1.单向RNN结构

上图为一个普通的RNN结构,和DNN不同的是,RNN可以保留之前的信息,也就是在计算t石时刻隐藏层的值时上一时刻
也要参与计算,即当前时刻的隐藏层的值由当前时刻的输入和上一时刻的隐藏层值共同决定,由递推的思想就可以得出,t-1时刻值与t-2关,t-2与t-3有关,....即可以将前面的信息一直保存到当前时刻(取决于权重W)
以t时刻的数据为例,其他的计算方式与上述一样,表示的是t时刻的输入,
表示的是t时刻隐藏层的值,
表示的是t时刻的输出。
上式中V,U,W均为矩阵,故用大写字母表示,均为向量,故用小写字母表示.(1)式是输出层的计算公式,输出层是一个全连接层,它的每个节点都与循环层的每个节点相连,V是输出层的权重矩阵,g是激活函数,(2)式是循环层的计算公式,U是输入x的权重矩阵,W是上一次的值
作为这一次的输入的权重矩阵,f是激活函数。
将(1)与(2)合并,可以得到:
从(3)式可以发现,t时刻的输出,与前面的都有关,这就是为什么循环神经网络可以往前看任意多个值的原因。
2.双向RNN
在机器翻译和其他自然语言处理方面,有时候当前的输出不仅和前面的输入有关,有时与后面的输入也有关,此时就衍生出双向RNN,其结构如下所示:

双向RNN结构中,隐藏层要保存两个值,一个A参数正向计算,一个A‘参与反向计算,最终的输出y2取决于A2和A2’。以y2为例,说明双向RNN的计算过程:(由于latex水平太烂,A'在公式中打不出来,所以全部用来表示)
的计算过程如下:
正向计算时,隐藏层的值与
有关,反向计算时(此时的反向计算不是指梯度的反向传播),隐藏层的
与
有关;最终的输出取决于正向与反向计算的加和。将其推广到一般形式,则双向RNN的计算公式如下所示:
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说和
、
、
都是不同的权重矩阵。
循环神经网络的训练:BPTT算法
BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:
前向计算每个神经元的输出值;
反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入
的偏导数;
计算每个权重的梯度。
最后再用随机梯度下降算法更新权重。