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
相关产品推荐
相关产品推荐

