ミニフロート

コンピューティングにおいてミニフロートは非常に少ないビット数で表現される浮動小数点値です。精度が低いため、汎用的な数値計算には適していませんが、次のような特殊な用途には役立ちます。

  • コンピュータグラフィックスでは、人間の色や光のレベルに対する知覚の精度は低いです。[1] 16ビットの半精度形式は非常に人気があります。
  • 機械学習では数値精度に比較的鈍感である。16ビット、8ビット、さらには4ビットの浮動小数点数がますます使用されるようになっている。[2]

さらに、浮動小数点演算IEEE 754数値の特性と構造を示すために、コンピュータ サイエンスのコースで教育ツールとして頻繁に使用されます。

文脈に応じて、ミニフロートは32未満のサイズ、16以下のサイズ、または16未満のサイズを意味する場合があります。マイクロフロートという用語は8以下のサイズを意味する場合があります。[3]

表記

このページでは、ミニフロートを記述するために表記法 ( SEM ) を使用します。

  • Sは符号フィールドの長さ (0 または 1) です。
  • Eは指数フィールドの長さです。
  • Mは仮数部 (仮数部) フィールドの長さです。

ミニ浮動小数点は、 IEEE 754規格の原則に従って設計できます。ほとんどすべてのミニ浮動小数点は、非正規正規数に対して最小の指数を使用します。多くのミニ浮動小数点は、(特殊指数) SE = 1で示される最大指数を使用します。一部のミニ浮動小数点数では、この指数値を通常通り使用し、その場合はSE = 0 となります

指数バイアス B = 2 E − 1SE。この値は、表現可能なすべての数値が表現可能な逆数を持つことを保証します。

この表記は、 (2, M + 1, SE − 2 E − 1 + 1, 2 E − 1 − 1)として( B,P,L,U )形式に変換できます

機械学習の分野でよく使われる表記法は 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(Shader Model 2.0)グラフィックスAPIは、グラフィックスハードウェアによる頂点シェーダとピクセルシェーダの計算において、当初はFP24(ATIのR300チップ)とFP32(NvidiaのNV30チップ)の両方を「完全精度」として、またFP16を「部分精度」としてサポートしていました。

2016年にクロノスは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]

FP4-E2M1フォーマット
.000.001.010.011.100.101.110.111
0...00.511.52346
1...−0−0.5−1−1.5−2−3−4−6

2023年以降、IEEE SAワーキンググループP3109は、現在の実践を体系化することで、機械学習向けに最適化されたミニフロートの標準策定に取り組んでいます。中間報告書バージョン3.0(2025年8月)では、「binary K p P [s/u][e/f]」という体系的な名称で、多くの形式のファミリーが定義されています。ここで、Kは総ビット長、Pは仮数ビット数、s/u(符号付き/符号なし)は符号ビットの有無、e/f(拡張/有限)は無限大を含むかどうかを表します。慣例により、sとeは省略可能です。より多くの数値を格納するためのスペースを節約するため、「負のゼロ」というものは存在せず、NaNの表現は1つだけです。したがって、符号付き形式の場合、NaNは負のゼロとなるはずのビットパターンを使用できます。例えば、FP4-E2M1形式は、P3109では次のように近似できます。[9]

バイナリ4p2sf形式
.000.001.010.011.100.101.110.111
0...00.511.52346
1...非数−0.5−1−1.5−2−3−4−6

(binary4p2se の場合、±6 は ±Infinity に置き換えられます。)

非常に小さなミニフロートの欠点は、表現可能なダイナミックレンジが非常に狭いことです。この問題を解決するために、機械学習業界では、ブロック浮動小数点の一種である「マイクロスケーリング形式」(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]

8ビット(1.4.3)

ここでは、1バイト(8ビット)のミニフロート(符号ビット1、指数ビット4、仮数ビット3)の例を示します(1.4.3)。指数バイアスは、他のIEEE 754浮動小数点数[11] [12]と一致するように値を1を中心に揃えるために7と定義されています。したがって、(ほとんどの値において)指数xの実際の乗数は2 x −7です。IEEE 754のすべての原則は有効です。[13]この形式は命令では非常に一般的です。[要出典]

サイン指数有効数字
00000000

ゼロは、ゼロの仮数部を持つゼロ指数として表されます。ゼロ指数とは、ゼロが先頭に「0」が付いた非正規数であることを意味します。ゼロ仮数部では、小数点以下のすべてのビットがゼロとなり、この値は と解釈されます。浮動小数点数は符号付きゼロを使用するため、も使用可能であり、 は正の と等しくなります

0 0000 000 = 01 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 = 10 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 = 1280 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 = 2240 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 ビット浮動小数点のすべての可能な値を示す表です。

… 000… 001… 010… 011… 100… 101… 110… 111
0 0000 …00.0019531250.003906250.0058593750.00781250.0097656250.011718750.013671875
0 0001 …0.0156250.0175781250.019531250.0214843750.02343750.0253906250.027343750.029296875
0 0010 …0.031250.035156250.03906250.042968750.0468750.050781250.05468750.05859375
0 0011 …0.06250.07031250.0781250.08593750.093750.10156250.1093750.1171875
0 0100 …0.1250.1406250.156250.1718750.18750.2031250.218750.234375
0 0101 …0.250.281250.31250.343750.3750.406250.43750.46875
0 0110 …0.50.56250.6250.68750.750.81250.8750.9375
0 0111 …11.1251.251.3751.51.6251.751.875
0 1000 …22.252.52.7533.253.53.75
0 1001 …44.555.566.577.5
0 1010 …89101112131415
0 1011 …1618202224262830
0 1100 …3236404448525660
0 1101 …6472808896104112120
0 1110 …128144160176192208224240
0 1111 …情報非数非数非数非数非数非数非数
1 0000 …−0−0.001953125−0.00390625−0.005859375−0.0078125−0.009765625−0.01171875−0.013671875
1 0001 …−0.015625−0.017578125−0.01953125−0.021484375−0.0234375−0.025390625−0.02734375−0.029296875
1 0010 …−0.03125−0.03515625−0.0390625−0.04296875−0.046875−0.05078125−0.0546875−0.05859375
1 0011 …−0.0625−0.0703125−0.078125−0.0859375−0.09375−0.1015625−0.109375−0.1171875
1 0100 …−0.125−0.140625−0.15625−0.171875−0.1875−0.203125−0.21875−0.234375
1 0101 …−0.25−0.28125−0.3125−0.34375−0.375−0.40625−0.4375−0.46875
1 0110 …−0.5−0.5625−0.625−0.6875−0.75−0.8125−0.875−0.9375
1 0111 …−1−1.125−1.25−1.375−1.5−1.625−1.75−1.875
1 1000 …−2−2.25−2.5−2.75−3−3.25−3.5−3.75
1 1001 …−4−4.5−5−5.5−6−6.5−7−7.5
1 1010 …−8−9−10−11−12−13−14−15
1 1011 …−16−18−20−22−24−26−28−30
1 1100 …−32−36−40−44−48−52−56−60
1 1101 …−64−72−80−88−96−104−112−120
1 1110 …−128−144−160−176−192−208−224−240
1 1111 …−無限大非数非数非数非数非数非数非数

14 個のビット パターンが NaN を表すため、非 NaN 値は 242 種類しかありません (+0 と -0 が異なるとみなされる場合)。

プログラミング言語で8ビット浮動小数点数と8ビット浮動小数点数を相互に変換するには、この形式が標準化されていないため、通常、ライブラリまたは関数が必要です。例えば、C++での実装例を以下に示します(パブリックドメイン)。

8ビット(1.4.3)B= −2

このような小さなサイズでは、他のバイアス値が興味深い場合があります。たとえば、バイアスが -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 (正規化された数)

8ビット(1.3.4)

任意のビット割り当てが可能です。精度を下げてより広いダイナミックレンジが必要な場合は指数部に多くのビットを割り当て、精度を下げてより広いダイナミックレンジが必要な場合は仮数部に多くのビットを割り当てるといったフォーマットを選択できます。極端な例として、すべてのビットを指数部に割り当てる(1.7.0)、または1ビットを除くすべてのビットを仮数部に割り当てる(1.1.6)ことで、指数部を1ビットだけ残すといったことも可能です。指数部には少なくとも1ビットを割り当てる必要があります。そうでないと、浮動小数点数として意味をなさなくなり、単なる符号付き数値となってしまいます。

