Bf16
bfloat16(brain floating point[1], bf16)は、コンピュータ内における16ビットの浮動小数点数の数値表現(フォーマット)である。
bfloat16形式はGoogleの人工知能研究グループであるGoogle Brain(英語版)によって2018年に開発された、より機械学習での利用に適した比較的新しいフォーマットである。
16ビット浮動小数点形式の一般的なフォーマットであるfp16(IEEE754 16ビット/半精度浮動小数点形式)と比較した場合、数値の精度よりも数値が表現できる桁数の幅(ダイナミックレンジ)を重視した設計となっている。その特性上通常の整数計算には適しておらず、fp16の置き換えを意図したものではない。
数値形式
bfloat16は以下の形式である
- 符号ビット : 1ビット
- 指数部 : 8ビット
- 仮数部 : 7ビット(暗黙的に8ビットの表現幅を持つ。これはfp16と同様の設計である)
bfloat16 | ||||||||||||||||
符号 | 指数部 (8 bit) | 仮数部 (7 bit) | ||||||||||||||
┃ | ┌────────────────┐ | ┌───────────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 7 | 6 | 0 | ||||||||||||
比較としてfp16形式を以下に示す
- 符号ビット : 1ビット
- 指数部 : 5ビット
- 仮数部 : 10ビット(暗黙的に11ビットの表現幅を持つ)
IEEE 754 16ビット半精度浮動小数点(fp16) | ||||||||||||||||
符号 | 指数部 (5 bit) | 仮数部 (10 bit) | ||||||||||||||
┃ | ┌────────────────┐ | ┌───────────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 10 | 9 | 0 | ||||||||||||
fp16に対して指数部への割り当てビット数を増やし、その分仮数部を減らしたものとなっている。
fp16が10−14 ~ 6.55 × 104程度の数値幅しか表現できないのに対し、bfloat16は10−38 ~ 3 × 1038の数値範囲を表現することが可能で、これは32ビット浮動小数点形式と同じ数値幅である。
その分仮数部の数値幅は減少しており、大きな整数値の精度を落とす代わりに0に近い数の精度を増加させている。
bfloat16では、正規最大値付近での丸め誤差はおよそ2まで増大する(fp16の場合はおよそ0.00098)が、ゼロ付近での精度はfp16が2^(-14)であるのに対し、bfloat16では2^(-126)となり、高精度の表現が可能になっている。
このため通常の数値計算用途には向いていないが、機械学習においては以下のような特性により有用である。
- モデルの構造や用途によるが、単一のネットワークウェイトの精度がネットワーク全体の精度に与える影響がそれほど大きくなく、またウェイトが非常に大きな値を扱うことは稀であり、そのような場合はネットワークそのものに問題がある場合が多い。
- 一方で、学習の過程で変動する勾配の値は適応の過程で極端に大きな値を取ることがあり、それが表現可能な数値の範囲外となってしまうと特定のウェイトが不正規数(NaN)となり、それによってネットワーク全体が連鎖的に破綻するなどの問題を起こす場合がある。ダイナミックレンジを広く取ることでより安定した学習となる可能性が高くなる。
指数エンコーディング
指数部の値は、実際の指数に対してオフセット値(bfloat16の場合127)を加算した値が格納される(オフセットバイナリ)。
fp16でも同様の方法で指数を表現しており、指数バイアスなどと呼ばれる。
また、指数部の最小値0x00と最大値0xFFはそれぞれ非正規数(NaN)および無限大として解釈される特殊な値である。
関連項目
参照
- ^ “A Study of BFLOAT16 for Deep Learning Training”. arXiv.org. 7 June 2024閲覧。
外部リンク
- bfloat16 の数値形式 - Google Cloud
- BFLOAT16 – Hardware Numerics Definition - Intel
- 表示
- 編集