优化算法大致可分为两大阵营:第一大阵营基于梯度下降,在深度学习领域很吃得开;第二大阵营则是基于牛顿法。
牛顿法的基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(海森矩阵)对目标函数进行二次函数近似,然后把二次函数的极小点作为新的迭代点,并重复这一过程。而梯度下降只需要用到一阶导数
这篇文章我想从深度学习中的梯度下降算法入手,梳理一下它的演化历程。
注:梯度下降有三种模式:single, batched, full,表征每轮计算梯度时用到的样本数目。最常用的是 batched 模式,它兼顾了训练稳定性与训练速度。下面讨论的并不是每轮更新样本数目的影响,重点是拿到梯度后如何更新参数。所以默认每个时间步得到的梯度是一个小批量的平均梯度就好了。
梯度下降的目标是找到合适的参数 ,使得它能最小化目标函数 :
计算可以分为以下几个步骤:
重复以上 1-4 步,直到收敛或者训练结束。
平时说的优化器状态,就是指这里的一阶和二阶动量。进行断点续训的时候,保存优化器状态是很重要的。
vanilla SGD 不考虑二阶动量,且一阶动量等于当前时间步的梯度
善于利用前人的经验
对原始的随机梯度下降做了些改进:一阶动量等于梯度的指数移动平均。即, 时刻的下降方向,由此前累积的下降方向与当前时刻的梯度方向共同决定
这可以让下降曲线更加平滑。一般 ,这样一阶动量约为最近 个时刻梯度的平均值
为了防止在局部最优的沟壑里震荡,往往需要登高望远
它是对 SGD-M 的进一步改进。SGD-M 中,主要下降方向由累积梯度决定,当前时刻的梯度占的分量不大。既然如此,不如看看如果跟着累积梯度走一步,那个时候再怎么走。
累积梯度:
更新参数:
对待参数也要因材施教
"Adaptive" 自适应,指的是学习率的自适应。对于不同的参数,采用不同的学习率。
这里用二阶动量去衡量历史的“更新频率”。更新频率越高,学习率越小。具体来说,假设有 个参数,二阶动量矩阵就是一个 的对角矩阵。对角线上的元素代表对应参数的累积梯度平方和。
更新参数:
可以看到,对于第 个参数,学习率变成了
莫要太贪心,贪多嚼不烂
AdaGrad 的缺点很明显:随着梯度平方和不断累积,学习率可能会趋近于 0,导致训练提前结束。于是 AdaDelta 考虑不累计全部历史梯度的平方和,只关注过去一段时间的窗口 —— 即指数移动平均。
一般 ,关注过去 10 个时间步的梯度平方和。
更新参数:
新三年,旧三年,缝缝补补又三年
回顾一下:
SGD-M 在 SGD 的基础上考虑了指数移动平均的一阶动量;
AdaDelta 在 SGD 的基础上考虑了指数移动平均的二阶动量。
现在 Adam (Adaptive + Momentum) 说:小孩子才做选择,我全都要!
在迭代初始阶段, 会向初值偏移,需要进行校正:
更新参数:
关于为什么要进行校正,以及校正是否真的有必要,可以参考这个讨论:Why is it important to include a bias correction term for the Adam optimizer for Deep Learning?
常用的超参数: 。也就是说,一阶动量关注的时间窗口更小,大约有 10 个时间步;二阶动量的时间窗口则有 1000
既然要缝缝补补,怎么能少得了 Nesterov 呢?
NAdam=Nesterov + Adam
其余和 Adam 一致。
对于 vanilla SGD 而言,权重衰减 与 L2 正则是等价的。
前者是 ;后者是
当 时,二者是等价的。但是对于 Adam 这种引入了一阶、二阶动量的优化器,就没有等价关系了。
之前 Adam 添加 L2 正则项时,直接在梯度上添加粉色项。但由于 的存在,粉色项会与原损失函数梯度 发生耦合,产生奇怪的作用。
Adam with decoupled weight decay (AdamW) 提出了解耦合的权重衰减方式:添加绿色项而不是粉色项。
此时更新公式就是标准的权重衰减:
一般设 weight decay 参数
现在 Adam 和 AdamW 是 NLP 领域乃至整个 DL 领域常用的优化器。但为了训练时节省显存,有时也会用 SGD-M
另外,参数更新公式中学习率取决于时间步。常见做法是先 warmup —— 线性增长到最大值(一般在 5e-5 到 1e-4),然后线性或余弦衰减到最大值的 10%
关于其他的学习率规划器,可以参考:Pytorch 学习率规划器_云中君不见的博客
公司名称: 8A-8A娱乐-注册登录商务站
手 机: 13800000000
电 话: 400-123-4567
邮 箱: admin@youweb.com
地 址: 广东省广州市天河区88号