从SGD到AdamW,各种优化器分别解决了什么问题?
用一条演进路线理解Momentum、AdaGrad、RMSProp、Adam和AdamW分别新增了什么。
DETAILED ANSWER
直接结论
这些优化器没有改变“根据梯度更新模型参数”这件事,而是在回答三个逐步出现的问题:方向能不能更稳定、不同参数的步长能不能自动调节、权重衰减能不能与自适应更新正确分开。
SGD:只看当前梯度
Momentum:加入历史方向,减少来回震荡
AdaGrad:累计梯度平方,为不同参数调节步长
RMSProp:只重点参考近期梯度平方,修复AdaGrad后期走不动
Adam:同时使用历史方向和历史梯度大小
AdamW:在Adam之外独立执行权重衰减
共同起点:参数为什么会移动
设当前参数为w,梯度为g,学习率为η,最基础的更新是:
新w = 旧w − η × g
梯度的正负决定移动方向,梯度绝对值和学习率共同影响移动距离。后面的优化器都是在重新加工g或控制实际步长,并没有另外训练一套模型参数。
Momentum:让方向更稳定
普通SGD只看当前批次的梯度,某一次噪声可能让参数突然调头。Momentum把当前梯度与历史梯度的平滑结果结合起来,使长期一致的方向得到保留,短暂波动的影响被削弱。
它主要解决的是更新方向震荡,而不是为每个参数单独计算学习率。
AdaGrad:不同参数使用不同的有效步长
AdaGrad为每个参数累计自己的历史梯度平方。某个参数的梯度长期较大,它的累计值就大,分母也会变大,于是该参数的有效步长会缩小。
优点是每个参数都能自适应调节;缺点是平方和从训练开始一直累加,后期可能大到让更新几乎停止。
RMSProp:重点记住近期梯度大小
RMSProp不再永久累加全部历史梯度平方,而是计算梯度平方的指数加权平均。旧梯度的影响会逐渐衰减,因此分母不会像AdaGrad那样只增不减。
它仍然用梯度平方控制步长,但参数往哪边移动,仍由未平方的梯度决定。
Adam:把方向与大小结合起来
Adam同时维护两份状态:
m:梯度的指数加权平均,保留正负号,用于稳定方向;v:梯度平方的指数加权平均,只记录大小,用于调节步长。
可以把Adam理解为“Momentum思想加RMSProp思想”。
AdamW:把权重衰减单独处理
AdamW的m和v与Adam相同。区别只在启用权重衰减时:AdamW不把衰减项混入梯度后再交给m和v处理,而是在Adam更新之外直接把参数向0缩小一点。
因此,W不是一套新的权重,也不是新的网络层,而是强调解耦后的Weight Decay。
最后记忆
Momentum管方向稳定,AdaGrad和RMSProp管步长,Adam同时管方向和步长,AdamW再把权重衰减独立出来。
