深度学习之RNN
递归神经网络RNN(也称循环神经网络)是一种节点沿着序列连接形成有向图的网络,显示时间序列的temporal dynamic behavior。与前馈神经网络不同之处在于,RNN可以使用其内部状态(记忆)来处理输入序列,递归/周期性的recurrent是指其每一个节点都执行相同的任务,但是输出依赖于输入和记忆,RNN适用于连续的手写识别、语音识别、机器翻译等任务。
一、RNN的结构
RNN的结构有两种表示方法,左图是RNN神经元(memory cell)折叠起来的形式,右图是RNN按时间维度展开的形式,下图是有复杂神经元的RNN。
二、RNN的前向传播
U为输入层到隐藏层的权重,将原始输入抽象后送入隐藏层;
V为隐藏层到输出层的权重,进一步抽象从隐藏层学习到的表示;
W为隐藏层到隐藏层的权重,负责控制、调度网络的记忆;
为t时刻的输入向量(对于语言模型,输入X为一句话,而某一时刻的
表示一个词向量);
为时刻t的隐状态(记忆),由输入和t-1时刻决定:
,σ为tanh等**函数;
为t时刻的预测输出:
,g为softmax函数;
为t时刻的实际输出;
为t时刻的损失函数;
通常U V W随机初始化, 初始化为0。
三、RNN的反向传播
RNN与DNN反向传播的算法类似,使用BP算法通过梯度下降迭代得到适合的一组RNN模型参数U V W。由于是基于时间的反向传播,因此也成为BPTT(back-propagation through time),与DNN不同的是,RNN模型的参数在序列的各个位置是共享的,反向传播时更新的是相同一组的参数。
t时刻产生的损失 可以用交叉熵(或平方误差等)表示,总损失为:
对L求解▽V时,不存在和之前状态的依赖,求导后求和即可:
求解▽W、▽U时计算由t和t+1两部分梯度组成,因此定义t时刻隐状态的梯度为,首先计算输出层的
,再反向递推各层
:
得到δ(t)后就可以计算▽W、▽U:
四、RNN种类
1、sequence-to-sequence
输入输出都是一个序列。例如股票预测时输入前N天的价格,输出明天的价格。
2、sequence-to-vector
输入是一个序列,输出是一个向量。例如输入一个电影评价序列,输出一个分数表示情感趋势(喜欢还是讨厌)。
3、vector-to-sequence
输入单一向量,输出一个序列。
4、encoder-decoder
输入encoder为sequence-to-vector,输出decoder为vector-to-sequence。这是一个delay模型,经过一段延迟即把所有输入都读取后,在decoder中获取输入并输出一个序列,可用于机器翻译等。
五、RNN总结
RNN和DNN的反向传播一样会出现梯度消失和梯度爆炸问题,与回溯路径太长有关,前面的权重基本不变,没有训练效果。因此发展出了很多复杂的RNN模型如LSTM、GRU等,将信息分为长期记忆和短期记忆,长期记忆可以传播很远,改变缓慢、相对稳定;梯度较大的记忆不会像RNN一样马上被抹除,因此可以一定程度上克服梯度消失的问题。
另外克服梯度爆炸可以用gradient clipping的trick,即当梯度超过阈值c或者小于-c时,将此时的梯度设置为c或-c。RNN的误差平面如下图所示,如果不采取任何措施时,当参数在某一次更新后,刚好碰到陡峭的区域时,梯度会变得非常大,则参数更新也会非常大,容易导数震荡问题。使用gradient clipping后,即使在梯度陡峭的地方也不会发生梯度爆炸的情况,因为梯度被限制在某个阈值内。
Deep Bidirectional RNN
深度双向RNN类似Bidirectional RNN,区别在于每个每一步输入有多层网络,这样的网络具有更加强大的表达能力和学习能力,但同时复杂性也提高了,同时需要训练更多的数据。
参考资料