zoukankan      html  css  js  c++  java
  • 深度学习-LSTM与GRU

    http://www.sohu.com/a/259957763_610300此篇文章绕开了数学公式,对LSTM与GRU采用图文并茂的方式进行说明,尤其是里面的动图,让人一目了然。https://zybuluo.com/hanbingtao/note/581764此篇文章对代码部分给予了充分说明。LSTM的详细推倒http://blog.csdn.net/u011414416/article/details/46724699,此便文章估计是展式中文推导过程最详细的吧。

      在RNN训练期间,信息不断地循环往复,神经网络模型权重的更新非常大。因为在更新过程中累积了错误梯度,会导致网络不稳定。极端情况下,权重的值可能变得大到溢出并导致NaN值。爆炸通过拥有大于1的值的网络层反复累积梯度导致指数增长产生,如果值小于1就会出现消失。

      由于RNN 有一定的局限性它会出现梯度消失的情况不能长时间保存记忆例如:

    I am from China, I speak Chinese.这个句子中的China对Chinese具有一定的决定性,但是由于距离太远难以产生关联。

     为解决这一问题,LSTM使用了Gate(“门”),它可以保存重要记忆

    RNN                                                     LSTM

                      

     LSTM的核心内容就是Ct

     信息流控制的关键,参数决定了ht传递过程中,哪些被保存或舍弃。参数被Gate影响Sigmoid函数系数决定 Ct参数的变化,而Sigmoid 函数决定于--输入, 之前状态

    gate 如何进行控制?https://blog.csdn.net/m0epnwstyk4/article/details/79124800

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

     分步分析 LSTM 原理       

    第一步:新输入xt前状态 ht-1 决定C哪些信息可以舍弃,ft与Ct-1运算,对部分信息进行去除,它就是遗忘门(forget gate),σ 是 sigmoid 函数。

    第二步:新输入xt前状态 ht-1 告诉 C 哪些新信息想要保存it:新信息添加时的系数(对比 ft)Ĉt单独新数据形成的控制参数,用于对Ct进行更新

     

    第三步:根据旧的控制参数Ct-1, 新生成的更新控制参数 Ĉt组合生成最终生成该时刻最终控制参数:

     

    第二步与第三步合起来是输入门。

    第四步:根据控制参数Ct 产生此刻的新的 LSTM 输出,它为输出门:

     

    LSTM的工作方式可以总结为:1.Ct信息舍弃,2.Ct局部生成,3.Ct更新,4.Ct运算

    这里使用的符号具有以下含义:

    a)X:缩放的信息--"门"

    b)+:添加的信息

    c)σ:Sigmoid层

    d)tanh:tanh层

    e)ht-1:上一个LSTM单元的输出

    f)ct-1:上一个LSTM单元的记忆

    g)Xt:输入

    h)ct:最新的记忆

    i)ht:输出

    下面摘自http://www.atyun.com/16821.html这篇文章的一部分,说到tanh与Sigmoid两个函数的作用

    为什么使用tanh?

    为了克服梯度消失问题,我们需要一个二阶导数在趋近零点之前能维持很长距离的函数。tanh是具有这种属性的合适的函数。

    为什么要使用Sigmoid?

    由于Sigmoid函数可以输出0或1,它可以用来决定忘记或记住信息。

    信息通过很多这样的LSTM单元。图中标记的LSTM单元有三个主要部分:

    1. LSTM有一个特殊的架构,它可以让它忘记不必要的信息。Sigmoid层取得输入Xt和ht-1,并决定从旧输出中删除哪些部分(通过输出0实现)。在我们的例子中,当输入是“他有一个女性朋友玛丽亚”时,“大卫”的性别可以被遗忘,因为主题已经变成了玛丽亚。这个门被称为遗忘门f(t)。这个门的输出是f(t)* ct-1
    2. 下一步是决定并存储记忆单元新输入Xt的信息。Sigmoid层决定应该更新或忽略哪些新信息。tanh层根据新的输入创建所有可能的值的向量。将它们相乘以更新这个新的记忆单元。然后将这个新的记忆添加到旧记忆ct-1中,以给出ct。在我们的例子中,对于新的输入,他有一个女性朋友玛丽亚,玛丽亚的性别将被更新。当输入的信息是,“玛丽亚在纽约一家著名的餐馆当厨师,最近他们在学校的校友会上碰面。”时,像“著名”、“校友会”这样的词可以忽略,像“厨师”、“餐厅”和“纽约”这样的词将被更新。
    3. 最后,我们需要决定我们要输出的内容。Sigmoid层决定我们要输出的记忆单元的哪些部分。然后,我们把记忆单元通过tanh生成所有可能的值乘以Sigmoid门的输出,以便我们只输出我们决定的部分。在我们的例子中,我们想要预测空白的单词,我们的模型知道它是一个与它记忆中的“厨师”相关的名词,它可以很容易的回答为“烹饪”。我们的模型没有从直接依赖中学习这个答案,而是从长期依赖中学习它。

    GRU可以说是LSTM的变种

      介绍完LSTM的工作原理后,下面来看下门控循环单元GRU。GRU是RNN的另一类演化变种,与LSTM非常相似。GRU结构中去除了单元状态,而使用隐藏状态来传输信息。它只有两个门结构,分别是更新门和重置门。更新门的作用类似于LSTM中的遗忘门和输入门,它能决定要丢弃哪些信息和要添加哪些新信息。重置门用于决定丢弃先前信息的程度。

       

    Reset gate

    rt 负责决定ht−1对new memory  的重要性有多大, 如果rt约等于0 的话,ht-1就不会传递给new memory

    new memory

    是对新的输入xt和上一时刻的hidden state ht−1的总结。计算总结出的新的向量包含上文信息和新的输入xt.

    Update gate

    zt负责决定传递多少ht−1给ht。 如果zt约等于1的话,ht−1几乎会直接复制给ht,相反,如果zt约等于0, new memory 直接传递给ht

    Hidden state

    ht 由 ht−1相加得到,两者的权重由update gate zt控制。

    可以看一下此篇https://blog.csdn.net/u012223913/article/details/77724621对LSTM与GRU做了一个具体的区别介绍。

    2. 区别
    1. 对memory 的控制
    LSTM: 用output gate 控制,传输给下一个unit

    GRU:直接传递给下一个unit,不做任何控制

    2. input gate 和reset gate 作用位置不同
    LSTM: 计算new memory Ĉt时不对上一时刻的信息做任何控制,而是用forget gate 独立的实现这一点

    GRU: 计算new memory时利用reset gate 对上一时刻的信息 进行控制。

    3. 相似
    最大的相似之处就是, 在从t 到 t-1 的更新时都引入了加法。

    这个加法的好处在于能防止梯度弥散,因此LSTM和GRU都比一般的RNN效果更好。

  • 相关阅读:
    js html table转json 反向生成数据源
    用命令提示符 打开 asp.net Development Server
    asp.net 'Sys'未定义 解决方案
    js form转换成Hash格式
    【转】NSIS 常用安装路径
    Linq lamdba GroupJoin外连接示例
    CDN简单了解
    获取android入口activity
    解决IE6下 li 的 float:left 自动换行
    WinForm窗口基础配置
  • 原文地址:https://www.cnblogs.com/yang901112/p/11900961.html
Copyright © 2011-2022 走看看