news 2026/10/30 2:27:56

【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验

系列:《从小白到 AI 大模型开发工程师的进阶之路》 技术点:AI-0224 Adam 与自适应优化 主人公:小蓝伞 前置:AI-0223 梯度下降 本期产出:独立实验脚本、原始输出、失败样本和验收清单

小蓝伞把优化器第二个状态命名为方差,又以为在Adam里加入惩罚项和直接缩小权重完全一样。本期从标量首步推到同预算更新对照。 本期按准备环境、运行完整脚本、读取结果和复验失败的顺序完成实践。Adam保存梯度及梯度平方的指数移动平均,并在早期做偏差校正。二阶原始矩不是中心化方差;AdamW把权重衰减从梯度中的惩罚项解耦出来。 输入均为教学合成数据,不是生产经历。

一、小蓝伞遇到的问题

固定梯度零点五、一阶系数零点九、二阶系数零点九九九,零状态首步一阶矩为零点零五、二阶矩为零点零零零二五。校正后为零点五和零点二五,后者对应梯度平方,不是减掉均值平方后的方差。把变量命名为方差容易在解释和日志中传递错误。

二、先给结论

Adam保存梯度及梯度平方的指数移动平均,并在早期做偏差校正。二阶原始矩不是中心化方差;AdamW把权重衰减从梯度中的惩罚项解耦出来。

  • 推荐:先用标量首步核对公式,再比较同预算轨迹;衰减和目标损失分别记录;恢复训练必须保存全部状态。

  • 不推荐:省略输入语义和指标口径,仅凭单次输出扩大结论。

  • 成功判据:首步校正值0.5与0.25;各优化器更新200步;零步参数为5;衰减两种语义输出不同。

三、任务与数据契约

项目本期约定
输入完整代码构造的合成数据
输出数值、图表或异常及原始日志
环境Windows 11、Python 3.13.9,依赖见记录
不在范围真实业务、生产容量和跨设备性能

四、前置准备

在新目录保存工作目录中的实验.py为main.py,再执行:

python -m venv .venv .\.venv\Scripts\python.exe -m pip install numpy==2.3.5 .\.venv\Scripts\python.exe main.py

本次实际执行使用 Windows 11、Python 3.13.9;代码只生成合成输入,不依赖账号、令牌或隐藏文件。

五、核心原理

  • 动量:对过去更新方向的累积。

  • 一阶矩:梯度指数移动平均。

  • 二阶原始矩:梯度平方指数移动平均。

  • 偏差校正:修正零初始化带来的早期偏小。

  • 解耦权重衰减:独立于梯度矩状态的参数缩减。

为什么需要偏差校正

初始状态设为零导致早期移动平均被零初始化拉低,除以一减衰减系数的步数次方纠正这部分偏差。这个操作纠正的是初始化影响,并不证明梯度噪声服从某种无偏方差估计。步号需要从一开始,重复恢复状态时必须同时恢复步号。

惩罚与解耦衰减的不同位置

在梯度中加入权重惩罚,会让惩罚进入Adam的两个状态并被自适应缩放;解耦衰减先按比例缩小参数,目标梯度的矩状态不包含这项。本例衰减零点一时两者终点不同,是更新位置不同的可观察后果。不同框架版本可能提供不同开关,使用时必须核对实际参数语义。

结果不能变成普遍排名

本例普通梯度下降到达目标一附近,Adam也接近,但带衰减的目标最优点和路径发生变化。若评价只看未加惩罚的原损失,衰减方法不一定更低。加入正则化通常为了泛化或参数控制,不能凭这个简单标量损失宣布某优化器全面胜出。

六、完整项目

完整脚本位于_work/第70期-Adam 与自适应优化/实验.py。它包含正常、边界和失败断言;复制到main.py后可独立运行。

import numpy as np def run(kind,steps=200,lr=.05,decay=0.): """固定更新次数比较标量SGD、动量、Adam和解耦衰减。""" w=5.;m=0.;v=0.;velocity=0. for step in range(1,steps+1): gradient=2*(w-1) if kind=="sgd": w-=lr*gradient elif kind=="momentum": velocity=.9*velocity+gradient w-=lr*velocity else: if kind=="adam_l2": gradient+=decay*w m=.9*m+.1*gradient v=.999*v+.001*gradient*gradient update=(m/(1-.9**step))/(np.sqrt(v/(1-.999**step))+1e-8) if kind=="adamw": w*=1-lr*decay w-=lr*update return w,(w-1)**2 g=.5;m=.1*g;v=.001*g*g print(f"Adam首步 m={m:.6f} v={v:.6f} m_hat={m/.1:.6f} v_hat={v/.001:.6f}") for kind in ("sgd","momentum","adam","adam_l2","adamw"): w,loss=run(kind,decay=.1) print(f"{kind} updates=200 w={w:.8f} loss={loss:.8f}") assert np.isclose(run("sgd",0)[0],5) print("零步更新参数保持不变;二阶矩不是中心化方差") ​

实现与结果的进一步核验

完整首步的分母

校正后二阶原始矩平方根为零点五,再加稳定项作为分母。一阶校正值也是零点五,所以首步更新接近学习率,与直接按梯度乘学习率不同。稳定项避免零分母,其位置和精度都属于算法约定。手算首步帮助发现漏校正或步号从零开始的错误。

方差需要中心化

随机变量方差是二阶原始矩减一阶矩平方。Adam的历史平均带有时间权重和变化中的梯度,本篇不把两个状态简单相减解释为可靠统计方差。术语准确能防止监控图和调参理由错误,例如把二阶状态增大直接说成噪声变大。

源码核验与执行区别

实际安装的框架源码明确给AdamW设置解耦权重衰减,并写出参数更新过程。读取源码不需导入冲突运行时,能核对公式位置;但不能代替执行框架优化器。本篇使用独立标量实现验证更新结果,来源记录明确这两种证据,不写已完成框架实测。

同预算不等于最优调参

二百步、相同初值和学习率让公式行为可比,却不保证各方法得到各自最好成绩。公平性能研究还需统一调参预算,选定评价准则和多个目标。标量凸例子不能代表深度训练,不把某个最后损失最小直接转成优化器推荐榜。

衰减目标的解释

原目标最优值是一,添加惩罚或持续缩小权重会改变最优点或有限步轨迹。带衰减方法原损失较高不自动代表实现错,也不证明泛化差。报告应分别列任务损失、惩罚、参数范数和下游验证目标,避免把一个数字作为所有设计的裁判。

七、可复现失败案例

把二阶原始矩误当中心化方差是概念失败;零步更新应保持初始参数。 这是构造的教学失败,不是线上事故。复现顺序是保存输入、运行脚本、记录输出、只改一个条件后重跑。修复后必须同时检查正常样本,不能用默认值掩盖错误。

八、实验设计与实际结果

首步校正值0.5与0.25;各优化器更新200步;零步参数为5;衰减两种语义输出不同。 本次已经执行,退出状态为0;完整输出见工作目录。控制变量、样本量和参数写在脚本中。

Adam首步 m=0.050000 v=0.000250 m_hat=0.500000 v_hat=0.250000 sgd updates=200 w=1.00000000 loss=0.00000000 momentum updates=200 w=1.00000558 loss=0.00000000 adam updates=200 w=1.00259655 loss=0.00000674 adam_l2 updates=200 w=0.95607873 loss=0.00192908 adamw updates=200 w=0.88476689 loss=0.01327867 零步更新参数保持不变;二阶矩不是中心化方差

数字怎样对应本期机制

普通梯度下降直接按梯度更新;动量累积历史方向;Adam用一阶平均除以二阶平均平方根再更新。本例各做二百步,目标相同、初始值相同、学习率相同。它验证更新式差异,不证明同学习率对每种方法都是各自最优超参数。

九、常见问题与排查顺序

先检查对象定义,再检查输入、形状、分母、索引或时间点,最后检查实现与环境。保存参数却不保存一阶矩、二阶矩和步号,会改变恢复训练后的轨迹。梯度裁剪、混合精度、学习率调度和参数分组也改变更新,应明确顺序。本篇独立实现标量公式,环境中PyTorch导入冲突未解决,不冒称完成框架训练对照。 不要把一次成功当成稳定性证明,也不要把技术指标直接换成业务价值。

十、系统与依赖差异

本次只在记录的 Windows 和库版本运行。浮点末位、计时、字体、编码和表格默认行为可能跨环境变化;未执行部分保持待核验。

十一、验证清单

  • 执行脚本,核对退出状态与本篇实际输出。

  • 重跑本篇正常、边界和失败样本,检查数值或拒绝结果。

  • 更换数据时重新检查对象、分母和评价条件。

  • 验收判据:首步校正值0.5与0.25;各优化器更新200步;零步参数为5;衰减两种语义输出不同。

