Training stuck not equal Small Gradient

  • People believe training stuck because the parameters are around a critical point

但是并不一定是因为以及在saddle point,有一种可能是震荡在如图所示的峡谷,导致无法下降。

Training can be difficult even without critical points

learning rate也就是步长如果比这个峡谷距离大,那么就会一直震荡停留在附近,但是如果真的设置非常小的learning rate,是可以慢慢减少,但是同时这也太慢了。

图上可看出来当learning rate为$10^-7$的时候,更新起来是极其慢的,一点点变化就需要100,000updates, 因此我们需要优化我们的算法。

也就是说不同的参数性格分配不同的learning rate

Different parameters needs different learning rate

如何自我改变learning rate的大小让其适应训练的变化呢?我们希望在平坦的道路上的时候,learning rate会比较大,但是在陡峭的道路上的时候,learning rate会比较大。

Root Mean Square

我们可以通过计算计算rms来算,那么这个$\sigma^t$​如何计算呢,它是根据以前所有的梯度的值平方除以要被除的个数开根号得到的

这个方法被称为Adagrad,这个原理可用以下图解释

平稳的graph里的gradient是比较小的,因此加在一起的$\sigma$也比较小,因为是除以$\sigma$,很明显就会导致learning rate大。反之gradient比较大,加在一起的$\sigma$就比较大, learning rate就会小。

Learning rate adapts dynamically

然而也会有更复杂的情况, 刚刚的情况只考虑了一个w,如果参数变多的话就会每个参数有不同的learning rate,因此我们引入新的参数来解决问题,那就是RMSProp。

这是个没有论文的方法,而是hilton在10多年前的deep learning课程的reference,这里引入了自己调参的数字alpha,计算方式如下图所示

实际上就是自己动态调整参数,调参侠就是我。

Adam:RMSProp + Momentum

adam就是目前非常常用的找参数的方式,而我们也不需要自己写,pytorch, keras都自带写好的方程了。

Without Adaptive Learning rate

加入adam方法后明显走了更深的路,但是为什么到后期步数会变大了呢?因为前期gradient比较大,会累积较多的$\sigma$,导致走到后期会步长变大,但是这个问题完全可以不用担心,让机器自己继续计算,因为通过式子我们可以得知,长步长会反过来导致累积的$\sigma$​变大,最终会导致learning rate又变小。

Learning Rate Scheduling

人为减少learning rate,因为我们知道随着训练继续,我们总是会不断逼近目的地的,因此我们可以减少learning rate。因此这个方式就可以人为干预,经过干预后的learning rate就走路平滑,不再震荡了

warm up

还有个黑科技方法叫warm up,让learning rate先增加后减少。

warm up很早就出现了,出现在15年12月的一篇论文里,这个红色的式子就可以做到让learning rate先增加后减少。

为什么需要最开始增加呢?因为根据$\sigma$计算公式可知,它是根据之前的统计得到的值,因此最初的$\sigma$并不够精准。因此最初时候可以设置一个较小的learning rate让机器自我探索,收集一定资料后再拉开距离找最优解。

Summary of Optimization

$\sigma$和动量都有考虑之前的梯度的变化,只是动量会考虑方向,正负值。rse并不会考虑方向正负大小。