(1.3.4)の全ての可能な値を表にまとめた。M ≥ 2 E − 1 は範囲全体にわたって精度が少なくとも0.5を維持することを保証する。[14]

… 0000… 0001… 0010… 0011… 0100… 0101… 0110… 0111… 1000… 1001… 1010… 1011… 1100… 1101… 1110… 1111
0 000 …00.0156250.031250.0468750.06250.0781250.093750.1093750.1250.1406250.156250.1718750.18750.2031250.218750.234375
0 001 …0.250.2656250.281250.2968750.31250.3281250.343750.3593750.3750.3906250.406250.4218750.43750.4531250.468750.484375
0 010 …0.50.531250.56250.593750.6250.656250.68750.718750.750.781250.81250.843750.8750.906250.93750.96875
0 011 …11.06251.1251.18751.251.31251.3751.43751.51.56251.6251.68751.751.81251.8751.9375
0 100 …22.1252.252.3752.52.6252.752.87533.1253.253.3753.53.6253.753.875
0 101 …44.254.54.7555.255.55.7566.256.56.7577.257.57.75
0 110 …88.599.51010.51111.51212.51313.51414.51515.5
0 111 …情報非数非数非数非数非数非数非数非数非数非数非数非数非数非数非数
1000 …−0−0.015625−0.03125−0.046875−0.0625−0.078125−0.09375−0.109375−0.125−0.140625−0.15625−0.171875−0.1875−0.203125−0.21875−0.234375
1 001 …−0.25−0.265625−0.28125−0.296875−0.3125−0.328125−0.34375−0.359375−0.375−0.390625−0.40625−0.421875−0.4375−0.453125−0.46875−0.484375
1010 …−0.5−0.53125−0.5625−0.59375−0.625−0.65625−0.6875−0.71875−0.75−0.78125−0.8125−0.84375−0.875−0.90625−0.9375−0.96875
1 011 …−1−1.0625−1.125−1.1875−1.25−1.3125−1.375−1.4375−1.5−1.5625−1.625−1.6875−1.75−1.8125−1.875−1.9375
1 100 …−2−2.125−2.25−2.375−2.5−2.625−2.75−2.875−3−3.125−3.25−3.375−3.5−3.625−3.75−3.875
1 101 …−4−4.25−4.5−4.75−5−5.25−5.5−5.75−6−6.25−6.5−6.75−7−7.25−7.5−7.75
1 110 …−8−8.5−9−9.5−10−10.5−11−11.5−12−12.5−13−13.5−14−14.5−15−15.5
1 111 …−無限大非数非数非数非数非数非数非数非数非数非数非数非数非数非数非数

上記のような表は、Python または GDScript のスクリプトを使用して、SEMB (符号、指数、仮数/仮数、バイアス) 値の任意の組み合わせに対して生成できます。

6ビット(1.3.2)

わずか 64 個の値で、すべての値を図にプロットすることができ、有益です。

これらのグラフィックは、IEEE 754の規則に厳密に従った、2つの6ビット(1.3.2)ミニフロートの計算結果を示しています。緑のXはNaN、シアンのXは+Infinity、マゼンタのXは-Infinityの結果です。有限の結果の範囲は、等しい値を結ぶ曲線で塗りつぶされており、青は正、赤は負を表します。

4ビット(1.2.1)

正規化数、非正規数、符号付きゼロ、符号付き無限大、複数のNaN値など、すべてのIEEE原則に準拠する最小の浮動小数点数のサイズは、1ビットの符号、2ビットの指数、1ビットの仮数を持つ4ビットの浮動小数点数です。[15]

.000.001.010.011.100.101.110.111
0...00.511.523情報非数
1...−0−0.5−1−1.5−2−3−無限大非数

この例の4ビット浮動小数点は、特殊なInfinity値とNaN値の割り当てが異なる点を除けば、Nvidiaが使用するFP4-E2M1形式や、前述のIEEE P3109のbinary4p2s*形式と非常によく似ています。この例では、他の浮動小数点サイズと同じ原則に従った従来の割り当てを使用しています。汎用的な相互運用性ではなく、アプリケーション固有のユースケースを目的とした浮動小数点数では、アプリケーションのニーズに応じて、有限数にこれらのビットパターンを使用する方が適している場合があります。

3ビット(1.1.1)

