当前位置:   article > 正文

BP算法和RNN_双向RNN的理解

rnn bp 关系

我们在学习某种神经网络模型时,一定要把如下几点理解透了,才算真正理解了这种神经网络。

  1. 网络的架构:包含那些层,每层的输入和输出,有那些模型参数是待优化的
  2. 前向传播算法
  3. 损失函数的定义
  4. 后向传播算法
  5. 什么情况下认为是发现了过拟合,怎么进行优化。

很多介绍深度学习的书籍,在介绍全连接神经网络时,对这几个方面都会介绍的比较清楚,但是在介绍CNN,RNN,LSTM等,都会只偏重介绍网络的架构,其他的方面介绍的少,没有讲解透彻。

如果不信,我提一个问题,如果能够在那本书中找到答案,请一定要告诉我这边书的名字!

问题:双向RNN中,有两个隐藏状态,一个是正序,如下图中的实线;一个是逆序,如下图中的虚线。那么在计算t时刻的状态变量时,对于正序,比较好理解,输入是上一个时刻的隐藏状态和当前时刻的系统输入;对于逆序,输入是下一个时刻的隐藏状态和当前时刻的系统输入。下一个时刻的隐藏状态属于未来的状态,那么,系统在计算时,怎么能够用未来的状态做输入呢?

d3ebc5a4-7913-eb11-8da9-e4434bdf6706.png

我可是日夜冥思苦想才想通这个问题啊。 下面给出历程。

先理解下RNN的几点:

网络的架构:

d4ebc5a4-7913-eb11-8da9-e4434bdf6706.png

这是一个标准的RNN结构图,图中每个箭头代表做一次变换,也就是说箭头连接带有权值。左侧是折叠起来的样子,右侧是展开的样子,左侧中h旁边的箭头代表此结构中的“循环“体现在隐层。

在展开结构中我们可以观察到,在标准的RNN结构中,隐层的神经元之间也是带有权值的。也就是说,随着序列的不断推进,前面的隐层将会影响后面的隐层。图中O代表输出,y代表样本给出的确定值,L代表损失函数,我们可以看到,“损失“也是随着序列的推荐而不断积累的。

除上述特点之外,标准RNN的还有以下特点:

1、权值共享,图中的W全是相同的,U和V也一样。

2、每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。

前向传播算法:

x是输入,h是隐层单元,o为输出,L为损失函数,y为训练集的标签。这些元素右上角带的t代表t时刻的状态,其中需要注意的是,因策单元h在t时刻的表现不仅由此刻的输入决定,还受t时刻之前时刻的影响。V、W、U是权值,同一类型的权连接权值相同。

前向传播算法其实非常简单,对于t时刻:

h(t)=ϕ(U*x(t)+W*h(t−1)+b)

其中ϕ()为激活函数,一般来说会选择tanh函数,b为偏置。

t时刻的输出就更为简单:

o(t)=V*h(t)+c

最终模型的预测输出为:

yˆ(t)=σ(o(t))

其中σ为激活函数,通常RNN用于分类,故这里一般用softmax函数。

损失函数的定义:

对于分类问题,采用交叉熵。

后向传播算法:

BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是BP算法,BP算法本质还是梯度下降法,那么求各个参数的梯度便成了此算法的核心。

需要寻优的参数有三个,分别是U、V、W。与BP算法不同的是,其中W和U两个参数的寻优过程需要追溯之前的历史数据,参数V相对简单只需关注目前。

什么时候出现过拟合,怎么优化?

很多资料在介绍全连接神经网络时,都介绍过拟合的定义以及优化的方法,然后在介绍RNN时,却没有介绍这些。对于学习和实践的过程就很容易忽略这些。其中这些在实践中也是非常重要的。

出现过拟合的现象,就是安装过拟合的定义,当模型在训练数据的表现很好,而在测试数据集的表现不好时。

优化的方法:一是使用正则化,而是使用dropout。 dropout就是对权重参数进行随机丢弃的过程,采用超参数来控制丢失的比例。一般对同一个序列的内部的参数(即 U和V)使用dropout,而不对不同序列之间的连接的参数(即W)进行dropout。为什么要这样呢?这点很多书籍和资料都没有讲解透彻。

这其实是一个从实践的角度总结出来的,隐状态h是之前输入的信息的表示,在传递给下一个时刻,如果进行dropout,会有信息丢失。 而对同一个序列的内部的参数(即 U和V)使用dropout,只是讲信息表示的维数降低,比如隐层的维数是200维,使用dropout之后,变成180维,从而降低模型的复杂度。

现在理解双向RNN的几个方面:

  1. 网络的结构:在本文的开始有讲解,或者百度下,很多讲双向RNN的资料,基本上只讲解了这部分。要优化的参数包含两组:W,U,V。
  2. 前向传播算法:和RNN相比,这正是不太容易理解的地方。双向RNN中,有两个隐藏状态,一个是正序,如下图中的实线;一个是逆序,如下图中的虚线。那么在计算t时刻的状态变量时,对于正序,比较好理解,输入是上一个时刻的隐藏状态和当前时刻的系统输入;对于逆序,输入是下一个时刻的隐藏状态和当前时刻的系统输入。下一个时刻的隐藏状态属于未来的状态,那么,系统在计算时,怎么能够用未来的状态做输入呢?
  3. 损失函数的定义,是根据要解决的问题的类型来选择的,跟网络的类型一般关系不大。
  4. 后向传播算法,也是采用BPTT。不详细展开,根据函数定义和偏导数的定义,比如容易类推。
  5. 什么情况下认为是发现了过拟合,怎么进行优化。和RNN相比,比较容易类推。

下一个时刻的隐藏状态属于未来的状态,那么,系统在计算时,怎么能够用未来的状态做输入呢?

这个问题,既然很多资料没有讲,那就找原始paper的作者,是怎么说明的。

https://www.di.ufpe.br/~fnj/RNA/bibliografia/BRNN.pdf​www.di.ufpe.br

d5ebc5a4-7913-eb11-8da9-e4434bdf6706.png

这里的确是讲解了,只是我还是没有理解。到这里为止,能够理解的请举手!

我发现tensorflow的代码,bidirectional_dynamic_rnn 函数的实现,坐了两遍计算:第一遍先正向计算隐状态h,保存成一个序列,顺序是t时刻从1到T。第二遍,将输入反转,计算隐状态h,保存为一个序列,这样顺序就是t时刻从T到1. 最后在计算output,这样在计算output时,所有时刻的隐状态都是已经计算出来了。这样之前的疑问就得到解答了。

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

闽ICP备14008679号