作者 | 张皓

引言

RNN是深度学习中用于处理时序数据的关键技术, 目前已在自然语言处理, 语音识别, 视频识别等领域取得重要突破, 然而梯度消失现象制约着RNN的实际应用。LSTM和GRU是两种目前广为使用的RNN变体,它们通过门控机制很大程度上缓解了RNN的梯度消失问题,但是它们的内部结构看上去十分复杂,使得初学者很难理解其中的原理所在。本文介绍”三次简化一张图”的方法,对LSTM和GRU的内部结构进行分析。该方法非常通用,适用于所有门控机制的原理分析。

预备知识: RNN

RNN (recurrent neural networks, 注意不是recursiveneural networks)提供了一种处理时序数据的方案。和n-gram只能根据前n-1个词来预测当前词不同, RNN理论上可以根据之前所有的词预测当前词。在每个时刻, 隐层的输出ht依赖于当前词输入xt和前一时刻的隐层状态ht-1:

其中:=表示"定义为", sigm代表sigmoid函数sigm(z):=1/(1+exp(-z)), Wxh和Whh是可学习的参数。结构见下图:

图中左边是输入,右边是输出。xt是当前词,ht-1记录了上文的信息。xt和ht-1在分别乘以Wxh和Whh之后相加,再经过tanh非线性变换,最终得到ht。

在反向传播时,我们需要将RNN沿时间维度展开,隐层梯度在沿时间维度反向传播时需要反复乘以参数。因此, 尽管理论上RNN可以捕获长距离依赖, 但实际应用中,根据谱半径(spectralradius)的不同,RNN将会面临两个挑战:梯度爆炸(gradient explosion)和梯度消失(vanishing gradient)。梯度爆炸会影响训练的收敛,甚至导致网络不收敛;而梯度消失会使网络学习长距离依赖的难度增加。这两者相比, 梯度爆炸相对比较好处理,可以用梯度裁剪(gradientclipping)来解决,而如何缓解梯度消失是RNN及几乎其他所有深度学习方法研究的关键所在。

LSTM

LSTM通过设计精巧的网络结构来缓解梯度消失问题,其数学上的形式化表示如下:

其中代表逐元素相乘。这个公式看起来似乎十分复杂,为了更好的理解LSTM的机制, 许多人用图来描述LSTM的计算过程, 比如下面的几张图:

似乎看完了这些图之后,你对LSTM的理解还是一头雾水? 这是因为这些图想把LSTM的所有细节一次性都展示出来,但是突然暴露这么多的细节会使你眼花缭乱,从而无处下手。

因此,本文提出的方法旨在简化门控机制中不重要的部分,从而更关注在LSTM的核心思想。整个过程是“三次简化一张图”,具体流程如下:

第一次简化: 忽略门控单元i,f,o的来源。3个门控单元的计算方法完全相同, 都是由输入经过线性映射得到的, 区别只是计算的参数不同。这样做的目的是为了梯度反向传导时能对门控单元进行更新。这不是LSTM的核心思想, 在进行理解时,我们可以假定各门控单元是给定的。

第二次简化: 考虑一维情况。LSTM中对各维是独立进行门控的,所以为了理解方便,我们只需要考虑一维情况。

第三次简化: 各门控单元0/1输出。 门控单元输出是[0,1]实数区间的原因是阶跃激活函数无法反向传播进行优化, 所以各门控单元使用sigmoid激活函数去近似阶跃函数。 因此, 为了理解方便, 我们只需要考虑理想情况, 即各门控单元是{0,1}二值输出的,即门控单元扮演了电路中”开关”的角色, 用于控制信息传输的通断。

一张图: 将三次简化的结果用”电路图”表述出来,左边是输入,右边是输出。另外需要特别注意的是LSTM中的c实质上起到了RNN中h的作用, 这点在其他文献资料中不常被提到。最终结果如下:

和RNN相同的是,网络接受两个输入,得到一个输出。不同之处在于, LSTM中通过3个门控单元来对记忆单元c的信息进行交互。

根据这张图,我们可以对LSTM中各单元作用进行分析:

输入门it: it控制当前词xt的信息融入记忆单元ct。在理解一句话时,当前词xt可能对整句话的意思很重要,也可能并不重要。输入门的目的就是判断当前词xt对全局的重要性。当it开关打开的时候,网络将不考虑当前输入xt。

遗忘门ft: ft控制上一时刻记忆单元ct-1的信息融入记忆单元ct。在理解一句话时,当前词xt可能继续延续上文的意思继续描述,也可能从当前词xt开始描述新的内容,与上文无关。和输入门it相反, ft不对当前词xt的重要性作判断, 而判断的是上一时刻的记忆单元ct-1对计算当前记忆单元ct的重要性。当ft开关打开的时候,网络将不考虑上一时刻的记忆单元ct-1。

输出门ot: 输出门的目的是从记忆单元ct产生隐层单元ht。并不是ct中的全部信息都和隐层单元ht有关,ct可能包含了很多对ht无用的信息,因此, ot的作用就是判断ct中哪些部分是对ht有用的,哪些部分是无用的。

记忆单元ct:ct综合了当前词xt和前一时刻记忆单元ct-1的信息。这和ResNet中的残差逼近思想十分相似,通过从ct-1到ct的”短路连接”, 梯度得已有效地反向传播。 当ft处于闭合状态时, ct的梯度可以直接沿着最下面这条短路线传递到ct-1,不受参数W的影响,这是LSTM能有效地缓解梯度消失现象的关键所在。

GRU

GRU是另一种十分主流的RNN衍生物。RNN和LSTM都是在设计网络结构用于缓解梯度消失问题, 只不过是网络结构有所不同。GRU在数学上的形式化表示如下:

为了理解GRU的设计思想,我们再一次运用“三次简化一张图”的方法来进行分析:

第一次简化: 忽略门控单元z, r的来源。

第二次简化: 考虑一维情况。

第三次简化: 各门控单元0/1输出。这里和LSTM略有不同的地方在于,GRU需要引入一个”单刀双掷开关”。

一张图: 把三次简化的结果用”电路图”表述出来,左输入,右输出:

与LSTM相比,GRU将输入门it和遗忘门ft融合成单一的更新门zt,并且融合了记忆单元ct和隐层单元ht,所以结构上比LSTM更简单一些。

根据这张图,我们可以对GRU的各单元作用进行分析:

重置门rt:rt用于控制前一时刻隐层单元ht-1对当前词xt的影响。如果ht-1对xt不重要,即从当前词xt开始表述了新的意思,与上文无关, 那么rt开关可以打开, 使得ht-1对xt不产生影响。

更新门zt:zt用于决定是否忽略当前词xt。类似于LSTM中的输入门it, zt可以判断当前词xt对整体意思的表达是否重要。当zt开关接通下面的支路时,我们将忽略当前词xt,同时构成了从ht-1到ht的”短路连接”,这梯度得已有效地反向传播。和LSTM相同,这种短路机制有效地缓解了梯度消失现象, 这个机制于highwaynetworks十分相似。

小结

尽管RNN, LSTM,和GRU的网络结构差别很大,但是他们的基本计算单元是一致的,都是对xt和ht-1做一个线性映射加tanh激活函数,见三个图的红色框部分。他们的区别在于如何设计额外的门控机制控制梯度信息传播用以缓解梯度消失现象。LSTM用了3个门,GRU用了2个,那能不能再少呢? MGU (minimal gate unit)尝试对这个问题做出回答, 它只有一个门控单元。

最后留个小练习, 参考LSTM和GRU的例子,你能不能用“三次简化一张图”的方法来分析一下MGU呢?

参考文献

1. Bengio, Yoshua, PatriceSimard, and Paolo Frasconi。 "Learning long-term dependencies with gradient descent isdifficult。" IEEE transactions on neural networks 5。2 (1994):157-166。

2. Cho, Kyunghyun, et al。"Learning phrase representations using RNN encoder-decoder for statisticalmachine translation。" arXiv preprint arXiv:1406。1078 (2014)。

3. Chung, Junyoung, et al。"Empirical evaluation of gated recurrent neural networks on sequencemodeling。" arXiv preprint arXiv:1412。3555 (2014)。

4. Gers, Felix。 "Longshort-term memory in recurrent neural networks。" UnpublishedPhD dissertation, Ecole Polytechnique Fédérale de Lausanne, Lausanne, Switzerland(2001)。

5. Goodfellow, Ian, YoshuaBengio, and Aaron Courville。 Deep learning。 MIT press, 2016。

6. Graves, Alex。 Supervisedsequence labelling with recurrent neural networks。 Vol。 385。 Heidelberg:Springer, 2012。

7. Greff, Klaus, et al。 "LSTM:A search space odyssey。" IEEE transactions on neural networks and learning systems(2016)。

8. He, Kaiming, et al。 "Deepresidual learning for image recognition。" Proceedingsof the IEEE conference on computer vision and pattern recognition。 2016。

9. He, Kaiming, et al。"Identity mappings in deep residual networks。" EuropeanConference on Computer Vision。 Springer International Publishing, 2016。

10. Hochreiter, Sepp, and JürgenSchmidhuber。 "Long short-term memory。" Neuralcomputation 9。8 (1997): 1735-1780。

11. Jozefowicz, Rafal, WojciechZaremba, and Ilya Sutskever。 "An empirical exploration of recurrent network architectures。" Proceedingsof the 32nd International Conference on Machine Learning (ICML-15)。 2015。

