PyTorch2中设置requires_grad=True后lambda_1参数不更新问题
解决可学习损失权重lambda_1不更新的问题
核心问题分析
你定义的lambda_1没被纳入优化器的更新队列,或者损失反向传播的链路被打断,导致梯度无法传递到lambda_1,所以训练时它的值始终保持初始状态。
具体修复步骤
- 将lambda_1加入优化器参数列表
优化器默认仅更新模型自身的参数,你需要手动把lambda_1添加到优化器的参数集合中:
# 定义带梯度追踪的lambda_1 lambda_1 = torch.tensor(1.0, requires_grad=True, device='cuda:0') # 初始化优化器时同时传入模型参数和lambda_1 optimizer = torch.optim.Adam(list(model.parameters()) + [lambda_1], lr=1e-3)
- 保证损失计算与反向传播的完整性
总损失必须明确包含lambda_1 * loss2的项,且直接对总损失执行反向传播,确保梯度能传递到lambda_1:
for epoch in range(epochs): optimizer.zero_grad() # 迭代前清零所有参数梯度 # 前向传播获取模型输出 outputs = model(inputs) # 计算两个损失值 loss1 = your_loss_fn1(outputs, targets1) loss2 = your_loss_fn2(outputs, targets2) # 构建总损失:主损失 + lambda_1加权的辅助损失 total_loss = loss1 + lambda_1 * loss2 # 反向传播计算梯度 total_loss.backward() # 更新所有参数(包括lambda_1) optimizer.step() # 打印lambda_1当前值,此时应该能看到数值变化 print(f"Epoch {epoch}: lambda_1 = {lambda_1.item()}")
- 避开常见错误
- 不要在训练循环内重新定义
lambda_1,否则会生成新的无梯度关联的tensor,丢失之前的梯度信息 - 确保
lambda_1的设备(cuda/cpu)与模型、损失的设备一致,否则会打断梯度计算链路 - 如果使用学习率调度器,要确保调度器绑定的是包含
lambda_1的优化器
内容的提问来源于stack exchange,提问作者TsurumiTei
相关产品推荐
相关产品推荐

