【发布时间】:2021-02-13 16:41:31
【问题描述】:
torch.optim.Adam(weight_decay=0.01)和torch.optim.AdamW(weight_decay=0.01)有什么区别吗?
文档链接:torch.optim
【问题讨论】:
标签: pytorch
torch.optim.Adam(weight_decay=0.01)和torch.optim.AdamW(weight_decay=0.01)有什么区别吗?
文档链接:torch.optim
【问题讨论】:
标签: pytorch
是的,Adam 和 AdamW 的权重衰减是不同的。
Hutter 在他们的论文 (Decoupled Weight Decay Regularization) 中指出,每个库中 Adam 实现权重衰减的方式似乎是错误的,并提出了一种简单的方法(他们称之为 AdamW)来修复它。
在 Adam 中,权重衰减通常是通过将wd*w(wd 在这里是权重衰减)添加到梯度(第一种情况)来实现,而不是实际从权重中减去(第二种情况)。
# Ist: Adam weight decay implementation (L2 regularization)
final_loss = loss + wd * all_weights.pow(2).sum() / 2
# IInd: equivalent to this in SGD
w = w - lr * w.grad - lr * wd * w
这些方法对于普通 SGD 是相同的,但是一旦我们添加动量,或者使用更复杂的优化器(如 Adam),L2 正则化(第一个方程)和权重衰减(第二个方程)就会变得不同。
AdamW 遵循第二个权重衰减方程。
在亚当里
weight_decay (float, optional) – 权重衰减(L2 惩罚)(默认值:0)
在 AdamW 中
weight_decay (float, optional) – 权重衰减系数(默认:1e-2)
阅读更多关于fastai blog的信息。
【讨论】: