当前位置: 首页 > news >正文

【深度学习】Loss为Nan的可能原因

文章目录

  • 1. 问题情境
  • 2. 原因分析
  • 3. 导致Loss为Nan的其他可能原因

1. 问题情境

在某个网络架构下,我为某个数据项引入了一个损失函数。
这个数据项是nn.Embedding类型的,我加入的损失函数是对nn.Embedding空间做约束。
因为我在没加入优化loss前,我的nn.Embedding的数据不在同一条直线上,希望通过下面这样一个loss,约束它们在同一条直线上:
在这里插入图片描述
我的变量计算是这么写的:

embedding = self.latent_codes(idx) # 通过nn.Embedding,根据idx获得对应的latent codes
vecs = self.latent_codes.weight.data # 获得所有的latent codes
d1 = torch.sum((vecs[0].unsqueeze(0) - embedding) ** 2, dim=1).sqrt() # 计算第i个latent codes到0的距离
d2 = torch.sum((vecs[len(vecs) - 1].unsqueeze(0) - embedding) ** 2, dim=1).sqrt() # 计算第i个latent codes到-1的距离
standard_distance = torch.dist(vecs[0], vecs[len(vecs) - 1], p=2) # 计算0-(-1)的标准距离

然后loss是这么写的:

latent_space_constraint = torch.abs(d1 + d2 - standard_distance) # 约束三点在一条直线上

结果导致了loss为Nan的情况

2. 原因分析

一开始没啥头绪,然后问了一下通义千问,loss为Nan的可能原因,给出的回答是:
------------------------------------
可能是数值稳定性问题:
新损失项的计算可能导致数值下溢或上溢,特别是在涉及指数函数、对数函数或其他可能导致极端值的数学运算时。
解决方案包括添加一个小的正偏移量(例如 1e-8)来避免除以零或对零取对数,或者使用数值稳定的损失函数实现。
------------------------------------
因为上述代码中,idx=0idx=-1(此处用-1表示最后一个变量)得到的d1/d2可能为0,然后导致latent_space_constraint中对应计算结果为0,这可能是导致Nan的结果

于是我直接在loss上加了一个 λ \lambda λ

latent_space_constraint = torch.abs(d1 + d2 - standard_distance) + 1e-8

但是完全没用,还是会出现Nan的问题,于是我问的第二个问题是:解决方案包括添加一个小的正偏移量(例如 1e-8)来避免除以零或对零取对数,或者使用数值稳定的损失函数实现。这个小的正偏移量是在loss上直接加吗?,给出的回答是:
------------------------------------
在深度学习中,为了避免数值不稳定的情况,比如在损失函数中对非常接近零的数取对数或除以接近零的数,我们确实会添加一个小的正偏移量(常被称为 epsilon)。但是,这个偏移量不是直接加到整个损失函数上,而是加到可能会引起数值不稳定的部分上。

------------------------------------
那么我可能引起数值不稳定的地方实际上是d1/d2/standard_distance,所以把代码修改成在数值计算的时候加小的偏移量

embedding = self.latent_codes(idx) # 通过nn.Embedding,根据idx获得对应的latent codes
vecs = self.latent_codes.weight.data # 获得所有的latent codes
d1 = torch.sum((vecs[0].unsqueeze(0) - embedding) ** 2 + 1e-8, dim=1).sqrt() # 计算第i个latent codes到0的距离
d2 = torch.sum((vecs[len(vecs) - 1].unsqueeze(0) - embedding) ** 2 + 1e-8, dim=1).sqrt() # 计算第i个latent codes到-1的距离
standard_distance = torch.dist(vecs[0], vecs[len(vecs) - 1] + 1e-8, p=2) # 计算0-(-1)的标准距离

解决上述问题,loss计算正常,但是还要考虑的是这个loss会不会导致所有embedding趋向同一个点的情况,还要约束0和-1的latent codes不能过于相似

3. 导致Loss为Nan的其他可能原因

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当在深度学习模型中加入新的损失项后,特定的权重或参数变为 NaN,这通常指向几个关键的问题区域。对于您的情况,pose_latent_codes 中的特定条目(索引为 0 和 5)在一轮优化后变为 NaN,可能的原因如下:

  1. 特定输入导致的数值不稳定

    • 加入的新损失项可能对某些输入特别敏感,导致计算中出现极大的数值或数值下溢,最终产生 NaN。这可能是因为输入数据中的异常值或不适当的数据预处理。
  2. 梯度爆炸

    • 特定输入或损失计算可能导致针对 pose_latent_codes 的梯度变得非常大,特别是对于索引 0 和 5 的条目。这通常发生在深度神经网络中,尤其是当网络层深且梯度在反向传播过程中累积时。
  3. 正则化或惩罚项

    • 如果新加入的损失项包含正则化项(如 L1 或 L2 正则化),并且正则化强度设置得过高,这可能对某些参数造成过度惩罚,导致 NaN。
  4. 数值计算错误

    • 在新损失项的计算中,可能有某些操作(如除以接近零的数、对负数取对数等)导致了数值不稳定,进而产生 NaN。
  5. 代码错误或实现问题

    • 实现新损失项时可能有代码错误,比如数组索引错误、维度不匹配、数据类型不一致等,这些问题在特定情况下才显现出来,例如针对 pose_latent_codes 的特定条目。

排查和解决方案:

  • 检查输入数据:确认数据预处理步骤,确保没有异常值或不合理的数据点进入模型,特别是在索引 0 和 5 的位置。

  • 梯度裁剪:在优化器中使用梯度裁剪技术,限制梯度的大小,防止梯度爆炸。

  • 降低学习率:尝试降低学习率,以减少每一步更新的幅度,使训练更加稳定。

  • 检查正则化项:如果新损失项包含正则化,尝试降低正则化系数,或检查正则化项的实现是否正确。

  • 数值稳定性改进:在损失计算中加入数值稳定性措施,比如避免除以零、使用 log-sum-exp 技巧避免数值下溢等。

  • 代码审查:仔细审查新损失项的实现代码,确保所有操作都是正确的,没有潜在的逻辑错误或数据类型不匹配。

  • 逐层检查梯度:在训练过程中打印各层的梯度,识别梯度异常增大的层,有助于定位问题所在。

通过上述步骤,您可以逐步排查并解决导致特定权重变为 NaN 的问题。在复杂模型中,问题可能不单一,需要综合多个方面的检查和调整。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

相关文章:

【深度学习】Loss为Nan的可能原因

文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下,我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的,我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…...

解密!考研数学满分学霸的备考书单

这题我太会了,高数视频有是有真的又臭又长,我也不喜欢看 但是自己看教材,有的地方又比较难以理解,所以,这个时候一本通俗易懂的教材就显得格外重要,国内很多教材都讲的晦涩难懂,所以我给大家推…...

AI绘画工具介绍

AI绘画工具是利用人工智能技术帮助用户创作艺术作品的软件或平台。它们通常通过用户输入的描述性文字,自动解析并生成具有特定风格和主题的画作。以下是一些2024年流行的AI绘画工具的介绍: GitMind AI绘画2:一个提供多种语言界面的AI绘画生成…...

【APP逆向】央视频播放量增加,逆向全过程解密

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体,这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统,这一三星系统拥有更大的体积,并且排列也更加紧密,这也使得这一系统更加特别。科学家推测&am…...

【MySQL】(基础篇六) —— 过滤数据

过滤数据 本文将讲授如何使用SELECT语句的WHERE子句指定搜索条件。 WHERE子句 数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria)&…...

利用 HTML5 Canvas 实现在线签字功能

目录 前言 一、HTML5 Canvas 简介 二、签字功能的实现 效果演示 完整代码 前言 在现代互联网应用中,有时我们需要让用户在网页上进行签字操作,比如确认文件、填写电子表格或者签署合同。利用 HTML5 的 canvas 画布,我们可以轻松地实现这一…...

GaussDB技术解读——GaussDB架构介绍(二)

上篇图文,从GaussDB关键架构目标、GaussDB分布式架构、数据计算路由层(Coordinator)关键技术方案等三方面对GaussDB架构进行了介绍。本篇将从数据持久化存取层(DataNode)关键技术方案、全局事务管理层(GTM)关键技术方案…...

EfficientNet详解

原论文名称:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 论文下载地址:https://arxiv.org/abs/1905.11946 原论文提供代码:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet 自己…...

UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则

UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则 在数字时代的浪潮中,UI前端交互设计如同一门深邃的艺术,既需要技术支撑,又需要设计灵感。它关乎用户体验,影响着产品的成败。那么,UI…...

java接口设计需要考虑哪些方面

1.签名 目的:防止数据被篡改 (1)接口请求方将请求参数、时间戳和密钥拼接成一个字符串。 (2)使用MD5等hash算法生成签名。 (3)在请求参数或请求头中增加sign参数传递给API接口。 (4&…...

Opencv图像处理

Opencv图像处理 图像阈值处理 图像阈值的处理通过cv2.threshold函数来进行处理,该函数的具体说明如下所示 ret, dst cv2.threshold(src, thresh, maxval, type) src: 输入图,只能输入单通道图像,通常来说为灰度图 dst&#x…...

LeetCode | 2879.显示前三行

在 pandas 中,可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行,可以在 head() 方法中传入一个参数 n,读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…...

Qt实现简易播放器

效果如图 源码地址: 简易播放器: 基于Qt的简易播放器,底层采用VLC源码 - Gitee.com GitHub:GitHub - a-mo-xi-wei/easy-player: 基于Qt的调用VLC的API的简易播放器...

适配Android12启动页

今天我们讲个什么话题呢?我们今天讲的内容是,Android12新启动页的支持API。 启动页我想大家都不陌生吧,通常的写法就是先创建一个SplashActivity,在onCreate中 Handler(Looper.getMainLooper()).postDelayed({// 在这里跳转主界…...

人工智能在医学领域的应用及技术实现

欢迎来到 Papicatch的博客 目录 🍉引言 🍉 医学影像分析 🍈技术实现 🍍数据准备 🍍模型构建 🍍模型训练 🍍模型评估 🍍应用部署 🍈示例代码 🍉 基因…...

MySQL—多表查询—练习(1)

一、引言 上几篇关于多表查询的基本几个部分全部学习完了。 多表查询的基本类型的查询包括以下: 1、内连接(隐式内连接、显示内连接):... [INNER] JOIN ... ON 条件; ) 2、外连接(左外连接、右外连接&…...

千益畅行:合法合规的旅游卡服务,打破误解

近期,千益畅行旅游卡服务引起了公众的广泛关注。然而,一些人对该服务存在误解,认为其存在某种欺诈行为。但经过深入了解和全网搜索证据,我们可以确认,千益畅行实际上是一家合法合规的旅游卡服务提供商。 千益畅行旅游…...

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本,这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示: 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…...

怎样把便签里的内容移到桌面?桌面便签软件使用方法

每次打开电脑,我总是被满屏的文件和图标弄得眼花缭乱。那些记录在各式各样便签里的重要事项,经常被埋没在这信息的海洋中,找起来真是头疼。想必很多人都有过这样的困扰:如何在繁杂的桌面环境中,一眼就看到自己需要提醒…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...