深度学习之循环神经网络(RNN)

文章目录

什么是循环神经网络

  • 循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)

  • 它并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来存储之前时间步的信息。

  • 为什么有BP神经网络、CNN,还需要RNN?

    • 因为PB,CNN网络(前馈神经网络)的输入输出都是相互独立的(只能正向或者反向传播的,单向的),但是实际应用中的有些场景的输出内容和之前的内容相关的(时序性)
    • RNN称之为循环神经网络,也称之为递归神经网络(将这一时刻的输出记忆好,传入到下一时刻输入),递归就是指其中每一个元素都是执行相同的任务,但是输出(问题)依赖于输入和“记忆“
  • 我们已经学习了前馈网络的两种结构——bp神经网络卷积神经网络,这 两种结构有一个特点,就是假设输入(问题)是一个独立的没有上下文联系的单位, 比如输入(问题)是一张图片,网络识别是狗还是猫。但是对于一些有明显的上下 文特征的序列化输入(问题),比如预测视频中下一帧的播放内容,那么很明显这 样的输出必须依赖以前的输入(问题), 也就是说网络必须拥有一定的”记忆能 力”。为了赋予网络这样的记忆力,一种特殊结构的神经网络——递归神经网络 (Recurrent Neural Network) 便应运而生了。

RNN的应用

机器翻译、看图说话、智能客服、聊天机器人、语音识别、文本情感分析、个性化推荐等

RNN网络结构

  • Gated Recurrent Unit(GRU)
    • 2014年提出 将忘记门和输入(问题)门合并成为一个单一的更新门
    • 同时合并了数据单元状态和隐藏状态
    • 结构比LSTM的结构更加简单

深度学习之循环神经网络(RNN)
深度学习之循环神经网络(RNN)

  • 网络某一时刻的输入(问题)xtx_txt​,和之前介绍的bp神经网络的输入(问题)一样,xtx_txt​是一个n 维向量,不同的是递归网络的输入(问题)将是一整个序列,也就是x=[x1,...,xt1,xt,xt+1,...xT]x=[x_1,...,x_{t-1},x_t,x_{t+1},...x_T]x=[x1​,...,xt−1​,xt​,xt+1​,...xT​],对于语言模型,每一个xtx_txt​将代表一个词向量,一整个序列就代表一句话。 hth_tht​代表时刻t隐神经元对于线性转换值,sts_tst​(HtH_tHt​)代表时刻t的隐藏状态 ,oto_tot​代表时刻t的输出
  • 输入(问题)层到隐藏层直接的权重由U表示
  • 隐藏层到隐藏层的权重W,它是网络的记忆控制者,负责调度记忆。
  • 隐藏层到输出层的权重V

深度学习之循环神经网络(RNN)
递归神经网络拥有记忆能力,而这种能力就是通过W将以 往的输入(问题)状态进行总结,而作为下次输入(问题)的辅助。可以这样理解隐 藏状态:h=f(现有的输入(问题)+过去记忆总结)

RNN的反向求导

普通的神经网络梯度更新如下图:
深度学习之循环神经网络(RNN)

RNN梯度更新如下图:
假设符号E表示误差。在时间t+1(经过两个时间步长),权重矩阵U 如何更新深度学习之循环神经网络(RNN)

Vanilla-RNN

Vanilla-RNN其实就是最简单的RNN

Vanilla-RNN存在的问题

深度学习之循环神经网络(RNN)

  • 使用基于时间的反向传播算法训练循环神经网络时,我们可以选择小批量进行训练,这里我们定期更新批次权重(而不是每次输入(问题)样本)。 我们计算每一步的梯度,但不要立即更新权重。
  • 另外,我们对权重每次更新固定的步长数量。这样有利于降低训练过程的复杂性,并消除权重更新中的噪音
  • RNN原理就是:传递过程中不断做乘法。连续乘一个小于1的数字,导致该数趋近于0,反之,趋近于无穷大。
  • 如果反向传播超过10个时间步长,梯度会变得非常小。这种现象称为梯度消失问题 在循环神经网络中,我们可能也有相反的问题,称为梯度膨胀问题

