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億の重みのうち約5.4%だけであり、残りの95%はオプティマイザによって一切変更されませんでした。
興味深いことに、この丸め動作はバグというよりも、安定化のための「機能」として作用する可能性があります。研究者が数学的に「正しい」fp32マスターコピーを使用して同じトレーニングレシピを再実行しようとした際、モデルはしばしば発散したり、極端な損失のスパイクを引き起こしたりしました。bf16の丸めは、非常に低い学習率においてモデルを破綻させるような、ノイズの多い不安定な更新を事実上破棄します。この挙動はいくつかの査読済み論文で観察されていますが、基礎的なメカニズムとして文書化されることは稀です。その結果、最小の大きさの重みのみをトレーニングするスパースなファインチューナーが生まれ、トレーニングの不安定さを隠蔽しながら、制限はあるものの安定したモデルパラメータの更新を生み出すという動態が生じます。
