QUESTION

AdamW会创建自己的w和b吗,m、v与模型参数是什么关系?

A

模型只有原来的可训练参数,AdamW额外保存的是每个参数的优化历史状态。

DETAILED ANSWER

直接结论

AdamW不会另外创建一套参与拟合的wbwb仍然属于模型,并在前向传播中产生预测;AdamW只是为每个模型参数保存对应的mv,用于决定下一次怎样更新原参数。

先分清三类数据

以一个线性层为例:

layer = torch.nn.Linear(3, 2)

模型拥有:

weight:形状[2, 3]
bias:形状[2]

训练时还会出现:

weight.grad:weight的当前梯度
bias.grad:bias的当前梯度

AdamW第一次更新后,会为这些参数分别维护:

weight对应的m和v:形状都与weight相同
bias对应的m和v:形状都与bias相同

模型参数负责什么

weightbias会参与前向传播:

y = xW^T + b

损失函数会通过反向传播计算它们的梯度,optimizer.step()再修改这些原参数。它们是模型真正需要学习和部署的内容。

m和v负责什么

m保存梯度的平滑平均,v保存梯度平方的平滑平均。它们:

  • 不参与模型的前向预测;
  • 不被当成另一套网络权重;
  • 不通过loss.backward()直接学习;
  • 由优化器根据本轮梯度更新;
  • 继续训练时需要,单纯推理时通常不需要。

因此,AdamW不会增加模型的可训练参数数量,但会增加训练期间的内存占用,因为它要为参数保存额外状态。

一个参数的更新链路

模型参数w参与前向传播
→ 得到Loss
→ backward算出w.grad
→ AdamW读取w.grad并更新m、v
→ 根据m、v修改原来的w
→ 下一轮仍由这个新w参与前向传播

全程只有一套模型参数w

保存模型时为什么有两种state_dict

torch.save(model.state_dict(), "model.pt")
torch.save(optimizer.state_dict(), "optimizer.pt")
  • model.state_dict()保存模型参数和缓冲区,用于推理或加载模型;
  • optimizer.state_dict()保存mv、步数和参数组配置,用于较完整地恢复训练。

如果只做推理,通常只需要模型状态;如果想从中断位置继续训练,最好同时保存优化器状态。

参考

PyTorch AdamW状态字典说明