Adam(自适应矩估计)是一种优化器,它融合了动量和RMSprop等自适应缩放方法的优势。Adam的更新机制通过维护两个独立的指数衰减移动平均值来实现优化:一个用于过去的梯度(第一矩估计),另一个用于过去的平方梯度(第二矩估计)。
第一矩和第二矩估计
在每个时间步t时,在计算了关于参数 (parameter)θ的梯度gt=∇θJ(θt−1)之后,Adam会更新这两个移动平均值:
-
第一矩估计(均值): 这类似于动量项。它累积了过去梯度的指数衰减平均值。
mt=β1mt−1+(1−β1)gt
这里,mt是第一矩向量 (vector),gt是当前时间步的梯度,β1是第一矩估计的指数衰减率(通常接近1,例如0.9)。m0初始化为全零向量。
-
第二矩估计(非中心方差): 这类似于RMSprop中使用的项。它累积了过去平方梯度的指数衰减平均值。
vt=β2vt−1+(1−β2)gt2
这里,vt是第二矩向量,gt2表示梯度向量的逐元素平方,β2是第二矩估计的指数衰减率(通常设置得更高,例如0.999)。v0也初始化为全零向量。
项mt和vt分别是梯度均值和非中心方差的估计值。超参数 (hyperparameter)β1和β2控制着这些移动平均值的衰减率。接近1的值表示过去的梯度影响时间更长。
偏差校正
一个可能出现的问题是,mt和vt被初始化为零向量 (vector)。特别是在训练的初始时间步,当t较小时,这些估计值会偏向于零。试想如果β1=0.9;那么m1=0.1g1。这明显小于实际梯度。
Adam通过计算偏差校正后的第一矩和第二矩估计(分别表示为m^t和v^t)来处理这个初始化偏差:
m^t=1−β1tmt
v^t=1−β2tvt
请注意分母中的项(1−β1t)和(1−β2t)。在训练开始时(t较小),β1t和β2t接近1,这使得分母变小。这种除法有效地抵消了初始的零偏差。随着训练的进行和t的增加,β1t和β2t趋近于零(因为β1,β2<1),所以校正项(1−β1t)和(1−β2t)趋近于1,偏差校正的作用减小。这确保了在整个训练过程中估计值更准确。
参数 (parameter)更新规则
最后,Adam使用这些偏差校正后的估计值来更新模型参数θ。这个更新规则与RMSprop非常相似,但它使用了校正后的动量估计m^t,而不是原始梯度gt:
θt=θt−1−αv^t+ϵm^t
这里:
- θt是时间步t时的参数。
- α是学习率(或步长)。
- m^t是偏差校正后的第一矩估计。
- v^t是偏差校正后的第二矩估计的逐元素平方根。此项自适应地缩放每个参数的更新,类似于RMSprop。过去平方梯度较大(即v^t较大)的参数将获得较小的更新。
- ϵ是一个小常数(例如10−8),用于数值稳定性,以防止在v^t可能非常接近零时出现除以零的情况。
Adam算法概览
总而言之,Adam在每个时间步t的更新过程包含以下步骤:
- 计算梯度:gt=∇θJ(θt−1)
- 更新有偏差的第一矩估计:mt=β1mt−1+(1−β1)gt
- 更新有偏差的第二矩估计:vt=β2vt−1+(1−β2)gt2
- 计算偏差校正后的第一矩估计:m^t=mt/(1−β1t)
- 计算偏差校正后的第二矩估计:v^t=vt/(1−β2t)
- 更新参数 (parameter):θt=θt−1−αv^t+ϵm^t
最初Adam论文的作者建议默认值设定为β1=0.9,β2=0.999,ϵ=10−8。学习率α(通常建议约为0.001)仍然是一个超参数 (hyperparameter),通常需要进行调整。
这个循序渐进的过程,结合了基于第二矩的自适应缩放和基于第一矩的动量,以及重要的偏差校正步骤,使得Adam成为深度学习 (deep learning)模型中广泛使用且通常有效的默认优化器。