RNN和LSTM

综述

RNN和LSTM是一类神经网络,可以有效地处理序列输入,完成各种关于序列的预测任务。

RNN

假设输入样本有形式$x_1,x_2,…,x_t$,其中$x_i$是序列位置$i$的输入,一般是向量形式。RNN有以下的计算形式:

$g$和$f$是激活函数,一般$g$是$tanh$函数,$f$是$softmax$函数。RNN的参数在每个时刻是共享的,所以在使用梯度下降更新参数时,需要计算每个时刻对共享参数的梯度:

对$W$求导形式和上式几乎一致,而对$V$求导形式则比较简单。RNN存在着梯度消失和梯度爆炸的问题,梯度爆炸比较容易理解,因为RNN的求导公式存在很长的连乘项,如果每一项都大于1,那么会存在指数爆炸的问题。而梯度消失则没那么好理解了,因为即使RNN的求导公式每一项都小于0,连乘后几乎等于0,但是每个时刻的损失函数值$L_{t}$都可以直接在时刻$t$作用于$U$和$W$,所以即使连乘项等于0,对所有求导链求和后的梯度也不至于会等于0。如果从全局来看,的确RNN不存在梯度消失的问题,但是如果我们关注一个特定位置的输出,即损失函数$L=L_t$,只对位置$L_t$求导,那么问题就存在了。在存在长期依赖的序列作为输入时,RNN无法将梯度传递回影响当前时刻输出的输入处,即我们无法调整长期输入对当前输出的影响,因为梯度在连乘后逐渐趋近于0,使得梯度只能反向传播到有限层,也就只能调整有限长度的输入对输出的影响。

LSTM

LSTM能够有效延长RNN可以处理的依赖长度,LSTM在每个时刻有一个细胞状态$c_t$和一个隐状态$h_t$,有三个门:遗忘门,输入门和输出门。

遗忘门

遗忘门的作用从细胞状态$c_{t-1}$中选择一部分信息忘掉,有下面的式子:

$\sigma$是$sigmoid$函数,$f_t$的每一位表示按照多少比例保留$c_{t-1}$对应位置的信息。

输入门

输入门的作用是从当前输入$x_t$中选择一部分信息加入到细胞状态$c_t$中,有下面式子:

通过输入门后就可以得到当前时刻的细胞状态$c_t$。

输出门

输出门的作用是通过细胞状态$c_t$得到$h_t$,有下面式子:

得到$h_t$后就可以使用和RNN一样的式子得到输出$y_t$以及利用$h_t$和$c_t$迭代求下一个时刻。

LSTM的优势及原因

LSTM为什么比RNN好,有两个主要原因:
(1) LSTM模型参数更多,调整参数可以拟合更多情况
(2) LSTM比RNN可以处理的依赖长度更大

LSTM在处理长期依赖时还是会存在问题,但比起RNN,LSTM可以处理的依赖长度会更长。RNN在反向传播时,主要通过$\frac{\partial h_{t}}{\partial h_{t-1}}…\frac{\partial h_{i+1}}{\partial h_i}$调整位置$i$对位置$t$的影响,在求导时,每一项都有$sigmoid$函数的导数。我们知道$sigmoid$函数的导数最大为$0.25$,这意味着梯度每往回传一层,都要乘上一个小于等于$0.25$的数,显然梯度是难以反向传播很多层。而LSTM在反向传播时,主要通过$\frac{\partial c_t}{\partial c_{t-1}}…\frac{\partial c_{i+1}}{\partial c_i}$调整位置$i$对位置$t$的影响,在求导时,每一项都有$sigmoid$函数输出。我们知道$sigmoid$函数的输出最大为1,比起最大为$0.25$,梯度每往回传一层,衰减会更小,所以LSTM的梯度可以往回传的层数会比RNN多。当RNN使用$tanh$函数作为激活函数,梯度最大值为1,和LSTM的$sigmoid$函数一样,但是$tanh$函数的梯度只有在靠近0点处才会有接近1的输出而在大部分时候值都接近0。而$sigmoid$函数则在正数处输出接近于1,在负数处输出接近于0。所以LSTM相比起RNN更不容易出现梯度消失,从而可以处理长期依赖。LSTM使用$sigmoid$函数控制遗忘门和输入门的输出,$sigmoid$函数在大多数时候输出要么接近1要么接近0,只有在少数情况才会介于两者之间,所以可以很好地起到开关的效果。在处理长期依赖时,只要调整$sigmoid$函数的输出使得输出接近于1就可以了,这是比较容易实现的,因为整个正数的饱和区的输出都接近于1,所以LSTM可以处理长期依赖。LSTM将激活函数应用于遗忘门和输入门作为开关的输出,将过去与现在通过加法结合得到当前状态,相比起RNN将过去与现在通过乘法以及激活函数结合得到当前状态,可以更好地适应梯度的长距离传播。