【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU

目录

一、LSTM网络

1.1、遗忘门

1.2、输入门

1.3、输出门

二、GRU网络

2.1、重置门

2.2、更新门

三、SRU网络

3.1、SRU网络结构

3.2、SRU并行优化

四、总结


人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。在理解当前文字的时候,你并不会忘记之前看过的文字,从头思考当前文字的含义。

传统的神经网络并不能做到这一点,这是在对这种序列信息(如语音)进行预测时的一个缺点。比如你想对电影中的每个片段去做事件分类,传统的神经网络是很难通过利用前面的事件信息来对后面事件进行分类。

而循环神经网络(下面简称RNNs)可以通过不停的将信息循环操作,保证信息持续存在,从而解决上述问题。
参考链接:【译】理解LSTM(通俗易懂版)

一、LSTM网络

Long Short Term Memory networks(以下简称LSTMs),一种特殊的RNN网络,该网络设计出来是为了解决长依赖问题。该网络由 Hochreiter & Schmidhuber (1997)引入,并有许多人对其进行了改进和普及。他们的工作被用来解决了各种各样的问题,直到目前还被广泛应用。
链接:https://www.jianshu.com/p/95d5c461924c

在标准RNN中,这个重复的结构模块只有一个非常简单的结构,如下图:

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第1张图片

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第2张图片

如上图所示, LSTM由三个门来控制细胞状态,这三个门分别称为遗忘门、输入门和输出门。

1.1、遗忘门

LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为遗忘门的sigmoid单元来处理的。它通过查看

h_{t-1}x_{t}信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态C_{t-1}中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。忘记门如下图所示。

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第3张图片

最终,通过f_{t}与细胞单元C_{t-1}来决定细胞单元有多少被遗忘,如下式:

C_{t}=f_{t}*C_{t-1}

1.2、输入门

下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容\widetilde{C}_{t},在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第4张图片

接下来就是更新输入细胞单元,更新规则就是通过遗忘门选择忘记的部分信息C_{t},再加上输入门添加候选的细胞信息\widetilde{C}_{t}从而得到新的细胞信息。计算公式如下:

C_{t}=C_{t}+i_{t}*\widetilde{C}_{t}

1.3、输出门

首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第5张图片

LSTM 两个激励函数sigmoid 和tanh的区别:

  1. sigmoid 用在了各种gate上,产生0~1之间的值,这个一般只有sigmoid最直接了。
  2. tanh 用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。

参考链接:LSTM 两个激励函数区别sigmoid 和tanh

参考链接:

人人都能看懂的LSTM

LSTM原理及实现

【译】理解LSTM(通俗易懂版)

二、GRU网络

GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。GRU摆脱了细胞状态并使用隐藏状态来传输信息。在GRU模型中只有两个门:分别是更新门和重置门。

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第6张图片

2.1、重置门

重置门控制前一状态有多少信息被写入到当前的候选集\widetilde{h}_{t}上,重置门越小,前一状态的信息被写入的越少。计算公式如下:

r_{t}=\sigma (W_{r}*[h_{t-1},x_{t}])

2.2、更新门

更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。更新门的作用类似于LSTM的遗忘门和输入门。它决定了要丢弃哪些信息以及要添加的新信息。计算公式如下:

z_{t}=\sigma (W_{z}*[h_{t-1},x_{t}])

GRU前向传播:

通过重置门重置上一时刻输出h^{{t-1}^{'}}=r_{t}*h^{t-1}的数据后,再将h^{{t-1}^{'}}x^{t}进行拼接,再通过激活函数tanh将数据缩放到-1~1范围内。计算公式为:\widetilde{h_{t}}=tanh(W_{\widetilde{h}}*[r_{t}*h_{t-1},x_{t}])

这里的 \widetilde{h_{t}}主要是包含了当前输入的x^{t}数据。有针对性地对\widetilde{h_{t}}添加到当前的隐藏状态,相当于”记忆了当前时刻的状态“。类似于LSTM的选择记忆阶段。

