当前位置:首页 > AI技术 > 正文内容

中PyTorch训练中出现死循环 检查Loss是否异常导致梯无穷|Duuu笔记

admin2个月前 (04-09)AI技术66

解决实际问题的Python最佳实践

Loss突变为inf或nan导致训练“假死”:梯度失效、参数不更新,主因是除零、log(0)、重复softmax等;需用torch.isfinite检查、清空optimizer状态或重建,并在AMP中配合GradScaler监控。

Loss突然变成

inf

nan

,训练卡住不动

这是最典型的“假死循环”:模型没真卡死,但

loss

爆掉后,后续梯度全是

nan

optimizer.step()

不再更新参数,看起来像无限循环。常见于除零、log(0)、softmax输入过大、loss函数内部未防错。

立刻在训练循环里加检查:

if torch.isnan(loss) or torch.isinf(loss): print("Loss exploded at step", i); break

torch.autograd.set_detect_anomaly(True)

开启异常检测(只在调试时开,会拖慢训练)

别依赖

loss.item()

判断——它对

nan

返回

nan

,但对

inf

可能静默返回一个极大浮点数;优先用

torch.isfinite(loss).all()

torch.nn.CrossEntropyLoss

输入logits前忘了关softmax

这个错不会报错,但会让loss持续为

inf

或剧烈震荡。因为

CrossEntropyLoss

内部已包含log-softmax,若你手动加了

torch.softmax(logits, dim=-1)

再传入,就等于算两次softmax,数值极易溢出。

正确写法:

criterion = torch.nn.CrossEntropyLoss(); loss = criterion(logits, targets)

logits

是未归一化的原始输出)

错误写法:

probs = torch.softmax(logits, dim=-1); loss = criterion(probs, targets)

→ 直接触发

inf

如果必须用概率输入(比如迁移旧代码),换用

torch.nn.NLLLoss

+

torch.log(probs)

,但要确保

probs

全>0

Adam优化器在loss异常时悄悄失效

Adam维护的

exp_avg

exp_avg_sq

缓存一旦混入

nan

,后续所有梯度更新都会被污染——即使loss后来恢复正常,参数也不再更新,表现就是loss平台期+acc不涨。

独响

一个轻笔记+角色扮演的app

下载

每次

loss

不合法时,必须清空optimizer状态:

optimizer.zero_grad(); optimizer.state.clear()

更稳妥的做法是遇到

nan/inf

后重建optimizer:

optimizer = torch.optim.Adam(model.parameters(), lr=...)

不要只靠

loss.backward()

前加

torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

——它拦不住loss本身爆炸,只能防梯度爆炸

混合精度训练(

amp

)下

inf

更隐蔽

torch.cuda.amp.autocast

时,某些层(如LayerNorm、Softmax)在FP16下更容易产出

inf

,但错误常延迟几轮才暴露,且

loss.item()

可能仍返回正常值,实际梯度已坏。

Python免费学习笔记(深入)

”;

务必配合

GradScaler

并检查其状态:

if scaler.get_scale() == 0: print("Scaler scale hit zero")

scaler.step(optimizer)

后加

scaler.update()

,否则下次

scale

不会自适应调整

临时关闭

autocast

做验证:把关键计算段用

with torch.no_grad(): with torch.cuda.amp.disable_casts(): ...

包起来,看是否还出

inf

事情说清了就结束。真正难的不是发现

inf

,而是它常藏在某次

backward

之后、

step

之前,而你只盯着loss曲线看。

相关文章

使用 ESP

针对该分类问题,我们使用了 Kaggle 手势识别数据集 中的一个开源数据集。原始数据集包括 10 个类别,我们只使用了其中 6 个。这些类别更容易识别,且日常生活中更有用,如...

【DL】2023年你应该知道的 10 大深度学习算法

3. 循环神经网络 (RNN) 4. 生成对抗网络 (GAN) 5. 径向基函数网络 (RBFN) 6. 多层感知器 (MLP) 7. 自组织图 (SOM)...

AI核心技巧:如何重置openclaw硬件设置 openclaw恢复出厂设置操作方法【操作】深度解析|Duuu笔记

重置 OpenClaw 配置有四种方法:一、交互式向导重置(openclaw onboard --reset);二、指定作用域的命令行重置(如--reset-scope config);三、手动删除~...

前端开发实战详解:骡子快跑怎么注册账号 骡子快跑账号注册流程最佳实践|Duuu笔记

骡子快跑注册仅需1分钟,但激活码需从Discord指定频道获取,输错3次将锁账户24小时;积分与注册邮箱强绑定且不可更换;部分地区即使注册成功也无法运行Agent。 ☞☞☞AI 智能聊天, 问答助手...

AI实战详解:Perplexity 怎么做市场调研 Perplexity 市场分析实操教程【商业】最佳实践|Duuu笔记

掌握Perplexity AI市场调研需五步:一、结构化提问嵌入地域/时间/主体/指标四要素;二、限定PDF等原始信源提升可信度;三、分步提问生成制表符分隔文本以自动导入Excel;四、启用Pro S...

前端开发实战详解:骡子快跑如何生成会议纪要 骡子快跑语音转文字整理技巧最佳实践|Duuu笔记

使用听脑AI转写、骡子快跑生成纪要、影子跟读校验、自定义术语词典及EcomGPT-CNN情绪风险分析,五步实现会议纪要高效精准产出。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。