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

RuntimeError报错:部分可微分张量无需梯度,网络参数微调求解

解决RuntimeError: One of the differentiated Tensors does not require grad

核心排查与解决步骤

这个错误本质是反向传播时无有效梯度可计算,结合你的代码逻辑,按以下顺序排查:

1. 确认可训练参数不为空

你的代码通过GN_params筛选可训练参数,首先要确保筛选后有有效参数:

# 替换原优化器初始化代码,先验证参数数量
trainable_params = list(filter(lambda p: p.requires_grad, self.model.parameters()))
print(f"可训练参数数量: {len(trainable_params)}")
if len(trainable_params) == 0:
    raise ValueError("无有效可训练参数,请检查GN_params的参数名匹配")
self.opt = AdamW(trainable_params, lr=self.lr, weight_decay=self.weight_decay)

如果数量为0,说明GN_params中的参数名和模型实际参数名不匹配,需核对两者的参数名:

# 打印模型所有参数名,与GN_params对比
print("模型参数列表:")
for k, _ in self.model.named_parameters():
    print(k)
print("\n加载的GN_params列表:")
print(GN_params)

常见问题包括:参数名层级差异(比如模型嵌套时参数名是backbone.conv1.weight,但npy中是conv1.weight)、大小写不一致、拼写错误。

2. 验证参数冻结逻辑正确性

确保GN_params内的参数确实被设置为可训练:

# 随机抽取一个GN_params内的参数,检查其requires_grad状态
for k, v in self.model.named_parameters():
    if k in GN_params:
        print(f"参数{k}的requires_grad: {v.requires_grad}")
        break

如果输出为False,说明你的条件判断逻辑有误,需检查k not in GN_params的反向逻辑是否正确。

3. 检查前向传播与损失计算

若可训练参数不为空仍报错,需确认损失计算是否依赖了被冻结的参数:

  • 若确实不需要冻结参数参与梯度更新,确保损失仅由可训练参数的输出计算而来;
  • 若误冻结了需要参与计算的参数,调整GN_params列表,将其加入可训练集合。

4. 确认模型处于训练模式

微调时务必将模型设为训练模式,避免影响梯度计算:

self.model.train()  # 不要使用eval(),否则会干扰batchnorm等层的梯度逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:03:18