fp16训练神经网络时出现nan问题

news/2025/10/9 20:36:51/文章来源:https://www.cnblogs.com/jzzg/p/19131930

问题总结:nan 问题

现象

在训练过程中,训练损失(Train Loss)和测试损失(Test Loss)的值变为 nan(Not a Number)。这通常意味着训练过程中出现了数值计算错误或不稳定,导致无法计算出有效的损失值。同时,训练准确率和测试准确率(Train AccuracyTest Accuracy)保持在接近随机猜测的水平(例如 9.87% 或 10%)。

在你的训练过程中,nan 错误使得模型无法正常学习,导致:

  • 训练损失和测试损失 变为 nan
  • 训练准确率测试准确率 固定在随机值附近,未能有效提升。

原因

  1. 梯度爆炸或梯度消失

    • FP16 精度训练中,由于计算精度较低,梯度可能会在反向传播过程中变得过小(梯度消失)或过大(梯度爆炸)。这会导致在训练时出现 nan,特别是在使用深层网络时,数值的误差可能在多次计算后积累。
  2. 学习率过大

    • FP16 精度下,数值的范围更加有限。如果学习率设置过大,梯度更新的步长可能会过大,从而导致数值溢出或计算不稳定,最终导致 nan
  3. 损失函数中的无效值

    • 某些损失函数(如对数损失函数)可能会在计算过程中遇到无效值(例如对零或负数取对数),导致 nan
  4. FP16 特有的数值问题

    • FP16 精度会导致数据在表示过程中有较大的精度损失,尤其是在处理小数时。网络中的某些操作(如权重更新)可能会由于精度不足而导致计算出错。

解决方法

  1. 使用 GradScaler 和 Loss Scaling

    • 通过使用 torch.cuda.amp.GradScaler,可以动态地对损失进行缩放,从而避免梯度过小或过大,保持梯度稳定。Loss Scaling 是在 FP16 精度训练中防止梯度消失或爆炸的有效方法。
    scaler = GradScaler()
    scaler.scale(loss).backward()  # 梯度反向传播
    scaler.step(optimizer)  # 更新优化器
    scaler.update()  # 更新缩放因子
    
  2. 降低学习率

    • 减小学习率有助于减缓训练过程中梯度更新的步伐,避免梯度过大导致溢出或计算不稳定。通常,可以将学习率从 0.001 降到 0.0001 或更小,以保证训练稳定。
  3. 梯度裁剪

    • 如果问题是梯度爆炸,可以使用 梯度裁剪(Gradient Clipping)来限制梯度的最大值,避免梯度过大导致的数值溢出:
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    
  4. 检查数据和损失函数

    • 确保输入数据没有异常值(如 NaN、无穷大或负值)。可以在数据预处理阶段进行规范化,确保数据在合理范围内。
    • 确保损失函数在计算时不会产生无效值。对于使用 对数损失 的函数,需要确保输入值大于零。
    print(f"Data max: {data.max()}, Data min: {data.min()}")
    
  5. FP16 转回 FP32

    • 如果依然无法解决问题,可以尝试退回到 FP32 精度训练,虽然会增加内存占用和计算时间,但可以避免由于 FP16 精度导致的数值问题。

总结

  • 现象:训练损失和测试损失为 nan,训练准确率和测试准确率固定在接近随机值。

  • 原因

    • 梯度爆炸或消失。
    • 学习率过大。
    • 损失函数计算中的无效值。
    • FP16 精度训练中的数值问题。
  • 解决方法

    • 使用 GradScalerLoss Scaling 来稳定梯度计算。
    • 降低学习率,避免梯度更新过大。
    • 使用梯度裁剪(如果出现梯度爆炸)。
    • 确保数据没有无效值,避免损失函数中的计算错误。
    • 在极端情况下,使用 FP32 代替 FP16

通过这些方法,你可以有效地避免训练过程中出现 nan 的问题,确保训练稳定进行。


根据你提供的结果,nan 问题出现在 训练 过程中,而非 推理(Inference)过程中。这从以下几个方面可以推测出来:

1. 训练过程的损失和准确率

  • 你在训练的 Train LossTest Loss 中看到的是 nan,这通常发生在训练过程中,由于反向传播计算梯度时数值不稳定导致。
  • 训练的准确率 Train Accuracy 也在持续提高,而测试准确率 Test Accuracy 达到接近随机猜测的水平(接近 10%),这说明在训练过程中,模型能够有效学习,但在梯度更新时遇到数值问题,导致损失变为 nan

2. 推理过程

  • 在推理过程中,通常不涉及梯度计算(即不进行反向传播)。因此,nan 结果一般不会出现在推理过程中。推理过程中发生 nan 的情况通常较少,除非输入数据本身有问题(如 nan、无穷大等),但这在训练过程中很少出现。

3. 推理与训练的区别

  • 训练:会涉及 前向传播损失计算反向传播梯度更新。在这些步骤中,数值计算(如梯度计算)会受到精度的影响,特别是 FP16 精度训练时,容易因为梯度过小或过大出现数值溢出,导致 nan
  • 推理:仅涉及 前向传播输出计算,没有梯度计算,因此更不容易出现 nan。如果出现 nan,通常是因为模型在训练时出现了不稳定,导致某些权重或激活值在推理时变为 nan

结论:

nan 问题出现在训练过程中,特别是在 FP16 精度训练中,由于梯度计算和损失更新时可能会出现数值不稳定,导致损失变为 nan。解决这个问题的常见方法是使用 Loss Scaling,通过 GradScaler 稳定梯度计算,避免梯度过小或过大。

