文章起源 | 恒源云社区(专一人工智能 / 深度学习云 GPU 服务器训练平台,官网体验网址:恒源智享云)
原文地址 | NAG 优化器
原文作者 | 角灰
社区人才济济,小编明天又发现一个宝藏版主‘角灰’。
小编是个爱分享的人,看见好文章好作者怎能管制住不分享给大家呢?所以,接下来跟着小编我,一起疾速浏览一下文章内容吧!
注释开始
最近在看 fairseq 源码时发现 NAG 优化器 (Nesterov Accelerate gradient)的实现与 torch 自带的有些许不一样,于是打算查下材料理解分明。
先回顾下 Momentm,该梯度降落法引入动量的概念,应用 β 对历史梯度进行滑动指数加权均匀,最早的梯度衰减的最快,对以后更新影响小; 反之,越靠近以后的梯度对更新的影响越大,公式为:
其中 Vt、gt、g(θt)别离代表 t 时刻的速度、梯度、模型参数,μ 是动量系数,lr 是学习率。该办法的思维是对网络参数进行平滑解决,让梯度的摆动幅度不要太大。
NAG 相似 Momentum, 它们都是利用历史梯度来更新参数,区别在于,NAG 先利用 μVt, 对 θt 进行局部更新失去 θt+μVt,而后利用梯度 g(θt+μVt)更新失去 θt+1,其公式如下所示:
此处 ε 是学习率。
下图对 Momentum 和 NAG 作了形象解释:
Momentum 应用以后地位 A 处的速度 Vt 和梯度 g(θt)间接更新到目的地 C; 而 NAG 从 A 点先沿着惯性方向走一小步到 B,此处距 C 很靠近了, 再利用 B 处的梯度 g(θt+μVt)更新到 C。
论文中认为这样能够疾速更新 V,使得 Nag 比 momentum 更稳固,且更适宜于大学习率的场景。除此之外,如果 Nag 用 μVt 更新到 B 点较差时,因为 B 点梯度 g(θt+μVt)比 momentum 的 g(θt)更大,因而 Nag 能更快往回修改到起始点 A。
言归正传,这是 torch.optim.SGD 的公式和代码 [1]:
这是 fairseq.optim.nag 的公式和代码 [2]:
能够看出两者实际上还是有些不同,而 Fairseq 的 nag 实际上和论文的公式基本一致,[3]中有推导:
其中的 β 就是本文的动量系数 μ,先对 θt+βVt 做了代换失去 θt’后,最初将 θt’当成待更新的参数 θt,也就是每次更新的始终是 θt+βVt,对于这个的解释见下图及 [4]:
总之,nag 优化器能减速收敛,且应用很大的学习率也很稳固,难怪 fairseq 外面 ConvS2S 能应用 0.5 的学习率。
[1]torch sgd
[2]fairseq nag
[3]深度学习中优化办法
[4]CS231n Convolutional Neural Networks for Visual Recognition