LSTM & Bi-LSTM & GRU

1、LSTM简介

基于RNN,与之不同的是一个是门控单元有所不同。

长短期记忆网将信息存放在递归网络正常信息流之外的门控单元中,这些单元可以存储、写入或读取息就像计算机内存中的数据一样。但愿通过门的开关判定存储哪些信息,何时允许读取、写入或清除信息。这些门是模拟的,包含输出范围全部在0~1之间的Sigmoid函数的逐元素相乘操作。这些门依据接收到的信号开关,而且会用自身的权重集对信息进行筛选,根据强度和输入内容决定是否允许信息通过。这些权重会通过递归网络的学习过程进行调整。
LSTM主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
LSTM & Bi-LSTM & GRU
如上图所示,RNN只有一个门:输入门(输入和输出相当于一个门),而LSTM拥有三个门,分别为:遗忘门、输入门、输出门
LSTM & Bi-LSTM & GRU

1.2、遗忘门

对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
LSTM & Bi-LSTM & GRU
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f) ft​=σ(Wf​⋅[ht−1​,xt​]+bf​)

1.3、输入门

将这个阶段的输入有选择性地进行“记忆”。一个新的候选值,判断是否将其加入到元胞状态中。
LSTM & Bi-LSTM & GRU

i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i) it​=σ(Wi​⋅[ht−1​,xt​]+bi​)
C t ~ = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C_t}=tanh(W_C\cdot[h_{t-1},x_t]+b_C) Ct​~​=tanh(WC​⋅[ht−1​,xt​]+bC​)
LSTM & Bi-LSTM & GRU
C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct​=ft​∗Ct−1​+it​∗Ct​~​

1.4、输出门

决定哪些将会被当成当前状态的输出。选择重要的信息作为元胞状态的输出。
LSTM & Bi-LSTM & GRU
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t-1},x_t]+b_o) ot​=σ(Wo​⋅[ht−1​,xt​]+bo​)
h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht​=ot​∗tanh(Ct​)

1.5、LSTM步骤如下:

LSTM & Bi-LSTM & GRU

  1. 决定从元胞状态中扔掉哪些信息。由叫做“遗忘门”的Sigmoid层控制。遗忘门会输出0~1之间的数,1表示保留该信息,0表示丢弃该信息。 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma(W_f\cdot[h_{t-1},x_t]+b_f) ft​=σ(Wf​⋅[ht−1​,xt​]+bf​)
  2. 通过输入门将有用的新信息加入到元胞状态。首先,将前一状态和当前状态的输入输入到Sigmoid函数中滤除不重要信息。另外,通过tanh函数得到一个-1〜1之间的输出结果。这将产生一个新的候选值,后续将判断是否将其加入到元胞状态中。
    i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i) it​=σ(Wi​⋅[ht−1​,xt​]+bi​)
    C t ~ = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C_t}=tanh(W_C\cdot[h_{t-1},x_t]+b_C) Ct​~​=tanh(WC​⋅[ht−1​,xt​]+bC​)
  3. 将上一步中Sigmoid函数和tanh函数的输出结果相乘,并加上第一步中的输出结果,从而实现保留的信息都是重要信息,此时更新状态即可忘掉那些不重要的信息。 C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct​=ft​∗Ct−1​+it​∗Ct​~​
  4. 最后,从当前状态中选择重要的信息作为元胞状态的输出。首先,将前一隐状态和当前输入值通过Sigmoid函数得到一个0〜1之间的结果值。然后对第三步中输出结果计算tanh函数的输出值,并与得到的结果值相乘,作为当前元胞隐状态的输出结果,同时也作为下一个隐状态的输入值。
    o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t-1},x_t]+b_o) ot​=σ(Wo​⋅[ht−1​,xt​]+bo​)
    h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht​=ot​∗tanh(Ct​)

1.6 LSTM训练过程

LSTM & Bi-LSTM & GRU
LSTM & Bi-LSTM & GRU

1.7 多隐藏层的LSTM

LSTM & Bi-LSTM & GRU
左边是2个隐藏层,右边是3个隐藏层。

2、Bi-LSTM(Bi-directional Long Short-Term Memory)

LSTM只关注了"上文",有时候我们需要感知"上下文",特别是在自然语言处理中。
前向的LSTM与后向的LSTM结合成BiLSTM。
例如:前向的依次输入“我”,“爱”,“中国”得到三个向量{ h L 0 , h L 1 , h L 2 h_{L0},h_{L1},h_{L2} hL0​,hL1​,hL2​}。后向的依次输入“中国”,“爱”,“我”得到三个向量{ h R 0 , h R 1 , h R 2 h_{R0},h_{R1},h_{R2} hR0​,hR1​,hR2​}。最后将前向和后向的隐向量进行拼接得到{ [ h L 0 , h R 0 ] , [ h L 1 , h R 1 ] , [ h L 2 , h R 2 ] [h_{L0},h_{R0}],[h_{L1},h_{R1}],[h_{L2},h_{R2}] [hL0​,hR0​],[hL1​,hR1​],[hL2​,hR2​]},即:{ h 0 , h 1 , h 2 h_0,h_1,h_{2} h0​,h1​,h2​}。
LSTM & Bi-LSTM & GRU

LSTM & Bi-LSTM & GRU
LSTM & Bi-LSTM & GRU

3、GRU(Gate Recurrent Unit)

GRU是循环神经网络的一种,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。为什么用GRU?相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。
门限循环单元本质上就是一个没有输出门的长短期记忆网络,因此它在每个时间步都会将记忆单元中的所有内容写入整体网络。
LSTM & Bi-LSTM & GRU
GRU只有两个门:重置门和更新门,将遗忘门和输入门合并为更新门,将细胞状态 与 隐藏层输出 合并在一起。
将元胞状态和隐状态合并,更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略的越多。这个模型比长短期记忆网络更加简化,也变得越来越流行。
LSTM & Bi-LSTM & GRU

来源:赵卫东《机器学习》

上一篇:ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务


下一篇:循环神经网络-GRU和LSTM