最后介绍GRU最关键的一个步骤,我们可以称之为”更新记忆“阶段。在这个阶段,我们同时进行了遗忘了记忆两个步骤。我们使用了先前得到的更新门控z_{t}(update gate)。更新表达式:h_{t}=(1-z_{t})\odot h_{t-1}+z_{t}\odot \widetilde{h_{t}}

最后,预测输出为:y_{t}=\sigma {W_{o}*h_{t}}

参考链接:

人人都能看懂的GRU

深度学习之GRU网络

一文了解LSTM和GRU背后的秘密(绝对没有公式)

一、LSTM(长短期记忆网络)

三、SRU网络

对于如机器翻译、语言模型、观点挖掘、问答系统等都依赖于RNN模型,而序列的前后依赖导致RNN并行化较为困难,所以其计算速度远没有CNN那么快。即使不管训练的耗时程度,部署时候只要模型稍微大点,实时性也会受到影响。

Tao Lei等人基于对LSTM、GRU等模型的研究,提出了SRU模型。在保证速度的前提下,准确度也是没有多少损失。而SRU网络结构的提出就是为了解决这个问题,SRU(simple recurrent units)将大部分运算放到进行并行处理,只是将有具有小量运算的步骤进行串行。

参考链接:https://www.cnblogs.com/shouhuxianjian/p/7804940.html

3.1、SRU网络结构

SRU的网络结构如下:

【深度学习系列(六)】:RNN系列(2):RNN的基础单元之LSTM、GRU以及SRU_第7张图片

(图片信息来源:https://www.cnblogs.com/shouhuxianjian/p/7804940.html)

SRU基础结构包含了一个单一的forget gate,假定输入Xt和时间t,则:

\widetilde{x_{t}}=Wx_{t}

f_{t}=\sigma (W_{f}x_{t}+b_{f})

上面的计算仅仅依靠Xt,因此,能够进行并行化处理。

通过遗忘门来更新隐藏状态c_{t},最终得到输出h_{t}

c_{t}=f_{t}\odot c_{t-1}+(1-f_{t})\odot \widetilde{x_{t}}

h_{t}=g(c_{t})

其中g表示激活函数。

另外,在论文中作者还在于引入残差结构,这样能够较好的提升性能。最终,网络的结构如下:

\widetilde{x_{t}}=Wx_{t}

f_{t}=\sigma (W_{f}x_{t}+b_{f})

r_{t}=\sigma (W_{r}x_{t}+b_{r})

c_{t}=f_{t}\odot c_{t-1}+(1-f_{t})\odot \widetilde{x_{t}}

h_{t}=r_{t}\odot g(c_{t})+(1-r_{t})\odot x_{t}

3.2、SRU并行优化

  • 所有时间步的矩阵相乘可以批次处理,这可以明显提升计算效率和GPU的使用。将上式中的三个权重矩阵合并成一个大矩阵。如下:

                        U^{T}=\left (\begin{matrix} W\\ W_{f}\\ W_{r} \end{matrix} \right )[x_{1},....x{t}]

  • 所有逐元素相乘的操作都可以放入一个kernel函数(cuda中的一个术语)中。如果不这么做。那么加法和sigmoid的激活函数就会分别需要调用各自独立的函数,并且增加额外的kernel运行延迟和数据移动的开销(这些都和gpu的计算有关,感兴趣的可以学习cuda)。

参考链接:https://www.cnblogs.com/shouhuxianjian/p/7804940.html

参考链接:

LSTM的加速算法:QRNN和SRU

Recurrent Neural Network[SRU]

SRU介绍

四、总结

RNN梯度消失和弥散以及LSTM为什么能解决?

tanh的梯度最大只能是1,而更多时候都是趋近于0的饱和状态,当求导得到的jacobian矩阵存在一些元素趋近于0,多个矩阵相乘,会使得梯度很快消失。

RNN中,每个记忆单元h_t-1都会乘上一个W和激活函数的导数,这种连乘使得记忆衰减的很快,而LSTM是通过记忆和当前输入"相加",使得之前的记忆会继续存在而不是受到乘法的影响而部分“消失”。

参考链接:https://zhuanlan.zhihu.com/p/32085405  

LSTM通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。

参考链接:https://zhuanlan.zhihu.com/p/32085405  

你可能感兴趣的:(深度学习)