Momentum Rmsprop Adam
SGD在一定程度上虽然可以避免像BGD一样,陷入local minimal、saddle point,从而无法到达global minimal/optimal local minimal(详情见 SGD详解)。
但是存在容易震荡、收敛速度慢等缺点,比如容易在最优点附近徘徊;此外,对学习率的挑选要求较高,如果选择一个较小的学习率,会导致收敛过慢,如果选择一个较大的学习率,则容易跳过最优点。
因此下面介绍几个对SGD进行改进的优化方法。
Momentum
基本做法
首先计算动量(每一步负梯度的移动指数平均值),然后直接用动量去更新参数。
使用移动指数平均而不是其他平均方法,是因为更新参数的时候,希望离当前步越近的梯度的权重越高,越久的梯度的权重越低。
作用
(a)SGD在移动的过程中,因为(batch较小带来的)randomness、pathological curvature等原因,可能会出现震荡现象,降低收敛速度,而动量可以抑制震荡。
举例来说,如果某个维度,比如w1,在最近的若干次迭代中,总是震荡(一会往正一会往负),动量是历史梯度的加权平均,因此会让这个维度的变化接近0,从而抑制动荡。
(b)提高速度。这是因为动量会对历史梯度做加权平均,如果某个维度,比如w2,在最近的若干次迭代中,始终往正/负向变化,那么这种加权平均会增强这种变化,从而提高收敛速度。
Rmsprop
基本做法
首先计算每一步的梯度平方的移动指数平均值st,然后将当前学习率调整为:
初
始
学
习
率
s
t
\frac {初始学习率} {\sqrt {s_t}}
st初始学习率,然后和当前的负梯度做点乘(两个向量/矩阵对应元素做乘法)。
和SGD的不同:动态调整学习率;每一个参数的学习率都不同。
作用
(a)主要作用是对不同参数动态计算对应的学习率,对于参数比较稀疏的模型作用比较大,比如带词向量的模型。某些词很高频,其词向量经常会被更新,那么它的学习率就会被调整的比较低,有防止个别example对该词向量参数的影响过大的作用;而有些词比较低频,偶尔出现一次,这种情况就需要充分利用当前的梯度信息进行较大的调整/学习。
(b)也有模拟退火的作用,如果step size过大,算法会自动降低学习率,从而避免overshoot最优点。
(c)抑制震荡(这个不太确定,如果是pathological curvature导致的震荡,因为震荡方向的梯度分量明显比理想方向的梯度分量大,所以一定程度上也许可以抑制震荡)。
和Momentum进行对比
动量主要是加速minimal方向的搜索,减少(抵消)震荡方向的搜索;而RMSProp则是较小地抑制minimal方向的搜索,较大的抑制震荡方向的搜索。
Adam
完全就是动量方法和RMSProp的结合。
总结
flat minimal vs narrow minima
(a)最主要的,前者generalization更好。 测试集和训练集的loss形状肯定是略有不同的,对于flat minimal,从训练集到测试集的shift不会导致loss变化太多。
(b)前者更容易收敛。 因为在接近narrow minimal的时候,容易overshoot或者发生在minimal附近山谷来回跳动的现象。而flat minimal就不容易出现这些现象。
Momentum vs Adam
(a)Adam和动量方法都能收敛到具有相同loss的local minimal;
(b)Adam比动量方法收敛更快;
(c)动量方法更容易收敛到flat minimal,而Adam更容易收敛到narrow minimal。所以一个实践上的方法是,先用Adam快速收敛,然后再用动量方法。
12万+

被折叠的 条评论
为什么被折叠?



