news 2026/6/15 18:13:25

【NPU】【精度】【数值计算】Adam算子计算顺序不同引发的精度问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【NPU】【精度】【数值计算】Adam算子计算顺序不同引发的精度问题

1. 精度异常表现

Adam(Adaptive Moment Estimation)是深度学习中最常用的自适应学习率优化器之一,用来更新网络模型训练参数。在NPU上调试apply_adam算子时遇到了一些微小的精度差异,有一个用例精度正确率只有99.9931%,数据类型为fp32,报错索引位置和与标杆的误差如下:

可以看到误差为0.000x, 来到了小数点的后四位。似乎这是计算过程中引入的必不可少的误差(报错位置分布毫无规律),但严谨考虑(该算子为优化器算子)我们还是要再细究一下这个问题,以避免模型训练累积误差。

2. 观察和猜想

apply_adam 的计算公式如下:

2.1 猜想1

可以看到公式中有add,sub,sqrt,div,mul 5类指令。这几个指令中最可能出问题的就是sqrt了(从计算的复杂度考虑)。于是笔者尝试用牛顿迭代法手动实现了sqrt的计算,公式如下:


式中,n为需要求取的值,x_k为每次迭代结果值,初始值设置为x_0=n/2
通常迭代5~6次就能满足fp64的精度,保守起见,笔者迭代了10次来验证精度是否由此处引起。不幸地是,依然存在同样的精度问题。

2.2 猜想2

就在笔者准备放弃尝试,承认这是硬件计算误差带来的问题时,突然瞥见最后一个公式w使用了下面的计算逻辑:

Muls(outCastLocal[expAvgOffset_], outCastLocal[expAvgOffset_], stepSize_, dataCount); PipeBarrier<PIPE_V>(); Div(inCastLocal[varOffset_], outCastLocal[expAvgOffset_], inCastLocal[varOffset_], dataCount);

我们通过下面这个公式来进行讲解:

在原本要计算的逻辑过程中应该先计算a = tensor1/tensor2,再计算value * a,即先除后乘。然而在实际实现中写成了数学上“等价”的形式:a = value * tensor1,然后计算a/tensor2,先乘后除。在浮点数计算中,由于精度限制,运算顺序的改变可能导致不同的舍入误差,二者在实际实现中并不完全等价,也就有可能引入误差。
而验证的方法非常简单,直接将第1行和第3行代码行交换一下位置变成先除后乘:

Div(inCastLocal[varOffset_], outCastLocal[expAvgOffset_], inCastLocal[varOffset_], dataCount); PipeBarrier<PIPE_V>(); Muls(inCastLocal[varOffset_], inCastLocal[varOffset_], stepSize_, dataCount);

再重新经过验证,果然精度100%通过。

3. 根因

浮点运算中,本应先除后乘,但实际实现被写成了先乘后除。虽然数学上等价,但在浮点运算中,由于​中间结果的舍入误差累积不同​,导致最终结果出现精度偏差。

4. 解决方法

调整w参数计算过程中l*m/(√v+ε)中的错误计算顺序,先计算a=m/(√v+ε),再计算l*a,与实际计算顺序保持一致,避免浮点计算误差。

5. 启发

如果我们止步于99.9931%时,不再细究,就可能遇到在模型集群训练时模型loss跑飞的问题。小小的乘法顺序不同可能会导致几天的模型白白训练。

  1. 浮点数数值敏感是个需要长时间投入研究的课题,当出现了精度的细微差距时,开发者也要敏感起来。
  2. 可能你的计算逻辑看上去是等价的,但是遇到问题时还是要看看CPU或者你的参考标杆是怎么处理的。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:20:58

九轴姿态:MPU-9250九轴姿态解算全攻略

目录 1. 硬件与 DMP 简介 MPU-9250 特性 DMP 作用 2. 软件整体架构 3. 代码实现&#xff08;STM32 HAL 库&#xff09; 3.1 IC 底层驱动 3.2 MPU-9250 与 DMP 初始化 3.3 读取 DMP 姿态数据 3.4 主函数与串口输出 4. DMP 库移植说明 5. 关键优化与注意事项 6. 进阶…

作者头像 李华
网站建设 2026/6/15 17:31:29

无人机双环PID悬停控制全解析

目录 1. 无人机悬停控制系统架构 2. 位置 PID 控制器设计 PID 结构体&#xff08;扩展到位置控制&#xff09; 3. 位置控制与姿态控制结合 位置数据结构 位置环 PID 初始化 4. 位置控制循环 5. 完整控制流程&#xff08;位置 姿态 电机&#xff09; 6. 传感器数据融…

作者头像 李华
网站建设 2026/6/15 16:37:20

YOLOv8 NWD归一化Wasserstein距离损失尝试

YOLOv8 中引入 NWD 损失&#xff1a;从理论到工程落地的完整实践 在现代目标检测系统中&#xff0c;边界框回归的精度往往决定了最终性能的上限。尽管 YOLO 系列模型以速度快、部署便捷著称&#xff0c;但其对小目标、遮挡物体和密集场景的处理仍面临挑战——尤其是在传统 IoU …

作者头像 李华
网站建设 2026/6/15 10:42:22

YOLOv8支持Markdown文档生成,提升项目协作效率

YOLOv8 容器化镜像&#xff1a;重塑AI开发协作的新范式 在智能安防摄像头实时识别行人、工业质检线上自动检测缺陷零件、自动驾驶车辆感知周围障碍物的背后&#xff0c;目标检测技术正以前所未有的速度渗透进现实世界。而在这场视觉革命中&#xff0c;YOLOv8 已成为许多工程师…

作者头像 李华
网站建设 2026/6/15 11:44:58

YOLOv8 ShuffleNet V2高速推理适配尝试

YOLOv8 ShuffleNet V2高速推理适配尝试 在边缘计算设备日益普及的今天&#xff0c;如何让目标检测模型既“跑得动”又“看得准”&#xff0c;成了智能系统设计的核心挑战。尤其是在树莓派、Jetson Nano这类算力有限的硬件上部署YOLOv8时&#xff0c;开发者常常面临内存溢出、帧…

作者头像 李华
网站建设 2026/6/15 14:39:22

PhotoShop新手教学之PS祛除黑眼圈

导入图片 首先先导入需要去除黑眼圈的图片 中性灰 1. 如图所示 新建一个图层 2.选择前景色 设置为一个 中性的灰色 rgb为 128&#xff0c;128&#xff0c;128 3.然后选中图层 按altdel 给他填充一个灰色 如图 混合 首先前景色设置为白色 如图 然后选择画笔工具 模式选择为正…

作者头像 李华