人的记忆原理也是与当前输入和之前的输入有关的。每个预测的结果都会放到下一个输入里进行运算,与下一次的输入一起来生成下一次的结果。 听到一句话“我来找你”,是在没听到一个字或词的时候大脑都会结合之前听到的和现在听到的组合起来,形成语句的理解。下面这种网络与我们的大脑对语句的理解过程很相似。
循环神经网络,Recurrent Neural Network。神经网络是一种节点定向连接成环的人工神经网络。这种网络的内部状态可以展示动态时序行为。不同于前馈神经网络的是,RNN可以利用它内部的记忆来处理任意时序的输入序列。
循环神经网络却能很好地处理文本数据变长并且有序的输入序列。 但是,RNN却存在梯度消失或者梯度爆炸的问题。 传统的RNN的梯度可以表示为连乘的形式 ∂ n e t t ∂ n e t 1 = ∂ n e t t ∂ n e t t − 1 ∂ n e t t − 1 ∂ n e t t − 2 . . . ∂ n e t 2 ∂ n e t 1 \frac{\partial net_t}{\partial net_1}=\frac{\partial net_t}{\partial net_{t-1}}\frac{\partial net_{t-1}}{\partial net_{t-2}}...\frac{\partial net_2}{\partial net_1} ∂net1∂nett=∂nett−1∂nett∂nett−2∂nett−1...∂net1∂net2 其中, n e t t = U x t + W h t − 1 net_t=Ux_t+Wh_{t-1} nett=Uxt+Wht−1, h t = f ( n e t t ) h_t=f(net_t) ht=f(nett), y = g ( V h t ) y=g(Vh_t) y=g(Vht) 上述矩阵为 ∂ n e t t ∂ n e t t − 1 \frac{\partial net_t}{\partial net_{t-1}} ∂nett−1∂nett对应的矩阵,被称为雅各比矩阵。 由于预测的误差是沿着神经网络的每一层反向传播的,因此当雅各比矩阵的最大特征值>1时,随着离输出越来越远,每层的梯度会呈指数增长,导致梯度爆炸,反之,若雅各比矩阵的最大特征值<1,梯度的大小会随离输出的距离增加而缩小,产生梯度消失。 梯度爆炸可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩。但是,梯度消失的问题相对更为棘手,模型本身必须得到改进。 一种方式是通过何凯明提出的深度残差网络(参考 https://www.cnblogs.com/wuliytTaotao/p/9560205.html)解决。 一种是通过添加门控循环单元解决。
鉴于RNN梯度消失的问题,LSTM使用门控循环单元来解决这个问题。 LSTM的结构图如下: LSTM对门结构进行了精心的设计,加入了输入门、遗忘门和输出门三个门,以及一个内部记忆单元。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。 当前状态的转移同时取决于激活函数和输入门、遗忘门这两个门。LSTM的遗忘门的 值接近于1,输入门的值接近于0,此时过去的记忆会被保存,从而实现了长期记 忆功能;当输入的序列中出现了重要的信息时,LSTM应当把其存入记忆中,此时 其输入门的值会接近于1;当输入的序列中出现了重要信息,且该信息意味着之前的记忆不再重要时,输入门的值接近1,而遗忘门的值接近于0,这样旧的记忆被遗忘,新的重要信息被记忆。经过这样的设计,整个网络更容易学习到序列之间的长期依赖。
GRU与俄罗斯情报组织有着同样的缩写,GRU是LSTM的一种变体,并且比LSTM更加简单。 与LSTM的三个门不同,GRU只有两个门:更新门和重置门。 图片来源于:https://www.ctolib.com/topics-135880.html 更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门控制前一状态有多少信息被写入到当前的候选集上,重置门越小,前一状态的信息被写入的越少。
上述的RNN都是单向的,但是语言文本中也会存在一个词不仅与之前的词有关,还与之后的词有关的情况,所以双向RNN就是来解决这个问题的。 本质上双向RNN就是两个单项RNN的叠加,如下图所示: 也可以将上述RNN换成LSTM和GRU。
结构:降维—>双向lstm —> concat输出—>平均 -----> softmax 参考: https://github.com/brightmart/text_classification/tree/master/a03_TextRNN
RCNN 整体的模型构建流程如下: 1)利用Bi-LSTM获得上下文的信息,类似于语言模型。 2)将Bi-LSTM获得的隐层输出和词向量拼接[fwOutput, wordEmbedding, bwOutput]。 3)将拼接后的向量非线性映射到低维。 4)向量中的每一个位置的值都取所有时序上的最大值,得到最终的特征向量,该过程类似于max-pool。 5)softmax分类。 RCNN使用Tensorflow实现IMDB文本分类参考: https://www.cnblogs.com/jiangxinyang/p/10208290.html https://github.com/jiangxinyang227/textClassifier/tree/master/RCNN