コンピュータ において、ミニフロートとは、非常に少ないビット数で表現される浮動小数点値のことです。この精度の低下により、汎用的な数値計算には適していませんが、次のような特殊な用途には役立ちます。
さらに、コンピュータサイエンスの授業では、浮動小数点演算やIEEE 754規格の数値の特性や構造を説明するための教育ツールとして頻繁に用いられます。
文脈によっては、ミニフロートは32未満の任意のサイズ、16以下の任意のサイズ、または16未満の任意のサイズを意味する場合があります。マイクロフロートという用語は、 8以下の任意のサイズを意味する場合があります。[ 3 ]
このページでは、ミニフロートを説明するために( SEM )という表記を使用しています。
ミニフロートは、 IEEE 754規格の原則に従って設計できます。ほとんどすべてが、非正規数と正規数に対して最小の指数を使用します。多くは、無限大とNaNに対して最大の指数を使用し、(特殊指数) SE = 1で示されます。一部のミニフロートは、この指数値を通常どおり使用し、その場合はSE = 0 となります。
指数バイアスB = 2 E − 1 − SE。この値は、表現可能なすべての数値が表現可能な逆数を持つことを保証します。
この表記は、 ( B,P,L,U )形式に(2, M + 1, SE − 2 E − 1 + 1, 2 E − 1 − 1)のように変換できます。
機械学習の分野でよく使われる表記法は FP n E e M mで、小文字のアルファベットは数字に置き換えられます。例えば、FP8-E4M3 は (1.4.3) と同じです。
浮動小数点数を必要とする多くの状況では、実際には高い精度は必要ありません。これは、高ダイナミックレンジグラフィックスや画像処理でよく見られる特徴です。また、より大規模なニューラルネットワークでも同様によく見られる特徴であり、2020年代以降、この特性を利用して、ますます大規模な言語モデルのトレーニングと展開が可能になっています。より「汎用的」な例としては、 IEEE 754-2008の fp16 (1.5.10) があり、これは「半精度」(32 ビット単精度および 64 ビット倍精度とは対照的)と呼ばれています。
bfloat16 (1.8.7)フォーマットは、標準的な単精度浮動小数点数の最初の 16 ビットであり、他のフォーマットのハードウェア サポートが追加される以前は、画像処理や機械学習でよく使用されていました。
Radeon R300およびR420 GPUは「fp24」浮動小数点形式(1.7.16)を使用しました。[ 4 ] Direct3D 9.0の「フル精度」は独自の24ビット浮動小数点形式です。MicrosoftのD3D9(シェーダーモデル2.0)グラフィックスAPIは当初、グラフィックスハードウェアによって実行される頂点およびピクセルシェーダー計算のために、「フル精度」としてFP24(ATIのR300チップと同様)とFP32(NvidiaのNV30チップと同様)の両方、および「部分精度」としてFP16をサポートしていました。
2016年にKhronosはVulkanで使用するための10ビット(0.5.5)と11ビット(0.5.6)の符号なしフォーマットを定義しました。 [ 5 ] [ 6 ]これらは符号と末尾の桁を切り捨てることで正の半精度から変換できます。
ミニフロートは、浮動小数点演算をソフトウェアでエミュレートする必要があるマイクロコントローラなどの組み込みデバイスでもよく使用されます。計算を高速化するために、仮数部は通常ビットのちょうど半分を占めるため、レジスタ境界はシフトなしで自動的にその部分をアドレス指定します(4ビットデバイスでは(1.3.4))。
2022年、NVIDIAなどが「fp8」フォーマット(1.5.2、E5M2)のサポートを発表しました。これは、末尾の桁を切り捨てることで半精度から変換できます。このフォーマットは、NaNや無限大などの特殊値をサポートしています。また、無限大がなく、NaNの表現が2つ(正と負)しかないフォーマット、FP8-E4M3(1.4.3)も発表しました。結局のところ、ニューラルネットワークの推論(バックプロパゲーションによるトレーニングとは対照的に、順方向実行)では特殊値は不要です。 [ 2 ]これらのフォーマットは、OCP-FP8と呼ばれる業界標準になりました。[ 7 ] FP4-E2M1(1.2.1)などのさらなる圧縮も効果的であることが証明されています。[ 8 ]
2023 年以来、IEEE SA ワーキンググループ P3109 は、現在の慣行を体系化することで機械学習に最適化されたミニフロートの標準に取り組んでいます。中間レポート バージョン 3.0 (2025 年 8 月) では、体系的な名前「binary K p P [s/u][e/f]」の下で多数のフォーマットのファミリーを定義しています。ここで、Kは合計ビット長、Pは精度 (仮数ビット数 + 1)、s/u (符号付き/符号なし) は符号ビットが存在するかどうか、e/f (拡張/有限) は無限大が含まれるかどうかを示します。慣例として、s と e は省略できます。より多くの数値のためのスペースを節約するために、「負のゼロ」というものはなく、NaN の表現は 1 つだけです。したがって、符号付きフォーマットでは、NaN は負のゼロになるはずだったビットパターンを使用できます。例えば、FP4-E2M1フォーマットはP3109では次のように近似できます。[ 9 ]
(binary4p2seの場合、± 6は±無限大に置き換えられます。)
非常に小さなミニフロートの欠点は、表現可能なダイナミックレンジが非常に小さいことです。この問題を解決するために、機械学習業界はブロック浮動小数点の一種である「マイクロスケーリングフォーマット」(MX)を発明しました。MXフォーマットでは、32個のミニフロートのグループが、「E8M0」ミニフロート(2 −127から2 127までの2のべき乗を表現できる)で表される追加のスケーリング係数を共有します。MXは、FP8-E5M2、FP8-E4M3、FP6-E3M2(1.3.2)、FP6-E2M3(1.2.3)、およびFP4-E2M1用に定義されています。[ 10 ]
ここでは、1 ビットの符号ビット、4 ビットの指数ビット、3 ビットの仮数ビット (1.4.3) を持つ1 バイト (8 ビット) のミニフロートを示します。指数バイアスは、他の IEEE 754 フロート[ 11 ] [ 12 ]と一致するように、値を 1 を中心にするために 7 と定義されています。したがって、(ほとんどの値の場合) 指数xの実際の乗数は2 x −7です。すべての IEEE 754 の原則が有効であるはずです。[ 13 ]この形式は命令でよく使用されます。
ゼロは、ゼロの指数とゼロの仮数で表されます。ゼロの指数は、ゼロが先頭に「0.」の接頭辞が付いた非正規数であることを意味し、ゼロの仮数では、小数点以下のすべてのビットがゼロであるため、この値は次のように解釈されます。浮動小数点数は符号付きゼロを使用するため、も利用可能で、正の値に等しい。。
0 0000 000 = 0 1 0000 000 = −0
最小の指数については、仮数部に「0」が追加され、指数値は最小の正規化数と同様に1高い値として扱われます。
0 0000 001 = 0.001 2 × 2 1 − 7 = 0.125 × 2 −6 = 0.001953125 (最小の異常値) ... 0 0000 111 = 0.111 2 × 2 1 − 7 = 0.875 × 2 −6 = 0.013671875 (最大の異常値)
その他の指数では、仮数部に「1」が追加されます。
0 0001 000 = 1.000 2 × 2 1 − 7 = 1 × 2 −6 = 0.015625 (最小正規化数) 0 0001 001 = 1.001 2 × 2 1 − 7 = 1.125 × 2 −6 = 0.017578125 ... 0 0111 000 = 1.000 2 × 2 7 − 7 = 1 × 2 0 = 1 0 0111 001 = 1.001 2 × 2 7 − 7 = 1.125 × 2 0 = 1.125 (1より大きい最小値) ... 0 1110 000 = 1.000 2 × 2 14 − 7 = 1.000 × 2 7 = 128 0 1110 001 = 1.001 2 × 2 14 − 7 = 1.125 × 2 7 = 144 ... 0 1110 110 = 1.110 2 × 2 14 − 7 = 1.750 × 2 7 = 224 0 1110 111 = 1.111 2 × 2 14 − 7 = 1.875 × 2 7 = 240 (最大の正規化された数)
無限大の値は指数が最も高く、仮数はゼロに設定されます。符号ビットは正または負のいずれかになります。
0 1111 000 = +無限大 1 1111 000 = −無限大
NaN値は指数が最も高く、仮数はゼロ以外です。
s 1111 mmm = NaN ( mmm ≠ 000 の場合)
これは、この例の8ビット浮動小数点数で取り得るすべての値を示す表です。
(+0と-0を異なる値とみなした場合)NaN以外の値は242種類しかありません。これは、14種類のビットパターンがNaNを表しているためです。
プログラミング言語で8ビット浮動小数点数との間で変換を行うには、通常、ライブラリまたは関数が必要となります。これは、この形式が標準化されていないためです。例えば、以下にC++での実装例を示します(パブリックドメイン)。
このような小さなサイズでは、他のバイアス値も興味深いかもしれません。例えば、バイアスを-2にすると、0~16の数値は0~16の整数と同じビット表現になりますが、非整数値は表現できなくなります。
0 0000 000 = 0.000 2 × 2 1 - (-2) = 0.0 × 2 3 = 0 (異常値) 0 0000 001 = 0.001 2 × 2 1 - (-2) = 0.125 × 2 3 = 1 (異常値) 0 0000 111 = 0.111 2 × 2 1 - (-2) = 0.875 × 2 3 = 7 (異常値) 0 0001 000 = 1.000 2 × 2 1 - (-2) = 1.000 × 2 3 = 8 (正規化された数値) 0 0001 111 = 1.111 2 × 2 1 - (-2) = 1.875 × 2 3 = 15 (正規化された数値) 0 0010 000 = 1.000 2 × 2 2 - (-2) = 1.000 × 2 4 = 16 (正規化された数値)
ビットの割り当ては任意です。フォーマットによっては、精度を下げてダイナミックレンジを広げる必要がある場合は指数部に多くのビットを割り当て、ダイナミックレンジを下げて精度を上げる必要がある場合は仮数部に多くのビットを割り当てることができます。極端な例として、すべてのビットを指数部に割り当てる(1.7.0)、または1ビットを除くすべてのビットを仮数部に割り当てる(1.1.6)ことで、指数部には1ビットだけを割り当てることができます。指数部には少なくとも1ビットを割り当てる必要があります。そうしないと、浮動小数点数として意味をなさなくなり、単なる符号付き数値になってしまいます。
ここに、 (1.3.4) のすべての可能な値の表を示します。M ≥ 2 E − 1 は、精度が全範囲にわたって少なくとも 0.5 に維持されることを保証します。[ 14 ]
上記のような表は、 PythonまたはGDScript のスクリプトを使用して、SEMB (符号、指数、仮数/有効数字、バイアス) 値の任意の組み合わせに対して生成できます。
わずか64個の値であっても、すべての値を図にプロットすることが可能であり、これは有益な情報となる。
この図は、IEEE 754の規則に厳密に従った2つの6ビット(1.3.2)ミニフロート演算を示しています。緑色のXはNaN、シアン色のXは+Infinity、マゼンタ色のXは−Infinityを表します。有限値の範囲は、等しい値を結ぶ曲線で埋められており、正の値は青色、負の値は赤色で示されています。
正規化数、非正規化数、符号付きゼロ、符号付き無限大、複数のNaN値を含むすべてのIEEE原則に従う最小の浮動小数点数のサイズは、1ビットの符号、2ビットの指数、1ビットの仮数を持つ4ビット浮動小数点数です。[ 15 ]
この4ビット浮動小数点数の例は、Nvidiaが使用するFP4-E2M1形式や、前述のIEEE P3109 binary4p2s*形式と非常によく似ていますが、特殊なInfinity値とNaN値の割り当て方法が異なります。この例では、他の浮動小数点数サイズと同じ原則に従った従来の割り当て方法を使用しています。汎用的な相互運用性ではなく、アプリケーション固有のユースケースを目的とした浮動小数点数では、アプリケーションのニーズに応じて、有限数にこれらのビットパターンを使用する方が望ましい場合があります。
その他の 4 ビット浮動小数点形式にはMXFP4 と NVFP4があります(上記と同様にプラスとマイナス Inf および NaN の別々のビット パターンを交換します)。「この形式の値は、およそ -6 から 6 の範囲です。たとえば、この範囲の値には、0.0、0.5、1.0、1.5、2、3、4、6 (負の範囲も同様) が含まれます。」[ 16 ]また、ブロックごとに別々に格納される別のスケール 形式もあります。
正規化された数値が必要ない場合は、指数を1に下げることでサイズを3ビットに縮小できます。
符号ビットを除外できる場合、上記の各例はさらに1ビット削減でき、上記の表の最初の行のみを残すことができます。1ビットの指数部と1ビットの仮数部を持つ2ビット浮動小数点数は、0、1、Inf、NaNの値のみを持ちます。
仮数部を削除すると、0 と Inf の 2 つの値しか得られません。指数部を削除しても機能せず、上記の式では 0 と sqrt(2)/2 が生成されます。指数部は少なくとも 1 ビットでなければ、浮動小数点数として意味をなさなくなります (単なる符号付き数値になります)。