• 【DL-4】长短期记忆网络(LSTM)


    目录

    1. 背景
    2. 从RNN到LSTM
    3. LSTM 的核心思想
    4. LSTM前向传播算法
    5. LSTM 的变体

    一、背景

    由于RNN梯度消失的问题,因此很难处理长序列的数据,大牛们对RNN的机构做了改进,得到了RNN的特例长短期记忆网络LSTM(Long Short-Term Memory)和其它变形,可以从结构上避免常规RNN的梯度消失。

    举个例子:长期依赖(Long-Term Dependencies)问题

    假设我们试着去预测"I grew up in France... I speak fluent French"最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

       

    使用RNN可能会产生信息消失现象,幸运的是,LSTM 并没有这个问题!

    二、从RNNLSTM

    从上一篇文章详细了解了如下图所示的标准形式:

    我们忽略向上输出的o,y和L,将其转换成如下形式:

    上图显示只有tanh作为激活函数,LSTM 同样是这样的结构,但是模块的结构更加复杂。不同于单一神经网络层,整体上除了 h 在随时间流动,细胞状态 c 也在随时间流动。细胞状态 c 就代表着长期记忆,而状态 h 代表了短期记忆。下图中sigma表示的都是Sigmoid函数。

       

    三、LSTM 的核心思想

    从上图中可以看出,在每个序列索引位置 t 时刻向前传播的除了和RNN一样的隐藏状态 h,还多了另一个隐藏状态,如图中上面的长横线。这个隐藏状态我们一般称为细胞状态(Cell State),记为 C。如下图所示:

    细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。LSTM 有通过精心设计的称作为"门"的结构来去除或者增加信息到细胞状态的能力。LSTM在每个序列索引位置t的门一般包括遗忘门,输入门和输出门三种。

    3.1 遗忘门

    遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:

    ht-1 表示历史信息,xt 表示当前流入细胞中新的信息。

    xt 在这里的作用是为了根据当前输入的新的信息来决定要忘记哪些历史信息。

    例如在语言模型中,基于已经看到的预测下一个词。细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

    两者的结构都是向量,在这里我们将两个向量拼接起来输入。输出一个在 0 到 1 之间的数值,这个数值决定要遗忘多少历史信息。1 表示"完全保留",0 表示"完全舍弃"。

    其精髓在于只能输出(0,1)小数的sigmoid函数和粉色圆圈的乘法,LSTM网络经过学习决定让网络记住以前百分之多少的内容。对于第二个问题就更好理解,决定记住什么遗忘什么,其中新的输入肯定要产生影响。

    3.2 输入门

    在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。所以在更新新的细胞状态时,主要要做的两件事就是决定哪些历史信息该流入当前细胞中(遗忘门控制),决定哪些新的信息该流入细胞中(输入门控制)。

    在获得了输入门和遗忘门系数之后就可以更新当前的细胞状态,Ct-1 更新为 Ct 。

    3.3 输出门

    在得到了新的隐藏细胞状态 C,我们就得开始去输出结果,输出门的子结构如下:

    从图中可以看出,隐藏状态 ht 的更新由两部分组成,输出门依然是由历史信息 ht-1 和新的信息 xt 来决定的,。

    小结:输入门、遗忘门、输出们所对应的函数都是 sigmoid 函数(因为 Sigmoid 函数的输出值范围为0-1,相当于控制门的百分比过滤),因此输出的结果是[0, 1],当为0时,门完全关闭,当为1时,门完全打开。输入们控制这当前输入值有多少信息流入到当前的计算中,遗忘门控制着历史信息中有多少信息流入到当前计算中,输出们控制着输出值中有多少信息流入到隐层中。所有LSTM除了有三个门来控制当前的输入和输出,其他的和RNN是一致的。

    四、LSTM前向传播算法

     LSTM模型有两个隐藏状态 ht , Ct ,模型参数几乎是RNN的4倍,因为现在多了  Wf, Uf, bf, Wa, Ua, ba, Wi, Ui, bi, Wo,  Uo, bo  这些参数。

    前向传播过程在每个序列索引位置的过程为:

    1)更新遗忘门输出:ft = σ (Wht-1 + Uxt + bf

    2)更新输入门两部分输出:it = σ(Wht-1 + Uxt + bi); a= tanh(Wht-1 + Uxt + ba)

    3)更新细胞状态:Ct = Ct-1 ft + iat

    4)更新输出门输出:

    o= σ(Wht-1 + Uxt + bo)

    h= ot tanh(Ct)

    5)更新当前序列索引预测输出:yt = σ(V ht + c)

    五、LSTM 的变体

    以上为正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。

    5.1 增加"peephole connection"

    其中一个流形的 LSTM 变体,由 Gers & Schmidhuber (2000) 提出的,让门层 也会接受细胞状态的输入。

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

    5.2 coupled 忘记门和输入门

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

    5.3 GRU

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

    主要参考:

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

    http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    https://blog.csdn.net/wangyangzhizhou/article/details/76651116

    附件一:手写推导

       

  • 相关阅读:
    Redis设计与实现第一部分:第5章:Redis 跳跃表
    根据临时表修改主表的某字段数据根据主表的主键
    Redis设计与实现第一部分:第2章:简单动态字符串SDS
    Redis
    MySQL的访问控制与用户管理
    MySQL字符集和语言的基础知识
    生成日志文件
    Python进阶09 动态类型
    Python进阶08 异常处理
    Python进阶07 函数对象
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/12662577.html
Copyright © 2020-2023  润新知