有关RNN请参考:循环神经网络(RNN)的基本原理
RNN在构建实际应用程序如语言翻译、文本分类和更多的序列化问题方面常见,but在处理大型序列时存在梯度消失和梯度爆炸等问题。
RNN结构共享一组U,W,b,这样梯度在反向传播过程中是不断连乘的,这样会使得梯度越来越大或者越来越小,带来梯度爆炸or梯度消失。所以当神经元个数非常多,也就是我们在处理很长一段序列的时候,往往得不到预期的结果。
梯度下降与梯度爆炸:
梯度的表达式为:
可以看到,当r>1,t-k→∞时,
,造成梯度爆炸问题;相反,γ<1,t-k→∞时,
,会出现梯度消失问题。
而循环神经网络中经常使用的激活函数为Sigmoid函数和Tanh函数,其导数值都小于1,并且权重矩阵U的值也不会太大,因此如果时间间隔t-k过大,就会导致误差 趋于0,出现梯度消失问题。在这种情况下,当目前的预测又需要用到比较久远的信息时,就会出现长期依赖问题。
既然是RNN的变种,那么二者之间肯定还是有很大关联的。实际上,LSTM的神经元还是基于输入x和上一级的隐藏层输出h来计算,只不过相比RNN,LSTM的内部结构更为复杂,RNN的计算表达式为:
LSTM相比于RNN,引入了输入门i、遗忘门f、输出门o以及内部记忆单元c。其结构如下所示:
如上图所示,遗忘门f用于控制输入x和上一层隐藏层输出h被遗忘的程度大小。 是遗忘门的权重, 是遗忘门的偏置,需要指出的是,所有遗忘门共用一组W和b。
实际上,上述公式也可以写成:
这样便能与前面的RNN对应起来,
是所有遗忘门的一组权重参数。
如上图所示,输入门 用于控制输入x和当前计算的状态更新到记忆单元的程度大小。相应地,其表达式可以改为:
观察上图可以发现,
和
汇聚到了一起,经过一个加号变成
,如下所示:
内部记忆单元表达式如下:
其中
为遗忘门输出,
是当前输入的单元状态,
是当前时刻单元状态。
同样可改写为:
可以看到,隐藏层输出是由输出门和内部记忆单元决定的。
以上所有表达式中的 通常是指Sigmoid函数,主要是起到门控作用,因为其输出为0~1,当输出接近0或者1时,符合物理意义上的关或开。
循环神经网络中的隐状态h存储了历史信息,可以看做一种记忆。在简单的RNN模型中,h在每一个时刻都是改变的,都会被重写,因此可看作一种短期记忆。而在LSTM中,记忆单元c可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间间隔。记忆单元c中保存信息的生命周期要长于短期记忆,但又远远短于长期记忆,因此将LSTM称为长短期记忆(Long Short-Term Memory)
在深度网络参数学习时,参数初始化的值一般都比较小。但是在训练LSTM网络时,过小的值会使得遗忘门的值比较小,这意味着前一时刻的信息大部分都丢失了,这样网络很难捕捉到长距离的依赖信息。 并且相邻时间间隔的梯度会非常小,这会导致梯度弥散问题。
因此遗忘门的参数初始值一般都设得比较大,其偏置向量
设为1或2。
门控循环单元(Gated Recurrent Unit, GRU)网络是一种比LSTM网络更加简单的循环神经网络。其结构如下所示:
GRU相比于LSTM有以下两点不同:
1.将输入门i、遗忘门f、输出门o变为两个门:更新门(Update Gate)和重置门(Reset Gate)。2.直接在当前状态
和历史状态
之间引入线性依赖关系。
具体来讲,GRU将遗忘门和输入门合并成更新门,将内部记忆单元和隐藏层输出合并成重置门,进而让整个结构变得更加简单,性能可能会有所增强。
重置门
与候选状态
的表达式为:
重置门用于控制候选状态是否依赖上一时刻状态,通过重置门
的表达式我们可以发现:
1.当
时,候选状态只与当前输入
有关,和历史状态无关。
2.当
时,候选状态和当前输入
以及历史状态
都有关,这就与一般的RNN一致了。
更新门
与当前状态
的表达式为:
通过 的表达式我们可以发现:
1.当
时,当前状态就是候选状态,与前一状态
之间为非线性关系。
2.当
时,当前状态就是前一状态,二者之间为线性关系。3.因此,更新门用于控制前一隐藏状态有多少信息转移到当前隐藏状态,类似于LSTM中的内部记忆单元。
因此,综合二者并观察状态更新表达式我们可以发现:
1.当
时,GRU退化为简单RNN。
2.当
时, 当前状态
只和当前输入
相关, 和历史状态
无关,即隐藏状态被迫忽略前一时刻隐藏状态。
3.当
时,当前状态就是前一状态。