| by YoungTimes | No comments

动图详解LSTM和GRU

问题:短期记忆

反向传播(Back Propagation)是一种与最优化方法(比如梯度下降方法)结合、用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度,然后将梯度反馈给最优化方法,用来更新网络权重以最小化损失函数。

在神经网络中一个典型的问题就是梯度消失(Gradient Vanishing)的问题,其原因在于是随着神经网络层数的加深,梯度逐渐减小甚至接近0,当梯度变的非常小的时候,就不能为学习提供足够的信息。

Recurrent Neural Networks(递归神经网络,RNN)也存在梯度消失的问题,当输入的序列足够长时,RNN前期的层通常通常由于梯度消失而停止学习,从而导致RNN只拥有短期记忆。也就是说如果输入的序列的足够长,RNN在处理序列后面的信息时,可能已经将序列前面的信息丢失或者遗忘了,RNN很难完整的传递完整的长序列信息。

视频来源:https://www.youtube.com/watch?v=8HyCNIVRbSU

短期记忆的解决方案-LSTM和GRU

LSTM和GRU的短期记忆的解决方案,它通过门控(Gates)机制调节信息的流向。Gates可以学习到序列数据中哪些信息是重要的,需要保留;哪些信息是不重要的,可以丢弃,从而解决长序列的信息传递问题。

RNN回顾

为了更好的理解LSTM和GRU是如何实现的,先回顾下Recurrent Neural Network是如何工作的。

以机器翻译为例,RNN先将句子和词语转换为机器可识别的词向量(Word Vector),然后把词向量one by one的交给RNN进行处理。

RNN处理信息过程中,Hidden State作为神经网络的记忆数据,保留了神经网络已经看到的历史信息。通过将前一单元的Hidden State传递给后一个RNN单元,从而实现对历史信息的记忆。

RNN计算Hidden State的过程如下:它将当前RNN单元的输入和前一个RNN单元输出的Hidden State组合起来,经过一个Tanh激活函数,生成当前单元的Hidden State。

Tanh激活函数将输入值压缩至-1和1之间。

如果不采用Tanh激活函数,数据流经多层神经网络后,个别维度会出现急剧膨胀,甚至变成一个天文数字。下图是神经网络每层都对输入数据做了一个x3的操作的效果。

Tanh函数确保网络的输出值在-1与1之间,下图是同样的输入数据流经激活函数为Tanh的多层神经网络的效果。

LSTM

LSTM与RNN有相似的数据流控制机制,差别在于LSTM Cell内部的运作逻辑。

LSTM的核心概念是Cell States和各种Gates。Cell State在整个序列的处理过程中都携带相关的信息,即使较早时刻的信息也可以很好的保留,从而降低了短期记忆问题的影响。

Gates都是不同神经网络,它们可以决定哪些信息需要保留在Cell States中,哪些信息需要遗忘。

Sigmoid

Gates中使用了Sigmoid激活函数,Sigmoid激活函数与Tanh激活函数类似,只不过它不是将所有输入数据压缩到(-1, 1)之间,而是将输入数据压缩到(0, 1)之间。Sigmoid激活函数对于Gates数据更新或者遗忘数据非常有用,因为任意数值乘以0都等于0,从而使得这些数据被遗忘或则消失;任意数值乘以1都等于原数值,从而使得这些信息保留下来。所以最终Gates通过训练可以哪些数据是重要的,需要保留;哪些数据是不重要的,需要遗忘。

下面在深入看看各种Gates都做了什么。

Forget Gate

Forget Gate决定哪些信息需要丢弃,哪些信息需要保留。它合并前一个Hidden State和当前的Input信息,然后输入Sigmoid激活函数,输出(0,1)之间的数值。输出值接近0的信息需要被遗忘,输出值接近1的信息需要被保留。

Input Gate

Input Gate首先将前一个Hidden State和当前Input合并起来,送入Sigmoid函数,输出(0,1)之间的值,0表示信息不重要,1表示信息重要。

Hidden State和Input的输入同时也被送入Tanh函数,输出(-1, 1)之间的数值。

Sigmoid的输出和Tanh的输出相乘,决定哪些Tanh的输出信息需要保留,哪些输出信息需要丢弃。

Cell State

前一个Cell State的输出,首先与Forget Gate的输出相乘,选择性的遗忘不重要的信息,再与Input Gate的输出相加,从而实现将当前的Input信息添加到Cell State中,输出新的Cell State。

Output Gate

Output Gate用于输出Hidden State。Output Gate首先将前一个Hidden State和当前Input送入Sigmoid函数,然后与新的Cell State通过Tanh函数的输出相乘,决定Hidden State要将哪些信息携带到下一个Time Step。

概括来说,就是Forget Gate决定哪些历史信息要保留;Input Gate决定哪些新的信息要添加进来;Output Gate决定下一个Hidden State要携带哪些历史信息。

Code Demo

通过Python伪代码辅助更好的理解整个LSTM的运行过程。

GRU

GRU与LSTM非常相似,但它去除了Cell State,使用Hidden State来传递信息。GRU只有两个Gates: Reset Gate和Update Gate。

上图不够直接明白,再来一张台湾大学李宏毅教学视频中的讲解。

其中$x^t$和$h^{t-1}$是GRU的输入,$y^t$和$h^t$是GRU的输出。

如上图所示,r是Reset Gate,z为Update Gate。

通过重置门(Reset Gate)处理前一个Cell的输出:

$$h^{t-1^{\prime}}=h^{t-1} \odot r$$

再将$h^{t-1^{\prime}}$与$x^t$进行拼接,送入Tanh激活函数得到$h^{\prime}$。

最后进行记忆更新的步骤:

$$h^{t}=(1-z) \odot h^{t-1}+z \odot h^{\prime}$$

Update Gate z的范围为0~1,它的值越接近1,代表记忆数据越多;它的值越接近0,则代表遗忘的越多。

相比LSTM,GRU的Tensor Operation更少,因而训练速度更快,并且效果与LSTM不相上下。

参考材料

1.https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21

2.https://zhuanlan.zhihu.com/p/32481747

注: 本文所有图片来源于参考材料。

发表评论