MENU

RNN-based is not always easy to learn

February 6, 2020 • Read: 3924 • Deep Learning阅读设置

本文内容以及图片均源自李宏毅老师 2017 机器学习课程

RNN-based is always not easy to learn

一般而言,你在做 training 的时候,你会希望,你的 learning curve 是像蓝色这条线,纵轴是 total loss,横轴是 epoch 的数目,你会希望:随着 epoch 的增加,参数的不断 update,loss 会慢慢下降最后趋于收敛。但不幸的是,在训练 RNN 的时候,有时会看到这条绿色的线

我们分析下 RNN 的性质,看看 RNN 的 error surface 的变化

假设你从橙色的点当作初始点($w_1=-2.2,w_2=4.6$),利用 Gradient Descent 更新参数,有一种情况是你一脚蹬上了悬崖,loss 暴涨。另一种更惨的情况是你一脚踩到了悬崖边上(从右往左数第三个橙色的点),此时当前这个点的 Gradient 很大,导致整个参数飞出去了

解决办法相当粗暴,clipping。具体来说就是当 Gradient 大于某个设定的阈时,让 Gradient 直接等于这个阈值,所以就算踩在这个悬崖边上,也不会飞出去,而是飞到一个比较近的地方,这样你还可以继续做 RNN 的 training

思考:为什么 RNN 会有这种奇怪的特性?有人认为,是不是因为 activation function 用的是 sigmoid 从而导致了 Gradient Vanish,其实并不是,如果真是这个问题,你换成 ReLU 去解决是不是就行了?然而事实是,使用 ReLU 会导致 RNN performance 更差,所以 activation function 其实并不是关键点

举个很简单的例子,只有一个 neuron,这个 neuron 是 Linear 的。input 没有 bias,weight 是 1。output 的 weight 也是 1,transition 的 weight 是 $w$,也就是说 memory 接到 neuron 的 input weight 是 $w$

现在假设 input 是 [1,0,0,0,...,0],那这个 neural network 在最后一个时间点(1000)的 output 值就是 $w^{999}$。假设 $w$ 是我们要 learn 的参数,我们想知道它的 Gradient,所以我们观察一下当 $w$ 改变的而时候,对 neural 的 output 有多大的影响。假设 $w=1$,那么 $y^{1000}=1$;假设 $w=1.01$,那么 $y^{1000}\approx 20000$,这就跟蝴蝶效应一样,$w$ 有一点小小的变化,就会对 output 产生非常大的影响,但是我们可以通过把 learning rate 设小一点。但如果假设 $w=0.99$,那么 $y^{1000}\approx 0$,也就是说这时候需要一个很大的 learning rate。所以,一会儿你又要很小的 learning rate,一会儿又要很大的 learning rate,这就很麻烦了。RNN training 的问题其实来自于它把同样的东西在 transition 的时候反复使用,所以这个 $w$ 只要一有变化,造成的影响都是天崩地裂级别的

Last Modified: April 25, 2021
Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment