一、RNN的网络结构
二、前向传播
假定隐藏单元的激活函数是tanh,输出是离散的。表示离散变量的常规方式是把输出O作为每个离散变量可能值的非标准化对数概率。然后经softmax函数处理后,获得标准化后概率的输出向量(hat{y})。RNN从特定的初始状态(h^{left ( 0 ight )})开始传播。从t=1到(t= au)的每个时间步,更新方程如下:
其中b和c是偏置向量权重矩阵U、V、W分别对应输入到隐层,隐层到输出,隐层到隐层的连接。这个神经网络将一个输入序列映射到相同长度的输出序列。与x序列配对的y的总损失为所有时间步的损失之和。
例如:(L^{left ( t
ight )})为给定的(x^{left ( 1
ight )},...,x^{left ( t
ight )})后(y^{left ( t
ight )})的负对数似然(最大似然估计的反数,可用作损失函数,进一步通过梯度下降来确定各参数值)。
其中(p_{model}left ( y^{left ( t
ight )}mid left { x^{left ( 1
ight )},...,x^{left ( t
ight )}
ight }
ight ))需要读取模型输出的向量
(hat{y}^{left ( t
ight )})中对应于(y^{left ( t
ight )})的项。
三、BPTT(back-propagation through time)反向传播
使用BPTT计算RNN的公式中用红色框线框出来的公式。包括参数U、V、W、b、c以及以t为索引的节点序列(x^{left ( t ight )})、(h^{left ( t ight )})、(o^{left ( t ight )})、(L^{left ( t ight )})。对于每一个节点N,我们需要基于N后面的节点的梯度,递归的计算梯度(igtriangledown_{N}L)。从离最终损失最近的节点开始递归:
在这个导数中,假设输出(o^{left ( t ight )})作为softmax函数的参数,从softmax可以获得关于输出的概率向量(hat{y}),所有i、t,关于时间步t输出的梯度(igtriangledown_{o^{left ( t ight )}}L)如下:
对化简公式的过程进行补充:
从序列的尾端开始,反向计算。在最后的时间步$ au (,)h^{left ( au ight )}(只有)o^{left ( au ight )}$作为后续节点,因此该梯度很简单。
从时刻(t= au -1)到t=1反向迭代,通过时间反向传播梯度,注意(h^{left ( t ight )}left ( t< au ight ))同时具有(o^{left ( t ight )})和(h^{left ( t+1 ight )})两个后续节点。因此,它的梯度由下式计算:
对化简公示的补充:
其中(diag(1-left ( h^{t+1}
ight )^{2}))表示包含元素(1-left ( h^{t+1}
ight )^{2})的对角阵。这是关于时刻t+1与隐藏单元i关联的双曲正切的Jacobian。
定义只在t时刻使用虚拟变量(W^{left ( t
ight )})作为W的副本。然后使用(igtriangledown_{W^{left ( t
ight )}})表示权重在时间步t对梯度的贡献。剩下参数的梯度如下:
三、总结
理论上循环神经网络可以支持任意长度的序列,然而在实际训练过程中,如果序列过长,一方面会导致优化时出现梯度消散和梯度爆炸的问题,另一方面,展开后的前馈神经网络会占用过大的内存,所以实际中会规定一个最大长度,当序列长度超过规定长度之后会对序列进行截断。