这篇文章简单介绍一个叫做AdaX的优化器,来自《AdaX: Adaptive Gradient Descent with Exponential Long Term Memory》。介绍这个优化器的原因是它再次印证了之前在《AdaFactor优化器浅析(附开源实现)》一文中提到的一个结论,两篇文章可以对比着阅读。

Adam & AdaX #

AdaX的更新格式是
{gt=θL(θt)mt=β1mt1+(1β1)gtvt=(1+β2)vt1+β2g2tˆvt=vt/((1+β2)t1)θt=θt1αtmt/ˆvt+ϵ


其中β2的默认值是0.0001。对了,顺便附上自己的Keras实现:https://github.com/bojone/adax

作为比较,Adam的更新格式是
{gt=θL(θt)mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)g2tˆmt=mt/(1βt1)ˆvt=vt/(1βt2)θt=θt1αtˆmt/ˆvt+ϵ


其中β2的默认值是0.999

等价形式变换 #

可以看到,两者的第一个差别是AdaX去掉了动量的偏置校正(ˆmt=mt/(1βt1)这一步),但这其实影响不大,AdaX最大的改动是在vt处,本来vt=β2vt1+(1β2)g2t是滑动平均格式,而vt=(1+β2)vt1+β2g2t不像是滑动平均了,而且1+β2>1,似乎有指数爆炸的风险?原论文称之为“with Exponential Long Term Memory”,就是指1+β2>1导致历史累积梯度的比重不会越来越小,反而会越来越大,这就是它的长期记忆性。

事实上,学习率校正用的是ˆvt,所以究竟有没有爆炸,我们要观察的是ˆvt。对于Adam,我们有
ˆvt=vt/(1βt2)=β2vt1+(1β2)g2t1βt2=β2ˆvt1(1βt12)+(1β2)g2t1βt2=β21βt121βt2ˆvt1+(1β21βt121βt2)g2t


所以如果设ˆβ2,t=β21βt121βt2,那么更新公式就是
ˆvt=ˆβ2,tˆvt1+(1ˆβ2,t)g2t

基于同样的道理,如果设ˆβ2,t=1β2(1+β2)t1,那么AdaX的ˆvt的更新公式也可以写成上式。

衰减策略比较 #

所以,从真正用来校正梯度的ˆvt来看,不管是Adam还是AdaX,其更新公式都是滑动平均的格式,只不过对应的衰减系数ˆβ2,t不一样。

对于Adam来说,当t=1ˆβ2,t=0,这时候ˆvt就是g2t,也就是用实时梯度来校正学习率,这时候校正力度最大;当t时,ˆβ2,tβ2,这时候vt是累积梯度平方与当前梯度平方的加权平均,由于β2<1,所以意味着当前梯度的权重1β2不为0,这可能导致训练不稳定,因为训练后期梯度变小,训练本身趋于稳定,校正学习率的意义就不大了,因此学习率的校正力度应该变小,并且t,学习率最好恒定为常数(这时候相当于退化为SGD),这就要求t时,ˆβ2,t1

对于AdaX来说,当t=1ˆβ2,t=0,当tˆβ2,t1,满足上述的理想性质,因此,从这个角度来看,AdaX确实是Adam的一个改进。在AdaFactor中使用的则是ˆβ2,t=11tc,它也是从这个角度设计的。至于AdaX和AdaFactor的策略孰优孰劣,笔者认为就很难从理论上解释清楚了,估计只能靠实验。

就这样结束了 #

嗯,文章就到这儿结束了。开头就说了,本文只是简单介绍一下AdaX,因为它再次印证了之前的一个结论——ˆβ2,t应当满足条件“ˆβ2,1=0,ˆβ2,=1”,这也许会成为日后优化器改进的基本条件之一。

转载到请包括本文地址:https://spaces.ac.cn/archives/7387

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (May. 11, 2020). 《AdaX优化器浅析(附开源实现) 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/7387

@online{kexuefm-7387,
        title={AdaX优化器浅析(附开源实现) },
        author={苏剑林},
        year={2020},
        month={May},
        url={\url{https://spaces.ac.cn/archives/7387}},
}