训练时nn.Parameter未参与前向计算的元素非预期变更问题
问题原因解答
根本原因
你观察到的未参与训练的参数发生变更,是优化器配置的weight_decay(权重衰减)导致的,和参数是否参与前向/反向传播无关。
具体原理
你在初始化Adam优化器时设置了weight_decay=1e-5,这个参数会对所有传入优化器的模型参数生效:
- 权重衰减的本质是L2正则化,在每一步参数更新时,无论该参数对应的梯度是否为0,都会对参数本身施加向0收缩的惩罚,更新规则可简化为:
param = param * (1 - learning_rate * weight_decay) - learning_rate * gradient - 你代码里只用到了
all_calibration_params[0],其余参数在前向传播中没有被引用,反向传播后对应的梯度为0,因此这些参数的更新仅由权重衰减项主导,从初始值1不断向0收缩,所有未使用的参数收缩规则完全一致,因此最终会变成相同的0.8455值。
验证方法
将configure_optimizers方法中的weight_decay修改为0,重新运行代码即可观测到未使用的参数会保持初始的[1,1,1,1]不变。
解决方案
如果你需要保留权重衰减、同时避免未使用的参数被修改,可选择以下任一方案:
- 优化器只传入当前需要更新的参数,而非全部模型参数
- 对参数进行分组配置,给
all_calibration_params单独设置weight_decay=0 - 每次训练步后手动将未使用参数的梯度置为
None,配合支持稀疏梯度更新的优化器使用
内容的提问来源于stack exchange,提问作者KarlFri
相关产品推荐
相关产品推荐