RNN动态图

深度学习之循环神经网络(RNN)

梯度消失

深度学习之循环神经网络(RNN)

梯度消失带来的影响

深度学习之循环神经网络(RNN)如下图:深度学习之循环神经网络(RNN)

梯度爆炸

深度学习之循环神经网络(RNN)

梯度消失带来的影响

深度学习之循环神经网络(RNN)

RNN的反向传播

  • 为了克服梯度消失的问题,LSTMGRU模型便后续被推出了,为什么LSTM和 GRU可以克服梯度消失问题呢?
    • 由于它们都有特殊的方式存储”记忆”,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除,因此可以一定程度上克服梯度消失问题。
  • 另一个简单的技巧可以用来克服梯度爆炸的问题就是gradient clipping(梯度裁剪),
    • 也就是当你计算的梯度超过阈值c的或者小于阈值−c时候,便把此时的梯度设置成c或 −c。
  • 下图所示是RNN的误差平面,可以看到RNN的误差平面要么非常陡峭,要么非 常平坦,如果不采取任何措施,当你的参数在某一次更新之后,刚好碰到陡峭的 地方,此时梯度变得非常大,那么你的参数更新也会非常大,很容易导致震荡问 题。而如果你采取了gradient clipping这个技巧,那么即使你不幸碰到陡峭的地 方,梯度也不会爆炸,因为梯度被限制在某个阈值c。 深度学习之循环神经网络(RNN)

Bidirectional RNN(双向的RNN)

  • Bidirectional RNN(双向RNN)假设当前t的输出不仅仅和之前的序列有关,并且 还与之后的序列有关
    • 例如:预测一个语句中缺失的词语那么需要根据上下文进 行预测;
    • Bidirectional RNN是一个相对简单的RNNs,由两个RNNs上下叠加在 一起组成。输出由这两个RNNs的隐藏层的状态决定。深度学习之循环神经网络(RNN)
      双向RNN中的机制
      深度学习之循环神经网络(RNN)

Deep(Bidirectional) RNN(深度的双向RNN)

  • Deep Bidirectional RNN(深度双向RNN)类似Bidirectional RNN,区别在于每个每一步的输入(问题)有多层网络,这样的话该网络便具有更加强大的表达能力 和学习能力,但是复杂性也提高了,同时需要训练更多的数据。
    深度学习之循环神经网络(RNN)

LSTM(长短时记忆)

  • 应为在简单的RNN(vanilla RNN结构)中存在时序过长时会导致梯度消散,梯度爆炸的问题,而长短时记忆LSTM就是解决vanilla RNN中的不足,可以有效的减少梯度消散问题。
  • LSTM 中引⼊了3个⻔,即输⼊⻔(input gate)、遗忘⻔(forget gate)和输出⻔(output gate),以及与隐藏状态形状相同的记忆细胞(某些⽂献把记忆细胞当成⼀种特殊的隐藏状态),从而记录额外的信息。深度学习之循环神经网络(RNN)

LSTM关键:“细胞状态”

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流 传保持不变很容易。深度学习之循环神经网络(RNN)

第一个“门”——“忘记门”

  • 第一个“门”==>“忘记门”:决定从“细胞状态”中丢弃什么信息;比如在语言模型中,细胞状态可能 包含了性别信息(“他”或者“她”),当我们看到新的代名词的时候,可以考虑忘记旧的数据
  • 因为是通过sigmoid激活,接近0的值就遗忘了,接近1的值就记住并继续传递
  • 状态 h(t-1)和本次的输入(问题) x(t) 结合(concat)起来的,concat, 就是把二者直接拼起来,比如 x是 28位的向量,h(t-1)是128位的,那么拼起来就是156位的向量深度学习之循环神经网络(RNN)