十二、面试题与追问

  1. 动量在本期是什么?

    答:对过去更新方向的累积。 固定梯度零点五、一阶系数零点九、二阶系数零点九九九,零状态首步一阶矩为零点零五、二阶矩为零点零零零二五。校正后为零点五和零点二五,后者对应梯度平方,不是减掉均值平方后的方差。把变量命名为方差容易在解释和日志中传递错误。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  2. 一阶矩在本期是什么?

    答:梯度指数移动平均。 初始状态设为零导致早期移动平均被零初始化拉低,除以一减衰减系数的步数次方纠正这部分偏差。这个操作纠正的是初始化影响,并不证明梯度噪声服从某种无偏方差估计。步号需要从一开始,重复恢复状态时必须同时恢复步号。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  3. 二阶原始矩在本期是什么?

    答:梯度平方指数移动平均。 普通梯度下降直接按梯度更新;动量累积历史方向;Adam用一阶平均除以二阶平均平方根再更新。本例各做二百步,目标相同、初始值相同、学习率相同。它验证更新式差异,不证明同学习率对每种方法都是各自最优超参数。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  4. 偏差校正在本期是什么?

    答:修正零初始化带来的早期偏小。 在梯度中加入权重惩罚,会让惩罚进入Adam的两个状态并被自适应缩放;解耦衰减先按比例缩小参数,目标梯度的矩状态不包含这项。本例衰减零点一时两者终点不同,是更新位置不同的可观察后果。不同框架版本可能提供不同开关,使用时必须核对实际参数语义。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  5. 解耦权重衰减在本期是什么?

    答:独立于梯度矩状态的参数缩减。 本例普通梯度下降到达目标一附近,Adam也接近,但带衰减的目标最优点和路径发生变化。若评价只看未加惩罚的原损失,衰减方法不一定更低。加入正则化通常为了泛化或参数控制,不能凭这个简单标量损失宣布某优化器全面胜出。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

十三、工程判断与下一期

先用标量首步核对公式,再比较同预算轨迹;衰减和目标损失分别记录;恢复训练必须保存全部状态。 下一期为AI-0231 NumPy 数组。本期保留的契约和反例会继续使用。

从本地证据到实际决策

动量符号约定

动量状态可按梯度累积或更新方向累积,代码中的正负号与学习率位置必须一致。不同写法名称相似但数值轨迹可能不同。阅读实现时从参数更新式往回核对状态,而不是只搜一个beta参数。本文明确采用梯度累积再减学习率乘状态。

稳定项与零梯度

稳定项避免二阶状态平方根为零时除零,但其数值不是无关装饰。低精度、小梯度和不同实现位置可能改变行为。真实框架需按版本文档核对默认值,本篇标量双精度只能验证声明公式,不给混合精度或稀疏更新保证。

权重衰减的参数分组

真实模型可能只对部分参数衰减,例如不同参数类型有不同策略。是否排除偏置或其他参数属于目标与训练配置,不能无条件照抄。保存每组学习率、衰减和状态,才能恢复同一训练过程;只保存统一优化器名称不足以复现。

重启与连续更新

重新初始化一二阶状态但继续旧参数,相当于新优化轨迹。恢复时步号错误也会改变偏差校正。检查点需包含参数、状态、步号和调度进度,读者可以用小标量例验证恢复的一步与连续的一步是否一致;本文未生成想象恢复性能数据。

Adam不是万能收敛保证

自适应尺度不免除学习率选择,也不保证非凸目标全局最优。比较时保留多个目标、初始化和评价预算才更接近工程决策。当前篇的确定证据是首步公式和解耦位置不同,不把某个标量结果包装成模型效果排行。

官方资料

  • PyTorch AdamW 2.9官方文档:用于核对本期技术机制或接口,查阅日期为2026-10-13。

适用边界

只覆盖脚本中的合成数据、明确假设和已记录版本。真实业务需追加授权、监控、资源预算、回滚和领域验证。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 2:27:42

Web 加载 DWG 实战(五):缩放、平移与图纸坐标怎么对应

在浏览器里查看 DWG,滚轮放大和拖动平移是最常用的两个操作。真正接入业务页面时,细节问题很快就会出现:鼠标指着一个节点,放大后节点为什么跑了?图纸明明没有修改,状态栏坐标为什么一直变化?换…

作者头像 李华
网站建设 2026/10/30 2:26:04

python中的静态方法和类方法

在版本号为.2的情况之下, 静态方法与类方法是被进行引用的, 不管是经典类还是新式类, 都是可以直接被使用的。与此同时, 存在一对内建函数, 是分别被称为和被的这两个内建函数被引入到了进来, 它们的作用是用于把一个类之中的某种方法进行转化, 从而把其转化为上述这两种方法当…

作者头像 李华
网站建设 2026/10/30 2:24:17

ltx-2.5-mlx提示词工程:文生视频Prompt写法完全指南(新手友好)

ltx-2.5-mlx提示词工程:文生视频Prompt写法完全指南(新手友好) ltx-2.5-mlx 是 Lightricks LTX-2.5 视频生成模型在 Apple Silicon(MLX 格式)上的转换版,支持文生视频、图生视频与音视频联合生成。本文面向…

作者头像 李华