自适应矩估计
自适应矩估计(adaptive moment estimation,Adam)利用梯度的一阶指数平均和平方梯度的指数平均,为不同坐标形成不同的更新尺度。这里“二阶矩”指未中心化的平方平均,不是已经减去均值平方的方差,也不是目标函数的 Hessian。
两个记忆量及初始偏差
设要优化参数 ,第t步的随机或确定性梯度为 ,在更新前参数 处计算。取 、步长 和 ,初始 。逐坐标运算为 平方、开方和除法都逐坐标进行。零初始化使初期权重总和小于一,因此通常作偏差修正 这里约定epsilon放在平方根之外;更改位置会改变数值。[1]
递推展开为 。若各步梯度期望都为同一向量 ,取期望并求几何和便有 ,所以修正后期望等于η。相同推导对平方梯度成立,条件是其各步二阶矩相同。它不要求各步独立,却依赖所估计矩的稳定性;训练中参数改变时,修正只是去掉零初始化造成的总权重偏差,并不保证无偏估计当前位置的真实梯度。
平方目标上的前两步
取 ,初值二,。第一梯度为二,故 ;修正后为 ,新参数约为 。若漏掉修正,第一步大小约为 ,不是约 。
第二梯度约为1.9,得到 ,再分别除以 和 ,新参数约为 。代码保留epsilon的精确位置与每一步修正量,不以常量梯度冒充真实迭代梯度。
收敛限制和参数变式
偏差修正的恒等式不是优化收敛证明。Reddi、Kale和Kumar给出了简单一维在线凸优化中Adam不能达到零平均遗憾的反例,并指出原分析的问题;论文说明其论证也适用于作偏差修正的版本。因而不能由“自适应”或某次损失下降,推导任意目标、固定步长、任意梯度噪声下都收敛,更不能保证非凸全局最优。[2]
变式取 ,更新变成 ,对远大于epsilon的非零梯度近似只看符号,步幅约为α,仍不同于普通梯度下降。若梯度恒为零,正epsilon使零除法被避免;若某实现令epsilon为零,则第一步零梯度会产生未定义的0/0。若动量仍为非零,即使当前梯度为零也可能继续移动。
标准库复算
函数专用于上述平方目标,输入初值、超参数和步数,返回更新前梯度、修正矩及新参数,不改写输入。对于n维参数,除梯度评价外每步为 ,两个矩向量占 ;若保存K步完整历史则需 。下例标量历史为 。
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
参考文献
- ↑ Kingma, D. P. and Ba, J., Adam: A Method for Stochastic Optimization,ICLR2015,算法1及§3。
- ↑ Reddi, S. J., Kale, S. and Kumar, S., On the Convergence of Adam and Beyond,ICLR2018,§3、定理1及关于偏差修正的脚注1。