Adam#
TL;DR#
本页内容7 个部分
1. 背景与问题#
Momentum保留了历史方向,但所有坐标仍共用一个学习率系数。如果两个坐标的梯度尺度相差很大,直接沿动量移动,更新也可能相差很大。
Adam 在平滑方向之外,再保存一份梯度平方的历史,用它估计各坐标的尺度,进而对方向做归一化。它要改变的是更新规则,训练损失本身没有改变。
2. 目标与定义#
记待最小化的损失为 L(θ),第 t 步 batch 梯度为 gt=∇Lt(θt−1)。Adam 保存一阶状态 mt 与非中心二阶状态 vt;下文平方、开方和除法都逐元素进行。
这里的二阶矩是梯度平方的期望。若某坐标的梯度均值为 μ、方差为 σ2,则 E[g2]=μ2+σ2;恒定梯度 2 的方差为零,二阶矩仍为 4。
3. 方法与推导#
3.1 方向与尺度分别怎样累积#
从 m0=v0=0 开始,取 0≤β1,β2<1:
mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2.
mt 平滑方向,vt 平滑平方尺度。用后者的平方根作分母,得到与梯度单位一致的尺度,而不是把梯度除以方差。[1]
3.2 零初始化的偏差怎样修正#
展开一阶递推,mt=(1−β1)∑k=1tβ1t−kgk。历史权重和为 1−β1t;当各步梯度具有同一均值 μ 时,E[mt]=(1−β1t)μ。因此定义:
m^t=1−β1tmt,v^t=1−β2tvt.
二阶状态使用相同推理。修正消除了恒定矩假设下的零初始化偏差,分布变化造成的历史滞后仍存在。[1]
3.3 归一化后怎样更新#
用修正后的方向除以均方根尺度,取学习率 η>0、稳定项 ϵ>0:
θt=θt−1−ηv^t+ϵm^t.
分子、分母都来自历史。较大分母并不单独意味着最终更新较小;需要一起计算比值。恒定正梯度 2 和 20,在忽略 ϵ 时都给出归一化方向 1。
4. 计算过程#
沿用 SGD 页的固定梯度输入 g1=2,g2=−1,取 θ0=2、η=0.1、β1=0.9、β2=0.999,本例忽略 ϵ:
第一步 θ1=2−0.1=1.9,第二步 θ2≈1.9−0.026634=1.873366。当前梯度虽转负,历史方向仍为正,所以参数继续减小;更新幅度与普通 Momentum 不同。
5. 比较与边界#
SGD 用原始梯度,Momentum 平滑方向,Adam 进一步使用逐坐标尺度。代价是保存两份矩状态,仍需选择学习率与历史窗口。
缩放不变性要求整段历史同步缩放,且 ϵ 可忽略;随机分母也使“比值期望”一般不等于“期望比值”。相应推导由统计解释维护。损失中加入 L2 会进入两份状态,与直接收缩权重的差别由 AdamW解释。
参考资料#
- Adam: A Method for Stochastic Optimization(2015). Algorithm 1、§3:矩估计、偏差修正与更新规则。