偏差累积,方差抵消

Hacker News Top 新闻

摘要

本文证明,对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 往返的问题后重新运行了结果。

相似文章