You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch2中设置requires_grad=True后lambda_1参数不更新问题

解决可学习损失权重lambda_1不更新的问题

核心问题分析

你定义的lambda_1没被纳入优化器的更新队列,或者损失反向传播的链路被打断,导致梯度无法传递到lambda_1,所以训练时它的值始终保持初始状态。

具体修复步骤

  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)
  1. 保证损失计算与反向传播的完整性
    总损失必须明确包含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()}")
  1. 避开常见错误
  • 不要在训练循环内重新定义lambda_1,否则会生成新的无梯度关联的tensor,丢失之前的梯度信息
  • 确保lambda_1的设备(cuda/cpu)与模型、损失的设备一致,否则会打断梯度计算链路
  • 如果使用学习率调度器,要确保调度器绑定的是包含lambda_1的优化器

内容的提问来源于stack exchange,提问作者TsurumiTei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:20:56