讲师中心 微信公众号
AI工具推荐 视频效率加速

Python中PyTorch的Loss为什么突然变成NaN_梯度裁剪clip_grad_norm与异常排查

云芳同学_8056

云芳同学_8056

发布时间:2026-04-28 14:13:02

|

922人浏览过

|

来源于php中文网

原创

PyTorch Loss变NaN主因是梯度爆炸、数值溢出或非法运算(如log(0)、sqrt(负数)、1/0),常源于数据含NaN/inf、学习率过大、BatchNorm异常或Loss未做数值保护;clip_grad_norm仅裁剪梯度,无法修复已存在的NaN,需配合梯度检查与源头排查。

python中pytorch的loss为什么突然变成nan_梯度裁剪clip_grad_norm与异常排查

PyTorch Loss突然变成NaN的典型诱因

Loss变NaN几乎从不孤立发生,而是梯度爆炸、数值溢出或非法运算在反向传播链上的最终显性表现。最常见路径是:某层输出出现inf或NaN → 反向传播时梯度爆炸 → loss.backward()后optimizer.step()前参数更新异常 → 下一轮loss直接为NaN。

关键排查点包括:

  • log(0)、sqrt(negative)、1/0等非法数学运算,尤其在自定义Loss或激活函数中(如手动实现softmax未加log_softmax数值稳定项)
  • 输入数据含NaN或inf(常来自预处理错误,如归一化时分母为0、读取损坏图像导致像素值异常)
  • 学习率过大,导致权重一步更新到极大值,后续exp(large)直接溢出为inf
  • BatchNorm层在train=False但running_var ≈ 0,造成除零

clip_grad_norm能解决Loss变NaN吗

不能直接解决,但能**延缓或掩盖问题**——它只作用于反向传播完成后的梯度张量,对已发生的NaN梯度无修复能力。如果梯度本身已是NaN,torch.nn.utils.clip_grad_norm_()会原样保留NaN(PyTorch 2.0+默认行为),随后optimizer.step()用NaN更新参数,下轮Loss必然NaN。

正确用法需配合梯度合法性检查:

Claw Code Suite (Python-Only Edition)
Claw Code Suite (Python-Only Edition)

仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...

下载

立即学习“Python免费学习笔记(深入)”;

  • 必须在loss.backward()之后、optimizer.step()之前调用clip_grad_norm_()
  • 建议紧接其后插入检查:
    if torch.isnan(loss).any() or torch.isinf(loss).any():
        print("Loss is NaN/inf before backward!")
    if any(torch.isnan(p.grad).any() for p in model.parameters() if p.grad is not None):
        print("Gradient contains NaN after backward, before clip!")
  • clip_grad_norm_()的max_norm不宜设得过大(如1e3),否则失去裁剪意义;也不宜过小(如1e-5),可能抑制正常训练

为什么grad_clip后Loss还是NaN:三个隐蔽坑

即使加了clip_grad_norm_(),Loss仍变NaN,大概率掉进以下任一陷阱:

  • Loss函数内部未做数值保护:例如用F.cross_entropy(input, target, reduction='none')后手动求均值,但未过滤掉inf样本;或用BCEWithLogitsLoss却误传sigmoid输出(应传logits)
  • 混合精度训练(AMP)未适配:启用torch.cuda.amp.autocast()时,若Loss函数含float64中间变量(如自定义正则项用了.double()),会触发类型不匹配导致NaN,且clip_grad_norm_()对float16梯度裁剪效果受限
  • 多卡DDP中梯度同步异常:某GPU上先出NaN梯度,DDP默认仍执行all_reduce,污染其他卡梯度;需在model.backward()后加if not torch.isfinite(grad).all(): return提前中断

快速定位NaN源头的实操步骤

别靠猜,用PyTorch内置工具逐层打断点:

  • 启用异常检测:torch.autograd.set_detect_anomaly(True),运行时会精准报出NaN出现在哪个backward节点(但会显著降速,仅调试用)
  • 在forward末尾插入:
    assert torch.isfinite(output).all(), f"Output contains NaN/inf at {layer_name}"
    ,从头到尾逐层加,快速定位爆炸起点
  • 检查DataLoader输出:for i, (x, y) in enumerate(loader): assert torch.isfinite(x).all(); break,确认原始数据干净
  • 禁用所有非必要操作:先关AMP、关DDP、关梯度裁剪、用最小batch size=1跑通,再逐个打开,隔离变量

真正棘手的往往不是clip_grad_norm_()没用,而是NaN在进入梯度计算前就已存在于模型中间态——那说明问题出在数据、初始化或Loss设计上,裁剪只是止痛药,不是解药。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1751

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4504

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1729

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

26437

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3207

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3227

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1183

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn