lecture7 - Vanishing Gradients and Fancy RNNs

主要内容

神经网络中的问题

梯度消失问题(Gradient Vanishing)

第7节课紧接着第6节课的内容,指出在RNN训练的过程中可能会出现的问题,首先就是梯度消失问题。课程中,在引入梯度消失的概念之前,主讲人首先引入了RNN中的一个例子来说明这个问题。

先回顾一下RNN的基本运算:

h t = σ ( W h t − 1 + W x t + b ) h_t=\sigma(Wh_{t-1}+Wx_t+b) ht=σ(Wht1+Wxt+b)

J ( θ )    =    − ∑ T y log ⁡ y ^ J(\theta)\;=\;\underset T{-\sum}y\log\widehat y J(θ)=Tylogy

来自 CS224N课件
如图所示,我们希望计算来自第4个时间步的loss对第一个隐状态 h ( 1 ) h^{(1)} h(1) 的导数,由上方的计算方式可以看到,每一层的隐状态是与上一个时间步的隐状态相关的,因此此处会用到链式求导法则:

d ⁡ J ( θ ) 4 d ⁡ h 1 = d J ( θ ) 4 d ⁡ h 4 × d ⁡ h 4 d ⁡ h 3 × d ⁡ h 3 d ⁡ h 2 × d ⁡ h 2 d ⁡ h 1 \frac{\operatorname dJ{(\theta)}_4}{\operatorname dh_1}=\frac{dJ{(\theta)}_4}{\operatorname dh_4}\times\frac{\operatorname dh_4}{\operatorname dh_3}\times\frac{\operatorname dh_3}{\operatorname dh_2}\times\frac{\operatorname dh_2}{\operatorname dh_1} dh1dJ(θ)4=dh4dJ(θ)4×dh3dh4×dh2dh3×dh1dh2

而对于隐状态之间的求导我们有:

d ⁡ h t d ⁡ h t − 1 = d i a g ( σ ′ ( W h h t − 1 + W x t + b ) ) × W h \frac{\operatorname dh_t}{\operatorname dh_{t-1}}=diag(\sigma'(W_hh_{t-1}+Wx_t+b))\times W_h dht1dht=diag(σ(Whht1+Wxt+b))×Wh

这里应该是涉及到一些矩阵求导的计算,回头得补补,但是把矩阵全部换成标量这个式子也是很容易就能得到的。
然后,在链式法则的应用中,我们可以写出如下的式子,切记矩阵 W h W_h Wh是复用的:

∂ J ( θ ) i ∂ h j = ∂ J ( θ ) i ∂ h i ∏ j < t ≤ i d i a g ( σ ′ ( W h h t − 1 + W x t + b ) ) W h ( i − j ) \frac{\partial J{(\theta)}^i}{\partial h_j}=\frac{\partial J{(\theta)}^i}{\partial h_i}\prod_{j<t\leq i}diag(\sigma'(W_hh_{t-1}+Wx_t+b))W_h^{(i-j)} hjJ(θ)i=hiJ(θ)ij<tidiag(σ(Whht1+Wxt+b))Wh(ij)

从这个式子可以很明显的看到,随着 i i i j j j的差值增大,即序列中的位置距离越远,如果矩阵 W h W_h Wh的特征值很小的话,那么这个梯度将会呈指数级别的收缩。也就是说,对于当前位置,我们很难得到来自一个较远位置的信号,这里课程中给出了一个证明,直接将图贴上来:
CS224N
这样,很直观的坏处就是,我们的模型无法捕捉到序列中的长期依存关系。更确切一些来说,这里引用Assessing the Ability of LSTMs to Learn Syntax-Sensitive Dependencies”, Linzen et al, 2016. 这篇论文中的一句话——“Due to vanishing gradient, RNN-LMs are better at learning from sequential recency than syntactic recency, so they make this type of error more often than we’d like”
模型更容易捕捉序列位置更相近的词的关系,而不是句法意义上更相近的词的关系。
总的来说,梯度消失就是由于链式法则中的中间项过小引起的,这导致反向传播时信号难以传递至前面的序列。

梯度爆炸问题(Gradient Exploding)

有了前文中对于梯度消失的解释,梯度爆炸就很好理解了,既然梯度过小会导致问题,那么很明显过大也会导致问题,这一问题就被称作梯度爆炸。
过大的梯度在反向传播中可能会导致某一中间层出现Inf/NaN这样的数值,导致计算无法进行,模型得从最近的checkpoint重新训练。

如何解决?

课程中提到了一个很简单的解决方案,叫梯度修剪(Gradient Cliping) 其思想很简单,既然梯度过大,那么我们就人为的去限制他的增长,每一次更新梯度时,我们都会设置一个阈值,一旦梯度大于这个阈值,我们就手动重设这一梯度,使其处于正常的范围,具体来说,超过阈值的梯度由如下式子重设:

g    =    t h r e s h o l d ∥ g ∥ g g\;=\;\frac{threshold}{\left\|g\right\|}g g=gthresholdg

其中, t h r e s h o l d threshold threshold代表阈值, g g g代表梯度。

新的RNN单元

上面没有提到如何解决梯度消失的问题,因为以下的章节都与解决梯度消失问题相关,所以放在这一块总结。

长短期记忆单元(Long-Short-Term Memory)

诞生于1997年的长短期记忆单元正是该问题的一种解决方案。
具体的网络结构网上已经有很多博客描述,这里就不再赘述,直接放上一张结构图:
在这里插入图片描述
具体的解决思路就是:
既然模型无法捕捉到长期依存,那么我们就使用单独的存储空间来存储这样的信息,这也就是LSTM中独具特色的cell的由来。自诞生以来,LSTM已经出现了许多变种,例如Peephole LSTM等。在捕捉长期关系中也体现出很良好的效果。实际上LSTM对于长期关系的捕捉也存在一定限制,不过这个是课程笔记,暂且不深究。
顺带提一句,最近看到LSTM的原文已经超越了反向传播(Back Propagation),成为深度学习领域引用量最多的论文。

门控循环单元(Gated Recurrent Unit)

GRU于2014年提出,目的是为了简化LSTM的结构,使训练更加快速,同样,具体结构网上也有不少博客已经说的很清楚,不再赘述。
在这里插入图片描述
最主要的改进在于:
合并了LSTM中的遗忘门以及输入门,不再使用单独的cell记录全局信息。
效果上看,LSTM貌似大部分情况下更出色,但是毫无疑问的, GRU的训练速度快于LSTM。

高级网络结构

当然,梯度消失/梯度爆炸问题并不仅仅存在于RNN之中,普通的前馈神经网络以及卷积神经网络同样存在这些问题,下面提到的就是解决此类问题的普遍方法。不过貌似大部分都出身计算机视觉领域。

跳接结构(Skip Connection)

关于Skip Connection实际上这节课之前我只知道残差连接,并且是从Transformer那知道的,下面列举的三种网络都有共同的思想:就是为浅层网络的输入创造一条捷径,从而使早前的信息能够传递到深层网络,这一思想能够很好的应对模型退化(Model Degradation),具体的三个网络,等我了解了再来补写。

Dense Network
Residual Network

基础结构:
cs224n
这就是残差网络的核心思想,残差连接,输入 x x x跨越两层与网络输出相加并送进激活函数。

Highway Network

双向RNNs(Bidirectional RNNs)

基础结构:

在这里插入图片描述
双向RNNs的出现是因为在普通的RNN模型中,模型只能获取来自一个方向的信息,这在某些任务中是不合理的,试想在机器翻译任务中,我们翻译句子会根据句子的各部分进行翻译,例如德语翻译为英语,德语的动词有时会放在句子的末尾,而单方向的模型显然无法获取这一信息。而双向模型中,最终的隐状态来自于前向模型以及后向模型的拼接,可以认为,双向的模型编码了来自左右两端的信息。
当然,是否使用双向模型也取决于具体的任务,在语言模型中,显然是不合适的,因为我们的目的就是给定前面的词预测下一个词,如果提前知晓了来自未来的信息,这样的模型就好比考前就知道了答案,对于提高学习能力毫无益处。这也是双向模型中存在的“看见自己(see itself)”问题。

多层RNNs(Multi-Layer RNNs)

基础结构:
在这里插入图片描述
多层RNNs有一些类似卷积神经网络的思想,将多个RNN堆叠起来,直观上可以认为,不同层级的RNN能够学习到语料的不同特征,例如,低层级学习到语法信息,高层级学习到语义信息等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值