DL入门(4):长短期记忆网络(LSTM)

  写在前面:看预测论文综述时,面临这样一个问题:很多DL的方法只是会简单运用,却不是特别了解其详细原理,故针对CNN、RNN、LSTM、AutoEncoder、RBM、DBN以及DBM分别做一些简单总结,以达到了解的目的,此篇为LSTM。

1.RNN的缺陷

  RNN在构建实际应用程序如语言翻译、文本分类和更多的序列化问题方面非常常见,but在处理大型序列时存在梯度消失和梯度爆炸等问题。
   RNN结构共享一组U,W,b,这样梯度在反向传播过程中是不断连乘的,这样会使得梯度越来越大或者越来越小,带来梯度爆炸or梯度消失。所以当神经元个数非常多,也就是我们在处理很长一段序列的时候,往往得不到预期的结果。
  梯度下降与梯度爆炸
  梯度的表达式为:
在这里插入图片描述
在这里插入图片描述
可以看到,当r>1,t-k→∞时, γ t − k \gamma^{t-k} γtk→∞,造成梯度爆炸问题;相反,γ<1,t-k→∞时, γ t − k \gamma^{t-k} γtk→0,会出现梯度消失问题。
  而循环神经网络中经常使用的激活函数为Sigmoid函数和Tanh函数,其导数值都小于1,并且权重矩阵U的值也不会太大,因此如果时间间隔t-k过大,就会导致误差 δ t , k δ_{t,k} δt,k趋于0,出现梯度消失问题。在这种情况下,当目前的预测又需要用到比较久远的信息时,就会出现长期依赖问题。

2.LSTM

2.1 LSTM的结构

  既然是RNN的变种,那么二者之间肯定还是有很大关联的。实际上,LSTM的神经元还是基于输入x和上一级的隐藏层输出h来计算,只不过相比RNN,LSTM的内部结构更为复杂,RNN的计算表达式为:
在这里插入图片描述
  LSTM相比于RNN,引入了输入门i、遗忘门f、输出门o以及内部记忆单元c。其结构如下所示:
在这里插入图片描述

2.1.1遗忘门f

在这里插入图片描述
  如上图所示,遗忘门f用于控制输入x和上一层隐藏层输出h被遗忘的程度大小。 W f W_{f} Wf是遗忘门的权重, b f b_{f} bf是遗忘门的偏置,需要指出的是,所有遗忘门共用一组W和b。
  实际上,上述公式也可以写成:
f t = σ ( W f x t + U f h t − 1 + b f ) f_{t}=\sigma(W_{f}x_{t}+U_{f}h_{t-1}+b_{f}) ft=σ(Wfxt+Ufht1+bf)
这样便能与前面的RNN对应起来, U f 、 W f 、 b f U_{f}、W_{f}、b_{f} UfWfbf是所有遗忘门的一组权重参数。

2.1.2 输入门i

在这里插入图片描述
  如上图所示,输入门i用于控制输入x和当前计算的状态更新到记忆单元的程度大小。相应地,其表达式可以改为:
i t = σ ( W i x t + U i h t − 1 + b i ) C ~ t = t a n h ( W C x t + U C h t − 1 + b C ) i_{t}=\sigma(W_{i}x_{t}+U_{i}h_{t-1}+b_{i})\\ \tilde{C}_{t}=tanh(W_{C}x_{t}+U_{C}h_{t-1}+b_{C}) it=σ(Wixt+Uiht1+bi)C~t=tanh(WCxt+UCht1+bC)

2.1.3 内部记忆单元c

  观察上图可以发现, i t i_{t} it C ~ t \tilde{C}_{t} C~t汇聚到了一起,经过一个加号变成 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}*\tilde{C}_{t} Ct=ftCt1+itC~t
其中 f t f_{t} ft为遗忘门输出, C ~ t \tilde{C}_{t} C~t是当前输入的单元状态, C t C_{t} Ct是当前时刻单元状态。

2.1.4 输出门o

在这里插入图片描述
同样可改写为:
o t = σ ( W o x t + U o h t − 1 + b o ) h t = o t ∗ t a n h ( C t ) o_{t}=\sigma(W_{o}x_{t}+U_{o}h_{t-1}+b_{o})\\ h_{t}=o_{t}*tanh(C_{t}) ot=σ(Woxt+Uoht1+bo)ht=ottanh(Ct)
  可以看到,隐藏层输出是由输出门和内部记忆单元决定的。
  以上所有表达式中的 σ \sigma σ通常是指sigmoid函数,主要是起到门控作用,因为其输出为0~1,当输出接近0或者1时,符合物理意义上的关或开。

