在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法。链接如下:

深度学习(一):DNN前向传播算法和反向传播算法深度学习(二):DNN损失函数和激活函数的选择深度学习(四):卷积神经网络(CNN)模型结构,前向传播算法和反向传播算法介绍。

建议在读本文之前,重点读下前2篇文章。如果不了解DNN的前向和反向传播的话,理解本篇文章会有难度。

这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域。

一、RNN概述

在前面讲到的DNN和CNN中,训练样本的输入和输出是比较确定的。但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练

而对于这类问题,RNN则比较的擅长。那么RNN是怎么做到的呢?RNN假设我们的样本是基于序列的。比如是从序列索引1到序列索引cnn正向传播和反向传播图片 cnn前向传播算法_DNN的。对于这其中的任意序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02,它对应的输入是对应的样本序列中的cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_03。而模型在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02位置的隐藏状态cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05,则由cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_03和在cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_07位置的隐藏状态cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_08共同决定。在任意序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02,我们也有对应的模型预测输出cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10。通过预测输出cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10和训练序列真实输出cnn正向传播和反向传播图片 cnn前向传播算法_RNN_12,以及损失函数cnn正向传播和反向传播图片 cnn前向传播算法_DNN_13,我们就可以用DNN类似的方法来训练模型,接着用来预测测试序列中的一些位置的输出。

下面我们来看看RNN的模型。

二、RNN模型

RNN模型有比较多的变种,这里介绍最主流的RNN模型结构如下:




cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_14


上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。

这幅图描述了在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02附近RNN的模型。其中:

1)cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_03代表在序列索引号t时训练样本的输入。同样的,cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_17cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_18代表在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_07cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_20时训练样本的输入。

2)cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05代表在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时模型的隐藏状态。cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_03cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_25共同决定。

3)cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10代表在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时模型的输出。cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10只由模型当前的隐藏状态cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05决定。

4)cnn正向传播和反向传播图片 cnn前向传播算法_DNN_13代表在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时模型的损失函数。

5)cnn正向传播和反向传播图片 cnn前向传播算法_RNN_12代表在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时训练样本序列的真实输出。

6)cnn正向传播和反向传播图片 cnn前向传播算法_DNN_34这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。

三、RNN前向传播算法

有了上面的模型,RNN的前向传播算法就很容易得到了。

对于任意一个序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02,我们隐藏状态cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_03cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_25得到:
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_39

其中cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_40为RNN的激活函数,一般为tanh, cnn正向传播和反向传播图片 cnn前向传播算法_RNN_41为线性关系的偏倚。

序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时模型的输出cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10的表达式比较简单:
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_44

在最终在序列索引号cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02时我们的预测输出为:
cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_46

通常由于RNN是分类模型,所以上面这个激活函数一般是softmax

通过损失函数cnn正向传播和反向传播图片 cnn前向传播算法_DNN_13,比如对数似然损失函数,我们可以量化模型在当前位置的损失,即cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_48cnn正向传播和反向传播图片 cnn前向传播算法_RNN_12的差距。

四、RNN反向传播算法推导

有了RNN前向传播算法的基础,就容易推导出RNN反向传播算法的流程了。RNN反向传播算法的思路和DNN是一样的,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数cnn正向传播和反向传播图片 cnn前向传播算法_DNN_50。由于我们是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。当然这里的BPTT和DNN也有很大的不同点,即这里所有的cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_51在序列的各个位置是共享的,反向传播时我们更新的是相同的参数

为了简化描述,这里的损失函数我们为对数损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数

对于RNN,由于我们在序列的每个位置都有损失函数,因此最终的损失cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_52为:

cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_53

根据公式(2),cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_54的梯度计算是比较简单的:
cnn正向传播和反向传播图片 cnn前向传播算法_DNN_55

cnn正向传播和反向传播图片 cnn前向传播算法_DNN_56


有必要介绍下公式(5)和(6)的求导。

对于公式(5),由于激活函数是softmax,损失函数是对数损失,因此该推导过程与深度学习(二):DNN损失函数和激活函数的选择里的公式(4)完全一样。

