偏差累积,方差抵消
摘要
本文证明,对BF16优化器状态使用随机舍入可以匹配FP32性能,因为无偏误差随时间抵消,而四舍五入则因累积偏差而停滞。一项使用MLP的实验表明,BF16+SR在减少内存使用的同时达到了与FP32相似的损失。
暂无内容
查看缓存全文
缓存时间: 2026/06/01 07:40
# 偏差累加,方差抵消
来源:https://convergentthinking.sh/posts/bias-compounds-variance-washes-out/
四舍五入每次都会产生相同的舍入误差。随机舍入每次产生不同的误差,且均值为零。当相同误差重复时,误差会累加。当误差均值为零时,它们会部分抵消。
将 0.001 加到 1.0 上一千次,使用 BF16 和四舍五入,数值从未变化。每次更新后的值都更接近 1.0 而不是下一个可表示的值,因此每次更新都舍入回 1.0。而随机舍入能达到 2.0。每次更新以一定概率向上舍入,概率取决于数值落在舍入区间内的位置。期望上,总和是精确的。
accumulation.png
在 $n$ 步中,有偏误差以 $O(n)$ 增长,而无偏误差以 $O(\sqrt{n})$ 增长。
方差像随机游走一样扩散,每一步都在增长。但它比偏差增长得慢,在长时间的小更新序列中,这种差异至关重要。
## 实验
一个小的 MLP,在教师-学生回归任务上使用 HeavyBall (https://github.com/ClashLuke/HeavyBall) 的 AdamW 进行训练。所有配置都将参数存储为 bf16。实验改变了优化器状态的舍入模式。
precision_toy_param.png
BF16 + SR(参数、一阶矩和二阶矩共 6 字节)与 FP32 状态(10 字节)性能相当。每步更新的噪声更大,但噪声是无偏的,并在训练过程中相互抵消。BF16 + RNE(6 字节)的性能停滞在比前者高出数个数量级的位置。相同的误差重复出现,损失停滞不前。
随机舍入替代了优化器内核中的四舍五入,不增加内存和带宽。
消除偏差后,6 字节可与 10 字节匹敌。保留偏差,6 字节就会撞墙。
---
代码 (https://github.com/ClashLuke/clashluke.github.io/tree/main/content/posts/stochastic_rounding/)
2026-03-16 修正。在修复了原始实验中因 torch.compile 融合而消除 bf16 往返的问题后重新运行了结果。
相似文章
bf16 舍入悄然丢弃了大多数强化学习策略更新:隐蔽的训练与推理不一致,以及一行代码的无偏修复方案
该论文发现,在RL后训练中,当fp32主权重通过bf16四舍五入导出时,大多数小于半个bf16间隔的策略更新会被静默丢弃,使采样器落后优化器50–150步;作者提出了仅需一行代码的Fair Cast(随机舍入/误差反馈),在Qwen3-0.6B到4B的25组配对实验中平均提升6.1分。
@SpaceTimeViking: 我有一个版本保持BF16注意力层,另一个混合精度量化使用NVFP4权重和FP8 At…
对Google的Gemma-4-12B-it模型进行混合精度量化,使用NVFP4用于MLP权重,FP8用于注意力层,实现了25%更小的存储占用和更快的吞吐量,同时保持质量。
分解LLM强化学习中MXFP4量化误差:可约简偏差、可恢复死区与不可约底限
本文证明了MXFP4量化误差可分解为三个加性分量——比例偏差、死区截断和网格噪声——并提出了针对性修正方法,能够在LLM强化学习后训练中,使Qwen2.5-3B的BF16精度恢复至0.7个百分点以内,Qwen3-30B-A3B-Base恢复至3.0个百分点以内。
4-Bitter的教训:在NVFP4 RL中平衡稳定性与性能
本文介绍了一种低精度(NVFP4)强化学习训练的方法,平衡了吞吐量和稳定性,解决了前向和后向传播量化误差的问题。
@VukRosic99: NVFP4端到端训练发散。当前方案通过Hadamard变换、随机舍入、高精度层等方式修补,但牺牲了大部分加速优势。
Four Over Six(4/6)为NVFP4量化引入了自适应块缩放,以最小开销降低量化误差,同时改善了大语言模型的训练和训练后量化。