模型训练过程中产生NAN的原因分析

本文分析了模型训练中导致loss变为NAN的四大原因,包括torch.sqrt()、torch.log()、梯度爆炸及除0操作,并提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型训练过程中产生NAN的原因分析

在模型的训练过程中发现,有时在经过多轮训练后loss会突然变为nan。loss变为nan也就使权重更新后的网络里的参数变为了nan,这样就使整个训练无法再进行下去了。

1. nan的来源

从调试情况来看nan出现的顺序是:loss的梯度 --> 网络的参数 --> 预测的结果 --> loss本身。

注意,第一个出现问题的应该是loss的梯度

2. 可能1:torch.sqrt()

一般sqrt函数的定义域为:[0,无穷大)

torch.sqrt()的定义域为:(0,无穷大)

因此,当开方的数非常小的时候反向传播无法正常进行。可以通过给其加一个非常小的数来避免该问题

torch.sqrt(x) --> torch.sqrt(x + 1e-8)

很有可能是这个原因造成的。实际操作的将其修改后再也没有出现过nan,说明这个问题很明显。

3. 可能2:torch.log()

众所周知,log函数在x接近于0的时候输出会接近于无穷小。因此,当绝对差很小的时候,log loss无法正常反向传播。因此需要对log里的x进行截取clip。

4. 可能3:梯度爆炸

假如在搜索空间中有一堵“墙”,那么当梯度下降撞到墙上时可能会得到一个异常的的梯度,这就是梯度爆炸现象。

当遇到梯度爆炸时,只需要对梯度进行剪裁即可:

loss.backward()
torch.nn.utils.clip_grad_norm(net.parameters(), 5)    #设置剪裁阈值为5

5. 可能4: 除0操作

虽然说这是一个很低级的失误, 但是有时候可能就是因为没有发现这个低级失误要检查很久.(血流教训)

ps:我会在这里持续更新我遇到的产生nan的原因.

### ARIMA模型预测结果为NaN原因分析 在时间序列建模过程中,ARIMA模型预测结果出现NaN通常由多种因素引起。具体原因如下: #### 数据预处理不当 原始数据中存在的大量缺失值(NaN),这些缺失值会影响模型训练和预测阶段的结果[^1]。 #### 参数配置不合理 当ARIMA模型的阶数(order)设置不当时,可能导致计算不稳定进而产生NaN值。例如,在某些情况下,差分次数(d)过高可能会使序列变得不再平稳,从而影响后续的自回归(p)和移动平均(q)部分正常工作[^2]。 #### 输入数据异常 用于预测的新输入数据可能存在格式错误或超出合理范围的情况,这也会引发预测失败并返回NaN作为输出。 --- ### 解决方案 针对上述提到的各种可能原因,可以采取以下措施来解决问题: #### 清洗与填补缺失值 对于含有较多NaN的数据集,应该先对其进行清洗操作,比如删除完全空白记录;更重要的是采用合适的插补方法填充剩余位置上的空缺数值,常用的方法有前向/后向填充(forward/backward fill)、均值替换(mean imputation)以及基于其他统计特征的选择性填充等技术。 ```python import pandas as pd from sklearn.impute import SimpleImputer # 使用SimpleImputer进行均值填充 imputer = SimpleImputer(strategy='mean') df_cleaned = pd.DataFrame(imputer.fit_transform(df), columns=df.columns) ``` #### 调整模型参数 仔细检查所使用的`order=(p,d,q)`组合是否合适,并尝试通过网格搜索(Grid Search)或其他优化手段找到最佳超参数设定。此外还可以考虑引入信息准则(AIC/BIC)辅助评估不同配置下的性能表现,以此指导最终选择。 ```python import statsmodels.api as sm import numpy as np def optimize_arima_parameters(data): best_aic = np.inf best_order = None p_values = range(0, 5) d_values = range(0, 2) q_values = range(0, 5) for p in p_values: for d in d_values: for q in q_values: try: model = sm.tsa.ARIMA(data, order=(p, d, q)) results = model.fit() if results.aic < best_aic: best_aic = results.aic best_order = (p, d, q) except Exception as e: continue return best_order best_order = optimize_arima_parameters(df['value']) print(f'Best ARIMA Order: {best_order}') model_optimized = sm.tsa.ARIMA(df['value'], order=best_order).fit() forecast = model_optimized.forecast(steps=10) ``` #### 验证新输入的有效性 确保提供给predict函数的时间戳或者其他索引字段保持连续性和一致性,防止因跳跃式增长而导致无法定位对应的历史观测点而报错。同时也要注意排除那些明显偏离常规趋势或者分布规律的数据点以免干扰整体拟合效果。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值