深度学习算法——循环神经网络RNN

RNN(Recurrent Neural Network)是一组用于处理序列数据的神经网络。序列数据的特点是后面的数据跟前面的数据有关系,是一种按照先后顺序排列的数据。一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。

RNN对序列特性的数据非常有效,它能够挖掘数据中的时序信息以及语义信息,大多应用于语音识别、语言模型、机器翻译以及时序分析等NLP领域。

RNN的结构为:

深度学习算法——循环神经网络RNN_第1张图片

 

具体含义如下:

x^{(t)}代表在序列索引号t时训练样本的输入,同样的,x^{(t-1)}x^{(t+1)}代表在序列索引号t-1和t+1时训练样本的输入;

h^{(t)}代表在序列索引号t时模型的隐藏状态,h^{(t)}x^{(t)}h^{(t-1)}共同决定。

o^{(t)}代表在序列索引号t时模型的输出。o^{(t)}只由模型当前的隐藏状态h^{(t)}决定。

L^{(t)}代表在序列索引号t时模型的损失函数。

y^{(t)}代表在序列索引号t时训练样本序列的真实输出。

U,W,V这三个矩阵是模型的线性关系参数,在整个RNN网络中是共享的。 

基于上面的模型,得出RNN前向传播算法

对于任意一个序列索引号t,隐藏状态h^{(t)}x^{(t)}h^{(t-1)}得到:

h^{(t)}=\sigma (Ux^{(t)}+Wh^{(t-1)}+b)

其中,\sigma为RNN的激活函数,一般为tanh,b为线性关系的偏倚。

序列索引号t时模型的输出o^{(t)}的表达式为:

o^{(t)}=Vh^{(t)}+c

最终序列索引号t时我们的预测输出为:\hat{y^{(t)}} = \sigma(o^{(t)})

通常RNN是识别类的分类模型,所以上面的激活函数一般是softmax

RNN的反向传播也叫做BPTT(Back-propagation through time),反向传播的思路是通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。

为了简化描述,这里的损失函数用交叉熵损失函数,公式为:

L=-\sum_{i=1}^{n} y_i log\hat{y_i}

对于RNN,由于在序列的每个位置都有损失函数,因此最终的损失L为:

L=\sum_{t=1}^{T}L^{(t)}

其中,求解V,c的式子为:

\frac{\partial L}{\partial c} = \sum_{i=1}^{T} \frac{\partial L^{(t)}}{\partial c} = \sum_{t=1}^{T} \frac{\partial -(y^{(t)})^{T}log\hat{y}^{t}}{\partial c}=\sum_{t=1}^{T} \frac{\partial -(y^{(t)})^Tlog(softmax(Vh^{(t)}+c))}{\partial c}\\ =\sum_{t=1}^{T} \hat{y^{(t)}}-y^{(t)}

同理,\frac{\partial L}{\partial V}=\sum_{i=1}^{T} \frac{\partial L^{(t)}}{\partial V}=\sum_{t=1}^{T} \frac{\partial -(y^{(t)})^Tlog \hat{y^{(t)}}}{\partial V}\\ =\sum_{t=1}^{T} \frac{\partial -(y^{(t)})^Tlog(softmax(Vh^{(t)}+c))}{\partial (Vh^{(t)}+c)} \cdot (\frac{\partial (Vh^{(t)}+c)}{\partial V})^T\\ =\sum_{t=1}^{T} (\hat{y}^{\(t)}-y^{(t)})(h^{(t)})^T上面有个转置的原因是标量对矩阵求导缘故。

对于W,U,b的梯度计算比较复杂,若有感兴趣的可参考RNN的反向传播推导与numpy实现 - 知乎

你可能感兴趣的:(神经网络,深度学习,算法,rnn)