为什么需要RNN
神经网络只能一个个的输入,前一个输入和后一个输入是没有关系的。但某些任务需要能够更好的处理序列的信息,即前面和后面的输入是有关系的。
RNN结构
x为一个向量,代表输入层和输出层的值;s是一向量,代表着隐藏层的值;U是输入层的权重矩阵,o也为一个向量,它表示输出层的值,V是隐藏层到输出层的权重矩阵。
循环神经网络的隐藏层s的值不仅仅取决于当前输入的x,还取决于上一次隐藏层的值h。权重矩阵W就是隐藏层上一次的值作为这一次输入的权重。
L为损失函数
y代表着序列的真实输出
RNN反向传播
首先我们要先了解下RNN的前向传播算法:
对于索引为t,h(t)的计算公式如下:
b为偏置项,为**函数,一般为
的表达式比较简单:
最终在序列中我们的预测输出是:
通常由于RNN是分类模型,所以上面的**扎个**函数为softmax
通过损失函数我们可以比较的差距
但是W,U,b的梯度计算就比较的复杂了。从RNN的模型可以看出,在反向传播时,在在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置t+1时的梯度损失两部分共同决定。对于W在某一序列位置t的梯度损失需要反向传播一步步的计算。我们定义序列索引t位置的隐藏状态的梯度为:
从t+1推t:
对于在T时刻,由于他后面没有其他的序列索引,因此:
有了计算就容易了,这里给出表达式:
参考博客:https://www.cnblogs.com/pinard/p/6509630.html
LSTM
Long Short Term Memory(长短期记忆网络),为一种特殊的RNN类型,可以学习长期依赖信息。LSTM由Hochreiter & Schmidhuber (1997)提出。
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。LSTM是一种拥有三个“门”结构的特殊网络结构。
LSTM 靠一些“门”的结构让信息有选择性地影响RNN中每个时刻的状态。所谓“门”的结构就是一个使用sigmod神经网络和一个按位做乘法的操作,这两个操作合在一起就是一个“门”结构。之所以该结构叫做门是因为使用sigmod作为**函数的全连接神经网络层会输出一个0到1之间的值,描述当前输入有多少信息量可以通过这个结构,于是这个结构的功能就类似于一扇门,当门打开时(sigmod输出为1时),全部信息都可以通过;当门关上时(sigmod输出为0),任何信息都无法通过。
输入门:
遗忘门:
候选记忆单元:
当前时刻记忆单元
输出门:
GRU网络
gru可以看做LSTM的变种,GRU把LSTM中的遗忘门和输入门用更新门来代替。把cell state和隐状态和合并,在计算当前时刻新信息的方法和LSTM有所不同。下图是GRU更新的过程
重置门:
更新门:
候选记忆门:
当前时刻记忆单元:
双向RNN
在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向RNN(BiRNN)来解决这类问题。例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。
双向RNN是由两个RNN上下叠加在一起组成的。输出由这两个RNN的状态共同决定。
从上图可以看出,双向RNN的主题结构就是两个单向RNN的结合。在每一个时刻t,输入会同时提供给这两个方向相反的RNN,而输出则是由这两个单向RNN共同决定(可以拼接或者求和等)。
参考博客:https://blog.csdn.net/mpk_no1/article/details/72875185
梯度消失和梯度爆炸
主要原因就是矩阵的高次幂导致的,在多层神经网络里,影响因素主要是权值和**函数的偏导数。
如果**函数求导小于1,经过多次相乘后就会导致梯度消失
同理如果大于1,就会导致梯度爆炸
解决方法
对于RNN可以通过梯度截断来避免梯度爆炸
添加正则项
使用LSTM自循环和门控制机制,避免梯度消失
优化**函数,例如将sigmoid改成relu
参考博客:http://www.mamicode.com/info-detail-1010318.html
textRNN
embedding layer—>Bi-LSTM layer—>concat output—>FC layer —> softmax层
https://github.com/brightmart/text_classification/tree/master/a03_TextRNN