1. 局部最小值与鞍点
为什么optimization会失败?
过去常见的一个猜想是,更新到了参数对Loss的微分为0的地方,gradient descent就没办法在update参数了,training就停止了。参数对Loss的微分为0的地方,最先想到的就是local minima。但不是只有local minima的gradient为0,也有其他地方会让gradient为0,比如鞍点saddle point。gradient为0的点统称为critical point。
如果gradient很靠近0,卡在了某个critical point上,怎么判断是local minima还是saddle point?
判断方法如下:
eigen value特征值
example:
若判断后发现卡住的地方是saddle point,可以根据H继续更新,沿着负的特征值的特征向量的方向。
example:
实际上,几乎不会真的把Hessian算出来,因为该矩阵的计算量非常大,还要计算特征值和特征向量。
Saddle point 和Local minima那个更常见?
从经验来看,Local minima并不十分常见
2. 批次和动量两个训练技巧
2.1 Batch(批次)
- 为什么要用Batch?
直观上,大的Batch size更新参数所花的时间较长,效果较稳,而小的Batch size更新参数所花的时间较短,但效果不稳定,即两种方式各有优劣势,如上图所示。
但是实验证明比较大的Batch size计算loss,进而计算gradient所需要的时间不一定比比小Batch size所花时间长,这主要是因为GPU可以平行运算。因此batch size从1到1000所花的时间基本一样,但GPU平行计算的能力是有极限的,当batch size很大的时候,运算时间是会增加的。
GPU的平行运算可以减少大的Batch size的运算时间,即其劣势消失了,那大的Batch size比小的Batch size好吗?noisy的gradient反而可以帮助training。batch size越大,validation acc上的结果越差。(这不是overfitting,因为batch size越大,training set 的效果也是越差的;同样的model,同样的function,batch size越大,training set 的效果是越差,所以不是Model bias的问题。因此是optimization的问题)
为什么小的batch size在training set上会取得比较好的结果?为什么noisy的update,noisy的gradient会在training的时候会取得比较好的结果?
因为不同batch的function略有不同,容易跳出critical point。
小的batch size对Testing有帮助。
直觉上,大的batch size会倾向于走到sharp minima,小的batch size会倾向于走到flat minima。
2. Momentum
vanilla(一般的)
一般的gradernt descent:有一个初始参数
θ
0
\theta_0
θ0,计算一下gradient,然后往gradient的反方向update参数。
gradient descent + momentum不止往gradient的反方向update参数,是gradient的反方向加上前一步移动的方向去update参数。
3. Adaptive Learning Rate
给每一个参数不同的learning rate
当learning rate较大时会在两边震荡,当learning rate较小时不再震荡,又由于learning rate太小无法收敛到最优值。
所以需要对gradient descent做进一步改进。原始版本所有参数都设置同样的learning rate。learning rate应该为每个参数客制化。
gradient小的方向,希望learning rate大一点;gradient大的方向,希望learning rate小一点。
上述改进用在Adagrad的方法里面
为什么有用?怎么做到learning rate大的时候gradient减小,learning rate小的时候gradient就大呢?有
θ
1
\theta_1
θ1和
θ
2
\theta_2
θ2两个参数,
θ
1
\theta_1
θ1波动小,
θ
2
\theta_2
θ2波动大。
θ
1
\theta_1
θ1波动小因此算出来的gradient就比较小,
σ
1
\sigma_1
σ1就比较大小;
θ
2
\theta_2
θ2波动大因此算出来的gradient就比较大,
σ
2
\sigma_2
σ2就比较小。
同一个方向同一个参数也希望learning rate是动态调整的——RMS Prop。
RMS Prop方法比较灵敏。
现在最常用的optimization策略是Adam:RMS Prop+Momentum
改进之后,用Adagrad求解先前的convex。
为改进上述情况,设置learning rate跟时间有关,即learning rate scheduling。最常用的策略是learning rate decay——试随着时间的不断进行,随着参数的不断update,设置
η
\eta
η越来越小。因为刚开始距离终点很远,后来距离终点越来越近,所以把learning rate减小,让参数更新逐渐慢下来。
另一种learning rate scheduling的常用策略是warm up——设置learning rate先增大后变小。
Momentum是直接把所有gradient都加起来,所以考虑了gradient的方向,即正负号。root mean square只考虑gradient的大小。所以
η
\eta
η和momentum不会互相抵消掉。