RNN(Recurrent Neural Network)是深度神经网络的一种,因为拥有「记忆」功能,主要应用在时序相关的场景中,如NLP、图像标注等。目前应用比较多的是RNN 的一种变种LSTM(Long Short-term Memory)、GRU 等。
先来看一张 RNN 经典的图
RNN 的计算公式如下:
其中,是 t 时刻的输入;
是 t 时刻的「记忆」,也可以说是系统的状态, 它保存了之前的信息,一般情况下,某个非线性函数,比如 RELU,tanh 等;
是 t 时刻的输出,这个输入有时候有用,有时候没用,具体看在什么场景了,如果在翻译场景中,应该是有用的,如果在情感分类中,那只有最后一个输出是有用的。
上面就介绍完 RNN是什么了,下面说一下RNN 的参数 W/U/V 怎么调节以拟合训练数据。
这里也是用到了反向传播,是一种增强版,BPTT(Backpropagation Through Time),
首先说一下链式法则,链式法则主要提供了计算复杂函数梯度(导数)的方法。
我们来看一个具体的例子:
上式就是一个 sigmoid 函数,
其中,t=W0*X0 + W1*X1+W2
感兴趣的可以自己推到一下哈
ok,链式法则知道后,BP 算法应该也差不多了,就是通过链式法则来调节网络参数,达到训练目的。
下来再介绍下 BPTT 在 RNN 中的应用。
为什么这里是 BPTT 呢,从 RNN 的计算公式可以看到,V 是可以应用 BP 算法进行优化的,但是 W/U 就不可以。那我们该怎么做呢?
我们先来看下 V
V 可以很容易的求出来
接着我们看下 W/U,
好,那BPTT 我们就了解到这里
接下来就是动手实现 RNN 了
可以参考这个 Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano