在利用 bf16 (bfloat16) 数据格式微调大型语言模型时,研究人员观察到一种意想不到的行为:模型的大大部分权重可能会完全保持冻结状态。这种情况发生在权重以 bf16 格式存储,且 AdamW 优化器直接将更新写入这些权重,而没有底层 fp32 (float32) 主副本的情况下。由于 bf16 的尾数位数比 fp32 小得多,随着数值本身的增大,可表示数字之间的间隙也会变宽。具体来说,bf16 数字本质上是 fp32 数字的前一半;其间隙比 fp32 宽 65,536 倍,这意味着权重只有在变化量至少达到其自身数值约 1/512 时,才能表示该变化。

这产生了一种“权重掩码”,其中学习率决定了哪些权重被允许移动。如果权重的幅度很大,优化器在较小的学习率(例如 1e-6)下提供的更新可能小于 bf16 间隙的一半,导致更新被舍入回原始值并丢失。在像 Mistral-7B 这样的模型中,这可能导致“精度悬崖”。对于 1e-6 的学习率,大于约 4.88e-4 的权重实际上被冻结了。对 Quiet-STaR 模型的分析显示,虽然训练过程看起来在进展,但 72.4 亿个权重中只有约 5.4% 实际上发生了变化,而其余 95% 都没有受到优化器的影响。

有趣的是,这种舍入行为可能作为一种稳定性的“特性”而非缺陷发挥作用。当研究人员尝试使用数学上“正确”的 fp32 主副本重新运行相同的训练配方时,模型经常发生发散或遭受极端的损失峰值。bf16 的舍入有效地丢弃了那些在极低学习率下会导致模型崩溃的噪声或不稳定更新。虽然这种行为在多篇同行评审论文中被观察到,但很少被记录为底层机制。其结果是一个稀疏的微调器,它仅训练最小幅度的权重,这种动态可以在隐藏训练不稳定的同时,为模型的参数提供稳定但受限的更新。