当前位置:   article > 正文

循环神经网络总结_深度学习 循环神经网络实验小结

深度学习 循环神经网络实验小结

DNN及DNN的特例CNN的模型都是前向反馈的,模型的输出和模型本身没有关联关系。循环神经网络(Recurrent Neural Networks ,RNN)是一种输出和模型间有反馈的神经网络。

1. RNN概述

DNN和CNN中,训练样本的输入和输出是比较的确定的。但当训练样本输入是连续的长短不一的序列,如基于时间的序列:一段段连续的语音,一段段连续的手写文字时,很难直接将其拆分成一个个独立的样本来通过DNN/CNN进行训练。

2. RNN模型

RNN模型有比较多的变种,这里介绍最主流的RNN模型结构:

上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。

这幅图描述了在序列索引号t附近RNN的模型。其中:

3. RNN前向传播算法

4. RNN反向传播算法推导

RNN反向传播算法的思路和DNN一样,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。由于是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。BPTT和DNN有一些不同点,RNN所有的U,W,V,b,c在序列的各个位置是共享的,反向传播时更新的是相同的参数。

损失函数使用对数损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数。对于RNN,由于在序列的每个位置都有损失函数,因此最终的损失L为:

除了梯度表达式不同,RNN的反向传播算法和DNN区别不大。

RNN理论上可以解决序列数据的训练,但是它像DNN一样有梯度消失的问题,当序列很长的时候问题尤其严重。因此,上面的RNN模型一般不能直接用于应用领域。在语音识别,手写书别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个特例LSTM。


循环神经网络(Recurrent Neural Networks ,RNN)

RNN是一种输出和模型间有反馈,可以对序列型数据进行建模的神经网络模型。传统的前馈神经网络一般输入的都是一个定长的向量,无法处理变长的序列信息,即使通过一些方法把序列处理成定长的向量,模型也很难捕捉序列中的长距离依赖关系。为了解决这个问题,RNN通过将神经元串行来处理序列化的数据,引入了隐状态h的概念(hidden state),h可以对序列形的数据提取特征,由于每个隐状态神经元能用它的内部变量保存之前输入的序列信息,可以据此进行分类或生成新的序列。

RNN的重要特点:在计算所有隐状态时,每一步使用的参数U,W,b都是一样的,即每个步骤的参数都是共享的。

使用新的参数V和c,通过对h进行计算可以得到输出值(每一步使用的参数V和c也都是一样的)。分类问题使用Softmax函数,将输出转换成各个类别的概率。输入和输出序列是等长的,

优点:模型是时间维度上的深度模型,可以对序列内容建模;h=f(现有的输入+过去记忆总结)

缺点:需要训练的参数较多,容易出现梯度消失梯度爆炸问题;不具有特征学习能力

梯度爆炸与梯度消失

RNN反向传播算法的思路和DNN一样,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。具体来说:RNN每一层的的隐状态都由前一层的隐状态经过变换和激活函数得到,反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失,所以RNN很难处理“长程依赖”问题,即无法学到输入序列中的长距离依赖关系。

梯度爆炸与梯度消失的解决

梯度爆炸:可以通过梯度裁剪来缓解,当梯度大于给定阈值时,对梯度进行等比收缩。

梯度消失:

  1. 对模型本身进行改进:深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象;而对于RNN来说,LSTM及其变种门控循环单元(Gated recurrent unit,GRU)等模型通过加入门控机制,可以一定程度缓解梯度消失。
  2. 使用ReLU激活函数:在前馈神经网络中采用ReLU激活函数通常可以有效地改善梯度消失,取得更快的收敛速度和更好的收敛结果。在RNN中也可以使用ReLU作为隐含层的激活函数,但是需要对矩阵的初值做一定限制,否则十分容易引发数值问题。只有将W初始化为单位矩阵时才能取得比较好的效果。实验证明,初始化W为单位矩阵并使用ReLU激活函数在一些应用中取得了与LSTM相似的结果,并且学习速度比LSTM更快 

长短期记忆网络(Long Short Term Memory,LSTM)

LSTM是循环神经网络的扩展,RNN每一层的的隐状态都由前一层的隐状态经过变换和激活函数得到,反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失,所以RNN很难处理“长程依赖”问题,即无法学到输入序列中的长距离依赖关系。LSTM在隐状态计算时以加法代替了这里的迭代变换,可以避免梯度消失的问题,使网络学到长程的规律。

一个RNN单元的输入由两部分组成,即前一步RNN单元的隐状态和当前这一步的外部输入,此外还有一个输出。从外部结构看,LSTM和RNN的输入输出一模一样,同样是在每一步接受外部输入和前一阶段的隐状态,并输出一个值。因此,RNN可以无缝切换到LSTM。

LSTM里各模块分别使用什么激活函数,可以使用别的激活函数吗?

在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数。这两个激活函数都是饱和的,在输入达到一定值的情况下,输出就不会发生明显变化了。如果使用非饱和的激活函数,例如ReLU,那么将难以实现门控的效果。 Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/85604
推荐阅读
  

闽ICP备14008679号