【综述专栏】循环神经网络RNN(含LSTM,GRU)小综述
在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。
作者:CSDN—我就是黑凤梨
地址:https://blog.csdn.net/hzy199772
全连接神经网络(Full Connected Neural Networks, FCNN)具有局限性,其同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,FCNN无法办到。由于FCNN一个序列的不同位置之间无法共享特征,所以只能单独的处理一个个的输入,即前一个输入和后一个输入之间没有关系,无法处理在时间或空间上有前后关联的输入问题。
重点介绍RNN的发展历史、模型改进及其应用领域,总结了RNN模型的特点及相关工作,旨在为刚进入该领域的初学者和对RNN进行深入研究的学者提供参考资料。
RNN循环神经网络
1.1 RNN的结构
RNN的结构图如图:
右方是左方图的展开形式,对于每一个时间步t,都有来自前面时间步的信息,并加以权重w用于控制,在每一个时间步中,从输入X,加上权重Wx,和来自上一步的激活值a,以及激活值权重Wa,经过激活函数输出y,然后再对y使用损失函数计算损失。
但是这种做法会造成,在任一时间步t中处理时,只参考或者说获取了前面时间步的特征,序列后方的信息特征没有学习到,这无疑会造成问题,所以我们引入了BRNN(双向循环神经网络)
1.2 BRNN的结构
BRNN的结构如图:
BRNN的隐藏层需要记录两个值。A参与正向计算,A’参与反向计算。最终的输出值y取决于A和A’。
RNN的前向计算 按照时间序列展开,然后使用基于时间的反向传播算法(Back Propagation Through Time, BPTT)对网络中的参数进行更新,也是目前循环神经网络最常用的训练算法。
1.3 梯度消失和梯度爆炸
这样我们解决了如何学习序列后方特征的问题,但是RNN仍然存在问题,在训练RNN的过程中容易出现梯度爆炸和梯度消失的问题,导致在训练时梯度的传递性不高,即梯度不能在较长序列中传递,从而使RNN无法检测到长序列的影响。对于基于梯度的学习需要模型参数θ和损失函数L之间存在闭式解,根据估计值和实际值之间的误差来最小化损失函数,那么在损失函数上计算得到的梯度信息可以传回给模型参数并进行相应修改。
假设对于序列x1,x2,x3……,xt ,通过St=F(s,x)将上一时刻的状态映射到下 一 时刻的状态S。T时刻损失函数L关于参数的梯度为:
假设循环网络若要可靠地存储信息即 也意味着当模型能够保持长距离依赖z时,其本身也处于梯度消失的情况下。随着时间跨度增加,梯度也会以指数级收敛于0。当 发生梯度爆炸的现象, 网络也陷入局部不稳定。
梯度爆炸问题是指在RNN中,每一步的梯度更新可能会积累误差,最终梯度变得非常大,以至于RNN的权值进行大幅更新,程序将会收到NaN错误。一般而言,梯度爆炸问题更容易处理,可以通过设置一个阈值来截取超过该阈值的梯度。
梯度消失的问题更难检测,可以通过使用其他结构的RNNs来应对,例如长短期记忆网络(long short-term memory, LTSM)和门控循环单元(Gated Recurrent Unit, GRU)。
02
LSTM
2.1 引子
使用梯度下降方法来优化RNN的一个主要问题就是梯 度在沿着序列反向传播的过程中可能快速消失。已经有大量的研究工作用于解决RNN中存在的训练问题并且提出了关于RNN的变体LSTM.
2.2 LSTM单元
LSTM的关键是细胞状态,表示细胞状态的这条线水平的穿过图的顶部。
细胞的状态类似于输送带,细胞的状态在整个链上运行,只有一些小的线性操作作用其上,信息很容易保持不变的流过整个链。
LSTM确实具有删除或添加信息到细胞状态的能力,这个能力是由被称为门(Gate)的结构所赋予的。门(Gate)是一种可选地让信息通过的方式。它由一个Sigmoid神经网络层和一个点乘法运算组成。Sigmoid神经网络层输出0和1之间的数字,这个数字描述每个组件有多少信息可以通过, 0表示不通过任何信息,1表示全部通过
LSTM单元中有三种类型的门控,分别为:输入门i、遗忘门f和输出门o,门控可以看作一层全连接层,LSTM对信息的存储和更新正是由这些门控来实现。
更具体地说, 门控是由sigmoid函数和点乘运算实现,门控并不会提供额外的信息。门控的一般形式可以表示为: 其中 Sigmoid 函数,是机器学习中常用的非线性激活函数,可以将一个实值映射到区间 0 ~ 1,用于描述信息通过的多少.当门的输出值为0 ,表示没有信息通过,当值为1 则表示所有信息都可以通过。
LSTM的前向计算过程可以表示为式(1) ~ (5)。在时间步t时,LSTM的隐藏层的输入和输出向量分别为xt和ht,记忆单元为ct .输入门用于控制网络当前输入数据xt流入记忆单元的多少,即有多少可以保存到ct,其值为:
遗忘门是LSTM单元的关键组成部分,可以控制哪些信息要保留哪些要遗忘,并且以某种方式避免当梯度随时间反向传播时引发的梯度消失和爆炸问题。遗忘门控制自连接单元 ,可以决定历史信息中的哪些部分会被丢弃。即上一时刻记忆单元Ct-1中的信息对当前记忆单元Ct 的影响。
输出门控制记忆单元ct对 当 前 输 出 值 ht的 影 响 ,即记忆单元中的哪一部分会在时间步t 输出。输出门的值如式(4) 所示 ,LSTM单元的在t时刻的输出 ht可 以 通 过 式 (5)得到。
2.3 LSTM的补充理解方式和变种(☆)
2.3.1一步步的拆解LSTM
LSTM的第一步是决定我们要从细胞状态中丢弃什么信息。该决定由被称为“遗忘门”的Sigmoid层实现。它查看ht-1(前一个输出)和xt(当前输入),并为单元格状态Ct-1(上一个状态)中的每个数字输出0和1之间的数字。1代表完全保留,而0代表彻底删除。
下一步是决定我们要在细胞状态中存储什么信息。这部分分为两步。首先,称为“输入门”的Sigmoid层决定了我们将更新哪些值。接下来一个tanh层创建候选向量Ct,该向量将会被加到细胞的状态中。在下一步中,我们将结合这两个向量来创建更新值。
现在是时候去更新上一个状态值Ct−1了,将其更新为Ct。我们将上一个状态值乘以ft,以此表达期待忘记的部分。之后我们将得到的值加上 it∗C̃ t。这个得到的是新的记忆细胞的值。
最后,我们需要决定我们要输出什么。此输出将基于我们的细胞状态,但这明显是参考了记忆细胞C的过滤版本。首先,我们运行一个sigmoid,它决定了我们要输出的细胞状态的哪些部分。然后,我们将单元状态通过tanh(将值规范化到-1和1之间),并将其乘以Sigmoid门的输出,至此我们只输出了我们决定的那些部分。
2.3.2LSTM变种
一个比较流行的LSTM变种是由Gers & Schmidhuber (2000)提出的,添加“peephole connections”。这意味着允许gate层去看细胞的状态。下图中所有的Sigmoid层都增加了窥视,但许多论文实现不是针对所有都增加窥探,而是有针对性的增加。这也叫做窥视孔连接.
另一种变化是使用耦合的忘记和输入门,而不是单独决定要忘记什么、添加什么,这个决定需要一起做。只有当需要输入某些信息的时候,我们才会忘记这个位置的历史信息。只有当我们忘记一些历史信息的时候,我们才在状态中添加新的信息。
LSTM的一个稍微更显着的变化是由Cho介绍的门控循环单元(或GRU)。它将遗忘门和输入门组合成一个统一的“更新门”。它还将单元格状态和隐藏状态合并,并进行了一些其他更改。所得到的模型比标准LSTM模型更简单,并且越来越受欢迎。GRU将在下一节进行介绍。
03
GRU
3.1 GRU介绍
在LSTM中,引入了三个门函数:输入门、遗忘门和输出门。而在GRU中,只有两个门:更新门和重置门。模型的结构如图所示:
GRU的前向传播公式:
GRU 有两个有两个门,即一个重置门(reset gate)和一个更新门(update gate)。从直观上来说,重置门决定了如何将新的输入信息与前面的记忆相结合,更新门定义了前面记忆保存到当前时间步的量。如果我们将重置门设置为 1,更新门设置为 0,那么我们将再次获得标准 RNN 模型。使用门控机制学习长期依赖关系的基本思想和 LSTM 一致,但还是有一些关键区别:
3.2 GRU详解
3.2.1 更新门
在时间步 t,我们首先需要使用以下公式计算更新门 :
其中 为第 t 个时间步的输入向量,即输入序列 X 的第 t 个分量,它会经过一个线性变换(与权重矩阵 W(z) 相乘)。 保存的是前一个时间步 t-1 的信息,它同样也会经过一个线性变换。更新门将这两部分信息相加并投入到 Sigmoid 激活函数中,因此将激活结果压缩到 0 到 1 之间。以下是更新门在整个单元的位置与表示方法。
更新门帮助模型决定到底要将多少过去的信息传递到未来,或到底前一时间步和当前时间步的信息有多少是需要继续传递的。这一点非常强大,因为模型能决定从过去复制所有的信息以减少梯度消失的风险。
3.2.2 重置门
本质上来说,重置门主要决定了到底有多少过去的信息需要遗忘,我们可以使用以下表达式计算: 该表达式与更新门的表达式是一样的,只不过线性变换的参数和用处不一样而已。下图展示了该运算过程的表示方法。如前面更新门所述, 和 先经过一个线性变换,再相加投入 Sigmoid 激活函数以输出激活值。
3.2.3 当前记忆内容
现在我们具体讨论一下这些门控到底如何影响最终的输出。在重置门的使用中,新的记忆内容将使用重置门储存过去相关的信息,它的计算表达式为:
入 与上一时间步信息 先经过一个线性变换,即右乘矩阵 。因为前面计算的重置门是一个由 0 到 1 组成的向量,它会衡量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息完全被遗忘掉。该乘积将确定所要保留与遗忘的以前信息。将这两部分的计算结果相加再投入双曲正切激活函数中。该计算过程可表示为:
3.2.4 当前时间步的最终记忆
在最后一步,网络需要计算 ,该向量将保留当前单元的信息并传递到下一个单元中。在这个过程中,我们需要使用更新门,它决定了当前记忆内容 h’t 和前一时间步 h(t-1) 中需要收集的信息是什么。这一过程可以表示为:
为更新门的激活结果,它同样以门控的形式控制了信息的流入。 与 的 乘积表示前一时间步保留到最终记忆的信息,该信息加上当前记忆保留至最终记忆的信息就等于最终门控循环单元输出的内容。
门控循环单元不会随时间而清除以前的信息,它会保留相关的信息并传递到下一个单元,因此它利用全部信息而避免了梯度消失问题。
参考文献
[1] 作者:colah 链接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/ 来源:Understanding LSTM Networks(Github) [2] 作者:Jerry_wl 链接:https://www.jianshu.com/p/4b4701beba92 来源:简书