转载自:https://zhuanlan.zhihu.com/p/28806793
Recurrent Neural Network(RNN)循环神经网络,循环的意思就是同一网络结构不停的重复。相比较普通的神经网络,循环神经网络的不同之处在于,它在神经元之间还有相互的连接。在隐层上增加了一个反馈连接,也就是说,RNN隐层当前时刻的输入有一部分是前一时刻的隐层输出,这使得RNN可以通过循环反馈连接保留前面所有时刻的信息,这赋予了RNN记忆功能。这些特点使得RNN非常适合用于对时序信号的建模。下图为循环神经网络的结构示意图:

一.  RNN公式

整理一下可以写为:

W_{hy}是LxN的权重矩阵,连接了N个隐含层单元到L个输出层单元, W_{xh} 是NxK权重矩阵连接K 个输入单元到N个隐含层单元, W_{hh}是NxN权重矩阵,连接N个隐含层单元从时刻t-1到时刻t,u_t=W_{xh}x_t+W_{hh}h_{t-1} 是Nx1隐含层潜向量, v_t=W_{hy}x_t+h_t 是Lx1输出层潜向量。

解释一下这张图,给定计算t时刻的输入x_t  求 y_t 。输入x_t  与权 w_{xh} 相乘(加上bias)与前一时刻的隐层输出与权重h_{t-1}w_{hh}  即为 u_tu_t  经过激活函数f之后即为隐含层的h_tv_t=h_tw_{hy}v_t 经过激活函数g以后即得到输出 y_t。  f(u_t)是隐含层激活函数,  g(v_t)是输出层激活函数。典型的隐含层激活函数有sigmoid,tanh与rectified linear units,典型的输出函数激活函数linear函数和softmax函数。 

有时上一时刻的输出也会用来更新下一时刻的状态,这时状态等式变为:

W_{yh} 是连接输出层到隐含层的权重矩阵,本文中不失一般性都没有加入 y_{t-1} 的部分。

(2)  反向传播

定义最小化目标函数:

使用误差平方和作为代价函数E, y_t 为真实输出, I_t 为目标向量。c=0.5是一个便于计算的尺度因子 1/2 (基本trick)。

训练时使用梯度下降法来优化权重,使得代价函数E的值越小越好。权重w的更新规则是:

其中 \gamma 是学习率。

为了计算梯度,定义如下误差项:

记住这三项计算公式,后面的工作都以这几个公式为指导依次展开

误差项的递归计算:

tips:

在最后一个时间帧(T)上的计算 ,输出层的计算误差项:

隐含层:

这里的求导使用了链式求导法则,并且上一步求过的到vt的偏导可以拿来直接向后继续求误差项一直计算到 u_t 偏导处。

其他时间帧的误差项:

与最后一帧的公式类似。

对输出节点和隐层节点递归计算的误差项为:

其中误差项  \delta_t^y是时间帧t的输出层反向传播所得,\delta_{t+1}^h 则是时间帧t+1的隐层反向传播所得。注意⚠️此处与T时刻不同的地方在于,中间时刻是有两个部分反向传播回传误差,T时刻作为最后一项是没有后继节点的,因此只有y一项回传误差项。T时刻可以说是一个特例情况。

更新weight:

输出层:

输入层:

循环层矩阵:

伪代码:

参考:automatic speech recognition-a deep learning approach

下载地址已附上 点击原文链接 直接下载。