跳到正文
格致开物MATHWIKI

自适应矩估计

自适应矩估计(adaptive moment estimation,Adam)利用梯度的一阶指数平均和平方梯度的指数平均,为不同坐标形成不同的更新尺度。这里“二阶矩”指未中心化的平方平均,不是已经减去均值平方的方差,也不是目标函数的 Hessian。

两个记忆量及初始偏差

设要优化参数 θ∈ℝn,第t步的随机或确定性梯度为 gt,在更新前参数 θt−1 处计算。取 0≤β1,β2<1、步长 αt>0 和 ε>0,初始 m0=v0=0。逐坐标运算为 mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2. 平方、开方和除法都逐坐标进行。零初始化使初期权重总和小于一,因此通常作偏差修正 m^t=mt1−β1t,v^t=vt1−β2t,θt=θt−1−αtm^tv^t+ε. 这里约定epsilon放在平方根之外;更改位置会改变数值。[1]

常量梯度下零初始化偏差及修正
本图刻意固定梯度为二,用来单独解释修正恒等式。

递推展开为 mt=(1−β1)∑j=1tβ1t−jgj。若各步梯度期望都为同一向量 η,取期望并求几何和便有 𝔼mt=(1−β1t)η,所以修正后期望等于η。相同推导对平方梯度成立,条件是其各步二阶矩相同。它不要求各步独立,却依赖所估计矩的稳定性;训练中参数改变时,修正只是去掉零初始化造成的总权重偏差,并不保证无偏估计当前位置的真实梯度。

平方目标上的前两步

取 f(θ)=θ2/2,初值二,α=0.1,β1=0.9,β2=0.999,ε=10−8。第一梯度为二,故 m1=0.2,v1=0.004;修正后为 m^1=2,v^1=4,新参数约为 1.9。若漏掉修正,第一步大小约为 0.316228,不是约 0.1。

第二梯度约为1.9,得到 m2≈0.37,v2≈0.007606,再分别除以 0.19 和 0.001999,新参数约为 1.800166。代码保留epsilon的精确位置与每一步修正量,不以常量梯度冒充真实迭代梯度。

真实平方目标上逐步重算梯度的Adam轨迹
这里梯度随参数改变,与上一幅恒定梯度试验区分。

收敛限制和参数变式

偏差修正的恒等式不是优化收敛证明。Reddi、Kale和Kumar给出了简单一维在线凸优化中Adam不能达到零平均遗憾的反例,并指出原分析的问题;论文说明其论证也适用于作偏差修正的版本。因而不能由“自适应”或某次损失下降,推导任意目标、固定步长、任意梯度噪声下都收敛,更不能保证非凸全局最优。[2]

变式取 β1=β2=0,更新变成 −αg/(|g|+ε),对远大于epsilon的非零梯度近似只看符号,步幅约为α,仍不同于普通梯度下降。若梯度恒为零,正epsilon使零除法被避免;若某实现令epsilon为零,则第一步零梯度会产生未定义的0/0。若动量仍为非零,即使当前梯度为零也可能继续移动。

标准库复算

函数专用于上述平方目标,输入初值、超参数和步数,返回更新前梯度、修正矩及新参数,不改写输入。对于n维参数,除梯度评价外每步为 O(n),两个矩向量占 O(n);若保存K步完整历史则需 O(Kn)。下例标量历史为 O(K)。

Python 3
import math

def adam_square(initial=2.0, alpha=.1, beta1=.9, beta2=.999, eps=1e-8, count=3):
    if alpha <= 0 or eps <= 0 or not 0 <= beta1 < 1 or not 0 <= beta2 < 1 or count < 0:
        raise ValueError("invalid Adam parameters")
    x,m,v,trace = float(initial),0.0,0.0,[]
    for t in range(1,count+1):
        g = x
        m = beta1*m+(1-beta1)*g
        v = beta2*v+(1-beta2)*g*g
        mh,vh = m/(1-beta1**t),v/(1-beta2**t)
        x -= alpha*mh/(math.sqrt(vh)+eps)
        trace.append((t,g,m,v,mh,vh,x))
    return trace

for row in adam_square():
    print(tuple(round(v,9) for v in row))
assert adam_square(initial=0)[-1][-1] == 0.0

参考文献

  1. ↑ Kingma, D. P. and Ba, J., Adam: A Method for Stochastic Optimization,ICLR2015,算法1及§3。
  2. ↑ Reddi, S. J., Kale, S. and Kumar, S., On the Convergence of Adam and Beyond,ICLR2018,§3、定理1及关于偏差修正的脚注1。