LSTM的“前生今世”

更多深度文章,请关注:https://yq.aliyun.com/cloud



循环神经网络(RNN

人脑因为某种机制的存在,从来不会从头开始思考。当你阅读这篇文章时,你会根据你对以前的词意的理解来理解每个单词。你从来不会把所有东西都扔掉,再从头开始思考。由于这种机制的存在,我们的大脑变得无比高效。算法其实就是模拟我们人类思维的一种真实映射。不管是RNN,还是LSTM它们都是基于人类思维的一种数学表现形式。

但传统神经网络不能做到这一点,这似乎是一个很大的缺陷。例如,想象一下你想要分析一个电影中每个点发生什么样的事件。传统的神经网络是不能够利用电影中以前的事件的来推理出以后的事件。但循环神经网络解决了这个问题。它是具有循环的网络,允许信息持续存在。

在上图中,一个神经网络,A,输入Xt并输出Ht。循环允许信息从网络的一个步骤传递到下一个。

这些循环使得循环神经网络看起来很神秘。然而,如果你在深入的思考一下,那就证明它们并不是一般的神经网络。一个循环的神经网络可以被认为是同一个网络的多个副本,它们每一个都会传递给后继者的消息。考虑如果我们展开循环神经网络会发生什么呢?请看下图:

这种链状特征揭示了循环神经网络与序列和列表的关系非常密切。RNN是用于分析此类数据的神经网络的自然结构。

在过去的几年里,RNN应用于语音识别,语言建模,翻译,图像字幕等各种问题上,并且取得了巨大的成功。这些成功的基础是使用“LSTM”,这是一种非常特殊的循环神经网络,对于许多任务来说,它比标准版本要好的多。几乎所有基于循环神经网络的令人兴奋的结果都是通过它实现的。本文就着重探讨LSTM。

长期依赖的问题

RNN的功能之一就是他们可以能够将先前的信息连接到当前任务,例如使用先前的视频帧可以增加对当前帧的理解。如果RNN可以做到这一点,他们将非常有用。

但有时,我们只需要查看最近的信息来执行当前的任务。例如,考虑一种语言模型,尝试基于以前的单词来预测下一个单词。例如我们试图预测“云在天空 ”中的最后一个字,我们就不需要任何其他的语境。在这种情况下,如果相关信息与所需神经元之间的差距很小,则RNN可以使用过去的信息。

但也有需要更多上下文的情况。考虑尝试预测文本中的最后一个单词“我在法国长大…….我说流利的法语。最近的信息表明,下一个单词可能是一种语言的名称,但是如果我们想缩小范围确定是哪种语言,我们需要法国的背景,从而进一步的来确定。这时,相关信息之间的差距就变得非常大。不幸的是,随着距离的扩大,RNN无法学会使用过去信息。

理论上,RNN绝对有能力处理类似的“长期依赖”。人们可以仔细挑选参数来解决这种形式的玩具问题。不幸的是,在实践中,RNN似乎没有办法做到这些。Hochreiter(1991)[German]Bengio等人深入探讨了这个问题。他们发现解决这个问题是非常困难的。幸运的是,LSTM成功的解决了这个问题!

LSTM网络

Long Short Term Memory(通常称为“LSTM”)是一种特殊的RNN,能够保存长期的依赖关系。在这个模型中,常规的神经元,即一个将S型激活应用于其输入线性组合的单位,被存储单元所代替。每个存储单元是与一个输入门,一个输出门和一个跨越时间步骤无干扰送入自身的内部状态相关联。它是由Hochreiter&Schmidhuber(1997)介绍,并且许多人对它进行了精炼和普及。

所有的循环神经网络都具有神经网络重复模块链。在标准的RNN中,该重复模块具有非常简单的结构,例如单个tanh层。

LSTM也具有这样的链结构,但是重复模块具有不同的结构。没有一个单一的神经网络层,而是有四个,并且以非常特殊的方式进行交互。

不要担心改变了什么细节。接下来我们将逐步介绍LSTM。现在,先熟悉我们将要使用的符号。

在上图中,每一行都含有从一个节点的输出到其他节点的输入的整个向量。粉色圆圈表示点向运算,如向量加法,而黄色框是神经网络层。行合并表示连接,而行交叉表示其内容正在复制,副本将转送到不同的位置。

LSTM的核心思想

LSTM的关键是细胞状态,即水平线穿过图的顶部。

细胞状态类似于输送带。它直接在整个链上运行,只有一些小的线性相互作用。信息很容易的可以通过它并且保持不变。

LSTM确实具有删除或添加信息到细胞状态的能力,这种能力由被称为门的结构调节使用。门是一种可选择地让信息通过的方式。它们由S形的神经网络层和点向乘法运算组成。

SIGMOID函数输出值是0或者1,它描述每个组件应该通过多少数据。值为0表示“如何都不能通过”,而值为1意味着“让一切通过!”

LSTM有三个门,用于保护和控制细胞状态。

一步一步“走过”LSTM

LSTM的第一步就是决定我们要从单元格中丢弃什么信息。这一决定是由一个sigmoid layer控制的。它主要控制ht−1和xt之间的计算,输出0或者1。1代表“完全保持”,而0 代表“彻底丢弃”。

我们回到一个语言模型的例子,试图根据所有以前的语料来预测下一个单词。在这样的问题中,细胞状态可能包括当前主题(subject)的词性的分析,从这些分析中,我们可以使用正确的代词或者动词。

下一步是决定我们要在单元格状态下存储的新信息。这有两部分,首先,称为“输入门层”的S形层(sigmoid layer)决定了我们将更新哪些值。接下来,tanh层会创建新的候选值的向量。在下一步中,我们将结合这两个来创建对状态的更新。

在我们的语言模型的例子中,我们希望将新主题的词性可以添加到单元格状态,以替换我们忘记的旧词性。

现在是更新旧细胞状态的时候了,我们把旧状态乘以ft,忘记我们之前决定忘记的事情。然后我们加it∗Ct,这是新的候选状态,按照我们决定更新每个状态值的程度来衡量。

在语言模型的情况下,我们实际上已经删除关于旧主题词性的信息,并添加了新信息,正如我们在之前的步骤中所做的。

最后,我们需要决定我们要输出什么。此输出将基于我们的单元格状态,但这将是一个过滤版本。首先,我们运行一个sigmoid层,它决定了我们要输出的单元格状态的哪些部分。然后,我们把细胞状态通过tanh,并将其乘以sigmoid门的输出,以便我们只输出我们需要的部分。

对于语言模型,由于它只是看到一个主题,它可能需要输出与动词相关的信息,以防下一步需要。例如,它可能会输出主题是单数还是复数,以便我们知道动词应该如何组合在一起。

LSTM变异

到目前为止我所描述的是一个很正常的LSTM。但并不是所有的LSTM都与上述相同。事实上,几乎每一篇涉及LSTM的论文都使用了一个略有不同的版本。差异很小,但值得一提的是它们。

Gers&Schmidhuber(2000)介绍的一种受欢迎的LSTM变体添加了“窥视孔连接(peephole connections)”。这意味着我们让门层看着单元格状态。

上面的图就是增加了所有的门的窥视。

另一种变异是使用耦合的忘记(coupled forget)和输入门。而不是单独决定要忘记什么,我们应该添加新信息,然后一起做出这些决定。

LSTM的更显著的变化是由Cho等人(2014)介绍的门控循环单元或GRU 。它将忘记和输入门组合成一个单一的“更新门”,还合并了单元格状态和隐藏状态,并进行了一些其他更改。所得到的模型比标准LSTM模型更简单,并且越来越受欢迎。

这些是最显著的LSTM变体。还有很多其他的,如Yao等人2015 Depth Gated RNNs 。还有一些完全不同的处理长期依赖的方法,例如Koutnik2014等人的 Clockwork RNNs。

哪些变体最好?分歧是否重要?Greff等人 (2015)做了一个很好的比较流行的变种,发现这些变异都是一样的。Jozefowicz,et al(2015)测试了一万多个RNN架构,发现在某些任务上它们的表现比LSTM更好。

结论

此前,我说人们通过RNN取得了显著的成果,这些成果基本上都是使用LSTM实现的。这足以表明LSTM的强大。可能写成一组方程式,会让LSTM看起来很吓人。但我希望在这篇文章中你会对它有一个认识,使他们变得更加平易近人。

LSTM是RNN发展的一大步。很自然的想法:还有另一大步吗?研究人员的共同观点是:“是的!还有下一步,值得关注!“这个想法是让RNN的每个步骤从一些较大的信息集合中挑选信息。例如,如果您使用RNN创建描述图像的标题,则可能会选择图像的一部分来查看其输出的每个字。事实上,徐(2015)做到了这一点 ,如果你想要引起注意,这可能是一个有趣的起点!

致谢

我很感谢一些人帮助我更好地了解LSTM, 我非常感谢Google的同事们有用的反馈,特别是Oriol VinyalsGreg CorradoJon ShlensLuke VilnisIlya Sutskever。我也感谢许多其他朋友和同事花时间帮助我,包括达里奥·阿莫德迪雅各布·斯坦哈特

文章原标题《Understanding LSTM Networks》

作者:colah 博客:http://colah.github.io

译者:袁虎 审阅:

文章为简译,更为详细的内容,请查看原文

时间: 2025-01-04 05:48:21

LSTM的“前生今世”的相关文章

揭秘无文件恶意软件的前生今世

本文讲的是揭秘无文件恶意软件的前生今世, 一听到无文件恶意软件,很多企业和个人用户都感觉无所适从.因为目前的很过防御检测技术还足以对这些攻击产生有效的拦截.无文件恶意真有这么厉害吗?今天我们就来详细的回顾一下它的历史,并结合一些目前已经查明的恶意软件样本进行具体分析. 根据Google Trends监测,无文件恶意软件这个词出现在2012年到2014年之间.不过随着恶意软件的开发者开始在攻击中频繁的使用这一技术,网络安全人员对这一术语的集中大规模讨论却发生在2015年,直至2017年随着网络安全

解构APT:高级持续性威胁的前生今世

本文讲的是 解构APT:高级持续性威胁的前生今世,就像来自IT.信息.网络安全行业很多缩略词一样,APT(高级持续性威胁)这个术语正变得广为人知.就像新生概念一样,它和它的兄弟词语AET(高级逃逸技术)占据了当今各大媒体的头条. 然而,从这两个术语涉及的最基本层面上来看,它们并没有任何创新.新的简写的确概括了当今这个高度信息化的时代遇到的一些真正的威胁,但它们只是在没人注意的时候偷偷重新发明了自己.因此,APT里代表持续性(Persistent)的那个"P"看上去才显得如此恰当(apt

柯里化的前生今世(一):函数面面观

关于 本文作为开篇,介绍了出场人物,并形象化的引入了高阶函数, 得到了柯里化的概念. 后续文章,会介绍高阶函数的实现方式,词法作用域和闭包,参数化类型,类型上的柯里化, 敬请期待. 如有不同的认识,或者感兴趣的点,请直接联系我,欢迎指教. 人物介绍 球星库里 库里,Stephen Curry,1988年3月14日出生于美国俄亥俄州阿克伦(Akron, Ohio), 美国职业篮球运动员,司职控球后卫,效力于NBA金州勇士队. 斯蒂芬·库里2009年通过选秀进入NBA后一直效力于勇士队,新秀赛季入选

柯里化的前生今世(八):尾调用与CPS

关于 在上一篇中,我们介绍了continuation的概念,还介绍了Lisp中威力强大的call/cc,它提供了first-class continuation,最后我们用call/cc实现了python中的generator和yield. call/cc赋予了我们很强的表达能力,Lisp中的异常处理机制也很人性化. 例如,Common Lisp: Condition_system, 由于call/cc可以捕捉到异常处的continuation, 我们就可以手动调用这个continuation,

HBase GC的前生今世 – 身世篇

在之前的HBase BlockCache系列文章中已经简单提到:使用LRUBlockCache缓存机制会因为CMS GC策略导致内存碎片过多,从而可能引发臭名昭著的Full GC,触发可怕的'stop-the-world'暂停,严重影响上层业务:而Bucket Cache缓存机制因为在初始化的时候就申请了一片固定大小的内存作为缓存,缓存淘汰不再由 JVM管理,数据Block的缓存操作只是对这篇空间的访问和覆盖,因而大大减少了内存碎片的出现,降低了Full GC发生的频率.那CMS GC策略如何导

交互设计探秘抽屉导航的前生今世

  @沐沐成长中 :Google不久前刚刚更新了他们的Google+应用,采用了新的导航方式并抛弃了navigationdrawer.一时之间,又引发了一系列关于NavigationDrawer利弊的讨论. Navigationdrawer又被称为"OffCanvas"."hamburgernavigation"."sidenavigation"."slidemenu"等等,虽然叫法不一样,但大致都是同一种形式的导航. Nav

柯里化的前生今世(十一):Pure and Lazy

语言的作用 语言可以用来交流想法,描述概念, 当前使用了什么语言,取决于我们有什么样的需要. 为了理解词法作用域,闭包,和continuation, 前文中,我们借助了Racket. 现在,为了理解代数数据类型(algebraic data type),多态(polymorphism),参数化类型(parameterized type),类型类(type class),我们要学习Haskell了. 编程也是如此,它是关于思想的, 编程语言只是描述这种思想的工具罢了. 非严格语义(non-stri

HBase GC的前生今世 – 演进篇

最原始的HBase CMS GC相当严重,经常会因为碎片过多导致Promotion Failure,严重影响业务的读写请求.幸运的是,HBase并没有止步不前,很多优化方案相继被提出并贡献给社区,本文要介绍的就是几个比较重要的核心优化,分别是针对Memstore所作的两个优化:Thread-Local Allocation Buffer和MemStore Chunk Pool 以及针对BlockCache所作的优化:BucketCache方案.在详细介绍这几个优化之前有必要简单介绍一下HBase

HBase Compaction的前生今世-身世之旅

了解HBase的童鞋都知道,HBase是一种Log-Structured Merge Tree架构模式,用户数据写入先写WAL,再写缓存,满足一定条件后缓存数据会执行flush操作真正落盘,形成一个数据文件HFile.随着数据写入不断增多,flush次数也会不断增多,进而HFile数据文件就会越来越多.然而,太多数据文件会导致数据查询IO次数增多,因此HBase尝试着不断对这些文件进行合并,这个合并过程称为Compaction. Compaction会从一个region的一个store中选择一些