动量(Momentum)算法
动量(Momentum)的引入可以解决“峡谷”和“鞍点”问题的同时可以加速SGD
在高曲率、小幅但是方向一致的梯度的情况下,原始的 SGD 在下降过程中会发生来回震荡;或者在鞍点处因为质量小速度很快减为 0,导致无法越过平地。动量方法使轨迹更加稳定;同时因为在鞍点处由于动量的作用,更容易越过平地。
SDG
加入动量
参数更新公式
其中,动量算法的变量 v 速度,相关的超参数 α(0.9)。原始 SGD 每次更新的步长只是梯度乘以学习率;加入动量的SDG的步长也和历史梯度序列的大小和排列,即使存在许多连续的梯度指向相同的方向时,步长会被不断增大;
动量算法描述
动量算法会在负梯度方向上不断加速,直到达到最终速度。在实践中, α 的一般取 0.5, 0.9, 0.99,分别对应最大2 倍、10 倍、100 倍的步长,和学习率一样,α 也可以使用某种策略在训练时进行自适应调整;一般初始值是一个较小的值,随后会慢慢变大。自适应学习率的优化方法NAG 算法(Nesterov 动量)
NAG 把梯度计算放在对参数施加当前速度之后。这个“提前量”的设计让算法有了对前方环境“预判”的能力。Nesterov 动量可以解释为往标准动量方法中添加了一个修正因子。NAG 算法描述
自适应学习率的优化算法
AdaGrad
该算法的思想是独立地适应模型的每个参数:具有较大偏导的参数相应有一个较大的学习率,而具有小偏导的参数则对应一个较小的学习率具体来说,每个参数的学习率会缩放各参数反比于其历史梯度平方值总和的平方根AdaGrad 算法描述
全局学习率 并没有更新,而是每次应用时被缩放学习率是单调递减的,训练后期学习率过小会导致训练困难,甚至提前结束需要设置一个全局的初始学习率RMSProp
RMSProp 主要是为了解决 AdaGrad 方法中学习率过度衰减的问题:根据平方梯度的整个历史来收缩学习率,可能使得学习率在达到局部最小值之前就变得太小而难以继续训练;RMSProp 使用指数衰减平均(递归定义),使其能够在找到某个“凸”结构后快速收敛;此外,RMSProp 还加入了一个超参数 ρ 用于控制衰减速率。RMSProp 建议的初始值:全局学习率 =1e-3,衰减速率 ρ=0.9
RMSProp 算法描述
带 Nesterov 动量的 RMSProp
RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。RMSProp 依然需要设置一个全局学习率,同时又多了一个超参数(推荐了默认值)。Adam
Adam 在 RMSProp 方法的基础上更进一步:除了加入历史梯度平方的指数衰减平均(r)外,还保留了历史梯度的指数衰减平均(s),相当于动量。Adam 行为就像一个带有摩擦力的小球,在误差面上倾向于平坦的极小值。Adam 算法描述
其中,s 和 r 初始化为 0;且 ρ1 和 ρ2 推荐的初始值都很接近 1(0.9 和 0.999)。这将导致在训练初期 s 和 r 都很小(偏向于 0),从而训练缓慢。Adam 可通过修正偏差来抵消这个倾向。