12. Li, Fei-Fei, JustinJohnson, and Serena Yeung。 CS231n: Convolutional Neural Networks for Visual Recognition。 Stanford。 2017。

13. Lipton, Zachary C。, JohnBerkowitz, and Charles Elkan。 "A critical review of recurrent neural networks for sequencelearning。" arXiv preprint arXiv:1506。00019 (2015)。

14. Manning, Chris andRichard Socher。 CS224n: Natural Language Processing with Deep Learning。 Stanford。 2017。

15. Pascanu, Razvan, Tomas Mikolov, and YoshuaBengio。 "On the difficulty of training recurrent neural networks。"International Conference on Machine Learning。 2013。

16. Srivastava, RupeshKumar, Klaus Greff, and Jürgen Schmidhuber。 "Highwaynetworks。" arXiv preprint arXiv:1505。00387 (2015)。

17. Williams, D。 R。 G。 H。 R。, andGeoffrey Hinton。 "Learning representations by back-propagating errors。"Nature 323。6088 (1986): 533-538。

18. Zhou, Guo-Bing, et al。"Minimal gated unit for recurrent neural networks。"International Journal of Automation and Computing 13。3 (2016):226-234。

本文是投稿文章,作者:张皓

github地址:https://github.com/HaoMood/

注:AI科技大本营现已开通投稿通道,投稿请加编辑微信1092722531

技能|三次简化一张图:一招理解LSTM/GRU门控机制的更多相关文章

  1. 几张图帮你理解 docker 基本原理及快速入门

    写的非常好的一篇文章,不知道为什么被删除了.  利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...

  2. [转] 图 + 文 + 公式 理解LSTM

    转自公号“机器之心” LSTM入门必读:从入门基础到工作方式详解 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用..在这篇文章中,Edwin ...

  3. 三张图较为好理解JavaScript的原型对象与原型链

    最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...

  4. 一张图11招学会Python网络黑客

    全部学起来: 第一招:搭建Python防范环境 第二招:扫描漏洞 第三招:暴力破解的秘密 第四招:防SQL注入 第五招:防命令注入 第六招:看清文件上传木马 第七招:看清Web攻击 第八招:利用Pyt ...

  5. 【转载的】这张图能容易理解sql joins,收藏下!

  6. 通过100张图一步步理解CNN

    https://blog.csdn.net/v_july_v/article/details/79434745 Youtube上迄今为止最好的卷积神经网络快速入门教程 https://www.bili ...

  7. 10张图带你深入理解Docker容器和镜像

    http://dockone.io/article/783 [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. Doc ...

  8. 10 张图带你深入理解 Docker 容器和镜像

    这篇文章希望能够帮助读者深入理解 Docker 的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对 Docker 技术还是一知半解的 ...

  9. 10张图带你深入理解Docker容器和镜像-转

    转载:http://dockone.io/article/783 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行 ...

随机推荐

  1. Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力

    D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...

  2. 如何利用Reveal神器查看各大APP UI搭建层级

    作者 乔同X2016.08.22 19:45 写了3195字,被42人关注,获得了73个喜欢 如何利用Reveal神器查看各大APP UI搭建层级 字数413 阅读110 评论0 喜欢5 title: ...

  3. RubyMine8 安装

    在win7下面安装RubyMine8 中文 汉化 1.需要下载 RubyMine8的程序包 2.先安装好 RubyMine8  很简单  点击下一步就可以  选择安装目录这应该就不需要说了 3.汉化 ...

  4. spring data jpa在使用PostgreSQL表名大小写的问题解决

    国内的文章看了一遍,其实没找到根本问题解决方法,下面将列举这一系列的问题解决方法: 1.在配置文件增加如下配置: spring.jpa.hibernate.naming.physical-strate ...

  5. 通过Windows Compatibility Pack补充.net core中缺失的api

    把项目往.net core上迁移的时候,一个最大的问题就是和.net framework相比,有一部分api缺失.它主要分为两类: Windows 独有的api,如注册表 未完成的功能,如System ...

  6. DTrace Probes in HotSpot VM

    http://docs.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html

  7. Creating popup windows in XBAP applications

    A colleague at DevelopMentor recently asked me about creating popup windows in XAML browser applicat ...

  8. 国内打不开onedrive,怎么办?

    Onedrive不能正常连接使用是由于DNS遭到污染闹的,其上传和下载文件慢也是DNS遭到污染闹的. 方法/步骤   在C盘windows/system32/drivers/etc/hosts下,用记 ...

  9. 哈希小demo hashCode取模

    package demo; import java.util.ArrayList; import java.util.List; class Person { private String usern ...

  10. ISO 8601: Delphi way to convert XML date and time to TDateTime and back (via: Stack Overflow)

    Recently I needed a way of concerting back and forth ISO 8601 DateTime values used in XML from Delph ...