bfloat16 は, 16bit で浮動小数点数を表します.
同じような表現として, fp16(half)がありました(2000 年くらい?).
fp16 は, 古くは半精度型としてシェーダの型だったり, OpenEXR などの HDR 画像フォーマットのひとつとして長らく知られてきました.
昨今のニューラルネットの流行りで, bfloat16 という表現が機械学習関連で最近(2012?)出てきました.
仕様
仮数部のビットを切って, 16bit に収めるフォーマットです.
指数部のビット数は fp32 と同じなので, fp32 と同じダイナミックレンジ(値の幅)が扱えます.
bfloat16 はダイナミックレンジはほしいけれども, 精度はそれほど不要というものにうまくハマりそうです.
fp32 から下位 16bit を切るだけでよいので, fp16(half)と異なりデータ変換が楽です.
精度は?
A Study of BFLOAT16 for Deep Learning Training
https://arxiv.org/pdf/1905.12322.pdf
機械学習の用途では, AlexNet, ResNet, deepspeech(RNN), etc でだいたい fp32 と同じ結果が得られています.
変換で気をつける点があります
MIOpen の bfloat16 変換を見ていましたら,
NaN の扱いと丸めに対する対処が入っていました.
丸め
tensorflow の bfloat16.h の解説のほうが参考になります.
(tensorflow では, ほかにも別の bfloat16 コードがいくつか存在していてつらい)
その他
LogLuv32 という, 32bit で Luv を表現するフォーマットがあります.
Luv 空間で convolution, pooling するようなネットワークだと, いくらかデータ圧縮が見込めるかも?
(とはいえ, 6bytes -> 4bytes なので劇的に小さくなるわけではない)
ColorNet: Investigating the importance of color spaces for image classification⋆
https://arxiv.org/pdf/1902.00267.pdf
まとめ
単純に下位 16bit を切っても多くのケースではうまくいくかもですが,
NaN と丸めの対処をしてあげると完璧ですね.