NLP-分类模型-2016-文本分类:TextRNN【利用RNN循环神经网络解决文本分类问题】【相比较TextCNN】

TextRNN指的是利用RNN循环神经网络解决文本分类问题,文本分类是自然语言处理的一个基本任务,试图推断出给定文本(句子、文档等)的标签或标签集合。

文本分类的应用非常广泛,如:

  • 垃圾邮件分类:2分类问题,判断邮件是否为垃圾邮件
  • 情感分析:2分类问题:判断文本情感是积极还是消极;多分类问题:判断文本情感属于{非常消极,消极,中立,积极,非常积极}中的哪一类。
  • 新闻主题分类:判断一段新闻属于哪个类别,如财经、体育、娱乐等。根据类别标签的数量,可以是2分类也可以是多分类。
  • 自动问答系统中的问句分类
  • 社区问答系统中的问题分类:多标签多分类(对一段文本进行多分类,该文本可能有多个标签),如知乎看山杯
  • 让AI做法官:基于案件事实描述文本的罚金等级分类(多分类)和法条分类(多标签多分类)
  • 判断新闻是否为机器人所写:2分类

一、TextRNN的原理

在一些自然语言处理任务中,当对序列进行处理时,我们一般会采用循环神经网络RNN,尤其是它的一些变种,如LSTM(更常用),GRU。当然我们也可以把RNN运用到文本分类任务中。

这里的文本可以一个句子,文档(短文本,若干句子)或篇章(长文本),因此每段文本的长度都不尽相同。在对文本进行分类时,我们一般会指定一个固定的输入序列/文本长度:该长度可以是最长文本/序列的长度,此时其他所有文本/序列都要进行填充以达到该长度;该长度也可以是训练集中所有文本/序列长度的均值,此时对于过长的文本/序列需要进行截断,过短的文本则进行填充。总之,要使得训练集中所有的文本/序列长度相同,该长度除之前提到的设置外,也可以是其他任意合理的数值。在测试时,也需要对测试集中的文本/序列做同样的处理。

假设训练集中所有文本/序列的长度统一为n,我们需要对文本进行分词,并使用词嵌入得到每个词固定维度的向量表示。对于每一个输入文本/序列,我们可以在RNN的每一个时间步长上输入文本中一个单词的向量表示,计算当前时间步长上的隐藏状态,然后用于当前时间步骤的输出以及传递给下一个时间步长并和下一个单词的词向量一起作为RNN单元输入,然后再计算下一个时间步长上RNN的隐藏状态,以此重复…直到处理完输入文本中的每一个单词,由于输入文本的长度为n,所以要经历n个时间步长。

二、TextRNN网络结构

1、Structure 1

流程:embedding—>BiLSTM—>concat final output/average all output----->softmax layer

结构图如下图所示:
NLP-分类模型-2016-文本分类:TextRNN【利用RNN循环神经网络解决文本分类问题】【相比较TextCNN】_第1张图片
一般取前向/反向LSTM在最后一个时间步长上隐藏状态,然后进行拼接,在经过一个softmax层(输出层使用softmax激活函数)进行一个多分类;或者取前向/反向LSTM在每一个时间步长上的隐藏状态,对每一个时间步长上的两个隐藏状态进行拼接,然后对所有时间步长上拼接后的隐藏状态取均值,再经过一个softmax层(输出层使用softmax激活函数)进行一个多分类(2分类的话使用sigmoid激活函数)。

上述结构也可以添加dropout/L2正则化或BatchNormalization 来防止过拟合以及加速模型训练。

2、Structure 2

流程:embedding–>BiLSTM---->(dropout)–>concat ouput—>UniLSTM—>(droput)–>softmax layer

结构图如下图所示:
NLP-分类模型-2016-文本分类:TextRNN【利用RNN循环神经网络解决文本分类问题】【相比较TextCNN】_第2张图片
与之前结构不同的是,在双向LSTM(上图不太准确,底层应该是一个双向LSTM)的基础上又堆叠了一个单向的LSTM。把双向LSTM在每一个时间步长上的两个隐藏状态进行拼接,作为上层单向LSTM每一个时间步长上的一个输入,最后取上层单向LSTM最后一个时间步长上的隐藏状态,再经过一个softmax层(输出层使用softamx激活函数,2分类的话则使用sigmoid)进行一个多分类。

三、TextRNN v.s. TextCNN

TextRNN的结构非常灵活,可以任意改变。比如把LSTM单元替换为GRU单元,把双向改为单向,添加dropout或BatchNormalization以及再多堆叠一层等等。TextRNN在文本分类任务上的效果非常好,与TextCNN不相上下,但RNN的训练速度相对偏慢,一般2层就已经足够多了。

尽管TextCNN能够在很多任务里面能有不错的表现,但CNN有个最大问题是固定filter的视野,一方面无法建模更长的序列信息,另一方面filter的超参调节也很繁琐CNN本质是做文本的特征表达工作,而自然语言处理中更常用的是RNN,能够更好的表达上下文信息,尤其是RNN的一些变种,如LSTM(更常用),GRU。

文本分类任务中,CNN可以用来提取句子中类似N-gram的关键信息,适合短句子文本。TextRNN擅长捕获更长的序列信息。具体到文本分类任务中,常用的Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的N-gram信息。

RNN模型在运行速度上丝毫不占优势,后一个时间步的输出依赖于前一个时间步的输出,无法进行并行处理,导致模型训练的速度慢,比CNN模型要慢几倍到十几倍,这是一个致命的弱点。而RNN模型引以为傲的能够捕获序列中的长距离依赖关系,只需要通过构建更深层的卷积层也可实现。如下图所示,更深层的卷积层可以捕获更长的序列信息。

NLP-分类模型-2016-文本分类:TextRNN【利用RNN循环神经网络解决文本分类问题】【相比较TextCNN】_第3张图片




参考资料:
textRNN 与 textCNN详解
textRNN & textCNN的网络结构与代码实现!
总结textRNN

你可能感兴趣的:(#,NLP应用/分类,神经网络,自然语言处理,文本分类)