推理过程一般不会直接导致 nan,除非是训练过程中有问题的模型参数导致推理时出现问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十篇

今天是10月9号,返校的第一天,学习了链表的相关知识,也学习了栈的有关知识点。

504 品酒大会!!!!!!

歌曲瑞平!!!!!!目前榜单 省流版:

newDay07

1.今天确实是没学多少,背了背单词,看了会《程序员修炼之道》 2.明天去图书馆静心学学吧,主要是Java这一块,再写写作业 3.过完国庆有点犯懒了

【数据结构】可撤销并查集 - Slayer

可撤销并查集只可以按照加入的时间从后到前撤销加边操作。 具体的,我们会把所有加入的边压入一个栈,然后当什么时候要撤销时不断从栈顶弹出一条边,撤销掉。而至于具体的撤销步骤,我们假设此边原来是把 y 连向 x,那…

直播美颜sdk的底层逻辑:人脸美型机制的算法与架构解析

直播美颜sdk的底层逻辑:人脸美型机制的算法与架构解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

从开放重定向到XSS:漏洞升级实战

本文详细记录了安全研究员如何发现网站开放重定向漏洞,并通过编码绕过防火墙成功升级为XSS攻击的全过程。文章包含具体的漏洞利用步骤、防火墙绕过技巧和最终的攻击验证,为网络安全爱好者提供了实用的技术参考。从开…

余弦日记

我擦,我不知道2025 年 10 月 2 日,对我来说是传说般的一天,因为我克服了在本科四年间缺乏社交导致的、对陌生人的社交恐惧症,去本地的一个漫展出了余弦。 上一次去漫展,可能是两年前暑假的上海东方 Only,再上一次…

【题解】P11459 [USACO24DEC] Its Mooin Time P

其实是套路题。但有段时间没写过闵可夫斯基和优化 \(dp\) 了,记录一下。 先简单回顾一下闵可夫斯基和。点集 \(P\) 与 点集 \(Q\) 的闵可夫斯基和定义为:\(P+Q=\{a+b|a\in P,b\in Q\}\) 。 对于两个凸包的闵可夫斯基…

创建一个springboot项目,mybatis连接嵌入式数据库H2,实现增删改查功能

@目录目标创建一个spirngboot项目创建流程第一次运行项目,界面如下mybatis连接数据库H2依赖:mybatis + h2配置文件schema.sql实现对用户的增删改查创建entity创建mapper创建service创建controller搭配前端程序,修改…

基于众包的产品质量比较与推荐算法研究

本研究通过众包方式探索影响顾客购买决策的因素,发现顾客评论和问答内容比商家描述更能预测产品质量感知,这些发现可用于改进产品发现算法,提高推荐相关性。探索顾客购买决策背后的原因 研究背景 为了提升产品发现算…

10/9

进一步学习了链表插入的相关知识,规划了自己的实验选题系统。

2025.10.9

今日:学习英语 明日:学习英语 敲代码

深入解析:一款相机是只有桶形畸变 和 枕形畸变的一种,还是两个都有?

深入解析:一款相机是只有桶形畸变 和 枕形畸变的一种,还是两个都有?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

记忆化

记忆化记忆化搜索(减少重复计算,对搜索的优化)DFS指数级 记忆化保证了每个值只计算一次限制在了NM时间范围内=等价于DP动态规划好处:不需要考虑循环顺序,且只考虑有解的状态,相较递推效率可能更高 弊端:需要考虑边…

重组抗体技术:从原理到应用,解锁高效可控的新一代抗体研发

在抗体技术迭代中,重组抗体凭借 “基因工程改造 + 可控化生产” 的核心优势,逐渐取代传统杂交瘤抗体,成为科研、诊断与治疗领域的主流工具。它不仅解决了动物源抗体的免疫排斥问题,还能灵活设计为全长抗体、小分子…

关于jinja2的ssti模版注入的学习+过滤

查找想要的模块 cnt = 0 for item in [].__class__.__base__.__subclasses__():try:if os in item.__init__.__globals__:print(cnt, item)cnt += 1except:cnt += 1continue{% for i in range(300) %}{{ i }} - {{ .__…

WPF Epplus export 10M+ items in excel with multiple sheets batch by batch

Install-Package Epplus; private async Task ExportAsExcelCommandExecuted(object? obj) {try{await PopulateStatusMsg($"Start exporting");exportedIdx = 0;var dg = obj as DataGrid;var items = dg.…

[EGOI 2023] Guessing Game

精彩。 这篇题解有思路讲解,只想看做法的可以看其它题解。 做题第一步一定是先把题目要干什么弄清楚。不妨令这题第一个人是 A(除了最后一个访问的元素的信息填写者),第二个人是 B(接收信息者),第三个人是 C(最…

CF2152G Query Jungle

很精巧的题。 很明显求的是虚树的叶子结点数量。 然而这个玩意还带修,看起来有点恶心。不过带修的问题一般都不会很复杂,再加上子树修改我们考虑用搜索序把树拍到序列上,为了更好的刻画叶子,我们可以考虑使用性质更…

[ROI 2018] Addition without carry

还是记录一下,有点怪但是有点帅。 首先条件等价于和不进位,也就是说每一位只有一个 \(b\) 是 \(1\)。 对于 \(b_i\ge a_i\) 的限制我们可以当成 \(a_i\) 加若干非负数,考虑 check 一个答案是否合法,记得确定一个漂…