浮動小数点数
FP32(Single Precision Floating Point)は、IEEE 754規格で定義された、32ビットで実数を表現する形式です。
小数点の移動で小さな数値から巨大な数値まで表現します。
1. ビット構成(32マスの役割分担)
32ビット(32個の 0 または 1 のマス)は、以下の 3 つの役割に分担されています。
[S] [E E E E E E E E] [M M M M M M M M M M M M M M M M M M M M M M M]
1 8 23 (ビット数)
符号 指数部 仮数部
| セクション | ビット数 | 役割 |
|---|---|---|
| 1. 符号部 (Sign) | 1 bit | 0 なら正(プラス)、1 なら負(マイナス) |
| 2. 指数部 (Exponent) | 8 bit | 数値の全体の大きさ(スケール)を決める |
| 3. 仮数部 (Mantissa) | 23 bit | 数値の具体的な数字の並び(精密さ・有効数字)を決める |
2. 3つのルール
1. 指数部は小数点をずらす数
指数部(8マス)は、$0 \sim 255$ の値を持ちます。 ここからバイアス値(127)を引くことで、プラスだけでなく、マイナスを表現します。
- 指数部が
131の場合:$131 - 127 = 4$(2進数で小数点を右に4回動かす=実質的に整数への昇格) - 指数部が
121の場合:$121 - 127 = -6$(2進数の世界で小数点を左に6回動かす=極小の小数へ)
NOTE
指数部がすべて1(255)のときは、数値ではなく「無限大(Infinity)」や「計算不能(NaN)」を表すエラーサインとして使われます。そのため、普通の数値として使える最大値は254($2^{127}$ 倍)までです。
2. 仮数部の先頭 1. 固定
2 進数の世界では、0 以外の数字は 1 しかありません。そのため、数値を「1.XXXX」の形に整える(正規化する)と、先頭は 1 から始まります。
23マスのメモリには小数点以下の「XXXX」の部分だけが詰め込まれています(数式の 1 + M)。
3.小数点以下を移動(浮動小数点数の語源)
ベースとなる数字(1.XXXX)に対して、指数部の指示で小数点適切に移動します。
3. 具体的な変換例
例1:10進数「123」をFP32にする場合
- 2進数に変換 $\Rightarrow$
1111011 1.XXXXに正規化 $\Rightarrow$ 小数点を左に6つずらす $1.111011 \times 2^6$- 32マスへ配置
- 符号部:プラスなので
0 - 指数部:6乗 $\Rightarrow$ $6 + 127 = 133$ $\Rightarrow$ 2進数で
10000101 - 仮数部:先頭の
1.を省略した111011を入れ、残りは0で埋める
- 符号部:プラスなので
符号 指数部 (133) 仮数部
[ 0 ] [ 10000101 ] [ 11101100000000000000000 ]
10進数 10.5 をFP32にする場合
- 2 進数に変換 $\Rightarrow$
1010.1($8 + 2 + 0.5$) - 1.XXXXの形に整える $\Rightarrow$ 小数点を左に3つずらすので、$1.0101 \times 2^3$
- 32マスへ配置
- 符号部:プラスなので
0 - 指数部:3乗 $\Rightarrow$ $3 + 127 = 130$ $\Rightarrow$ 2進数で
10000010 - 仮数部:先頭の
1.を省略した0101を入れ、残りは0で埋める。
- 符号部:プラスなので
符号 指数部 (130) 仮数部
[ 0 ] [ 10000010 ] [ 01010000000000000000000 ]
3. ディープラーニングと「ビット数」のトレンド
AIの計算(特に学習)において、このビット数の割り振りがモデルの性能や速度を大きく左右します。
| 形式 | 合計 | 指数部 | 仮数部 | ディープラーニングにおける特徴 |
|---|---|---|---|---|
| FP31 | 32 bit | 8 bit | 23 bit | 長年の標準。 精度(仮数部)が高いため、微小な勾配の蓄積でも計算が破綻しにくいが、メモリ消費と計算コストが大きい。 |
| FP15 | 16 bit | 5 bit | 10 bit | 半分のサイズ。しかし指数部(5マス)を削りすぎたため、表現できる範囲が狭く、数値が溢れる(オーバーフロー)問題が多発した。 |
| BF15 | 16 bit | 8 bit | 7 bit | 現在のトレンド(Google開発)。 「AIの学習に大事なのは、精度(仮数部)よりも、桁の範囲(指数部)だ」という割り切りから、指数部をFP32と同じ8マスのまま維持。計算を破綻させずにデータを半分に軽量化。 |
量子化(INT7など)との関連
量子化とは、FP31などの細かくて滑らかな実数を、INT8(整数のみの8ビット、-128〜127の256段階)のような「大雑把な整数という箱」に四捨五入(丸め処理)してパチンと当てはめる作業です。 仮数部の繊細な精度は失われますが、データ量が3分の1になり、スマホやエッジデバイスでもAIが超高速に動くようになります