第二个“门”——“学习门”:

  • 第二个“门”==>“学习门”:决定放什么新信息到“细胞状态”中;
    • iti_tit​(忽略因子,ignore factor)Sigmoid层决定什么值需要更新;
    • Tanh层创建一个新的信息向量ctc_tct​;
    • 最后:itcti_t*c_tit​∗ct​构成学习门深度学习之循环神经网络(RNN)

第三个“门”——“记忆门”:

  • 经过第一个和第二个“门”后,可以确定传递信息的删除和增加,即可以进行 “细胞状态”的更新
    • 更新Ct1C_{t-1}Ct−1​为CtC_tCt​;
    • 将旧状态与ft相乘,丢失掉确定不要的信息;
    • 加上新的候选值itcti_t*c_tit​∗ct​得到最终更新后的“细胞状态”深度学习之循环神经网络(RNN)

第四个“门”——“使用门”:

  • 第四个“门”==>基于“细胞状态”得到输出;
    • 首先运行一个sigmoid层来确定细胞状态的那个部分将输出
    • 使用tanh处理细胞状态得到一个-1到1之间的值,再将它和sigmoid门的输出相乘,输出程序确定输出的部分。深度学习之循环神经网络(RNN)

lstm动态图展示

深度学习之循环神经网络(RNN)

LSTM可以使用别的激活函数吗?

  • 关于激活函数的选取,在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数

  • 值得注意的是,这两个激活函数都是饱和的,也就是说在输入达到一定值的情况下,输出就不会发生明显变化了。如果是用非饱和的激活函数,例如ReLU,那么将难以实现门控的效果。

  • Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。

  • 在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

  • 激活函数的选择也不是一成不变的,但要选择合理的激活函数。

LSTM-总结

  • LSTM的隐层神经元不仅包含隐状态hth_tht​,还专门开辟了一个 cell来保存过去的“记忆”ctc_tct​,LSTM希望用ctc_tct​来传递很久以前的信息,以达到长 距离依赖的目的。所以LSTM隐层神经元的输入是上一时刻的隐状态ht1h_{t−1}ht−1​和记忆ct1c_{t−1}ct−1​,输出是当前时刻的隐状态hth_tht​和希望传递给下一个时刻的记忆ctc_tct​。

GRU

  • 在循环神经⽹络中的梯度计算⽅法中,我们发现,当时间步数较⼤或者时间步较小时,循环神经⽹络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但⽆法解决梯度衰减的问题。通常由于这个原因,循环神经⽹络在实际中较难捕捉时间序列中时间步距离较⼤的依赖关系。

  • 门控循环神经⽹络(gated recurrent neural network)的提出,正是为了更好地捕捉时间序列中时间步距离较⼤的依赖关系。它通过可以学习的⻔来控制信息的流动。其中,门控循环单元(gatedrecurrent unit,GRU)是⼀种常⽤的门控循环神经⽹络。

  • GRU它引⼊了重置⻔(reset gate)和更新⻔(update gate) 的概念,从而修改了循环神经⽹络中隐藏状态的计算⽅式。深度学习之循环神经网络(RNN)
    深度学习之循环神经网络(RNN)

GRU动图

深度学习之循环神经网络(RNN)

LSTM与GRU区别

  • LSTM与GRU二者结构十分相似,不同在于:
    • 新的记忆都是根据之前状态及输入进行计算,但是GRU中有一个重置门控制之前状态的进入量,而在LSTM里没有类似门;
    • 产生新的状态方式不同,LSTM有两个不同的门,分别是遗忘门(forget gate)和输入门(input gate),而GRU只有一种更新门(update gate);
    • LSTM对新产生的状态可以通过输出门(output gate)进行调节,而GRU对输出无任何调节。
    • GRU的优点是这是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,然后它可以扩大模型的规模。
    • LSTM更加强大和灵活,因为它有三个门而不是两个。
深度学习之循环神经网络(RNN)深度学习之循环神经网络(RNN) 年轻无为呀! 发布了16 篇原创文章 · 获赞 14 · 访问量 3547 私信 关注
上一篇:《21个项目玩转深度学习——基于TensorFlow的实践详解》


下一篇:减小code体积的书写习惯