循环神经网络RNN 3——LSTM及其变体

LSTM(Long Short Term Memory networks)被称为长短期记忆模型,是一种比较特殊的循环神经网络,其基本结构和基本思路与RNN一样。关于模型,我们都知道LSTM有解决长依赖问题的能力,这是区别于普通RNN的地方。本篇将总结LSTM及其相关变体。
循环神经网络RNN 1—— 基本模型及其变体
循环神经网络RNN 2—— attention注意力机制(附代码)
循环神经网络RNN 3——LSTM及其变体


1,LSTM概述

所有循环神经网络都具有神经网络的重复模块链的形式。 在标准的RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。标准的RNN网络如下图所示:
在这里插入图片描述
LSTMs也具有这种链式结构,但是它的重复单元不同于标准RNN网络里的单元只有一个网络层,它的内部有四个网络层。LSTMs的结构如下图所示:
在这里插入图片描述
很多人问,为什么开发者知道这种结构就能有这样的效果呢?其实,很多时候是有了这种效果然后解释这种结构,能达到这种效果的结构有很多,不止一种,当然LSTM的效果是经得住考验的,但是现在逐渐发展的transform结构已经逐渐有替代LSTM的趋势。

2,剖析LSTM

2.1 细胞状态

LSTMs的核心是细胞状态,用贯穿细胞的水平线表示。细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNNs。细胞状态如下图所示:

在这里插入图片描述
LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息,总的来说还是比较好理解的,以细胞状态为轴,将每个time-step的信息进行过滤处理,添加到细胞状态中,过滤就包括删除和添加,由三个门来控制,这三个门分别称为忘记门、输入门和输出门。

2.2 忘记信息

在这里插入图片描述

ft=σ(Wf[ht1,xt]+bf)f_t=\sigma(W_f*[h_{t-1},x_t]+b_f)
LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为忘记门的sigmoid单元来处理的。它通过查看ht1h_{t-1}xtx_t信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态Ct1C_{t-1}中的哪些信息保留或丢弃多少,0表示不保留,1表示都保留。

2.3 添加信息

下一步是决定给细胞状态添加哪些新的信息。这一步又分为两个步骤,首先,利用ht1h_{t-1}xtx_t通过一个称为输入门的操作来决定更新哪些信息。然后利用ht1h_{t-1}xtx_t通过一个tanh层得到新的候选细胞信息CtC_t^{'},这些信息可能会被更新到细胞信息中。这两步描述如下图所示 。
在这里插入图片描述
it=σ(Wi[ht1,xt]+bi)Ct^=tanh(WC[gt1,xt]+bC)\begin{aligned} &i_t = \sigma(W_i*[h_{t-1},x_t]+b_i)\\ &\hat{C_t} = tanh(W_C*[g_{t-1},x_t] + b_C) \end{aligned}

2.4 更新细胞状态

下面将更新旧的细胞信息Ct1C_{t-1},变为新的细胞信息CtC_t。更新的规则就是通过忘记门选择忘记旧细胞信息的一部分,通过输入门选择添加候选细胞信息CtC_t^{’}的一部分得到新的细胞信息CtC_t。更新操作如下图所示:

在这里插入图片描述
Ct=ftCt1+itCt^C_t=f_t*C_{t-1}+i_t*\hat{C_t}

2.5 输出细胞状态

更新完细胞状态后需要根据输入的ht1h_{t-1}xtx_t来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个-1~1之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。该步骤如下图所示
在这里插入图片描述
ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)\begin{aligned} & o_t = \sigma(W_o[h_t-1,x_t]+b_o)\\ & h_t = o_t*tanh(C_t) \end{aligned}

3, LSTM反向传播

与RNN一样,我们通过隐藏状态的梯度一步步向前反向传播,只不过LSTM有两个隐藏状态hh,CC,LSTM中所有的参数要经过这两个状态,只要这两个隐藏状态的导数计算出来,相应的U,V,W,bU,V,W,b等参数就很好计算了。这里我们以h为例做简单推导。
为了方便表示,我们将损失函数L(t)L(t)表示为两部分,一部分是位置t的损失函数,另一部分是位置t+1的损失函数。