正規化された数値が必要ない場合は、指数を 1 に減らすことでサイズを 3 ビットに減らすことができます。

.00.01.10.11
0...01情報非数
1...−0−1−無限大非数

2ビット (0.2.1) と (0.1.1)

符号ビットを除外できる場合、上記の各例をさらに1ビット削減し、上記の表の最初の行のみを維持できます。1ビットの指数部と1ビットの仮数部を持つ2ビットの浮動小数点数は、0、1、Inf、NaNの値のみになります。

1ビット (0.1.0)

仮数部を削除すると、0とInfの2つの値しか得られません。指数部を削除してもうまくいきません。上記の式は0とsqrt(2)/2を生成します。指数部は少なくとも1ビットでなければならず、そうでなければ浮動小数点数として意味をなさなくなります(単なる符号付き数値になってしまいます)。

参照

参考文献

  1. ^ Mocerino, Luca; Calimera, Andrea (2021年11月24日). 「AxP: 連想マッチングによるエネルギー効率の高い近似ConvNetを実現するハードウェア-ソフトウェア共同設計パイプライン」.応用科学. 11 (23) 11164. doi : 10.3390/app112311164 .
  2. ^ ab https://developer.nvidia.com/blog/nvidia-arm-and-intel-publish-fp8-specification-for-standardization-as-an-interchange-format-for-ai/ (Intel、NVIDIA、Armによる共同発表);https://arxiv.org/abs/2209.05433 (上記3社の研究者による共同執筆のプレプリント論文)
  3. ^ https://www.mrob.com/pub/math/floatformats.html#microfloat マイクロフロート
  4. ^ Buck, Ian (2005年3月13日)、「第32章 GPUコンピューティングへの飛躍」、Pharr, Matt (編)、GPU Gems、Addison-Wesley、ISBN 0-321-33559-7、 2018年4月5日閲覧
  5. ^ Garrard, Andrew. 「10.3. 符号なし10ビット浮動小数点数」. Khronosデータフォーマット仕様 v1.2 rev 1. Khronos Group . 2023年8月10日閲覧
  6. ^ Garrard, Andrew. 「10.2. 符号なし11ビット浮動小数点数」. Khronosデータフォーマット仕様v1.2 rev 1. Khronos Group . 2023年8月10日閲覧
  7. ^ 「OCP 8ビット浮動小数点仕様(OFP8)リビジョン1.0」。2023年5月。
  8. ^ 「ローカル PC で LLM 推論を高速化する」。
  9. ^ 「IEEEワーキンググループP3109機械学習のためのバイナリ浮動小数点形式に関する中間報告書」(PDF) . GitHub . IEEEワーキンググループP3109. 2025年8月5日.(最新バージョン)
  10. ^ “OCP Microscaling Formats (MX) 仕様 バージョン 1.0”. Open Compute Project . 2024年2月24日時点のオリジナルよりアーカイブ2025年2月21日閲覧。
  11. ^ IEEE半精度は指数部が5ビットでバイアスが15()、IEEE単精度は指数部が8ビットでバイアスが127()、IEEE倍精度は指数部が11ビットでバイアスが1023()、IEEE四倍精度は指数部が15ビットでバイアスが16383()。詳細については指数バイアスの記事を参照してください。
  12. ^ O'Hallaron, David R.; Bryant, Randal E. (2010).コンピュータシステム:プログラマの視点(第2版). ボストン、マサチューセッツ州、米国: Prentice Hall . ISBN 978-0-13-610804-7
  13. ^ Burch, Carl. 「浮動小数点表現」ヘンドリックス大学. 2023年8月29日閲覧
  14. ^ 「8ビット浮動小数点表現」(PDF)。2024年7月8日時点のオリジナル(PDF)からのアーカイブ。
  15. ^ Shaneyfelt, Dr. Ted. 「Dr. Shaneyfeltの浮動小数点構築ギズモ」. Dr. Ted Shaneyfelt . 2023年8月29日閲覧
  • ムナフォ、ロバート (2016年5月15日). 「浮動小数点形式に関する調査」 . 2016年8月8日閲覧
  • ミニ浮動小数点数(浮動小数点形式の調査
Retrieved from "https://en.wikipedia.org/w/index.php?title=Minifloat&oldid=1318309937"