深度学习:LSTM的拓展(双向LSTM和GRU等)

原始的LSTM

[深度学习:长短期记忆模型LSTM]

双向和深层LSTM

双向LSTM

RNN和LSTM都只能依据之前时刻的时序信息来预测下一时刻的输出,但在有些问题中,当前时刻的输出不仅和之前的状态有关,还可能和未来的状态有关系。比如预测一句话中缺失的单词不仅需要根据前文来判断,还需要考虑它后面的内容,真正做到基于上下文判断。即:
对于每个时刻t,输入会同时提供给两个方向相反的RNN,输出由这两个单向RNN共同决定。

双向RNN

深层LSTM模型

类似于深层RNN,使用多层的LSTM模型。著名的seq2seq模型使用的就是2层的LSTM来进行encode和decode的。multilayered Long Short-Term Memory (LSTM) to map the input sequence to a vector of a fixed dimensionality。

[Ilya Sutskever, Oriol Vinyals, and Quoc VV Le. Sequence to sequence learning with neural networks. In NIPS, 2014.]

增加网络层数 Going Deep

既然LSTM(RNN)是神经网络,我们自然可以把一个个LSTM叠加起来进行深度学习。

比如,我们可以用两个独立的LSTM来构造两层的循环神经网络:一个LSTM接收输入向量,另一个将前一个LSTM的输出作为输入。这两个LSTM没有本质区别——这不外乎就是向量的输入输出而已,而且在反向传播过程中每个模块都伴随着梯度操作。

[Gated Feedback Recurrent Neural Networks]

左边是传统的stack RNN(三个RNN叠加),右边是升级版——RNN的hidden state除了会对下一时刻自己产生影响外,还会对其他的RNN产生影响,由reset gates控制。

基于Vanilla LSTM的变体

[Greff, Klaus, et al. "LSTM: A search space odyssey." TNNLS2016] 探讨了基于Vanilla LSTM (Graves & Schmidhube (2005))之上的8个变体,并比较了它们之间的性能差异,包括:

  1. 没有输入门 (No Input Gate, NIG)
  2. 没有遗忘门 (No Forget Gate, NFG)
  3. 没有输出门 (No Output Gate, NOG)
  4. 没有输入激活函数 (No Input Activation Function, NIAF) (也就是没有输入门对应的tanh层)
  5. 没有输出激活函数 (No Output Activation Function, NOAF) (也就是没有输出门对应的tanh层)
  6. 没有"peephole connection" (No Peepholes, NP)
  7. 遗忘门与输入门结合 (Coupled Input and Forget Gate, CIFG)
  8. Full Gate Recurrence (FGR)。The FGR variant adds recurrent connections between all the gates (nine additional recurrent weight matrices).

关于不同变体的对比

[Greff, Klaus, et al. "LSTM: A search space odyssey." TNNLS2016]将8种LSTM变体与基本的Vanilla LSTM在TIMIT语音识别、手写字符识别、复调音乐建模三个应用中的表现情况进行了比较,得出了几个有趣的结论:

  1. Vanilla LSTM在所有的应用中都有良好的表现,其他8个变体并没有什么性能提升;
  2. 将遗忘门与输出门结合 (Coupled Input and Forget Gate, CIFG)以及没有"peephole connection" (No Peepholes, NP)简化了LSTM的结构,而且并不会对结果产生太大影响;
  3. 遗忘门和输出门是LSTM结构最重要的两个部分,其中遗忘门对LSTM的性能影响十分关键,输出门 is necessary whenever the cell state is unbounded (用来限制输出结果的边界);
  4. 学习率和隐含层个数是LSTM最主要的调节参数,而动量因子被发现影响不大,高斯噪音的引入对TIMIT实验性能提升显著,而对于另外两个实验则会带来反效果;
  5. 超参分析表明学习率与隐含层个数之间并没有什么关系,因此可以独立调参,另外,学习率可以先使用一个小的网络结构进行校准,这样可以节省很多时间。

[[NL系列] RNN & LSTM 网络结构及应用]

原始LSTM:不带忘记门的lstm block

         

[Hochreiter, S., & Schmidhuber, J. Long short-term memory. Neural computation1997] 