L(t)={l(t)+L(t+1)if t<τl(t)if t=τ L(t)=\left\{ \begin{aligned} &l(t)+L(t+1) & if \ t<\tau \\ & l(t) & if \ t=\tau \\ \end{aligned} \right.
对于序列结尾的位置:
δh(τ)=Lhτ=(oτh(τ))TLτo(τ)=VT(y^(τ)y(τ))\begin{aligned} \delta_h^{(\tau)}&=\frac{\partial L}{\partial h^{\tau}}\\ &=(\frac{\partial o^\tau}{\partial h^{(\tau)}})^T\frac{\partial L^\tau}{\partial o^{(\tau)}}\\ & = V^T(\hat{y}^{(\tau)}-{y}^{(\tau)}) \end{aligned}
其他时间位置要多加一项:
δh(t)=Lht=l(t)ht+(ht+1h(t))TL(t+1)h(t+1)=VT(y^(τ)y(τ))+(ht+1h(t))Tδht1\begin{aligned} \delta_h^{(t)}&=\frac{\partial L}{\partial h^{t}}\\ &=\frac{\partial l(t)}{\partial h^{t}} + (\frac{\partial h^{t+1}}{\partial h^{(t)}})^T\frac{\partial L(t+1)}{\partial h^{(t+1)}}\\ & = V^T(\hat{y}^{(\tau)}-{y}^{(\tau)}) + (\frac{\partial h^{t+1}}{\partial h^{(t)}})^T\delta_h^{t-1} \end{aligned}
至于C的求导要更加复杂一些,有兴趣的可以参考文末的资料。有了两个隐藏变量的导数,就可以根据前向公式进行参数求导了。

4, LSTM注意事项

1)首先需要明确的是,RNN 中的梯度消失/梯度爆炸和普通的 MLP 或者深层 CNN 中梯度消失/梯度爆炸的含义不一样。MLP/CNN 中不同的层有不同的参数,各是各的梯度;而 RNN 中同样的权重在各个时间步共享,最终的梯度 g=gtg = \sum g_t.

2)由 1 中所述的原因,RNN 中总的梯度是不会消失的。即便梯度越传越弱,那也只是远距离的梯度消失,由于近距离的梯度不会消失,所有梯度之和便不会消失。RNN 所谓梯度消失的真正含义是,梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系

3)LSTM 中梯度的传播有很多条路径,细胞状态C 这条路径上只有逐元素相乘和相加的操作,梯度流最稳定;但是其他路径(上梯度流与普通 RNN 类似,照样会发生相同的权重矩阵反复连乘。

4)LSTM 刚提出时没有遗忘门,或者说相当于 ft=1f_t=1 ,这时候在ct1ctc_{t-1} 、c_t直接相连的短路路径上,从而这条路径上的梯度畅通无阻,不会消失。类似于 ResNet 中的残差连接。

5)同样,因为总的远距离梯度 = 各条路径的远距离梯度之和,高速公路上梯度流比较稳定,但其他路径上梯度有可能爆炸,此时总的远距离梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此 LSTM 仍然有可能发生梯度爆炸。不过,由于 LSTM 的其他路径非常崎岖,和普通 RNN 相比多经过了很多次激活函数(导数都小于 1),因此 LSTM 发生梯度爆炸的频率要低得多。实践中梯度爆炸一般通过梯度裁剪来解决。

5, LSTM变体

5.1 peephole connections

在这里插入图片描述
ft=σ(Wf[Ct1,ht1,xt]+bf)it=σ(Wi[Ct1,ht1,xt]+bi)ot=σ(Wo[Ct1,ht1,xt]+bo)\begin{aligned} &f_t=\sigma(W_f[C_{t-1},h_{t-1},x_t]+b_f)\\ &i_t=\sigma(W_i[C_{t-1},h_{t-1},x_t]+b_i)\\ &o_t=\sigma(W_o[C_{t-1},h_{t-1},x_t]+b_o)\\ \end{aligned}
Peephole是窥视的意思,意图也很明显,就是将细胞状态信息传递给各个门,让其能窥视到细胞状态。

5.2 引入耦合(GRU)

在这里插入图片描述

zt=σ(Wz[ht1,xt])rt=σ(Wr[ht1,xt])h^t=tanh(W[rtht1,xt])ht=(1zt)ht1+zth^t\begin{aligned} &z_t=\sigma(W_z[h_{t-1},x_t])\\ &r_t=\sigma(W_r[h_{t-1},x_t])\\ &\hat{h}_t=tanh(W[r_t*h_{t-1},x_t])\\ &h_t=(1-z_t)*h_{t-1}+z_t*\hat{h}_t\\ \end{aligned}
我们熟知的就是GRU,将忘记门和输入门合并成一个新的门,称为更新门。GRU还有一个门称为重置门,上图中前面那个门,决定了如何将新的输入信息与前面的记忆相结合。

6, biLSTM

在这里插入图片描述
为什么会有双向LSTM?原因很简单,单项LSTM信息量不够,例如:
“我今天不舒服,我打算____一天。”
只根据‘不舒服‘,可能推出我打算‘去医院‘,‘睡觉‘,‘请假‘等等,但如果加上后面的‘一天‘,能选择的范围就变小了,‘去医院‘这种就不能选了,而‘请假‘‘休息‘之类的被选择概率就会更大。
而双向计算的思路也很简单,从前往后计算一遍,然后从后往前再计算一遍,得到的特征维度要比lstm多一倍

7, LSTM总结

回顾一下,LSTM的过程,LSTM与RNN一样是重复模块链式结构,我们把每个模块看做细胞,其中贯穿所有细胞的为细胞状态CC,起到保留有效信息的左右,对于每个细胞状态,根据当前输入和前一时刻的输入,分别计算需要忘记和保留的细胞信息,并把这些信息添加到细胞状态中,然后再根据当前输入计算细胞状态输出。
LSTM 之所以能够实现长时记忆而不会形成远距离梯度衰减,是因为有细胞状态这条高速通道。

参考文献
https://www.cnblogs.com/pinard/p/6519110.html
https://www.zhihu.com/question/34878706

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章