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

PyTorch实现3隐藏层MLP回归时损失恒为NaN的问题排查

可能的原因及解决方法

  • 检查目标变量的异常值:回归任务中若RET列存在极大或极小的异常值,计算MSE时会直接导致损失爆炸为NaN。先统计train_data_top['RET']的均值、标准差、最大最小值,对超出合理范围的数值做截断处理(比如限制在±3倍标准差内)。
  • 匹配模型输出与目标的维度:模型输出是(batch_size, 1)的二维张量,但batch_y是(batch_size,)的一维张量,MSE计算时的广播机制可能引发数值问题。修改损失计算代码为:loss = criterion(outputs, batch_y.unsqueeze(1)),或者在创建y张量时直接设置为二维:y_train_tensor = torch.tensor(train_data_top['RET'].values, dtype=torch.float32).unsqueeze(1)。
  • 添加梯度裁剪:即使降低学习率,梯度爆炸仍可能让参数变成NaN。在loss.backward()后、optimizer.step()前添加:torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0),限制梯度的最大范数。
  • 验证归一化的正确性:确认所有输入特征都完成了归一化,且归一化时仅使用训练集的统计量(均值、标准差)来转换验证集和测试集,避免数据泄露导致的数值异常。
  • 自定义模型参数初始化:PyTorch线性层的默认初始化可能导致初始输出过大,可在模型__init__中对权重做初始化:
    nn.init.xavier_uniform_(self.fc1.weight)
    nn.init.xavier_uniform_(self.fc2.weight)
    nn.init.xavier_uniform_(self.fc3.weight)
    nn.init.xavier_uniform_(self.fc4.weight)
    
  • 逐batch监控损失:在训练循环中打印每个batch的损失值,定位首次出现NaN的批次,针对性排查对应批次的数据问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:37:31