2.2 一些总结

  循环神经网络中的隐状态h存储了历史信息,可以看做一种记忆。在简单的RNN模型中,h在每一个时刻都是改变的,都会被重写,因此可看作一种短期记忆。而在LSTM中,记忆单元c可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间间隔。记忆单元c中保存信息的生命周期要长于短期记忆,但又远远短于长期记忆,因此将LSTM称为长短期记忆(Long Short-Term Memory)

  在深度网络参数学习时,参数初始化的值一般都比较小。但是在训练LSTM网络时,过小的值会使得遗忘门的值比较小,这意味着前一时刻的信息大部分都丢失了,这样网络很难捕捉到长距离的依赖信息。 并且相邻时间间隔的梯度会非常小,这会导致梯度弥散问题。因此遗忘门的参数初始值一般都设得比较大,其偏置向量 b f b_{f} bf设为1或2。

3.门控循环单元网络GRU

3.1 基本结构

  门控循环单元(Gated Recurrent Unit, GRU)网络是一种比LSTM网络更加简单的循环神经网络。其结构如下所示:
在这里插入图片描述
GRU相比于LSTM有以下两点不同:

  1. 将输入门i、遗忘门f、输出门o变为两个门:更新门(Update Gate)和重置门(Reset Gate)。
  2. 直接在当前状态 h t h_{t} ht和历史状态 h t − 1 h_{t-1} ht1之间引入线性依赖关系。

   具体来讲,GRU将遗忘门和输入门合并成更新门,将内部记忆单元和隐藏层输出合并成重置门,进而让整个结构变得更加简单,性能可能会有所增强。

3.2 工作原理

在这里插入图片描述
重置门 r t r_{t} rt与候选状态 h ~ t \tilde{h}_{t} h~t的表达式为:
r t = σ ( W r x t + U r h t − 1 + b r ) h ~ t = t a n h ( W h x t + U h ( r t ⊙ h t − 1 ) + b h ) r_{t}=\sigma(W_{r}x_{t}+U_{r}h_{t-1}+b_{r})\\ \tilde{h}_{t}=tanh(W_{h}x_{t}+U_{h}(r_{t}\odot h_{t-1})+b_{h}) rt=σ(Wrxt+Urht1+br)h~t=tanh(Whxt+Uh(rtht1)+bh)
重置门用于控制候选状态是否依赖上一时刻状态,通过重置门 r t r_{t} rt表达式我们可以发现:

  1. r t = 0 r_{t}=0 rt=0时,候选状态只与当前输入 x t x_{t} xt有关,和历史状态无关。
  2. r t = 1 r_{t}=1 rt=1时,候选状态和当前输入 x t x_{t} xt以及历史状态 h t − 1 h_{t-1} ht1都有关,这就与一般的RNN一致了。

更新门 z t z_{t} zt与当前状态 h t h_{t} ht的表达式为:
z t = σ ( W z x t + U z h t − 1 + b z ) h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ h ~ t z_{t}=\sigma(W_{z}x_{t}+U_{z}h_{t-1}+b_{z})\\ h_{t}=z_{t}\odot h_{t-1}+(1-z_{t})\odot \tilde{h}_{t} zt=σ(Wzxt+Uzht1+bz)ht=ztht1+(1zt)h~t

通过 h t h_{t} ht的表达式我们可以发现:

  1. z t = 0 z_{t}=0 zt=0时,当前状态就是候选状态,与前一状态 h t − 1 h_{t-1} ht1之间为非线性关系。
  2. z t = 1 z_{t}=1 zt=1时,当前状态就是前一状态,二者之间为线性关系。
  3. 因此,更新门用于控制前一隐藏状态有多少信息转移到当前隐藏状态,类似于LSTM中的内部记忆单元。

因此,综合二者并观察状态更新表达式我们发现:

  1. z t = 0 , r t = 1 z_{t}=0,r_{t}=1 zt=0rt=1时,GRU退化为简单RNN。
  2. z t = 0 , r t = 0 z_{t}=0,r_{t}=0 zt=0rt=0时, 当前状态 h t h_{t} ht只和当前输入 x t x_{t} xt相关, 和历史状态 h t − 1 h_{t-1} ht1无关,即隐藏状态被迫忽略前一时刻隐藏状态。
  3. z t = 1 z_{t}=1 zt=1时,当前状态就是前一状态。

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/112758157