1.循环神经网络概述
循环神经网络(Recurrent Neural Network,RNN),简称RNN。它与DNN和CNN的不同是:可处理序列问题(如一段文字,一段语音等)。如给定一个索引从0-T的序列,对于任意的索引号t,它对应的输入是,则模型在t时刻的隐藏状态
由
和t-1时刻的隐藏状态
共同决定。而t时刻的输出
则是由
通过非线性变换得到。
也就是说,当我们在理解一句话时,不光要理解句子中的字,更要理解字前面或者后面的句子序列信息,以达到理解整个句子序列的目标。
理论上来说,RNN可以理解关联往前或往后的任意多个字序列。
2.循环神经网络模型
我想以一张图的方式简明扼要的阐述RNN模型。
其中:
x(t):代表在序列索引号 t 时训练样本的输入。
h(t):代表在序列索引号 t 时模型的隐藏状态。
o(t):代表在序列索引号 t 时模型的输出。
L(t):代表在序列索引号 t 时模型的损失函数,模型整体的损失函数是所有的L(t)相加和。
y(t):代表在序列索引号 t 时训练样本序列的真实输出。
U、V、W这三个矩阵是模型的参数。他们在整个网络中是共享的。——共享权重
3.循环神经网络前向传播算法
对于t时刻的隐藏状态:
对于t时刻的输出:
则t时刻的预测输出为:
则t时刻的损失函数为:
则RNN模型整体的损失函数为:
4.循环神经网络反向传播算法
BPTT(Back-Propagation Through Time)算法是RNN的训练算法,本质上还是BP算法。当然BPTT算法与BP算法的不同之处在于RNN中的U、V、W在序列中的不同位置是共享的,反向传播时我们更新的是相同的参数。
由于sigmoid导数的范围在(0,0.25],tanh导数的范围在(0,1],因此在上面关于W和U的梯度连乘中,会导致梯度接近于0,这就引起了梯度消失的问题。梯度消失意味着那一层参数再也不更新了,模型训练也就没意义了。Relu函数在一定程度上可以解决梯度消失问题,但又容易引起梯度爆炸问题。
当序列很长时,梯度消失问题尤为明显,因此RNN一般用不了,取而代之的是LSTM模型。
注:循环神经网络和recursive neural network(递归神经网络)的区别如下:
循环神经网络:是时间维度上的展开,处理的是序列结构的信息,有环图。
递归神经网络:是空间结构上的展开,处理的是树状结构的信息,无环图。
长短期记忆网络(Long Short-Term Memory,LSTM),通过引入“门”机制,使得长距离依赖建模得以形成,并在一定程度上缓解RNN模型的梯度消失问题。
LSTM模型的核心是Cell Memory,即记忆细胞。
模型参数量几乎是RNN的4倍。增加了三个门+一个候选记忆细胞的参数(3*3+3*1=12)。
记:
:n*1
:m*1
W: L*m
b: L*1
:L*1
:m*1
:m*n
:m*m
:m*1
作为t时刻输出会影响t时刻误差,同样作为t+1时刻的输入会影响t+1时刻的误差。所以
的变化影响的是t和t+1时刻的损失函数的变化。
LSTM依然不能完全解决梯度消失这个问题,有文献表示序列长度一般到了三百多仍然会出现梯度消失现象。如果想彻底规避这个问题,还是transformer好用。
门循环控制单元(Gated Recurrent Units,GRU),是对LSTM模型的简化版模型,但同时却保持者与LSTM模型相近的效果。
相比LSTM的不同:
1)将三门:输入门、遗忘门、输出门变两门:更新门 (Update Gate) 和 重置门 (Reset Gate)
。
2)将 (候选) 细胞状态与隐藏状态 (输出) 合并,即只有 当前时刻候选隐藏状态 和 当前时刻隐藏状态
。
GRU 结构图: