LLMの量子化について調べながら、そもそもFP8を使うのはどういう場面だろう、と考えていた。さらに調べるとFP6やFP4もある。6bitという半端な幅はどう保存するのか、そこまでbit数を減らした浮動小数点はどのくらいの精度で値を表せるのかが気になった。

FP6の表現可能な値を並べてみると、普段使う浮動小数点ではあまり意識しない、隣り合う値の間隔がはっきり見える。同じ6bitでも指数と仮数への配分によってその間隔が変わる。ならば、重みの分布に合わせて表現を選べないだろうか。

最初は単に「6bitはどう保存するのか」という疑問だったのに、表現可能な値を見ているうちに、どの値を正確に残すかという話になった。そこから、情報の偏りに合わせて少ないbitを配分するという点で、画像圧縮のことを思い出した。さらに、圧縮に時間をかけて結果をよくするZopfliのことも連想した。

この記事で考えたい問いは、限られた保存bit数をどこに、どんな表現で割り当てれば、モデルの挙動を壊しにくいかというものだ。まずFP6で失われる値を具体的に見て、そこから立てた仮説をJPEGやZopfliの発想、既存の量子化研究と照らす。最後に、何を改善とみなして測るべきかを考える。

量子化方式を実装・評価した結果ではない。以下は、数値表現の観察を出発点にした仮説と、先行研究から分かる範囲を分けて書いたものになる。

背景: 6bitへの疑問

量子化と6bitの保存

LLMの重みはFP16やBF16などで保持されることが多い。量子化は、これをINT8、INT4、FP8、FP6などの少ないbit数で近似し、モデルサイズや重みを読み出すメモリ帯域を減らす方法だ。対応する演算器やkernelがあれば計算の高速化にもつながるが、bit数を減らすだけで必ず速くなるわけではない。

30B、つまり300億個の重みをすべて16bitで持つなら、重みだけで約60GBになる。8bitなら単純計算で約30GB、6bitなら約22.5GB、4bitなら約15GBだ。GPUが計算するたびに大量の重みをメモリから運ぶことを考えると、この差は保存容量だけの話ではない。ただし、実際にはscaleなどのメタデータが付くし、実行時にはactivationやKV cacheなど重み以外のメモリも必要なので、この数字がそのまま必要容量になるわけではない。

コンピュータでは8bit、16bit、32bit、64bitのような幅をよく見る。6bitの値は8bitの箱へ入れて残り2bitを捨てるのかと思ったが、そうすると容量面では8bitと変わらない。実際には複数の値をbit単位で詰められる。6bitの値が4個なら24bitなので、3byteへ収まる。

6bit × 4個 = 24bit = 3byte

DRAMは物理的にはbitを記憶し、CPUからは通常byte単位のアドレス空間として扱う。6bitごとにアドレスを割り当てる必要はなく、読み出したbyte列から目的の値を展開すればよい。例えば3byteをまとめて読み、そこから4個の6bit値を取り出す。

ただし、byteの境界をまたぐ値は取り出すときにshiftやmaskが要る。値を計算用の形式へ展開し、scaleを適用する処理も入る。大量の重みをSIMDやGPUのkernelでまとめて処理するとしても、packingとunpackingは無料ではない。メモリから運ぶ量を25%減らせても、展開が遅ければ8bitより速いとは限らない。「6bitなら8bitより25%小さい」と「6bitなら8bitより速い」は別の主張だ。

この区別は後でZopfliの話につながる。モデルを作るときの計算を重くすることは許容できても、推論のたびに複雑な展開をするなら、その費用はずっと払い続けることになる。

FP6で隣り合う値の間隔を見てみる

FP8は、値の範囲と精度をある程度保ちながらデータ量や転送量を減らす選択肢になる。では、さらに少ないFP6やFP4ではどうなるのか。 OCPのMX形式仕様 には、FP8、FP6、FP4を使う形式が載っている。ここではFP6のE3M2とE2M3を見てみる。名前は符号以外の指数bit数と仮数bit数を表す。

形式符号指数仮数傾向
E3M21bit3bit2bit広い範囲を表せるが値の間隔は粗い
E2M31bit2bit3bit範囲は狭いが間隔は細かい

スケールを掛ける前の正の値だけを見ると、隣り合う表現可能値の距離は次のようになる。

形式0付近の最小間隔大きい値の側の最大間隔
E3M20, 0.0625, 0.125 の間は 0.062516, 20, 24, 28 の間は 4
E2M30, 0.125, 0.25 の間は 0.1254, 4.5, 5, ..., 7.5 の間は 0.5

例えばE3M2で8から14までがどうできるかを考える。指数部によって基準になる大きさが8になり、仮数の2bitで1.001.011.101.11の4通りを表す。それぞれ8、10、12、14だ。次の指数帯に入ると基準が16になり、16、20、24、28と並ぶ。保存している仮数の刻みは同じでも、指数が一つ上がれば絶対的な距離は倍になる。

E2M3なら仮数が3bitあるので同じ指数帯に8通りの値を置ける。ただし指数部に割くbitが一つ減るため、scaleを掛ける前に扱える範囲は狭い。OCPのこのFP6形式ではInfやNaNの符号化を予約せず、subnormalも扱う。ここで比べているのは、一般的な浮動小数点を何となく6bitへ縮めたものではなく、仕様に定義された二つの具体的な形式だ。

E3M2では最小間隔と最大間隔が64倍違う。途中の8から16の手前では8, 10, 12, 14と並び、11という値は保存できない。16以上では16, 20, 24, 28とさらに粗くなる。11をE3M2へ変換するなら、元の11をそのまま残すのではなく、10か12のどちらかへ寄せることになる。どちらへ寄せるかは丸め規則によるが、どちらでも1の誤差が生じる。

0付近では逆に刻みが0.0625しかない。例えば0.1を近い方の0.125へ寄せた場合、絶対誤差は0.025で、11を10や12へ寄せたときの誤差1よりずっと小さい。しかし元の値に対する割合なら、前者は25%、後者は約9%だ。絶対誤差だけなら11の方が悪く見え、相対誤差なら0.1の方が悪く見える。重みが実際に使う値の分布や、その値へ掛けるscaleを抜きにして「FP6の誤差」を一つの数字で表すことはできない。

指数が大きくなるにつれて絶対的な間隔が広がる。仮数が2bitなので、各指数帯に置ける値も少ない。指数が切り替わる境界では間隔も切り替わる。この階段のような並びは、FP32ではほとんど気にならない浮動小数点の性質を露骨に見せてくれる。

IEEE 754でおなじみのFP32にも、隣り合う表現可能値の間隔が指数によって変わる性質はある。ただ仮数が23bitあるので、普段は間隔の粗さを意識しにくい。FP6はパターンが少なく、浮動小数点の仕組みが数字で見えて面白い。

E3M2もE2M3も保存には6bitを使い、bit patternはそれぞれ64通り。違うのは64個の状態を数直線上のどこへ置くかだ。OCP仕様ではscaleを掛ける前のE3M2の最大正規数は28、E2M3は7.5になる。指数にbitを振れば範囲が広がり、仮数に振れば範囲内の刻みが細かくなる。

実際のMX形式ではblockごとに共有scaleを掛ける。例えばscaleが2なら、E3M2で表せる8, 10, 12, 14は実際には16, 20, 24, 28になる。表示した間隔も2倍だ。逆にscaleを小さくすれば細かくなるが、今度は大きな値が表現範囲を超えるかもしれない。したがって、E3M2かE2M3かの選択とscaleの選択は独立ではない。

OCPのMX形式では32個の値が一つのscaleを共有する。この単位を小さくすれば各blockの分布に合わせやすいが、scaleを保存する割合が増える。逆にblockを大きくすればメタデータは減るが、一つの外れ値に引っ張られて残りの値の刻みが粗くなる。値そのものの6bitだけ見ていても、実際の保存効率は分からない。

AMDの MXFP4・MXFP6の量子化検証 では、共有scaleが値域の多くを受け持つため、MXFP6では指数を増やすE3M2より仮数を増やすE2M3の方が実用上よい精度になりやすいと説明している。また、scaleをE8M0形式へ変換するときの丸め方も精度に効き、round-to-nearest-evenを省くと精度が落ちるという。要素の6bitだけでなく、共有scaleをどう決めるかまで含めて量子化方式になる。

「持っている情報量が違う」というより、同じ6bitの表現能力をレンジと精度へどう配るかの違いとして見る方が分かりやすい。もちろん、実際に値が持つ統計的な情報量まで両者で等しいという意味ではない。

仮説: 限られたbitの使い方を変える

FP6を見て分かったのは、単に「6bitでは値が粗くなる」ことだけではない。同じ6bitでも、どの値を細かく表現するかを変えられる。この選択を行列やblockごとに行い、さらに表現する座標系や量子化を作る手順まで選べば、同じ容量でもモデルの挙動をより保てるのではないか。

ここから先は、分布に合わせて形式を選ぶ、座標系を変える、重要な場所に精度を配る、作成時に候補を探す、という順に考える。類似する先行研究もそれぞれの話の中で参照するが、これらを組み合わせた方法の効果を自分で測ったわけではない。

値の分布に合わせて表現を選べないか

同じ6bitでも表現できる値の配置が変わる。ならば、分布によって使い分けられないか。LLMには重み行列が大量にあり、行列やchannel、さらに小さなblockごとに値の分布が違う。全部へ同じ表現を当てる必要があるのか。

仮に二つのblockがあるとする。一方はほとんどの値が狭い範囲に密集し、もう一方には離れた位置に大きな値が混ざる。前者では、使わない広い範囲のために指数へbitを割くより、近い値を区別する方が得かもしれない。後者では、細かい刻みを優先して大きな値を表せなくなると困る。この発想から、blockごとにscaleや表現方法を選ぶことが考えられる。

ただし、分布を見ただけでE2M3が前者、E3M2が後者と機械的に決められるわけでもない。共有scaleをどこに置くかで両形式の実際の刻みは変わるし、外れ値を別の形で保存する選択もある。さらに同じ数値誤差でも、推論結果への影響はblockによって違う。まずは「候補を変えて比較する余地がある」くらいの発想だ。

似た方向の研究はすでにある。 MicroMix は、MXFP4、MXFP6、MXFP8をchannelごとに組み合わせ、低精度だと誤差が大きい場所へ高い精度を割り当てる。 AdaMX は、blockごとに適した精度回復の方法が異なることを扱っている。どちらも「全体を一つの形式で押し通さない」という点では近いが、E3M2とE2M3をblockごとに選ぶという自分の思いつきそのものではない。

先ほどのAMDの記事で評価している混合精度もMXFP4とMXFP6の組み合わせで、E3M2とE2M3をblockごとに切り替えた結果ではない。そこは分けて考える必要がある。

そして、どの形式か示す情報が増えれば、推論側にもそれを読み分けるkernelが必要になる。MicroMixが量子化方式と行列積kernelを一緒に設計しているのも、この問題が保存形式だけでは終わらないからだろう。共通のINT4形式を維持したまま、blockごとのscaleや丸め方を変える方が実装しやすい場面もある。

JPEGのように座標系を変える

場所によって情報の偏りが違うものを、少ないbitでうまく表現する話なら、画像圧縮にも似た考え方がある。そこでJPEGを思い出した。一般的なDCT方式のJPEGは、8×8の画素blockを周波数成分へ変換してから量子化する。 JPEGの仕様 T.81 では、DCT係数ごとに異なる量子化値を指定できる。

8×8なら64個の画素から64個の係数が得られる。左上の成分はblock全体のおおまかな明るさを表し、それ以外は横や縦にどれくらい細かく変化するかを表す。画素の値をすべて同じ幅で丸めるよりも、係数ごとに量子化の強さを変えられる。細かな変化を強く削っても、人の目には目立ちにくいことがある。一方、大まかな明るさや形を壊すとすぐ分かる。

この例が面白いのは、画素のどこか一つが「重要」だと決めているわけではないところだ。64個の画素を別の64個の成分へ並べ替え、その成分ごとに誤差の許容度を変える。元の座標系より、情報を捨てる場所を選びやすい座標系へ移しているとも言える。量子化テーブルは、その判断を保存形式の中へ持ち込んだものに見える。

LLMの重みも、元の座標系でそのまま丸める以外の方法がありそうだ。例えば線形層y=Wxで可逆な変換Tを使うなら、次のように書ける。

$$ x’=Tx,\qquad W’=WT^{-1},\qquad W’x’=Wx $$

ここでTは逆行列を持つものとした。変換しても、量子化する前ならW'x'は元のWxと一致する。重みだけをT(W)へ置き換えたら別のモデルになってしまう。入力側も対応させるか、変換を隣の層へ吸収して、元の計算が保たれるようにする必要がある。

この時点では何も圧縮していない。圧縮上の利益が出るのは、そのあとでW'を粗く量子化した場合に、元のWを直接量子化するよりモデルの出力が保たれるときだ。変換後の数値が「小さく見える」だけでは足りず、逆変換相当の計算や隣接層への吸収も含めて正しく動く必要がある。

この方向はすでに研究されている。 QuaRot は、モデルの計算を保つ回転によって外れ値を分散させ、低bit量子化をしやすくする。さらに SpinQuant は、回転なら何でも同じというわけではなく、量子化後の精度がよくなる回転を学習する。つまり「量子化しやすい座標系を探す」ところまで踏み込んでいる。

JPEGのDCTとモデルの回転は同じ処理ではない。JPEGは画像の周波数成分を分け、人間の知覚に合わせて捨てる量を変える。一方、LLMでは元の計算をなるべく保ちながら、量子化誤差が出にくい分布を探している。人間の目に見えにくい成分に相当するものが、LLMの重み行列にもそのまま存在する、という主張ではない。

それでも、元の数値をそのまま丸める以外の道があると分かった。しかもSpinQuantでは、同じく元の計算を保つ回転であっても量子化後の精度に差が出る。ならば変換そのものも「何となく選ぶ」のでなく、候補として探索できる。

JPEGの量子化テーブルのように精度を配る

変換に加えて、限られたbitをどこへ使うかも考えたい。JPEGで64個の係数へ一律の精度を与えないように、LLMでも全重みを同じbit数で持つ必要はない。仮に大事なchannelを8bit、通常の部分を4bit、影響の小さい部分を2〜3bit、外れ値を別途高精度で保持するとする。これは具体的な実装案というより、同じ容量の中で精度を交換するための例だ。

仮に100個の重みのうち20個を8bit、残り80個を4bitで表せば、本体だけなら平均は4.8bitになる。全100個を6bitにする場合より小さい。この差を使って、特に壊れやすい20個を守る方がよいかもしれない。逆に、残り80個の誤差が積み重なって性能が落ちるなら、この配分は失敗だ。bit数の平均だけでは結論が出ない。

ただし「重みの絶対値が大きいから重要」とは限らない。一つの積y=wxを考えても、重みの量子化誤差を\(\Delta w\)とすると出力の誤差は\(\Delta y=\Delta w x\)になる。\(\Delta w\)が同じでも、そこへ掛かる入力xが大きい場所ほど出力は変わる。実際のモデルではさらに後段の層があり、一つの誤差が弱まることも増幅されることもある。

だから入力となるactivationの分布や、後段へ伝わる誤差まで見ないと、どの値を守るべきか分からない。 AWQ はactivationから重要なchannelを見つけ、重みのscaleを調整して保護する。高精度の値を混ぜる方法ではなく、同じ低bit形式のまま誤差を減らすところが面白い。 GPTQ は近似的な二次情報を使い、単純な丸めより量子化誤差を抑える。

自分が面白いと思ったのは、4bitか6bitかを一律に決めることより、同じ平均bit数の中で配分を変えること。どの場所の誤差を小さくするかを選ぶため、bitは単なる保存幅ではなく、モデルの振る舞いを守る予算になる。

もちろん形式を混ぜればメタデータやkernelの分岐も増える。先ほどの平均4.8bitも、形式を示す情報、block単位のscale、alignment、外れ値の別保存を抜いた計算だ。その分まで含めて得かどうかを見なければならない。

Zopfliのように候補をたくさん試せないか

表現や精度の配分を選ぶとして、何を採用するかは一度試してみないと分からない。そこで Zopfli を思い出した。Zopfliは圧縮時に探索へ時間をかけ、より小さい表現を探す。出力は通常のDEFLATEなので、既存の展開器で読める。

LLMでも量子化はモデルを配布する前に一度行い、その後は同じ重みを何度も推論に使う。ならば、量子化を作る段階でたくさんの候補を試し、モデルの挙動が最も保たれるものを探せないか。数時間、場合によっては数日かけても、そのモデルが長く使われるなら探索の費用を回収できるかもしれない。

最もZopfliに近い形を考えるなら、推論時の形式を先に固定する。例えば対応済みのINT4形式、group size、scaleの保存方法は変えず、作成時にscale、clipping、各値の丸め方向を変えてみる。それぞれの候補を校正データで評価し、よいものを残す。最終的に同じINT4の重みとscaleとして書き出せるなら、推論側は探索の回数を知らなくてよい。

一方、block sizeやbitの配分まで候補にすると、最終的なデータ配置や必要なkernelも変わりうる。こちらは「圧縮を頑張っても展開器は同じ」というZopfliの比喩から一歩外れる。まず既存形式の内側で最適化する話と、形式そのものを設計する話を分けた方がよさそうだ。

Zopfliは可逆圧縮で、LLMの量子化は通常は非可逆。最小のファイルを探す話と、モデルの精度を守る話は同じではない。借りたいのは、利用時の形式を変えずに、作成時の試行回数を増やすという考え方だ。

圧縮ファイルなら元データと完全一致するかを確認できる。しかし量子化モデルには、どの入力でも元モデルと同じ答えを出すかを簡単に保証する手段がない。校正データでよく見えた候補が、別のタスクや長い文脈で弱くなるかもしれない。「一番精度がよい」と言えるのは、試した候補と評価データの範囲に限られる。探索へ計算を積むほど、評価側も手を抜けなくなる。

SignRound はこの方向に近い。量子化を作る段階で重みの丸め方と値の切り詰め方を調整し、推論時の追加処理を増やさない。Zopfliのように全候補を試すわけではなく、勾配を使って効率よく探す方法だ。探索を増やすなら、総当たりだけでなく、こうした近似的な最適化とも比べる必要がある。

評価: 何を「壊れた」とみなすか

候補をたくさん試す前に、何をよい候補と呼ぶかを決める必要がある。保存bit数だけが小さくても、元のモデルと別の答えを出すなら困る。一方、重みの数値を忠実に保つだけでは、モデルの挙動を守れたことにもならない。

重みの誤差からモデルの出力へ

重みをW、scaleや丸め方などの選択を\(\theta\)、量子化後の重みを\(Q_\theta(W)\)とする。重みそのものの差を測るなら、まずはこう書ける。

$$ \theta^*=\underset{\theta}{\operatorname{argmin}}\quad\lVert W-Q_\theta(W)\rVert_F^2 $$

これは分かりやすいが、先ほどのy=wxでも見たように、重みの差が小さくても、掛かる入力によって出力は大きく変わる。反対に、大きな重み誤差があっても、ほとんど使われない場所なら挙動へ影響しないこともある。行列内の全要素を等しく数えるFrobenius normだけでは、モデルにとっての痛みを表せない。

一歩進めて、層に入るactivationを使い、量子化前後の層出力を比べる方法がある。さらにモデル全体を評価するなら、校正データDで元のモデルf_Wと量子化後のモデルを比較する目的を考えられる。

$$ \theta^*=\underset{\theta}{\operatorname{argmin}}\quad \mathcal{L}\bigl(f_W(D),f_{Q_\theta(W)}(D)\bigr) $$

AQLM は、校正データの入力と出力を考慮して重みを圧縮し、複数の層にまたがるcodebookも調整する。重みの数値を近づけるだけでなく、計算結果を保とうとする実例だ。ただしAQLMはcodebookを使う独自の表現なので、「既存のINT4形式へ出力する」というZopfli的な制約をそのまま満たす例ではない。

\(\theta\)にはscale、block分割、bitの配分、変換、外れ値の扱いなどを含められる。\(\mathcal{L}\)にも選択肢がある。層出力の二乗誤差、次トークンの分布のずれ、perplexity、特定のタスクでの正答率は、同じものを測っていない。例えば元モデルに近い確率分布を出すことと、少数の問題で同じ正答を出すことでは、候補の順位が変わる可能性がある。

評価に使うデータの範囲も効いてくる。コードを多く含む校正データで選んだ量子化が、別の言語や長い入力で同じように振る舞うとは限らない。校正データだけへ合わせ込むと別の入力で壊れる可能性もあるので、選んだ方式は独立したデータや実際のタスクでも確認したい。探索回数を増やすほど、同じ評価セットへ過度に最適化する心配も大きくなる。

容量まで含めて比べる

モデルの挙動だけを守るなら、高精度の重みをそのまま持つという選択もある。サイズまで目的へ入れると、画像圧縮でいうrate-distortionに近い形になる。これは単なる比喩でもない。 Rate Distortion for Model Compression は、ニューラルネットワークの圧縮をrate-distortionの枠組みで分析し、量子化などへ適用できる目的関数を検討している。ただしLLM向けの完成した量子化手法というわけではない。

$$ \theta^*=\underset{\theta}{\operatorname{argmin}}\quad \left[\mathcal{L}\bigl(f_W(D),f_{Q_\theta(W)}(D)\bigr) +\lambda R\bigl(Q_\theta(W),\theta\bigr)\right] $$

Rは重み本体に加え、scale、形式を示す情報、別保存する外れ値なども含めた保存bit数。\(\lambda\)はサイズと劣化のどちらを重く見るかを決める。全重みを同じINT4に固定すれば本体のbit数はほぼ一定なので、その場合は候補ごとの品質差を探す話になる。形式を混ぜるならRも変わる。

同じことを「保存bit数はここまで」という制約にして、その範囲で\(\mathcal{L}\)を最小にする問題としても書ける。量子化の候補Aが小さい代わりに精度を少し落とし、候補Bが大きい代わりに精度を保つなら、どちらがよいかは用途やメモリ上限で変わる。単一の「最良の量子化方式」があるわけではなく、容量と誤差の折り合いをどこで付けるかになる。

そして保存bit数だけでなく、実際には推論速度も制約に入る。たとえRが小さく\(\mathcal{L}\)も低くても、専用kernelがなく展開のたびにCPUへ戻るような形式なら使いにくい。学習済みモデルを一回圧縮して何度も使う、というZopfli的な話を成立させるには、この「何度も使う」側のコストを抑えることが前提だ。

エントロピーと重要度は別

各blockで同じ量子化値が頻出すれば、符号化によって小さく保存できるかもしれない。だが、値のエントロピーが低いことと、モデルに不要なことは別だ。全部0のblockなら「全部0」という短い記述で済むとしても、そこを別の値に変えてよいという意味ではない。むしろ、その0がモデルの出力を決めるうえで重要かもしれない。低エントロピーは「捨ててよい」ではなく、「少ないbitで正しく表現できる可能性がある」と捉えたい。

逆に、各値がばらばらで符号化しにくいblockが、モデルの出力にほとんど効かないこともありうる。そうなら細かな値を保存するために多くのbitを使うより、強く量子化した方がよい。この二つを混ぜて「情報量が多い場所ほど重要」としてしまうと、bitの配分を間違えそうだ。

考えたいのは、量子化後の値列を保存するコストと、そのblockを変えたときのモデル出力への影響を分けて測ること。例えば、保存bitが少なくても出力への影響が大きい場所、高いbit数を使う割に影響が小さい場所の両方がある。

保存に必要なbit出力への影響考え方
少ない大きい少ないbitで重要な状態を残せる
多い小さい強めに量子化する候補になる
多い大きい高精度で残す価値がある

ここでいうエントロピーは、どの表現で量子化し、どう符号化するかによって変わる。全重みを固定幅のINT4で持つなら、値に偏りがあっても、追加の圧縮をしない限り各重みは4bitを占める。可変長符号化を入れればファイルは縮むかもしれないが、GPUが行列の特定の場所を高速に読むには展開や索引の処理が要る。理論的なエントロピーが低いことと、推論に都合のよい形式で小さく持てることは別だ。

探索空間をどう扱うか

候補が多すぎるなら量子探索は使えるのか

変換方式、scale、bitの配分、block size、外れ値の扱いを組み合わせると、試したい量子化方法は急激に増える。仮に10個のblockそれぞれで4種類の形式を選ぶだけでも、全体の組み合わせは4^10 = 1,048,576通りになる。実際には選んだ形式に応じてscaleの候補もあるし、block同士の誤差が後段で相互作用する。各blockを個別に最適化しただけでは、モデル全体で最善になる保証はない。

候補がN個あり、各候補を同じ方法で評価するとして、単純な全探索ならO(N)回の評価が必要になる。そこで、量子コンピュータでこの探索を速くできないのか、という疑問も出てきた。ここでいう量子探索は、LLMの「量子化」とは別の話だ。名前が似ているだけで、一方は重みの表現を減らす処理、もう一方は量子計算による探索方法だ。

非構造な候補探索を理想化すると、 Groverの探索アルゴリズム DürrとHøyerのminimum finding では、O(√N)回程度のオラクル問い合わせで解や最小値を探すことが考えられる。例えば候補がN = 2^40個なら、全件評価の2^40回に対し、平方根は2^20のオーダーになる。

ただし、これは問い合わせ回数の比較にすぎない。1回の問い合わせが「候補のbit配分を選び、量子化モデルを作り、校正データを通して損失を測る」なら、それ自体が非常に重い。Groverの式へNを代入しただけでは、実行時間の見積もりにすらならない。

量子探索として成立させるには、この評価を量子回路上で効率よく使える形、いわゆるオラクルへ落とす必要がある。大きなモデルの重みや校正データをどう扱うのか、量子状態の中で評価をどう計算するのか、誤り訂正を含む実機の費用はどうなるのか、といった問題が残る。さらに候補に構造があるなら、勾配法、局所探索、近似的な重要度推定などの古典的手法が全探索よりずっと有利かもしれない。巨大な離散最適化として定式化すると量子探索を連想するが、今のところ実用案ではなく理論上の問いにとどまる。

考察: 推論側の制約と未検証の点

最終的に選びたいのは、保存容量が小さく、モデルの挙動を保ち、推論時にも速く扱える形式だ。JPEGのように表現を変えてから精度を配り、Zopfliのように作成時の探索へ計算を使う、という発想はここでつながる。ただし「JPEGっぽいからDCTを使う」「Zopfliっぽいから総当たりする」と言いたいわけではない。何を圧縮し、どの誤差が許され、どこに計算時間を使えるか、という問題の切り分け方を借りている。

一方で、変換を毎回推論時に実行したり、blockごとに異なる形式を読み分けたりすると、そのコストで帯域削減の利点が消えるかもしれない。サイズと誤差だけでなく、対象のGPUやkernelでの速度も測る必要がある。

この話を確かめるなら、まず比較の条件を揃えたい。例えば同じモデル、同じ校正データ、同じ保存bit数の上限を決め、一律の形式で量子化したものを基準にする。そのうえでblockごとのscaleや形式選択、丸め方の探索を一つずつ加え、独立した評価データで出力の変化を見る。変換や混合形式を試す場合は、重みファイルだけでなくメタデータの容量と実際の推論時間も含めて比較する。そうしないと「モデルの精度は上がったが、推論では使いにくくなった」という結果を見落とす。

ここまでに挙げたMicroMix、QuaRot、SpinQuant、AWQ、SignRoundなどは、それぞれ異なる部分に答えを出している。この記事の仮説を新しい方式として提示しているわけではない。JPEGとZopfliから得た発想のどこが既存の研究と重なり、どこに推論形式や評価の制約が残るのかを整理した段階だ。量子探索についても、理論的な問い合わせ回数から現実の高速化を主張する材料はない。

まとめ

FP8を調べていてFP6やFP4を知り、FP6の粗さを数字で見たところから、限られたbitをモデルのどこへどう使うかという話になった。何bitへ落とすかだけでなく、どの単位で分け、どの表現へ変換し、どの誤差をモデルが壊れたとみなすかを選ぶ必要がある。モデルの挙動の変化を許容範囲に抑えつつ、必要なbit数を減らす探索問題として考えられそうだ。

表現の変換、精度の配分、量子化時の最適化、rate-distortionには、それぞれ先行研究がある。そのおかげで、「同じbit数なら同じ精度」という単純な話ではないことも見えてきた。

それでも、FP6の8, 10, 12, 14を眺めたときの「11が入らないなら、どこに表現の細かさを回せばよいのか」という疑問は、意外と遠くまでつながった。FP6の形式を選ぶ話だけでなく、座標系を変える、重要な場所を守る、量子化時の候補を探す、そして何をもって「壊れた」とするのかまで考えることになった。実際に比較するなら、まずは同じ推論形式に出力できる候補を揃え、校正データと独立した評価データで、容量・速度・挙動の三つを測るところから始めたい。