Recurrent Neural Network(RNN)循环神经网络,循环的意思就是同一网络结构不停的重复。相比较普通的神经网络,循环神经网络的不同之处在于,它在神经元之间还有相互的连接。在隐层上增加了一个反馈连接,也就是说,RNN隐层当前时刻的输入有一部分是前一时刻的隐层输出,这使得RNN可以通过循环反馈连接保留前面所有时刻的信息,这赋予了RNN记忆功能。这些特点使得RNN非常适合用于对时序信号的建模。下图为循环神经网络的结构示意图:
一. RNN公式
整理一下可以写为:
是LxN的权重矩阵,连接了N个隐含层单元到L个输出层单元, 是NxK权重矩阵连接K 个输入单元到N个隐含层单元, 是NxN权重矩阵,连接N个隐含层单元从时刻t-1到时刻t, 是Nx1隐含层潜向量, 是Lx1输出层潜向量。
解释一下这张图,给定计算t时刻的输入 求 。输入 与权 相乘(加上bias)与前一时刻的隐层输出与权重 即为 , 经过激活函数f之后即为隐含层的 , , 经过激活函数g以后即得到输出 。 是隐含层激活函数, 是输出层激活函数。典型的隐含层激活函数有sigmoid,tanh与rectified linear units,典型的输出函数激活函数linear函数和softmax函数。
有时上一时刻的输出也会用来更新下一时刻的状态,这时状态等式变为:
是连接输出层到隐含层的权重矩阵,本文中不失一般性都没有加入 的部分。
(2) 反向传播
定义最小化目标函数:
使用误差平方和作为代价函数E, 为真实输出, 为目标向量。c=0.5是一个便于计算的尺度因子 1/2 (基本trick)。
训练时使用梯度下降法来优化权重,使得代价函数E的值越小越好。权重w的更新规则是:
其中 是学习率。
为了计算梯度,定义如下误差项:
记住这三项计算公式,后面的工作都以这几个公式为指导依次展开
误差项的递归计算:
tips:
在最后一个时间帧(T)上的计算 ,输出层的计算误差项:
隐含层:
这里的求导使用了链式求导法则,并且上一步求过的到vt的偏导可以拿来直接向后继续求误差项一直计算到 偏导处。
其他时间帧的误差项:
与最后一帧的公式类似。
对输出节点和隐层节点递归计算的误差项为:
其中误差项 是时间帧t的输出层反向传播所得, 则是时间帧t+1的隐层反向传播所得。注意⚠️此处与T时刻不同的地方在于,中间时刻是有两个部分反向传播回传误差,T时刻作为最后一项是没有后继节点的,因此只有y一项回传误差项。T时刻可以说是一个特例情况。
更新weight:
输出层:
输入层:
循环层矩阵:
伪代码:
参考:automatic speech recognition-a deep learning approach
下载地址已附上 点击原文链接 直接下载。