bfloat16(brain floating point, bf16)は、
16ビットの
浮動小数点数フォーマットであり、特に機械学習の分野でその有用性が注目されています。
Googleの
人工知能研究グループである
Google Brainによって2018年に開発された比較的新しい形式です。
bfloat16の特徴
bfloat16は、同じ
16ビットの浮動小数点形式であるfp16(IEEE754
16ビット/半
精度浮動小数点形式)と比較して、数値の
精度よりも表現可能な数値の範囲(
ダイナミックレンジ)を重視した設計となっています。そのため、通常の整数計算には適さず、fp16の代替を意図したものではありません。
数値形式
bfloat16の内部構造は以下の通りです。
符号ビット:1ビット
指数部:8
ビット
仮数部:7ビット(暗黙的に8ビットの表現幅を持つ)
比較として、fp16の内部構造は以下のようになっています。
符号
ビット:1
ビット
指数部:5ビット
仮数部:10
ビット(暗黙的に11
ビットの表現幅を持つ)
fp16と比較すると、bfloat16は指数部に割り当てられる
ビット数が多く、その分仮数部の
ビット数が少なくなっています。この設計により、fp16が表現できる数値範囲が10
-14から6.55 × 10
4程度であるのに対し、bfloat16では10
-38から3 × 10
38と、32
ビット浮動小数点形式と同等の広い範囲をカバーできます。
その一方で、仮数部の
ビット数が少ないため、大きな整数値の
精度はfp16に比べて低くなりますが、0に近い数の
精度は向上しています。
具体的には、正規最大値付近での丸め誤差はbfloat16ではおよそ2まで増大する(fp16ではおよそ0.00098)一方、ゼロ付近での
精度はfp16が2
-14であるのに対し、bfloat16では2
-126と高
精度になります。
機械学習におけるbfloat16の有用性
bfloat16は、その特性から通常の数値計算には適していませんが、機械学習においては以下の点で非常に有用です。
モデルの精度への影響: 機械学習モデルでは、個々のネットワークウェイトの精度がネットワーク全体の精度に与える影響は必ずしも大きくありません。また、ウェイトが極端に大きな値を持つことは稀であり、そのような場合はネットワーク構造に問題がある可能性が高いです。
勾配の安定性: 学習の過程で変動する勾配の値は、極端に大きな値を取ることがあります。これらの値が表現可能な数値範囲外になると、特定のウェイトが非数(NaN)となり、ネットワーク全体が連鎖的に破綻する可能性があります。bfloat16の広い
ダイナミックレンジは、このような問題を回避し、より安定した学習を可能にします。
指数エンコーディング
指数部の値は、実際の指数にオフセット値(bfloat16の場合127)を加算したものが格納されます。この方式はオフセットバイナリと呼ばれ、fp16でも同様の手法が採用されています。また、指数部の最小値0x00と最大値0xFFは、それぞれ非正規数(NaN)と無限大を表す特殊な値として扱われます。
まとめ
bfloat16は、その独特の数値表現と広い
ダイナミックレンジにより、機械学習分野において重要な役割を担っています。特に学習時の安定性を向上させる効果があり、より効率的なモデル開発に貢献しています。
関連項目
浮動小数点
IEEE754
機械学習
参照
bfloat16 の数値形式 - Google Cloud
*
BFLOAT16 – Hardware Numerics Definition - Intel