PyTorch训练线性网络出现NaN错误,请求排查原因
解决PyTorch训练中出现NaN的常见方案
针对你用线性网络处理百万级回归数据时遇到的NaN问题,给你列几个最可能的原因和解决办法:
数据没做预处理或存在异常值
百万级数据里很容易藏着极端值、NaN/Inf样本,再加上12个特征尺度差异大,线性网络的梯度很容易爆炸。- 先扫一遍数据集,把含NaN/Inf的样本直接过滤掉;
- 对所有输入特征做标准化(转成均值0、方差1的分布),输出特征如果尺度偏大也可以做缩放,用
torch.mean()和torch.std()就能快速实现。
学习率设置过高
哪怕是简单线性网络,百万级批量训练时大学习率会让参数更新幅度过大,直接把损失或参数冲成NaN。- 把初始学习率往下调,比如从
1e-3降到1e-4甚至1e-5,慢慢试出合适的值; - 加个学习率调度器,比如
torch.optim.lr_scheduler.StepLR,每几轮就把学习率降一档,防止后期梯度波动。
- 把初始学习率往下调,比如从
梯度爆炸或损失计算溢出
回归任务如果输出值本身很大,MSE平方后容易数值溢出;反向传播时梯度也可能突然变超大。- 给梯度加裁剪:反向传播后执行
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0),把梯度范数限制在安全范围; - 要是输出尺度太大,先把目标值做缩放,训练完再转回去。
- 给梯度加裁剪:反向传播后执行
DataLoader的潜在问题
用了DataLoader不代表就没问题,可能最后一批数据不完整、或者多进程加载时读入了异常数据。- 设置
drop_last=True,扔掉最后一个不满批次的样本; - 先把
num_workers设为0,排查是不是多进程加载导致的数据异常,没问题再调大。
- 设置
模型参数初始化不当
要是你手动初始化了线性层的权重,值设得太大的话,初始损失会高到离谱,训练几步就出NaN。- 用PyTorch内置的初始化方法,比如
torch.nn.init.xavier_uniform_()给线性层权重初始化,别自己瞎设值。
- 用PyTorch内置的初始化方法,比如
内容的提问来源于stack exchange,提问作者asdfasdf4312
相关产品推荐
相关产品推荐

