将优化算法的框架搬来. 首先定义符号. w为待优化参数, f(w)为目标函数, α为初始学习率.
在每步t中:
计算目标函数关于当前参数wt的梯度: gt=∇f(wt)
根据历史梯度g1,g2,⋯,gt计算一阶动量和二阶动量: mt=ϕ(g1,g2,⋯,gt); Vt=ψ(g1,g2,⋯,gt)
计算当前时刻的下降梯度: ηt=α⋅mt/Vt
根据下降梯度更新参数: wt+1=wt−ηt
AdaDelta
Adadelta是对Adagrad的扩展. Adagrad计算二阶动量的方法是将至今所有时间的梯度的平方和累加起来:
Vt=∑τ=1tgτ2=Vt−1+gt2
造成了学习率单调递减的问题. 在AdaDelta中, 改变了二阶动量的计算方法, 不再累计全部的历史梯度, 而是只关注一个时间窗口的梯度. 类似于动量的累计方式, 使用指数移动平均值计算二阶累计动量:
Vt=β2∗Vt−1+(1−β2)gt2
这样就避免了二阶动量持续累积, 导致训练过程提前结束的问题. 一般来说在训练的初期, 中期, 训练很快, 但在后期容易出现反复抖动的问题.