FP32・FP16・BF16・INT8の違い:ビット構成・範囲・精度・用途を比較

FP32は32ビットの単精度の浮動小数点数で、計算の基準として使われます。FP16とBF16はどちらも16ビットですが、ビットの割り当てが違います。FP16は仮数に多くのビットを使って精度を取り、表せる範囲は最大65504と狭くなります。BF16は指数部をFP32と同じ8ビットにして範囲をFP32並みに保ち、そのぶん精度を下げています。INT8は8ビットの整数で、スケールをかけて実数を近似する量子化に使い、AIの推論でメモリと電力を大きく減らせます。

項目FP32FP16BF16INT8
ビット数32ビット16ビット16ビット8ビット
符号・指数・仮数のビット数1・8・231・5・101・8・7指数と仮数はない。2の補数の整数で−128〜127
表せる最大の値約3.4 × 10³⁸65504約3.4 × 10³⁸(FP32とほぼ同じ)127(実数はスケールをかけて表す)
最小の正規化数約1.2 × 10⁻³⁸約6.1 × 10⁻⁵(2⁻¹⁴)約1.2 × 10⁻³⁸なし(表せる値の刻みはスケールで決まる)
精度の目安10進で約7桁(1と次の数の差は2⁻²³ ≈ 1.2 × 10⁻⁷)10進で約3桁(2⁻¹⁰ ≈ 9.8 × 10⁻⁴)10進で2〜3桁(2⁻⁷ ≈ 7.8 × 10⁻³)256段階の目盛り
FP32からの変換なし(基準)範囲が狭いので、大きな値はあふれ、小さな値は0になりうる上位の16ビットを取り出して丸めるだけで、範囲はあふれないスケール(とゼロ点)を決めて量子化する。値の範囲を調べるキャリブレーションが必要
1つの値のメモリ4バイト2バイト2バイト1バイト
演算器の効率乗算器が大きく、同じ面積での積和の数は少ないFP32より小さな演算器で、多くの積和を並べられるFP16と同じくらい。仮数が短いぶん乗算器はさらに小さい乗算器が最も小さく省電力。積は32ビットの整数で足し合わせることが多い
学習での使い方マスターウェイト、オプティマイザの状態、積の累積混合精度の学習。ロススケーリングで小さな勾配が0になるのを防ぐ混合精度の学習で広く使われる。多くの場合ロススケーリングが不要一般には使わない(量子化を考慮した学習では、量子化の影響をまねる)
推論での使い方精度の基準。性能より正確さを優先するときGPUなどでの推論GPUやAIアクセラレータでの推論量子化したモデルの推論。特にエッジのNPUなど

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

FP32
精度が必要な計算、学習のマスターウェイトや積の累積、低い精度の結果を確かめる基準。
FP16・BF16
AIの学習と推論で、メモリと計算を半分にしたいとき。範囲を重視する学習ではBF16、範囲に収まる値で精度を重視するならFP16。
INT8
学習済みのモデルを量子化して、推論を速く省電力にしたいとき。メモリや電力の限られたエッジの機器での推論。

よくある質問

AIの学習で、FP16よりBF16が好まれることが多いのはなぜですか?

BF16は指数部がFP32と同じ8ビットなので、表せる範囲がFP32とほぼ同じです。FP16では小さな勾配が0になったり大きな値があふれたりするのを防ぐためにロススケーリングが必要ですが、BF16では多くの場合不要で、FP32からの変換も簡単です。精度は低くなりますが、ニューラルネットワークの学習では問題になりにくいです。

FP16の最大値が65504なのはなぜですか?

FP16は指数部が5ビット(バイアス15)で、すべて1の値は無限大とNaNに使うため、指数の最大は2の15乗です。仮数の10ビットをすべて1にした (2 − 2⁻¹⁰) × 2¹⁵ が最大の有限の値で、これが65504になります。

INT8で小数を含む値をどう表すのですか?

実数 ≈ スケール × (整数 − ゼロ点) の形で近似します。0を中心に対称に量子化する場合はゼロ点を0とし、スケールを「値の最大の絶対値 ÷ 127」などに決めます。スケールは、テンソルごとやチャネルごとに持たせます。

INT8で学習もできますか?

一般には、学習には浮動小数点の形式を使います。学習では勾配の値の範囲が広く、重みへの小さな更新も扱う必要があるからです。INT8は主に、学習済みのモデルを量子化した推論に使い、量子化を考慮した学習でも、重みの更新は浮動小数点で行います。

理解度チェック

IEEE 754の単精度(32ビット)の浮動小数点数で、符号・指数部・仮数に割り当てられるビット数の組み合わせはどれか。

  1. A1・11・20
  2. B1・8・23
  3. C1・5・26
答えと解説を見る

正解:B. 1・8・23

単精度(FP32)は、符号1ビット、指数部8ビット、仮数23ビットの合計32ビットです。正規化された数では仮数の先頭の1を省略しているので、精度は24ビット分あり、10進数でおよそ7桁です。倍精度(FP64)は符号1・指数部11・仮数52ビットで、指数部が広く精度も高くなります。1・11・20は倍精度の指数部の幅と混同した組み合わせで、1・5・26は半精度の指数部の幅と混同しています。

FP16(符号1・指数部5ビット(バイアス15)・仮数10ビット)で表せる最大の有限の値はいくらか。

  1. A32768
  2. B65536
  3. C65504
答えと解説を見る

正解:C. 65504

指数部のすべて1(31)は無限大とNaNに使われるので、最大の指数部は30で、実際の指数は 30 − 15 = 15 です。仮数がすべて1のとき、値は (1 + 1 − 2⁻¹⁰) × 2¹⁵ = (2 − 2⁻¹⁰) × 32768 = 65536 − 32 = 65504 になります。これを超える結果は無限大になるため、FP16での学習ではオーバーフローにも注意が必要です。32768は仮数が0のときの 2¹⁵、65536は 2¹⁶ で、どちらも最大値ではありません。

bfloat16がAIの学習で使われる主な理由はどれか。

  1. A指数部がFP32と同じ8ビットで、表せる数の範囲が広いから
  2. B仮数部がFP32より長く、精度が高いから
  3. C整数演算で計算できるから
答えと解説を見る

正解:A. 指数部がFP32と同じ8ビットで、表せる数の範囲が広いから

bfloat16は符号1ビット、指数部8ビット、仮数部7ビットの16ビット形式です。指数部がFP32と同じなので表せる範囲がほぼ同じで、学習中の勾配のような非常に小さい値や大きい値でもオーバーフローやアンダーフローを起こしにくく、FP32のモデルからの切り替えも簡単です。精度は低いものの、学習は多少の誤差に強いので問題になりにくく、データ量と演算器の面積を半分にできます。仮数部はFP32より短く、整数ではなく浮動小数点の演算で計算します。

  1. FP16(半精度:符号1・指数部5・仮数10ビット)でニューラルネットワークを学習させるときに問題になりやすく、損失の値を何倍かに拡大して計算する工夫(ロススケーリング)で対策するのはどれか。
  2. AIの推論で、重みをFP32からINT8に変換(量子化)する主な利点はどれか。
  3. AIの混合精度の学習で、計算の多くをFP16やbfloat16で行いながら、重みの元の値(マスターウェイト)をFP32で保持しておく主な理由はどれか。

計算機算術の練習問題へ

関連する用語の解説

IEEE 754
浮動小数点数の表し方と演算の規則を定めた国際規格。単精度(32ビット)・倍精度(64ビット)などの形式、丸めの方法、無限大やNaNなどの特殊値を定め、計算結果がコンピュータによらずそろうようにしている。
bfloat16
符号1ビット、指数8ビット、仮数7ビットの16ビットの浮動小数点の形式。指数がFP32と同じなので表せる範囲が広く、精度は低いがAIの学習で使われる。FP16は指数5ビット・仮数10ビットで、精度は高いが範囲が狭い。
INT8
8ビットの符号付き整数(−128〜127)。AIの推論で、重みや活性化の値をスケールを掛けてINT8に変換(量子化)すると、計算とメモリが大きく減り、整数の小さな回路で高速に処理できる。
混合精度
計算の部分ごとに違う精度の数値を使うこと。掛け算をFP16などで行い、累積をFP32で行って、速さと精度を両立させる。
学習後量子化
学習が終わったモデルの重みや活性化を、代表的なデータで値の範囲を調べてから低い精度に変える方法。PTQ。

関連する比較