循环神经网络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 忘记信息

在这里插入图片描述

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

2.3 添加信息

下一步是决定给细胞状态添加哪些新的信息。这一步又分为两个步骤,首先,利用 h t − 1 h_{t-1} ht1 x t x_t xt通过一个称为输入门的操作来决定更新哪些信息。然后利用 h t − 1 h_{t-1} ht1 x t x_t xt通过一个tanh层得到新的候选细胞信息 C t ′ C_t^{'} Ct,这些信息可能会被更新到细胞信息中。这两步描述如下图所示 。
在这里插入图片描述
i t = σ ( W i ∗ [ h t − 1 , x t ] + b i ) C t ^ = t a n h ( W C ∗ [ g t − 1 , x t ] + b C ) \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} it=σ(Wi[ht1,xt]+bi)Ct^=tanh(WC[gt1,xt]+bC)

2.4 更新细胞状态

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

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

2.5 输出细胞状态

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

3, LSTM反向传播

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

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

4, LSTM注意事项

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

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

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

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

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

5, LSTM变体

5.1 peephole connections

在这里插入图片描述
f t = σ ( W f [ C t − 1 , h t − 1 , x t ] + b f ) i t = σ ( W i [ C t − 1 , h t − 1 , x t ] + b i ) o t = σ ( W o [ C t − 1 , h t − 1 , x t ] + b o ) \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} ft=σ(Wf[Ct1,ht1,xt]+bf)it=σ(Wi[Ct1,ht1,xt]+bi)ot=σ(Wo[Ct1,ht1,xt]+bo)
Peephole是窥视的意思,意图也很明显,就是将细胞状态信息传递给各个门,让其能窥视到细胞状态。

5.2 引入耦合(GRU)

在这里插入图片描述

z t = σ ( W z [ h t − 1 , x t ] ) r t = σ ( W r [ h t − 1 , x t ] ) h ^ t = t a n h ( W [ r t ∗ h t − 1 , x t ] ) h t = ( 1 − z t ) ∗ h t − 1 + z t ∗ h ^ 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} zt=σ(Wz[ht1,xt])rt=σ(Wr[ht1,xt])h^t=tanh(W[rtht1,xt])ht=(1zt)ht1+zth^t
我们熟知的就是GRU,将忘记门和输入门合并成一个新的门,称为更新门。GRU还有一个门称为重置门,上图中前面那个门,决定了如何将新的输入信息与前面的记忆相结合。

6, biLSTM

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

7, LSTM总结

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

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值