Pytorch 具有重量衰减的AdamW和Adam

Pytorch 具有重量衰减的AdamW和Adam,pytorch,Pytorch,torch.optim.Adam(重量衰减=0.01)和torch.optim.AdamW()之间有什么区别吗?链接到文档:是的,Adam和AdamW重量衰减是不同的 Hutter在他们的论文()中指出,在每个库的Adam中实现权重衰减的方式似乎是错误的,并提出了一种简单的方法(他们称之为AdamW)来解决这个问题 在Adam中,权重衰减通常通过将wd*w(wd这里是权重衰减)添加到梯度(Ist情况)来实现,而不是实际从权重中减去(IInd情况) 这些方法对于香草SGD是相同的,但一旦我们添加动

torch.optim.Adam(重量衰减=0.01)
torch.optim.AdamW()
之间有什么区别吗?链接到文档:

是的,Adam和AdamW重量衰减是不同的

Hutter在他们的论文()中指出,在每个库的Adam中实现权重衰减的方式似乎是错误的,并提出了一种简单的方法(他们称之为AdamW)来解决这个问题

在Adam中,权重衰减通常通过将
wd*w
wd
这里是权重衰减)添加到梯度(Ist情况)来实现,而不是实际从权重中减去(IInd情况)

这些方法对于香草SGD是相同的,但一旦我们添加动量,或使用更复杂的优化器,如Adam,L2正则化(第一个方程)和权重衰减(第二个方程)就不同了

AdamW遵循第二个重量衰减方程

亚当

权重衰减(浮动,可选)–权重衰减(L2惩罚)(默认值:0)

在AdamW中

重量衰减(浮动,可选)–重量衰减系数(默认值:1e-2)


阅读更多信息。

更进一步,目前torch.optim.adam的文档中似乎存在误导性陈述,(错误地)暗示adam也在使用新版本的重量衰减,这将使其等同于AdamW。
# 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