4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

float32 -> bfloat16 変換では NaN と丸めを考慮すると完璧

Last updated at Posted at 2019-08-27

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 と丸めの対処をしてあげると完璧ですね.

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?