lstm 订阅
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。 展开全文
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
信息
外文名
Long-Short Term Memory
缩    写
LSTM
中文名
长短期记忆网络
长短期记忆人工神经网络简介
长短期记忆网络(Long-Short Term Memory,LSTM)论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好,比如用在不分段连续手写识别上。2009年,用LSTM构建的人工神经网络模型赢得过ICDAR手写识别比赛冠军。LSTM还普遍用于自主语音识别,2013年运用TIMIT自然演讲数据库达成17.7%错误率的纪录。作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。 [1] 
收起全文
精华内容
参与话题
问答
  • LSTM这一篇就够了

    万次阅读 多人点赞 2019-09-16 15:02:25
    ▌短时记忆 NN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。...

    640?wx_fmt=gif

    转自AI大本营https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/82922386

    短时记忆

    NN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。

    在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。
    640?wx_fmt=png

                                                                                        梯度更新规则

    因此,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

    作为解决方案的 LSTM 和 GRU

    LSTM 和 GRU 是解决短时记忆问题的解决方案,它们具有称为“门”的内部机制,可以调节信息流。

    640?wx_fmt=png

    这些“门”可以知道序列中哪些重要的数据是需要保留,而哪些是要删除的。 随后,它可以沿着长链序列传递相关信息以进行预测,几乎所有基于递归神经网络的技术成果都是通过这两个网络实现的。

    LSTM 和 GRU 可以在语音识别、语音合成和文本生成中找到,你甚至可以用它们为视频生成字幕。对 LSTM 和 GRU 擅长处理长序列的原因,到这篇文章结束时你应该会有充分了解。 

    下面我将通过直观解释和插图进行阐述,并避免尽可能多的数学运算。

    RNN 述评

    为了了解 LSTM 或 GRU 如何实现这一点,让我们回顾一下递归神经网络。 RNN 的工作原理如下;第一个词被转换成了机器可读的向量,然后 RNN 逐个处理向量序列。

    640?wx_fmt=gif

    处理时,RNN 将先前隐藏状态传递给序列的下一步。 而隐藏状态充当了神经网络记忆,它包含相关网络之前所见过的数据的信息。

    640?wx_fmt=gif

    让我们看看 RNN 的一个细胞,了解一下它如何计算隐藏状态。 首先,将输入和先前隐藏状态组合成向量, 该向量包含当前输入和先前输入的信息。 向量经过激活函数 tanh之后,输出的是新的隐藏状态或网络记忆。

    640?wx_fmt=gif

     

    激活函数 Tanh

    激活函数 Tanh 用于帮助调节流经网络的值。 tanh 函数将数值始终限制在 -1 和 1 之间。

    640?wx_fmt=gif

     

    当向量流经神经网络时,由于有各种数学运算的缘故,它经历了许多变换。 因此想象让一个值继续乘以 3,你可以想到一些值是如何变成天文数字的,这让其他值看起来微不足道。

    640?wx_fmt=gif

     

                                                                                          没有 tanh 函数的向量转换

    tanh 函数确保值保持在 -1~1 之间,从而调节了神经网络的输出。 你可以看到上面的相同值是如何保持在 tanh 函数所允许的边界之间的。

    640?wx_fmt=gif

                                                                                        有 tanh 函数的向量转换

    这是一个 RNN。 它内部的操作很少,但在适当的情形下(如短序列)运作的很好。 RNN 使用的计算资源比它的演化变体 LSTM 和 GRU 要少得多。

     

    LSTM

    LSTM 的控制流程与 RNN 相似,它们都是在前向传播的过程中处理流经细胞的数据,不同之处在于 LSTM 中细胞的结构和运算有所变化

    640?wx_fmt=png

     

    这一系列运算操作使得 LSTM具有能选择保存信息或遗忘信息的功能。咋一看这些运算操作时可能有点复杂,但没关系下面将带你一步步了解这些运算操作。

    核心概念

    LSTM 的核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。

    因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。
     

    Sigmoid

    门结构中包含着 sigmoid 激活函数。Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到 0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息,因为任何数乘以 0 都得 0,这部分信息就会剔除掉。同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。这样网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。
    640?wx_fmt=gif

    接下来了解一下门结构的功能。LSTM 有三种类型的门结构:遗忘门、输入门和输出门。

    遗忘门

     

    遗忘门的功能是决定应丢弃或保留哪些信息。来自前一个隐藏状态的信息和当前输入的信息同时传递到 sigmoid 函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。

    640?wx_fmt=gif

    输入门

    输入门用于更新细胞状态。首先将前一层隐藏状态的信息和当前输入的信息传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要。

    其次还要将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。
    640?wx_fmt=gif

     

    细胞状态

    下一步,就是计算细胞状态。首先前一层的细胞状态与遗忘向量逐点相乘。如果它乘以接近 0 的值,意味着在新的细胞状态中,这些信息是需要丢弃掉的。然后再将该值与输入门的输出值逐点相加,将神经网络发现的新信息更新到细胞状态中去。至此,就得到了更新后的细胞状态。

    640?wx_fmt=gif

     

    输出门

    输出门用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态和当前输入传递到 sigmoid 函数中,然后将新得到的细胞状态传递给 tanh 函数。

    最后将 tanh 的输出与 sigmoid 的输出相乘,以确定隐藏状态应携带的信息。再将隐藏状态作为当前细胞的输出,把新的细胞状态和新的隐藏状态传递到下一个时间步长中去。


    640?wx_fmt=gif

    让我们再梳理一下。遗忘门确定前一个步长中哪些相关的信息需要被保留;输入门确定当前输入中哪些信息是重要的,需要被添加的;输出门确定下一个隐藏状态应该是什么。

    GRU

    知道了 LSTM 的工作原理之后,来了解一下 GRU。GRU 是新一代的循环神经网络,与 LSTM 非常相似。与 LSTM 相比,GRU 去除掉了细胞状态,使用隐藏状态来进行信息的传递。它只包含两个门:更新门和重置门。

    640?wx_fmt=png

     

    更新门

    更新门的作用类似于 LSTM 中的遗忘门和输入门。它决定了要忘记哪些信息以及哪些新信息需要被添加。

    重置门

    重置门用于决定遗忘先前信息的程度。

    这就是 GRU。GRU 的张量运算较少,因此它比 LSTM 的训练更快一下。很难去判定这两者到底谁更好,研究人员通常会两者都试一下,然后选择最合适的。
     

    展开全文
  • 什么是LSTM算法?

    万次阅读 2019-01-16 14:51:34
    经常接触LSTM,GRU,RNN这些模型,对于LSTM的印象只是知道它用来解决梯度消失梯度爆炸问题,对于长距离的句子的学习效果不好的问题,而且大概知道里面是加了一些参数,加了门单元来选择忘记和记住一些信息。...

    个人认为下面这篇博文非常适合初学或者学的很浅的朋友。
    转自http://www.jianshu.com/p/9dc9f41f0b29

    经常接触LSTM,GRU,RNN这些模型,对于LSTM的印象只是知道它用来解决梯度消失梯度爆炸问题,对于长距离的句子的学习效果不好的问题,而且大概知道里面是加了一些参数,加了门单元来选择忘记和记住一些信息。但是具体公式没有推过,所以理解的不够深。

    但是上面这篇长博文,作者真心花了很多心血来创作,写的详细,易懂,对于学习lstm有很大的帮助。

    读完后我觉得要理解几个门的作用,文中作者提到的三个例子恰到好处。个人认为这三个例子是弄明白lstm的关键。

    忘记门:
    作用对象:细胞状态
    作用:将细胞状态中的信息选择性的遗忘
    让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的类别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
    例如,他今天有事,所以我。。。当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。

    输入层门:
    作用对象:细胞状态
    作用:将新的信息选择性的记录到细胞状态中
    在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。
    例如:他今天有事,所以我。。。。当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。

    输出层门:
    作用对象:隐层ht
    在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
    例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。
    会把前面的信息保存到隐层中去。

    Gated Recurrent Unit (GRU)就是lstm的一个变态,这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

    以上的观点纯属个人通过学习这篇博文后的一些理解,有错误的地方请大家见谅。


    [译] 理解 LSTM 网络

    本文译自 Christopher Olah 的博文

    Recurrent Neural Networks

    人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。
    传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。
    RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。


    RNN 包含循环

    在上面的示例图中,神经网络的模块,A,正在读取某个输入 x_i,并输出一个值 h_i。循环可以使得信息可以从当前步传递到下一步。
    这些循环使得 RNN 看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:


    展开的 RNN


    链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。
    并且 RNN 也已经被人们应用了!在过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。我建议大家参考 Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 来看看更丰富有趣的 RNN 的成功应用。
    而这些成功应用的关键之处就是 LSTM 的使用,这是一种特别的 RNN,比标准的 RNN 在很多的任务上都表现得更好。几乎所有的令人振奋的关于 RNN 的结果都是通过 LSTM 达到的。这篇博文也会就 LSTM 进行展开。

    长期依赖(Long-Term Dependencies)问题

    RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。
    有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。


    不太长的相关信息和位置间隔

    但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。
    不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。


    相当长的相关信息和位置间隔

    在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。
    然而,幸运的是,LSTM 并没有这个问题!

    LSTM 网络

    Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
    LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
    所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。


    标准 RNN 中的重复模块包含单一的层


    LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。


    LSTM 中的重复模块包含四个交互的层


    不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。


    LSTM 中的图标


    在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

    LSTM 的核心思想

    LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
    细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。


    Paste_Image.png

    LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。


    Paste_Image.png


    Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!

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

    逐步理解 LSTM

    在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 h_{t-1}x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态 C_{t-1} 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
    让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语


    决定丢弃信息


    下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,\tilde{C}_t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。
    在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。


    确定更新的信息

    现在是更新旧细胞状态的时间了,C_{t-1} 更新为 C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。
    我们把旧状态与 f_t 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
    在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。


    更新细胞状态

    最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
    在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。


    输出信息

    LSTM 的变体

    我们到目前为止都还在介绍正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。
    其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。


    peephole 连接

    上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。

    另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。


    coupled 忘记门和输入门


    另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。


    GRU


    这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
    要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。


    Jozefowicz等人论文截图

    结论

    刚开始,我提到通过 RNN 得到重要的结果。本质上所有这些都可以使用 LSTM 完成。对于大多数任务确实展示了更好的性能!
    由于 LSTM 一般是通过一系列的方程表示的,使得 LSTM 有一点令人费解。然而本文中一步一步地解释让这种困惑消除了不少。
    LSTM 是我们在 RNN 中获得的重要成功。很自然地,我们也会考虑:哪里会有更加重大的突破呢?在研究人员间普遍的观点是:“Yes! 下一步已经有了——那就是注意力!” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,如果你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上,Xu, et al.(2015)已经这么做了——如果你希望深入探索注意力可能这就是一个有趣的起点!还有一些使用注意力的相当振奋人心的研究成果,看起来有更多的东西亟待探索……
    注意力也不是 RNN 研究领域中唯一的发展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是很有前途。使用生成模型的 RNN,诸如Gregor, et al. (2015) Chung, et al. (2015) Bayer & Osendorfer (2015) 提出的模型同样很有趣。在过去几年中,RNN 的研究已经相当的燃,而研究成果当然也会更加丰富!

    致谢

    I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.
    I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals,Greg Corrado, Jon Shlens, Luke Vilnis, and Ilya Sutskever. I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt. I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.
    Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.




    原文地址:http://blog.csdn.net/u014422406/article/details/52806430

    http://www.jianshu.com/p/9dc9f41f0b29

    展开全文
  • 从复杂系统的历史故障数据出发,提出了一种基于长短期记忆(LSTM)循环神经网络的故障时间序列预测方法,包括网络结构设计、网络训练和预测过程实现算法等,进一步以预测误差最小为目标,提出了一种基于多层网格搜索的LSTM...
  • LSTM原理详解

    万次阅读 多人点赞 2019-03-20 16:14:43
    LSTM 长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。 长短时记忆网络的思路: 原始 RNN 的隐藏层只有一个状态,...

    LSTM

    长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。

    长短时记忆网络的思路:

    原始 RNN 的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。
    再增加一个状态,即c,让它来保存长期的状态,称为单元状态(cell state)。

    把上图按照时间维度展开:

    在 t 时刻,LSTM 的输入有三个:当前时刻网络的输入值 X_t、上一时刻 LSTM 的输出值 h_t-1、以及上一时刻的单元状态 C_t-1
    LSTM 的输出有两个:当前时刻 LSTM 输出值 h_t、和当前时刻的单元状态 C_t.

    关键问题是:怎样控制长期状态 c ?

    方法是:使用三个控制开关

    第一个开关,负责控制继续保存长期状态c;
    第二个开关,负责控制把即时状态输入到长期状态c;
    第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。

    如何在算法中实现这三个开关?

    方法:用 门(gate)

    定义:gate 实际上就是一层全连接层,输入是一个向量,输出是一个 0到1 之间的实数向量。

    公式为:

    也就是:

    gate 如何进行控制?

    方法:用门的输出向量按元素乘以我们需要控制的那个向量
    原理:门的输出是 0到1 之间的实数向量,当门输出为 0 时,任何向量与之相乘都会得到 0 向量,这就相当于什么都不能通过;
    输出为 1 时,任何向量与之相乘都不会有任何改变,这就相当于什么都可以通过。

    LSTM 的前向计算

    一共有 6 个公式

    遗忘门(forget gate)
    它决定了上一时刻的单元状态 c_t-1 有多少保留到当前时刻 c_t

    输入门(input gate)
    它决定了当前时刻网络的输入 x_t 有多少保存到单元状态 c_t

    输出门(output gate)
    控制单元状态 c_t 有多少输出到 LSTM 的当前输出值 h_t

    遗忘门的计算为:

    遗忘门的计算公式中:
    W_f 是遗忘门的权重矩阵,[h_t-1, x_t] 表示把两个向量连接成一个更长的向量,b_f是遗忘门的偏置项,σ 是 sigmoid 函数。

    输入门的计算:

    根据上一次的输出和本次输入来计算当前输入的单元状态:

    当前时刻的单元状态 c_t 的计算:由上一次的单元状态 c_t-1 按元素乘以遗忘门 f_t,再用当前输入的单元状态 c_t 按元素乘以输入门 i_t,再将两个积加和:这样,就可以把当前的记忆 c_t 和长期的记忆 c_t-1 组合在一起,形成了新的单元状态 c_t。由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。

    输出门的计算:

    关于它的 Tuning 有下面几个建议:

    LSTM的变种

    Cho介绍的门控循环单元(或GRU)

    多层LSTM

    LSTM的手写识别源码链接

    https://github.com/geroge-gao/deeplearning/tree/master/LSTM

    【参考】

    https://www.jianshu.com/p/dcec3f07d3b5

    https://www.cnblogs.com/wangduo/p/6773601.html?utm_source=itdadao&utm_medium=referral

    https://www.jianshu.com/p/4b4701beba92

    Stacked Long Short-Term Memory Networks

    【注】有关LSTM前向传播以及反向传播误差修正部分值得关注!

    展开全文
  • LSTM 详解

    千次阅读 2019-03-17 22:10:57
    这篇文章打算讲一下LSTM,虽然这类文章已经很多了,但以前刚开始看的时候还是一知半解,有一些细节没有搞清楚,我打算借这篇文章好好梳理一下。 前言 在许多讲LSTM的文章中,都会出现下面这个图。 Alt text 说实话...

    这篇文章打算讲一下LSTM,虽然这类文章已经很多了,但以前刚开始看的时候还是一知半解,有一些细节没有搞清楚,我打算借这篇文章好好梳理一下。

    前言

    在许多讲LSTM的文章中,都会出现下面这个图。
    Alt text
    在这里插入图片描述
    说实话,这个图确实很清晰明了(对于懂的人来说)。在很多文章中我都发现了这样的问题,有的时候,对于已经明白的人,一些很“显然”的问题就被忽略了,但是对于刚入门的人来说,一些基础的问题却要搞很久才能弄明白。所以,我希望在这里能尽可能讲的“慢”一些,把细节部分都讲清楚。

    当然了,在看这篇文章之前,大家应该对RNN有一个基础的了解。

    LSTM的大体结构

    相比于原始的RNN的隐层(hidden state), LSTM增加了一个细胞状态(cell state),我下面把lstm中间一个时刻t的输入输出标出来:在这里插入图片描述

    我们可以先把中间那一坨遮起来,看一下LSTM在t时刻的输入与输出,首先,输入有三个: 细胞状态Ct1C_{t-1},隐层状态ht1h_{t-1}, tt时刻输入向量XtX_t,而输出有两个:细胞状态CtC_t, 隐层状态hth_t。其中hth_t还作为tt时刻的输出。

    至于绿色框内部的结构与逻辑,我会在下面详细的讲,不过当前,我们从这个图里,只需要看出个大概就行了:

    1. 细胞状态Ct1C_{t-1}的信息,一直在上面那条线上传递,tt时刻的隐层状态hth_t与输入xtx_t会对CtC_t进行适当修改,然后传到下一时刻去。
    2. Ct1C_{t-1}会参与tt时刻输出hth_t的计算。
    3. 隐层状态ht1h_{t-1}的信息,通过LSTM的“门”结构,对细胞状态进行修改,并且参与输出的计算。

    总的来说呢,细胞状态的信息一直在上面那条线上传递,隐层状态一直在下面那条线上传递,不过它们会有一些交互,在LSTM中,通常被叫做“门”结构。

    LSTM的输入输出

    LSTM也是RNN的一种,输入基本没什么差别。通常我们需要一个时序的结构喂给LSTM,数据会被分成tt个部分,也就是上面图里面的XtX_tXtX_t可以看作是一个向量 ,在实际训练的时候,我们会用batch来训练,所以通常它的shape是**(batch_size, input_dim)**。当然我们来看这个结构的时候可以认为batch_size是1,理解和计算之类的也比较简单。

    另外还有一点想啰嗦一下,C0C_0h0h_0的值,也就是两个隐层的初始值,一般是用全0初始化。两个隐层的同样是向量的形式,在定义LSTM的时候,会定义隐层大小(hidden size),即Shape(Ct)=Shape(ht)=HiddenSizeShape(C_t) = Shape(h_t) = HiddenSize。输出的维度与对应输入是一致的。

    LSTM的门结构

    LSTM的门结构,简单来说,就是被设计出来的一些计算步骤,通过这些计算,来调整输入与两个隐层的值。

    这里首先讲一下图里的几个组件吧。在这里插入图片描述
    首先是上面这几个黄色的图案,这东西代表一个“神经元”,也就是wTx+bw^T x + b的操作。区别在于使用的激活函数不同,σ\sigma表示sigmoid函数,它的输出是在0到1之间的, tanhtanh是双曲正切函数,它的输出在-1到1之间。

    在这里插入图片描述
    然后是这个粉色的操作,根据图里画的内容,操作略有不同,不过整体的意思就是向量的按元素操作。具体解释起来可能还比较麻烦,在当前的场景下,可以认为是,两个相同维度的向量,对应的元素进行圆圈内部的操作,比如✖️就是两个相同维度对应元素的乘积组成新的向量。

    遗忘门在这里插入图片描述

    首先说一下[ht1,xt][h_{t-1}, x_t]这个东西就代表把两个向量连接起来(操作与numpy.concatenate相同)。然后ftf_t就是一个网络的输出,看起来还是很简单的。

    然而它为什么叫遗忘门呢,下面是我自己的看法,前面也说了σ\sigma的输出在0到1之间,这个输出ftf_t逐位与Ct1C_{t-1}的元素相乘,我们可以发现,当ftf_t的某一位的值为0的时候,这Ct1C_{t-1}对应那一位的信息就被干掉了,而值为(0, 1),对应位的信息就保留了一部分,只有值为1的时候,对应的信息才会完整的保留。因此,这个操作被称之为遗忘门,也算是“实至名归”。

    更新门层在这里插入图片描述

    这个门有两个部分,一个是Ct~\tilde{C_t},这个可以看作是新的输入带来的信息,tanhtanh这个激活函数讲内容归一化到-1到1。另一个是iti_t,这个东西看起来和遗忘门的结构是一样的,这里可以看作是新的信息保留哪些部分。
    在这里插入图片描述
    下面的操作就是对CtC_t进行更新,这个公式表示什么呢?看左边,就是前面遗忘门给出的ftf_t,这个值乘Ct1C_{t-1},表示过去的信息有选择的遗忘(保留)。右边也是同理,新的信息Ct~\tilde{C_t}iti_t表示新的信息有选择的遗忘(保留),最后再把这两部分信息加起来,就是新的状态CtC_t了。

    输出门层

    在这里插入图片描述
    最后就是lstm的输出了,此时细胞状态CtC_t已经被更新了,这里的oto_t还是用了一个sigmoid函数,表示输出哪些内容,而CtC_t通过tanhtanh缩放后与oto_t相乘,这就是这一个timestep的输出了。

    公式总结

    上面说了这些,看起来可能有些复杂,其实就是那几个公式,这里再把公式总结一下:

    ft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f\cdot[h_{t-1}, x_t] + b_f)
    it=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i\cdot[h_{t-1}, x_t] + b_i)
    Ct~=tanh(Wc[ht1,xt]+bc)\tilde{C_t}=tanh(W_c\cdot[h_{t-1}, x_t] + b_c)
    Ct=ftCt1+itCt~C_t=f_t*C_{t-1} + i_t*\tilde{C_t}
    ot=σ(Wo[ht1,xt]+bo)o_t= \sigma(W_o\cdot[h_{t-1}, x_t] + b_o)
    ht=ottanh(Ct)h_t= o_t * \tanh(C_t)

    参数计算

    上面说了lstm的原理与公式,这里想再讲一下参数是怎么计算的。简单来说,就是上面公式的WWbb包含的参数数量。

    WW的话,就是输入维度乘输出维度,bb的参数量就是加上输出维度。

    上面的公式中,WW有四个:Wf,Wi,Wc,WoW_f,W_i,W_c,W_o,同样,bb也是四个bf,bi,bc,bob_f, b_i, b_c, b_o

    我们假设输入xtx_t这个向量的维度是512512,lstm的隐层数是256256,根据这个来实际计算一下参数量。

    首先是输入[ht1,xt][h_{t-1}, x_t],这个前面说过,是两个向量连接起来,因此维度相加: 256+512=768256 + 512 = 768
    因为隐层是256256,所以输出就是256256维。WW的参数量就是768×256=196608768 \times 256 = 196608,bb的参数是256256
    所以最终的参数量就是:(768×256+256)×4=787456(768 \times 256 + 256) \times 4 = 787456

    另外,pytorch中的lstm实现稍有不同,其公式如下:
    在这里插入图片描述

    上面的gtg_t其实就是Ct~\tilde{C_t},其他符号基本是一致的。可以看到,pytorch中,xtx_tht1h_{t-1}并没有拼接在一起,而是各自做了对应的运算,这其实就是使用了分块矩阵的技巧进行计算,结果理论上是一样的,不过这里有些不同的就是加了两个bias,因此计算偏置的参数需要乘2。

    展开全文
  • 详解BiLSTM及代码实现

    2020-03-03 11:52:38
    本文简要介绍了BiLSTM的基本原理,并以句子级情感分类任务为例介绍为什么需要使用LSTM或BiLSTM进行建模。在文章的最后,我们给出在PyTorch下BiLSTM的实现代码,供读者参考。 1.2 情感分类任务 自然语言处理中情感...
  • LSTM、BiLSTM讲解及实践+GRU讲解

    千次阅读 2019-11-10 16:33:58
    1、普通RNN和LSTM 在实际应用中普通的 RNN 是非常难以训练的: 假设有一段关键文字“xxxx[key]xxx…xxxx”要求 RNN 分析出与 key 相关的 结果,即文字中的 key 是 RNN 进行分析所需要的关键数据。但此时 key 出现在 ...
  • BI-LSTM,BILSTM-CRF,Lattice-LSTM基本原理以及在NER中的应用 连大赵露思 喜欢这篇文章可以关注公众号GoAI哟,都是感兴趣的在读研究生共同经营的,目前已收录计算机视觉和NLP的文章多篇 目录: ①BI-LSTM,BILSTM-CRF...
  • Lstm self.lstm = nn.LSTM(input_size=self.input_size, hidden_size=self.hidden_size, num_layers = self.num_layers, batch_first=True, bidirectional=False, drop
  • BiLSTM介绍及代码实现

    2020-02-12 13:48:13
    本文简要介绍了BiLSTM的基本原理,并以句子级情感分类任务为例介绍为什么需要使用LSTM或BiLSTM进行建模。在文章的最后,我们给出在PyTorch下BiLSTM的实现代码,供读者参考。 1.2 情感分类任务 自然语言处理中情感...
  • LSTM原理及实现(一)

    万次阅读 多人点赞 2019-03-19 13:18:17
    LSTM原理及实现 RNN LSTM 实现 RNN基本原理 前言 当我们处理与事件发生的时间轴有关系的问题时,比如自然语言处理,文本处理,文字的上下文是有一定的关联性的;时间序列数据,如连续几天的天气状况,当日的天气情况...
  • LSTM特点及适用性

    万次阅读 多人点赞 2015-09-10 14:46:40
    这篇博客主要是我之后要做的一个关于LSTM的小报告的梗概,梳理了一下LSTM的特点和适用性问题。
  • 深度学习:长短期记忆模型LSTM

    万次阅读 多人点赞 2017-10-27 10:14:05
    lstm可以减少梯度消失:[RNN vs LSTM: Vanishing Gradients] LSTM模型 长短期记忆模型(long-short term memory)是一种特殊的RNN模型,是为了解决RNN模型梯度弥散的问题而提出的;在传统的RNN中,训练算法...
  • RNN

    万次阅读 多人点赞 2018-06-06 23:40:03
    RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。首先我们要明确什么是序列数据,摘取百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化...
  • RNN以及LSTM的介绍和公式梳理

    万次阅读 多人点赞 2015-07-25 16:32:32
    前言好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RNN以及LSTM的算法流程并...
  • 如何从RNN起步,一步一步通俗理解LSTM

    万次阅读 多人点赞 2019-05-06 23:47:54
    如何从RNN起步,一步一步通俗理解LSTM 前言 提到LSTM,之前学过的同学可能最先想到的是ChristopherOlah的博文《理解LSTM网络》,这篇文章确实厉害,网上流传也相当之广,而且当你看过了网上很多关于LSTM的文章...
  • RNNLSTM 的原理详解

    万次阅读 多人点赞 2018-11-10 10:54:26
    本文主要讲解了 RNNLSTM 的结构、前馈、反馈的原理,参考了https://www.jianshu.com/p/f3bde26febed/与https://blog.csdn.net/zhaojc1995/article/details/80572098等文章,并纠正了一些公式的错误。 RNN...
  • RNNLSTM

    千次阅读 2019-01-05 11:44:44
    RNNLSTM 标签: RNN 什么是RNN RNN全称是循环神经网络,其和我们普通的神经网络不同之处在于我们普通的神经网络只有层与层之间有关联,但是RNN每层结点之间也会产生关联,因为这个特性,所以RNN适合用于序列...
  • RNN/Stacked RNN rnn一般根据输入和输出的数目分为5种 1. 一对一 最简单的rnn 2. 一对多 Image Captioning(image -> sequence of words) 3. 多对一 Sentiment Classification(sequence of words -&...
  • 理解RNNLSTM网络

    千次阅读 2018-04-15 10:49:05
    本文重点讲解RNNLSTM的原理与区别LSTM通过细胞状态可以长期保留数据。因为RNN每次都是用上一次的输出和本次的输入concat作为本次的实际输入,在迭代几次之后,基本上循环的输出就会遗留很小的影响对接下来的循环,...
  • [深度学习] Pytorch中RNN/LSTM 模型小结

    千次阅读 2019-01-15 12:04:13
    概念介绍可以参考:[深度学习]理解RNN, GRU, LSTM 网络 Pytorch中所有模型分为构造参数和输入和输出构造参数两种类型。 模型构造参数主要限定了网络的结构,如对循环网络,则包括输入维度、隐层\输出维度、层数;...
  • RNNLSTM详解

    千次阅读 2019-02-22 20:41:17
    版权声明:转载请注明出处 https://blog.csdn.net/zhaojc1995/article/details/80572098 </div> <div id=&...content_vie
  • 面试准备——RNNLSTM

    千次阅读 2019-04-08 16:07:53
    LSTM结构推导,为什么比RNN好? 推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止...
  • 注:1)这篇文章主要参考Alex Graves的博士论文《Supervised Sequence Labellingwith Recurrent Neural Networks》 详细介绍其关于BP算法的推导过程。 2)论文没有提到过偏差的处理,不过如果能耐心推导出论文给出...
  • RNN, LSTM详解以及浅尝试

    千次阅读 2017-12-31 00:09:23
    现在论文中说到RNN,基本上说的就是LSTM,但是最近又有了GRU,用了比LSTM更少的gate,更少的参数,可以达到类似的效果。这篇博客主要是介绍RNNLSTM的原理,以及举了一个程序的例子来说明如何用TF实现LSTM【1】。RN
  • RNNLSTM的区别

    万次阅读 2019-07-19 15:44:28
    这篇文章简单总结一下RNNLSTM的区别。 首先,对于基本RNN来说,它能够处理一定的短期依赖,但无法处理长期依赖问题。比如句子The cat, which already ate …, was full.和句子The cats, which already ate …, ...
  • RNNLSTM

    千次阅读 2018-06-11 15:30:10
    RNN 中文分词、词性标注、命名实体识别、机器翻译、语音识别都属于序列挖掘的范畴。序列挖掘的特点就是某一步的输出不仅依赖于这一步的输入,还依赖于其他步的输入或输出。在序列挖掘领域传统的机器学习方法有HMM...
  • 从本专栏开始,作者正式开始研究Python深度...本篇文章将分享循环神经网络LSTM RNN如何实现回归预测,通过sin曲线拟合实现如下图所示效果。本文代码量比较长,但大家还是可以学习下的。基础性文章,希望对您有所帮助!
  • RNNLSTM模型

    2019-03-20 20:14:15
    RNN 简介 前馈神经网络的两个局限 难以捕捉到数据之间长距离的依赖关系,即使CNN也只能捕捉到局部或短距离的关系 当训练样本输入是连续序列且长短不一时,不好处理,如一段段连续的语音、连续的文本 为了解决上述...
  • RNN, LSTM, GRU 公式总结

    万次阅读 2017-04-11 17:09:28
    RNN参考 RNN wiki 的描述,根据隐层 hth_t 接受的是上时刻的隐层(hidden layer) ht−1h_{t-1} 还是上时刻的输出(output layer)yt−1y_{t-1},分成了两种 RNN,定义如下: Elman network 接受上时刻的隐层 ht−1h...

空空如也

1 2 3 4 5 ... 20
收藏数 87,495
精华内容 34,998
关键字:

lstm