RNN结构及反BPTT向传播算法

写在前面

传统的人工神经网络(Artificial Neural Network,ANN)存在很多局限性,在不断发展中,出现了真对图像数据的卷积神经网络(Convolutional Neural Network,CNN),解决了图像数据大,权重参数过多难以训练的问题。以及针对有序序列数据的循环神经网络(Recurrent neural Network,RNN),不谋而合的是在这两种网络中都采用了权重共享,这样大大减少了网络参数过多而难以训练的问题。

循环神经网络(RNN)

传统的神经网络结构采用的是平行结构,所以无法应用于有序数据。举个例子,好比你要参加考试了,考试的内容是你这一阶段学习的内容,但是,和以前的学到的知识有没有关系?明显是有的,不然怎么说夯实基础。如果没有的话,倒是好了,直接上高中,参加高考啊!省钱省时,何乐而不为呢?而RNN的结构改变就在于除了在输入上是有先后顺序(有序序列)外,还能够用到以前的信息,从而对现在和以后的结果产生影响。(所以说基础还是很重要的,不然就输在起跑线上了)

RNN的网络结构

典型的RNN网络结构如下:RNN结构及反BPTT向传播算法
是不是有点晕?反正我一开始是晕的。上图右边是简化的结构,同样包括输入层(Input Layer)、隐藏层(Hidden Layer)和输出层(Output Layer),当然可以有多层的隐藏层。上图确实不好分析,那换种方式来看看:
RNN结构及反BPTT向传播算法
清楚多了吧!xt是输入,A是隐层,ht是输出。t是序列先后的标识,这里看做时刻。从上面可以看出输入是和时间有关的,并不是ANN和CNN那种不分先后的输入,而且RNN的输入一定要按着顺序输入,否则,学习出来的结果什么都是!而且隐层神经元是有向连接的,这也就是为什么RNN能够利用之前的信息。看完了二维的结构,再看看立体一点的。RNN结构及反BPTT向传播算法
这是一个比较清楚好看清结构的图了,像不像电线桩?隐层之间的连接就是电线,时序便是电流的方向。怎么感觉跟上面的图不一样呢?其实是一样的,上面的图每个节点是一个向量,而这个图的每一个节点是向量的每一个元素。例如最底下那一层xt,就是输入向量。每一个节点是向量的一个元素,例如在NLP中,是词向量的每一个元素。

RNN前向传播

首先我们规定一些符号:
netth:表示t时刻隐层的节点输入;
netty:表示t时刻输出层的输入;
f(x):表示隐层节点的**函数;
bh:是隐层的偏置;
g(x):表示输出层的**函数;
by:是输出层的偏置;
ht:是隐层节点的值;
yt:是输出值;
VUW:分别是输入到隐层、隐层之间、隐层到输出之间的权重。
则RNN的前向传播过程是:
(1). 隐层节点ht的计算(时刻t的输入以及上一时刻t1隐状态作为输入):
netth=XtV+ht1U+bh
ht=f(netth)
(2). 输出节点yt的计算:
netty=htW+by
yt=g(netty)

RNN方向传播——BPTT

有了前向传播算法,下一步则需要更新权重UVW,RNN的反向传播方法与ANN的BP算法并无本质的区别,仅仅是在隐层之间的权重求导。同样,先规定几个符号:
δtyk=Enettyk
δthj=Enetthj
E是结果残差,且:
E=tEt=tL(ytzt)
L是损失函数,可以是均方损失也可以是交叉熵损失函数,zt是样本的真实标记。
δtyk=Enettyk=Eytk ytknettyk
δthj=Enetthj=Ehtj htjnetthj
W=Eytk ytknettyk nettykW=t(ht)Tδty
U=Eytk ytknettyk nettykhtj  htjU=t(ht1)Tδth
V=Eytk ytknettyk nettykhtj  htjV=t(xt)Tδth
by=Eytk ytknettyk nettykby=tδty
bh=Eytk ytknettyk nettykhtj  htjbh=tδth
由于RNN的残差是来自己所有时刻的残差和,在进行求参数梯度的时候同样需要计算参数个时刻导数和,这是很好理解的。