循环神经网络 RNN
概述
循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域。
对于这类问题,RNN则比较擅长。那么RNN是怎么做到的呢?
RNN假设我们的样本是基于序列的。比如是从序列索引1到序列索引$\tau$的。对于这其中的任意序列索引号$t$,它对应的输入是对应的样本序列中的$x^{(t)}$。
而模型在序列索引号$t$位置的隐藏状态$h^{(t)}$,则由$x^{(t)}$和在$t−1$位置的隐藏状态$h^{(t−1)}$共同决定。在任意序列索引号$t$,我们也有对应的模型预测输出$o^{(t)}$。
通过预测输出$o^{(t)}$和训练序列真实输出$y^{(t)}$,以及损失函数$L^{(t)}$,我们就可以用DNN类似的方法来训练模型,接着用来预测测试序列中的一些位置的输出。
RNN模型
上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。
这幅图描述了在序列索引号t附近RNN的模型。其中:
$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的模型的“循环反馈”的思想。
RNN前向传播算法
对于任意一个序列索引$t$,隐藏状态$h^{(t)}$由 输入$x^{(t)}$ 和 前一个隐藏状态$h^{(t-1)}$得到。
hint: 我把隐藏状态理解为时间序列中该时间事件的内部真实状态。
隐藏状态
其中 $\sigma$ 为RNN的激活函数,主要为tanh,b为线性偏执。
模型的输出
序列索引号$t$时模型的输出$o^{(t)}$的表达式比较简单:- 最终预测输出
在最终在序列索引号$t$时我们的预测输出为:通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。
通过损失函数$L^{(t)}$,比如对数似然损失函数,我们可以量化模型在当前位置的损失,即$\hat{y}^{(t)}$和$y^{(t)}$的差距。
RNN小结
RNN虽然理论上可以很漂亮的解决序列数据的训练,但是它也像DNN一样有梯度消失时的问题,当序列很长的时候问题尤其严重。
因此,上面的RNN模型一般不能直接用于应用领域。在语音识别,手写书别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个特例LSTM。