• 看图理解长短期记忆网络和门控循环网络


    这是我在机器之心上看到的一篇文章,写的非常好。自己写一遍增强印象

    参考地址:https://mp.weixin.qq.com/s/yWKdZLzPy5fcnmNLLcfKPA

    循环神经网络(RNN)很容易受到短期记忆的影响。如果序列足够长,序列开头的信息随着传递逐渐减弱,直至消失,很容易被遗漏。

    在反向传播中,循环神经网络也存在梯度消失等问题。一般而言,梯度是用来更新神经网络权重,梯度消失问题是梯度随着时间的推移逐渐减小到0,如果梯度非常小,它就不能为学习提供足够的信息。

    所以RNN中,通常是前期的层会因为梯度消失和停止学习。因此,RNN会忘记它在更长的序列中看到的东西,从而只拥有短期记忆。

    解决方案----LSTM和GRU

    创建LSTM和GRU可以作为短期记忆的解决方案,他们有一种成为“门”的内部机制,可以调节信息流

     

    这些门可以判断数据在一个序列中该保留或弃用,一次它可以将相关信息传递到较长序列链中进行预测。

    就像是人的记忆,在与他人对话中,你没必要记住对方所说的每一个字,只需记住其中的关键词即可,将其他不必要的信息给遗忘。

    一、回顾循环神经网络

    第一个单词被转换成机器可读的向量。然后,RNN逐个处理向量序列

    在处理过程中,它将之前的隐状态传递给序列的下一个步骤。隐状态作为神经网络的记忆,保存着网络先前观察到的数据信息。

    观察RNN的一个单元格,看看如何计算隐状态。首先,输入和之前的隐状态组合成一个向量。这个向量现在有当前输入和先前输入的信息。向量通过tanh激活,输出是新的隐状态,或神经网络记忆。

    双曲正切(tanh)激活函数

    tanh激活函数用于调节在神经网络中传递的值,它会将输入值压缩到-1到1之间

    当向量通过神经网络时,由于各种数学运算,它会经历许多变换。假设一个值连续乘以3,结果会爆炸增长成天文数字,从而导致其他值的变换变得微不足道。

    tanh函数确保值在-1到1之间,从而控制神经网络的输出。下图可以看到数值是如何借助tanh在不同的时间步之中保持稳定。

    这就是RNN。它的内部操作很少,但在适当环境(比如短序列)会有很好的性能。RNN使用的计算资源比它的改进版LSTM和GRU要少的多。

    二、LSTM

    LSTM具有与循环神经网络相似的控制流,它在前向传播时处理传递信息的数据,两者区别在与单元内的处理过程不同。

    核心概念

    LSTM的核心概念是单元状态,及单元各种各样门。单元状态好比传输的高速公路,在序列链中传递相关信息。你可以把它看做是网络的“记忆”。从理论上讲,单元状态可以在整个序列处理过程中携带相关信息。因此,即使是前期时间步的信息也可以帮助后续时间步的处理,因此单元状态有效减少了短期记忆的影响。随着单元状态在不同时间步的传递,我们可以通过门控机制添加或删除单元状态中的信息。这些门是不同的神经网络,用来决定能够进入单元状态的信息。在训练过程中,门可以学习到哪些信息需要保存,哪些信息需要遗忘。

    sigmoid函数

    门控机制主要由sigmoid激活函数,它将数值控制在0到1之间。

    任何数值乘以0都是0,这将导致数值消失或被“遗忘”。任何数字乘以1都是其本身,这将导致数值不变或被“保存”。

    网络可以知道哪些数据可以被遗忘,哪些数据需要保存

    LSTM:遗忘门、输入门、单元状态、输出门、

    遗忘门(forget gate)

    这个门决定了哪些信息应该被保存或丢弃。在遗忘门中,来自先前隐状态的信息和来自当前输入的信息传递到sigmoid函数,并将值压缩到0和1之间。越接近0,意味着丢弃,越接近1意味着保留

    输入门(input gate)

    为了更新单元状态,LSTM需要输入门。首先,我们将前面的隐状态和当前输入传递给一个sigmoid函数,它通过将值转换到0到1来决定将更新哪些值。0 表示不重要,1 表示重要。还可以将隐状态和当前输入传递给 tanh 函数,使值变为 -1 到 1 之间,以帮助调节神经网络。然后将 tanh 输出与 sigmoid 输出相乘,sigmoid 输出将决定保留 tanh 输出的重要信息。

    单元状态(cell state)

    现在应该有足够的信息来计算单元状态。首先,单元状态逐点乘以遗忘向量,如果它与接近 0 的值相乘,就有可能在单元状态中得到低值。然后,从输入门读取上一步输出,并逐点相加,将单元状态更新为神经网络认为相关的新值,这就得到了新的单元状态,

    输出门(output gate)

    输出门决定下一个隐藏状态。记住,隐藏状态包含先前输入的信息。隐藏状态也用于预测。首先,我们将前面的隐状态和当前输入传递给一个 sigmoid 函数。然后我们将修改的单元状态传递给 tanh 函数。我们将 tanh 输出与 sigmoid 输出相乘,以确定隐状态应该包含的信息。新的单元状态和新的隐状态随后被转移到下一步中。

    遗忘门决定了哪些内容与前面的步骤相关。输入门决定从当前步骤中添加哪些相关信息。输出门决定一个隐状态应该是什么。

    伪代码演示

    def LSTMCELL(prev_ct, prev_ht, input):
        combine = prev_ht + input
        ft = forget_layer(combine)
        candidate = candidate_layer(combine)
        it = input_layer(combine)
        Ct = prev_ct * ft + candidate * it
        ot = output_layer(combine)
        ht = ot * tanh(Ct)
        return ht, Ct
    
    ct = [0, 0, 0]
    ht = [0, 0, 0]
    for input in inputs:
        ct, ht = LSTMCELL(ct, ht, input)

    1. 首先,将前面的隐状态和当前输入拼接起来,即为 combine

    2. 将 combine 的值送至遗忘层,并删除不相关的数据

    3. 使用 combine 创建候选层,候选项保存要添加新的单元状态的可能值

    4. 将 combine 的值送至输入层,这一层决定应该添加到新的单元状态的候选数据。

    5. 在计算遗忘层、候选层和输入层后,利用这些向量和前面单元格状态计算新单元格状态

    6. 然后计算输出

    7. 输出新单元状态之间的对应元素乘积将得到新的隐状态

    三、GRU

    GRU与LSTM非常相似,GRU摆脱了单元状态,直接用隐藏状态传递信息,它只有重置门和更新门这两个门控机制

    更新门的作用类似于LSTM的遗忘门和输入门。它同时决定丢弃什么旧信息,添加什么新信息。而重置门是一个用来决定要忘记多少过去信息的门。

    GRU的张量运算很少,因此与LSTM相比,它的训练速度要快一些。

    小结

    RNN对于处理用于预测的序列数据很有帮助,但其存在短期记忆问题。创建LSTM和GRU的目的是利用“门”的机制来降低短期记忆。LSTM和GRU广泛应用在语音识别、语音合成、自然语言理解等最先进的深度学习应用中。

  • 相关阅读:
    利用委托传值
    引用类型的默认值为Null
    字符串加密与解密 (MD5)
    讲解Guitar Pro如何显示吉他面板功能
    Guitar Pro 7 常见问题之版本更新
    Guitar Pro7常见问题之滑音的讲解
    Guitar Pro 7如何新建吉他谱步骤
    带你演绎Guitar Pro 7制作吉他谱前的步骤
    如何添加音效使乐曲更加丰富?
    Guitar Pro 吉他软件功能介绍
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/10300924.html
Copyright © 2020-2023  润新知