Bf16

bf16（bfloat16, brain float）浮動小数点形式はコンピュータ内における16ビットの数値表現（フォーマット）である。

bf16形式はGoogleの人工知能研究グループであるGoogle Brainによって開発された、より機械学習での利用に適した比較的新しいフォーマットである。

16ビット浮動小数点形式の一般的なフォーマットであるfp16(IEEE754 16ビット／半精度浮動小数点形式)と比較した場合、数値の精度よりも数値が表現できる桁数の幅（ダイナミックレンジ）を重視した設計となっている。その特性上通常の整数計算には適しておらず、fp16の置き換えを意図したものではない。

数値形式 
bf16は以下の形式である

 符号ビット : 1ビット
 指数部 : 8ビット
 仮数部 : 7ビット(暗黙的に8ビットの表現幅を持つ。これはfp16と同様の設計である)

比較としてfp16形式を以下に示す

 符号ビット : 1ビット
 指数部 : 5ビット
 仮数部 : 10ビット(暗黙的に11ビットの表現幅を持つ)

fp16に対して指数部への割り当てビット数を増やし、その分仮数部を減らしたものとなっている。

fp16が10−14 ～ 6.55 × 104程度の数値幅しか表現できないのに対し、bf16は10−38 ～ 3 × 1038の数値範囲を表現することが可能で、これは32ビット浮動小数点形式と同じ数値幅である。

その分仮数部の精度は減少しており、fp16の最小精度（イプシロン）がおよそ0.000098であるのに対してbf16は0.0078と少ないものとなっている。

このため通常の数値計算用途には向いていないが、機械学習においては以下のような特性により有用である。

 モデルの構造や用途によるが、単一のネットワークウェイトの精度がネットワーク全体の精度に与える影響がそれほど大きくない。
 一方で、学習の過程で変動するネットワークウェイトや勾配などの値は適応の過程で極端な値を取ることがあり、それが表現可能な数値の範囲外となってしまうと学習内容が破綻したり、いつまでも収束できない状態に陥るなどの問題が生じる。ダイナミックレンジを広く取ることでより安定した学習となる可能性が高くなる。

指数エンコーディング 
指数部の値は、実際の指数に対してオフセット値（bf16の場合127）を加算した値が格納される（オフセットバイナリ）

fp16でも同様の方法で指数を表現しており、指数バイアスなどと呼ばれる。

また、指数部の最小値0x00と最大値0xFFはそれぞれ非正規数(NaN)および無限大として解釈される特殊な値である。

関連項目 
 浮動小数点
 IEEE754
 機械学習

コンピュータの算術
データ型