- 循环神经网络(RNN):包括输入层、隐含层、输出层;包含自循环结构,一般处理序列数据;
- 网络结构如下:
其初始化状态a<0>=0,计算其状态及输出,如下:
其中a为隐层结点的状态,激活函数也可以为ReLu;则t时刻隐藏层和输出结果计算公式为:
为了提高并行计算能力,将参数转化为矩阵,拼接到一起计算;即:
;输出层计算不变。
- RNN的反向传播:(随时间反向传播BPTT)按照时间t进行反向传播;即将输出端的误差值反向传播,运用梯度下降的方法进行参数更新。
1)计算输出的损失:(交叉熵损失函数或平方误差损失函数)
2)计算第t时刻损失L对参数W的偏导数,即其梯度;
3)计算整个序列的损失函数L对参数W的梯度(对2计算的梯度进行求和)。
4)根据其梯度根据随机梯度下降方法进行反向传播,进行参数更新。
图片来源于:https://blog.csdn.net/qq_39422642/article/details/78676567
- RNN存在问题:
- 长期依赖问题,(由于每一个时刻的输出依赖于比它早的时刻的输入值)指当前系统的状态,可能受很长时间之前系统状态的影响,但是RNN由于序列长度以及模型本身特性会出现长期记忆失效。((1)渗透单元及其它多时间尺度的策略(2)长短期记忆和其它门控RNN(3)优化长期依赖(截断梯度、引导信息流的正则化))
- 梯度消失问题,在误差反向传播的过程中,误差经过每一层传递都会不断衰减,当网络层数很深时,神经元上的梯度也会不断衰减,导致前面的隐含层神经元的学习速度慢于后面隐含层上的神经元。(1.用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。2.用Batch Normalization。3.LSTM的结构设计也可以改善RNN中的梯度消失问题。)
- 梯度爆炸问题,网络的权重设置得过大,梯度以指数级增大,神经网络的层数越深,梯度越大,产生梯度爆炸问题。(采取梯度截断和权重正则化的方法。)
- 常见的RNN的网络变种:LSTM、GRU;
- LSTM(Long-Short-Term Memory):有效的解决信息的长期依赖,避免梯度消失或爆炸问题;其隐藏层结构如下:
LSTM可以有效地解决长期依赖问题,避免梯度消失或爆炸问题;其通过门控机制对输入的信息进行有效的传递。具体公式如下:ht-1为上一细胞的信息;
GRU(Gated Recurrent Unit):
较于LSTM所做改变:
- 将输入门、遗忘门、输出门变为两个门:更新门zt与重置门rt;
- 将单元状态与输出合并为一个状态:ht;
隐藏层结构如下图:
GRU是在LSTM上进行的一种优化;其计算公式如下:.代表点乘,*代表叉乘
最终输出层对隐藏层信息进行非线性处理: