基本循环神经网络
下图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:
这个网络在t时刻接收到输入之后,隐藏层的值是,输出值是。关键一点是的值不仅仅取决于,还取决于。我们可以用下面的公式来表示循环神经网络的计算方法:
式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值作为这一次的输入的权重矩阵,f是激活函数。
从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。
如果反复把式2带入到式1,我们将得到:
从上面可以看出,循环神经网络的输出值,是受前面历次输入值,,,,...影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。
双向循环神经网络
从上图可以看出,双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A'参与反向计算。最终的输出值取决于和。其计算方法为:
和则分别计算:
双向循环神经网络的通用计算方法:
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U'、W和W'、V和V'都是不同的权重矩阵。
深度循环神经网络
前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:
循环神经网络的训练
循环层如下图所示:
使用前面的式2对循环层进行前向计算:
注意,上面的、、都是向量,用黑体字母表示;而U、V是矩阵,用大写字母表示。向量的下标表示时刻,例如,表示在t时刻向量s的值。
我们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是,矩阵W的维度是。下面是上式展开成矩阵的样子,看起来更直观一些:
误差项的计算
用向量表示神经元在t时刻的加权输入,因为:
因此:
我们用a表示列向量,用表示行向量。上式的第一项是向量函数对向量求导,其结果为Jacobian矩阵:
同理,上式第二项也是一个Jacobian矩阵:
最后,将两项合在一起,可得:
上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻的误差项:
(式3)
式3就是将误差项沿时间反向传播的算法。
权重梯度的计算
现在,我们终于来到了BPTT算法的最后一步:计算每个权重的梯度。
首先,我们计算误差函数E对权重矩阵W的梯度。
只要知道了任意一个时刻的误差项,以及上一个时刻循环层的输出值,就可以按照下面的公式求出权重矩阵在t时刻的梯度:
我们下面可以简单推导一下式5。
我们知道:
因为对W求导U与无关,我们不再考虑。现在,我们考虑对权重项求导。通过观察上式我们可以看到只与有关,所以
按照上面的规律就可以生成式5里面的矩阵。
式6就是计算循环层权重矩阵W的梯度的公式。
式6详细推导:
因为U与W完全无关,我们把它看做常量。现在,考虑第一个式子加号右边的部分,因为W和都是W的函数,因此我们要用到大学里面都学过的导数乘法运算:
因此,上面第一个式子写成:
所以:
我们先计算式7加号左边的部分。是矩阵对矩阵求导,其结果是一个四维张量(tensor),如下所示:
接下来,我们知道,它是一个列向量。我们让上面的四维张量与这个向量相乘,得到了一个三维张量,再左乘行向量,最终得到一个矩阵:
接下来,我们计算式7加号右边的部分:
于是,我们得到了如下递推公式:
同权重矩阵W类似,我们可以得到权重矩阵U的计算方法。
式8是误差函数在t时刻对权重矩阵U的梯度。和权重矩阵W一样,最终的梯度也是各个时刻的梯度之和: