Bf16

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 × 104程度であるのに対し、bfloat16では10-38から3 × 1038と、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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。