AdamW会创建自己的w和b吗,m、v与模型参数是什么关系?
模型只有原来的可训练参数,AdamW额外保存的是每个参数的优化历史状态。
DETAILED ANSWER
直接结论
AdamW不会另外创建一套参与拟合的w和b。w和b仍然属于模型,并在前向传播中产生预测;AdamW只是为每个模型参数保存对应的m和v,用于决定下一次怎样更新原参数。
先分清三类数据
以一个线性层为例:
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相同
模型参数负责什么
weight和bias会参与前向传播:
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()保存m、v、步数和参数组配置,用于较完整地恢复训练。
如果只做推理,通常只需要模型状态;如果想从中断位置继续训练,最好同时保存优化器状态。
