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

调用nn.Linear forward函数失败及训练Loss不更新问题求助

问题分析与解决方案

你的问题是训练过程中损失值无变化、模型参数未更新,即使调用了optimizer.step(),可能的原因及修复方案如下:

可能原因

  1. 输入数据范围过大:你的输入X_train数值范围在2~160之间,导致模型参数的梯度值较大,配合当前学习率0.01会引发参数更新幅度过大,可能出现损失震荡或看似“无变化”的情况(实际是参数在最优值附近剧烈波动,平均损失无明显下降)。
  2. 梯度未正确计算或传递:虽然代码中调用了train_loss.backward(),但可能存在数据类型不匹配、模型参数未开启梯度跟踪等隐性问题。
  3. 优化器未正确绑定模型参数:极少数情况下,model_eins.parameters()未正确返回模型参数,导致优化器无参数可更新。

调试与修复步骤

1. 先添加调试代码定位问题

在训练循环中插入以下代码,查看梯度是否存在、参数是否更新:

for epoch in range(epochs):
    model_eins.train()
    train_preds = model_eins(X_train)
    train_loss = loss_fn(train_preds, y_train)
    
    optimizer.zero_grad()
    train_loss.backward()
    
    # 检查梯度是否存在
    print(f"Epoch {epoch} | Weight Gradient: {model_eins.linear_model.weight.grad}")
    print(f"Epoch {epoch} | Bias Gradient: {model_eins.linear_model.bias.grad}")
    
    # 记录更新前后的参数
    pre_w = model_eins.linear_model.weight.item()
    pre_b = model_eins.linear_model.bias.item()
    
    optimizer.step()
    
    post_w = model_eins.linear_model.weight.item()
    post_b = model_eins.linear_model.bias.item()
    
    print(f"Epoch {epoch} | Weight Change: {post_w - pre_w:.6f}, Bias Change: {post_b - pre_b:.6f}")
    
    if epoch % 10 == 0:
        print(f"Epoch {epoch} | Train Loss: {train_loss.item():.4f}")
  • 如果梯度为None:检查y_train和train_preds的数据类型是否一致(需同为torch.float32),确认模型处于train模式。
  • 如果梯度存在但参数无变化:打印optimizer.param_groups,确认参数列表中包含linear_model.weight和linear_model.bias,同时检查参数的requires_grad属性是否为True(print(model_eins.linear_model.weight.requires_grad))。

2. 核心修复方案:数据归一化

输入数据范围过大是最可能的原因,对输入做标准化处理,将数值缩放到均值为0、方差为1的范围,让学习率更容易适配:

# 对训练集计算均值和标准差(仅用训练集避免数据泄露)
mean = X_train.mean()
std = X_train.std()

# 标准化训练集和测试集
X_train = (X_train - mean) / std
X_test = (X_test - mean) / std

标准化后,再使用原学习率0.01训练,损失值会明显下降,参数也会逐步逼近真实值weight=0.3、bias=0.9。

3. 备选方案:调整学习率

如果不想做归一化,可以尝试缩小学习率,比如将lr改为0.0001,避免参数更新幅度过大:

optimizer = torch.optim.SGD(params=model_eins.parameters(), lr=0.0001)

验证修复效果

训练完成后,打印模型参数查看是否接近目标值:

print(f"Learned Weight: {model_eins.linear_model.weight.item():.4f}")
print(f"Learned Bias: {model_eins.linear_model.bias.item():.4f}")

内容的提问来源于stack exchange,提问作者Gamma-ray-burst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:53