深度学习之RNN

 

递归神经网络RNN(也称循环神经网络)是一种节点沿着序列连接形成有向图的网络,显示时间序列的temporal dynamic behavior。与前馈神经网络不同之处在于,RNN可以使用其内部状态(记忆)来处理输入序列,递归/周期性的recurrent是指其每一个节点都执行相同的任务,但是输出依赖于输入和记忆,RNN适用于连续的手写识别、语音识别、机器翻译等任务。

一、RNN的结构  

RNN的结构有两种表示方法,左图是RNN神经元(memory cell)折叠起来的形式,右图是RNN按时间维度展开的形式,下图是有复杂神经元的RNN。

 

二、RNN的前向传播

U为输入层到隐藏层的权重,将原始输入抽象后送入隐藏层;

V为隐藏层到输出层的权重,进一步抽象从隐藏层学习到的表示;

W为隐藏层到隐藏层的权重,负责控制、调度网络的记忆;

x^{(t)} 为t时刻的输入向量(对于语言模型,输入X为一句话,而某一时刻的 x^{(t)} 表示一个词向量);

h^{(t)} 为时刻t的隐状态(记忆),由输入和t-1时刻决定:h^{(t)}=\sigma (Wh^{(t-1)}+Ux^{(t)}),σ为tanh等激活函数;

o^{(t)} 为t时刻的预测输出:o^{(t)}=g(Vh^{(t)}),g为softmax函数;

y^{(t)} 为t时刻的实际输出;

L^{(t)} 为t时刻的损失函数;

通常U V W随机初始化,h^{(0)} 初始化为0。

 

三、RNN的反向传播

RNN与DNN反向传播的算法类似,使用BP算法通过梯度下降迭代得到适合的一组RNN模型参数U V W。由于是基于时间的反向传播,因此也成为BPTT(back-propagation through time),与DNN不同的是,RNN模型的参数在序列的各个位置是共享的,反向传播时更新的是相同一组的参数。

t时刻产生的损失 L^{(t)} 可以用交叉熵(或平方误差等)表示,总损失为:

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

对L求解▽V时,不存在和之前状态的依赖,求导后求和即可:

        \triangledown V=\frac{\partial L}{\partial V}=\sum_{t=1}^{T}\frac{\partial L^{(t)}}{\partial o^{(t)}}\frac{\partial o^{(t)}}{\partial V}=\sum_{t=1}^{T}(o^{(t)}-y^{(t)})(h^{(t)})^{T}

求解▽W、▽U时计算由t和t+1两部分梯度组成,因此定义t时刻隐状态的梯度为\delta ^{(t)}=\frac{\partial L}{\partial h^{(t)}},首先计算输出层的 \delta ^{(T)},再反向递推各层 \delta ^{(t)}

        \delta ^{(T)}=\frac{\partial L}{\partial o^{(T)}}\frac{\partial o^{(T)}}{\partial h^{(T)}}=V^{T}(o^{(T)}-y^{(T)})

        \delta ^{(t)}=\frac{\partial L}{\partial o^{(t)}}\frac{\partial o^{(t)}}{\partial h^{(t)}}+\frac{\partial L}{\partial h^{(t+1)}}\frac{\partial h^{(t+1)}}{\partial h^{(t)}}=(V^{T}\delta ^{(T)}+W^{T}\delta ^{(t+1)})*\sigma {}'(h^{(t+1)})

        \sigma {}'(h^{(t+1)})=diag(1-(h^{(t+1)})^{2})

得到δ(t)后就可以计算▽W、▽U:

        \triangledown W=\sum_{t=1}^{T}\frac{\partial L^{(t)}}{\partial h^{(t)}}\frac{\partial h^{(t)}}{\partial W}=\sum_{t=1}^{T}\delta ^{(t)}(h^{(t-1)})^{T}*\sigma {}'(h^{(t)})

        \triangledown U=\sum_{t=1}^{T}\frac{\partial L^{(t)}}{\partial h^{(t)}}\frac{\partial h^{(t)}}{\partial U}=\sum_{t=1}^{T}\delta ^{(t)}(x^{(t)})^{T}*\sigma {}'(h^{(t)})

       

四、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,区别在于每个每一步输入有多层网络,这样的网络具有更加强大的表达能力和学习能力,但同时复杂性也提高了,同时需要训练更多的数据。

 

参考资料

https://www.cnblogs.com/rucwxb/p/8047401.html

http://www.cnblogs.com/pinard/p/6509630.html#!comments

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值