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

神经网络训练出现NaN Loss与训练数据量的关联问题咨询

你遇到的训练全量数据时loss为NaN、减半数据后恢复正常的问题,本质不是数据量本身直接导致的,是全量数据中包含的少量极端异常样本、分布特性触发了数值计算溢出,半量采样时刚好避开了这些触发条件,因此问题消失。

具体原因

  • 离群样本触发计算溢出:如果全量数据的标签y或输入特征X中存在少量数值极大/极小的离群点,当这些样本被划分到同一个batch时,MSE损失计算时会对误差做平方操作,数值直接超出浮点数上限变为inf,反向传播时梯度就会变为NaN。半量采样时要么没有采到这些离群点,要么这些点没有集中出现在同一个batch里,因此不会触发溢出。
  • 全量数据分布跨度过大且未做归一化:如果输入特征或标签未做归一化处理,全量数据的数值范围会比50%采样数据的范围大很多,输入到神经网络后,ReLU层输出的数值会过大,经过多层计算后极易出现数值溢出,最终导致loss为NaN。
  • 梯度裁剪无法修正计算层面的溢出:你已经配置了clipvalue=0.5的梯度裁剪,但如果某一步的损失计算本身已经是inf,梯度裁剪也无法修正后续出现的NaN问题。

解决步骤

  1. 排查数据异常
    运行以下代码检查全量数据集是否存在非法值和极端离群点:
import numpy as np
# 检查是否存在NaN/inf
print("X存在NaN:", np.isnan(X).any())
print("X存在inf:", np.isinf(X).any())
print("y存在NaN:", np.isnan(y).any())
print("y存在inf:", np.isinf(y).any())
# 查看标签的分布情况
print("y的99分位值:", np.percentile(y, 99))
print("y的最大值:", y.max())
print("y的最小值:", y.min())

如果存在非法值直接删除对应样本;如果存在超出99分位过多的离群点,可以考虑做数值截断或者对数变换压缩数值范围。
2. 补充数据预处理流程
对输入特征和标签做标准化处理,示例代码如下:

from sklearn.preprocessing import StandardScaler
# 特征标准化
x_scaler = StandardScaler()
X_scaled = x_scaler.fit_transform(X)
# 标签标准化(标签数值范围大时建议添加)
y_scaler = StandardScaler()
y_scaled = y_scaler.fit_transform(y.reshape(-1, 1)).flatten()
# 训练时传入缩放后的数据,预测后反缩放得到真实值
test_input_scaled = x_scaler.transform(test_input)
y_pred_scaled = model.predict(test_input_scaled)
y_pred = y_scaler.inverse_transform(y_pred_scaled)
  1. 调整训练参数
    可以将batch size调整为64或128,降低单个batch集中出现大量离群点的概率;也可以将梯度裁剪方式调整为clipnorm=1.0,对梯度的范数做限制,适配不同的梯度分布。

内容的提问来源于stack exchange,提问作者Livia Fragoso Pimentel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:06:02