[LSTM memory cell as initially described in Hochreiter [Hochreiter and Schmidhuber, 1997]

现在常说的 LSTM 有 Forget Gate,是由 Gers 在"Learning to Forget: Continual Prediction with LSTM, 2000"中提出的改进版本。

后来,在"LSTM Recurrent Networks Learn Simple Context Free and Context Sensitive Languages, 2001"中 Gers 又加入了 Peephole Connection 的概念。

耦合的输入和遗忘门/遗忘门与输入门结合 (Coupled Input and Forget Gate, CIFG)

合并忘记门与输入门

变成

CIFG可以达到a 20% reduction in computation time (Greff et al., 2016).

peephole connections

为每个门的输入增加一个cell state的信号

A. Graves. Supervised Sequence Labelling with Recurrent Neural Networks. Textbook, Studies in Computational Intelligence, Springer, 2012.(图中的虚线为 Peephole Connection)

[Understanding LSTM Networks]

某小皮

门控循环单元GRU模型

        GRU即门控循环单元/Gated Recurrent Unit。GRU保持了LSTM的效果同时又使结构更加简单计算量更小。GRU把LSTM中的forget gateinput gateupdate gate来替代。 把cell state和隐状态ht进行合并,在计算当前时刻新信息的方法和LSTM有所不同。 

        GRU模型只有两个门了,分别为更新门zt和重置门rt。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多;重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。重置门有助于捕捉时间序列里短期的依赖关系;更新门有助于捕捉时间序列里长期的依赖关系。

GRU模型图

门控循环单元中隐藏状态的计算。⊙是按元素乘,也即下面的*表示矩阵元素相乘。

GRU前向传播公式

pytorch中gru的实现公式[GRU — PyTorch 2.0 documentation]。

Note: 有些地方zt和(1 - zt)是相反的,这个顺序需要注意一下,比如下面这个等同的图示(其中[]表示两个向量相连接)。

具体更新过程如下:

        如果reset gate接近0,那么之前的隐藏层信息就会丢弃,允许模型丢弃一些和未来无关 的信息;update gate控制当前时刻的隐藏层输出ht需要保留多少之前的隐藏层信息, 若zt接近1相当于我们之前把之前的隐藏层信息拷贝到当前时刻,可以学习长距离依赖。 一般来说那些具有短距离依赖的单元reset gate比较活跃(如果rt为1,而zt为0 那么相当于变成了一个标准的RNN,能处理短距离依赖),具有长距离依赖的单元update gate比较活跃。

Note: 如果reset门为1,而update门为0(不同图示中可能为1)的话,则GRU完全退化为一个RNN。其实第2个公式r=1时就是一个rnn!

GRU参数数量

3*((embed_dim+hidden_units)*hidden_units+hidden_units)

GRU 比 LSTM 少了一个门(将遗忘门和输入门合成了一个单一的更新门),与结果一致

[参考lstm中参数数量计算深度学习:长短期记忆模型LSTM_-柚子皮-的博客-CSDN博客]

LSTM与GRU对比

1 门数不同。GRU只有两个门reset门r和update门z。
2 在GRU中,r和z共同控制了如何从之前的隐藏状态(st−1st−1)计算获得新的隐藏状态(stst),而取消了LSTM中的output门。
3 经过实验,一般认为,LSTM和GRU之间并没有明显的优胜者。因为GRU具有较少的参数,所以训练速度快,而且所需要的样本也比较少。而LSTM具有较多的参数,比较适合具有大量样本的情况,可能会获得较优的模型。

[经典必读:门控循环单元(GRU)的基本概念与原理]

[RNN LSTM与GRU深度学习模型学习笔记]

[GRU 原论文:https://arxiv.org/pdf/1406.1078v3.pdf]

其它变型

Recurrent Dropout without Memory Loss

the cell and hidden state update equations for LSTM will incorporate a single dropout (Hinton et al., 2012) gate, as developed in Recurrent Dropout without Memory Loss (Semeniuta et al., 2016), to help regularize the entire model during training.

 DropOut()

[Stanislaw Semeniuta, Aliases Severyn, and Erhardt Barth. Recurrent dropout without memory loss. arXiv 2016]

Layer Normalization

add the option to use a Layer Normalization layer in the LSTM

i^t = σ(LN())

i g f o s^t都需要LN。

Layer Normalization (Ba et al., 2016[Jimmy L. Ba, Jamie R. Kiros, and Geoffrey E. Hinton. Layer normalization. NIPS2016]). The central idea for the normalization techniques is to calculate the first two statistical moments of the inputs to the activation function, and to linearly scale the inputs to have zero mean and unit variance.

具有2个cell的LSTM模型

一般时间序列只需要一个block,而空间序列可能需要多个block?如下图。

2个cell的lstm模型就类似于rnn模型中的”动态跨时间步的rnn网络“。

Figure 2: Example of a net with 8 input units, 4 output units, and 2 memory cell blocks of size 2.
in 1 marks the input gate, out 1 marks the output gate, and cell 1 =block 1 marks the rst memory cell of block 1. cell 1 =block 1 's architecture is identical to the one in Figure 1, with gate units in 1 and out 1

The example assumes dense connectivity: each gate unit and each memory cell see all non-output units.

[Hochreiter, S., & Schmidhuber, J. Long short-term memory. Neural computation1997] 

[LSTM模型]

​带状态 (stateful) 的 LSTM 模型

        stateful LSTM:能让模型学习到你输入的samples之间的时序特征,适合一些长序列的预测,哪个sample在前,那个sample在后对模型是有影响的。

        stateless LSTM:输入samples后,默认就会shuffle,可以说是每个sample独立,之间无前后关系,适合输入一些没有关系的样本。

        在stateless时,长期记忆网络并不意味着你的LSTM将记住之前batch的内容,它只是记住句子内部的内容。Keras stateless lstm在训练时会默认地shuffle samples,所以导致sequence之间的依赖性消失,samplesample之间就没有时序关系,顺序被打乱,这时记忆参数在batch、小序列之间进行传递就没意义了,所以Keras要把记忆参数初始化。

        使 RNN 具有状态意味着每批样品的状态将被重新用作下一批样品的初始状态。注意,此处的状态表示的是原论文公式里的c,h,即LSTM特有的一些记忆参数,并非w权重。

        在keras中使用带状态的lstm时,即在stateful = True 时,我们要在fit中手动使得shuffle = False。随后,在X[i](表示输入矩阵中第isample)这个小序列训练完之后,Keras会将将训练完的记忆参数传递给X[i+bs](表示第i+bs个sample),作为其初始的记忆参数。bs = batch_size。这样一来,我们的记忆参数就能顺利地在samplesample之间传递,X[i+n*bs]也能知道X[i]的信息。

[Keras之stateful LSTM全面解析+实例测试]

加入了peephole的 LSTM

换一个图:

        这里三条黑线就是所谓的 peephole,传统的 LSTM 中遗忘门、输入门和输出门只用了 h(t-1) 和 xt 来控制门缝的大小,peephole 的意思是说不但要考虑 h(t-1) 和 xt,也要考虑 Ct-1 和 Ct,其中遗忘门和输入门考虑了 Ct-1,而输出门考虑了 Ct。

[Gers, Felix A., Schraudolph, Nicol N., and Schmidhuber, J¨urgen. Learning precise timing with lstm recurrent networks. J. Mach. Learn. Res., 3:115–143, March 2003.]

代码实现

rnn的tf实现

tf.nn.dynamic_rnn 函数是tensorflow封装的用来实现递归神经网络(RNN)的函数

tf.nn.dynamic_rnn(
    cell,
    inputs,
    sequence_length=None,
    initial_state=None
)

返回值:元组(outputs, states)
outputs:outputs很容易理解,就是每个cell会有一个输出,即h(所有步)。
states:states表示最终的状态,也就是序列中最后一个cell输出的状态。一般情况下gru的states的形状为 [batch_size, cell.output_size],因为gru中无c^t,只有h^t;但当输入的cell为BasicLSTMCell时,state的形状为[2,batch_size, cell.output_size ],因为此时state = [c^t, h^t]。也就是说,如果cell为LSTM,那 states是个tuple,分别代表c^t 和h^t,其中h^t与outputs中对应的最后一个时刻(即最后一个cell)的输出相等;如果cell为GRU,那么同理,states其实就是h^t。

[tf.nn.dynamic_rnn 详解]

RNN+LSTM+GRU的pytorch实现

[RNN类Encoder-RNN|LSTM|GRU]

Lstm​的直接实现

[搭积木之LSTM的实现]

[深度学习第41讲:LSTM的numpy和keras实现]

from: 深度学习:长短期记忆模型LSTM的变体和拓展(GRU模型等)

ref:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值