对于公式(6),为什么cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_57会放在后面,那是因为在实际矩阵求导的链式法则里面,对于两步的链式法则:

1)如果是标量对矩阵求导改成链式法则,那么求导的后半部分不用提前。
比如cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_58为标量,cnn正向传播和反向传播图片 cnn前向传播算法_RNN_59为矩阵,则:
cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_60

2)如果是标量对向量求导改成链式法则,那么求导的后半部分要提前。
比如cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_58为标量,cnn正向传播和反向传播图片 cnn前向传播算法_RNN_59为向量,则:
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_63


但是cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_64的梯度计算就比较的复杂了。从RNN的模型可以看出,在反向传播时,在某一序列位置cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_65的梯度损失由当前位置的输出对应的梯度损失和序列索引位置cnn正向传播和反向传播图片 cnn前向传播算法_DNN_66时的梯度损失两部分共同决定。对于cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_67在某一序列位置cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02的梯度损失需要反向传播一步步的计算。我们定义序列索引cnn正向传播和反向传播图片 cnn前向传播算法_DNN_02位置的隐藏状态的梯度为:
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_70

这样我们可以像DNN一样从cnn正向传播和反向传播图片 cnn前向传播算法_RNN_71递推cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_72
cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_73

cnn正向传播和反向传播图片 cnn前向传播算法_DNN_74


有必要介绍下公式(8)和(9)的求导。

先来看公式(8),两部分相加的原因是:
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_75
cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_76
所以cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_52cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05求导时,要分别经过cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_10cnn正向传播和反向传播图片 cnn前向传播算法_RNN_80cnn正向传播和反向传播图片 cnn前向传播算法_DNN_05进行求导。

cnn正向传播和反向传播图片 cnn前向传播算法_DNN_82的导数是cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_83,这是显然的。

重点是cnn正向传播和反向传播图片 cnn前向传播算法_RNN_84的导数怎么求。根据公式(1)
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_85

在前面我们介绍过了,隐含层的激活函数是tanh激活函数,即cnn正向传播和反向传播图片 cnn前向传播算法_DNN_86,它的导数为cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_87。结合
深度学习(一):DNN前向传播算法和反向传播算法中公式(12),有
cnn正向传播和反向传播图片 cnn前向传播算法_RNN_88

这里是双曲正切激活函数,用矩阵中对角线元素表示向量中各个值的导数,可以去掉哈达马乘积,转化为矩阵乘法。

对于cnn正向传播和反向传播图片 cnn前向传播算法_DNN_89,正确的运算顺序应该是先cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_90(注意这里是哈德玛乘积的意思,即cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_91个元素对应位置相乘,并非cnn正向传播和反向传播图片 cnn前向传播算法_前向传播_92乘以cnn正向传播和反向传播图片 cnn前向传播算法_RNN_93),然后再用cnn正向传播和反向传播图片 cnn前向传播算法_RNN_94与上面的结果运算。即先进行哈德玛乘积。

知道了公式(8),公式(9)是显然易见的。


有了cnn正向传播和反向传播图片 cnn前向传播算法_cnn正向传播和反向传播图片_72,计算cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_64就容易了,这里给出cnn正向传播和反向传播图片 cnn前向传播算法_反向传播_64的梯度计算表达式:
cnn正向传播和反向传播图片 cnn前向传播算法_DNN_98

cnn正向传播和反向传播图片 cnn前向传播算法_DNN_99

cnn正向传播和反向传播图片 cnn前向传播算法_RNN_100

可以看到,除了梯度表达式不同,RNN的反向传播算法和DNN区别不大。

五、RNN小结

上面总结了通用的RNN模型和前向反向传播算法。当然,有些RNN模型会有些不同,自然前向反向传播的公式会有些不一样,但是原理基本类似。

RNN虽然理论上可以很漂亮的解决序列数据的训练,但是它也像DNN一样有梯度消失时的问题,当序列很长的时候问题尤其严重。因此,上面的RNN模型一般不能直接用于应用领域。在语音识别,手写书别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个特例LSTM,下一篇我们就来讨论LSTM模型。

参考文献

循环神经网络(RNN)模型与前向反向传播算法 该篇博客。