- 「使ってみたけど体感は変わらない」が証拠にならない理由と、代わりに使う 2 つの指標
- perplexity と KL ダイバージェンスが何を測っているのか、そして何と何なら比べていいのか
- llama.cpp 公式スコアボードの実測値から読める、ビット数ごとの劣化の相場
- 同じメモリ予算で「大きいモデルを強く量子化」が有利になる条件と、その例外
- 量子化で先に壊れるタスク(日本語・長文・数学)と、ベンチマーク平均が見落とすもの
「体感で変わらない」は証拠にならない
Q4_K_M のモデルを落として何度か話しかけ、「特に問題なさそう」と結論する。よくある判断ですが、材料としては使えません。理由は劣化の出方にあります。
量子化がもたらす変化は「モデルが壊れる」ではなく、1 トークンごとに、次の 1 語を選ぶ確率がわずかにずれることです。ずれは大半の場面で無害です。1 位の候補が圧倒的なとき、確率が少し動いても 1 位は 1 位のままだからです。表に出るのは 1 位と 2 位が競っている場面だけで、そこで選択が入れ替わると、以降の文章はその分岐の上に積み上がっていきます。つまり劣化には「短い応答では見えにくく、長い生成や多段の推論で増幅される」という性質があります。人間が数回試して確かめられる量ではありません。
だから数値で測ります。この章で使う指標は 2 つです。
- perplexity(PPL) — そのモデルがテキストをどれだけ言い当てられるか。モデル単体の予測力
- KL ダイバージェンス(KLD) — 量子化前のモデルの出力分布と量子化後の分布がどれだけ違うか。「元と同じ振る舞いか」
量子化の評価で本命は後者です。私たちが知りたいのは「このモデルは賢いか」ではなく「元のモデルと同じものが手元で動いているか」だからです。
perplexity — 次の 1 語を何択で迷っていたか
llama.cpp 公式ドキュメントの定義は「Perplexity measures how well the model can predict the next token with lower values being better.」(次のトークンをどれだけうまく予測できるかを測る。低いほど良い)です。素人向けに言い換えると、PPL は「次の 1 トークンを選ぶとき、実質何択で迷っていたか」の平均です。PPL 4.0 なら平均 4 択、6.2 なら 6.2 択で迷っていた。少ない選択肢で正解を当てられるモデルの方が優秀なので、低いほど良い数値になります。
計算の手順はこうです。テキストを 1 トークンずつ進めながら、モデルが「実際に来た正解トークン」に与えた確率を記録する。その対数の平均を取り、符号を反転して指数に戻す。
PPL = exp( −(1/t) × Σ ln p(正解トークン | それまでの文脈) )
計算例を置きます。3 トークンの文で、正解トークンに与えた確率が順に 0.5 / 0.25 / 0.5 だったとします。ln 0.5 = −0.6931、ln 0.25 = −1.3863 なので合計は −2.7725、平均は −0.9242、符号を反転して 0.9242、exp(0.9242) = 2.52。「平均 2.5 択で迷っていた」と読めます。もし 3 つとも 0.25 なら exp(1.3863) = 4.00 で、ちょうど 4 択と一致します。この一致が「何択か」という直感の根拠です。
ここからが重要で、PPL は絶対値を比べてよい相手が極端に狭い指標です。公式ドキュメントが明示している制約は次の 3 つです。
- 「perplexity is not directly comparable between models, especially if they use different tokenizers」— トークナイザが違えば「1 トークン」の単位そのものが違うので、別モデルの PPL を並べても意味がない
- 「llama.cpp numbers are not directly comparable to those of other projects」— 実装依存で値が変わる
- 「finetunes typically result in a higher perplexity value even though the human-rated quality of outputs increases」— 指示追従のためにファインチューンすると PPL は悪化するのに、人間の評価は上がる
さらに Hugging Face の解説は、固定長モデルでテキストをぶつ切りにして測る素朴な方法を「a poor approximation」と呼び、文脈が短くなるぶん PPL が悪く(高く)出ると書いています。結局、同じモデル・同じデータ・同じコンテキスト長・同じ実装という 4 条件が揃ったときだけ、差分に意味があります。llama.cpp が PPL を使う用途もそこに限定されていて、公式の言い方は「the perplexity of base models is used primarily to judge the quality loss from e.g. quantized models vs. FP16」です。慣習として使うデータは Wikitext-2 のテストセット(= 英語版 Wikipedia の記事から作られた、言語モデル評価の定番テキスト。scripts/get-wikitext-2.sh で取得できます)です。
KL ダイバージェンス — 分布のズレを直接見る
PPL の弱点は「正解トークンに与えた確率しか見ない」ことです。語彙は数万〜十数万トークンあり、そのうちの 1 つだけを見ているので、上位候補の順位が入れ替わっても、正解の確率が変わっていなければ PPL は動きません。
KL ダイバージェンスはそこを直接見ます。比べるのは logits(= モデルが最後に吐き出す、語彙の全トークンぶんの生のスコア列。これを softmax 関数に通すと確率分布になります)から作った確率分布です。量子化前(FP16)の分布を p、量子化後を q として、語彙のすべてのトークン v について足し合わせます。
KLD = Σ p(v) × ln( p(v) / q(v) )
これは「p が正しいのに q を使ってしまったときに、余分に払う情報量」で、0 なら 2 つの分布は完全に同じです。公式の説明も「a measure of how similar the FP16 and the quantized logit distributions are with a value of 0 indicating that the distribution are the same」となっています。
計算例として図 9-1 の数値を式に入れると、0.40×ln(0.40/0.34) + 0.36×ln(0.36/0.41) + 0.12×ln(0.12/0.13) = 0.0650 − 0.0468 − 0.0096 = 0.0086 になります(残る 2 候補は p = q なので 0)。実測でも Llama-2-7B の q4_K_M の平均 KLD は 0.012686 で、同じ桁です。
「KLD の方が鋭い」とどこまで言えるか
llama.cpp の README に「KLD の方が鋭い」と書かれた一文はありません。公式から読み取れるのは次の 3 点までです。
- 公式スコアボードは「sorted by Kullback-Leibler divergence relative to FP16」。量子化タイプの序列付けに使われているのは PPL ではなく KLD
- README 自身が「K-quants score better on mean Δp than the legacy quants than e.g. KL divergence would suggest」と書いており、指標を変えると順位が入れ替わることを認めている
- KLD 系の統計を追加した PR #6936 の動機は「LLaMA 3 は LLaMA 2 より量子化で壊れやすいという体感報告」の検証で、作者は「My findings align with the subjective reports.」と結論した。PPL だけでは説明しきれなかった体感差を、追加統計が裏づけた
学術側の裏づけは arXiv:2407.09141「Accuracy is Not All You Need」です。正答率が同じでも答えが正解↔不正解に入れ替わる flips が起きることを示し、「compression techniques should also be evaluated using distance metrics. We propose two such metrics, KL-Divergence and flips」と主張しています。
Same top p — 何トークンに 1 回、違う語を選ぶか
--kl-divergence を付けると KLD 以外の統計も出ます。実務で効くのは 2 つです。
- Same top p — FP16 と量子化版が同じトークンを 1 位に選んだ割合。Llama-3-8B の q4_K_M は 91.901 ± 0.072 %
- Δp のパーセンタイル — Δp は「正解トークンに与えた確率が FP16 から何ポイント動いたか」で、負なら悪化です。公式の読み方は「パーセンタイルが対称ならノイズを足しただけ。負側が明らかに大きければ、実際に悪化している」
Same top p 91.901 % は感覚に直せます。100 − 91.901 = 8.099 % なので、計算例として 1 ÷ 0.08099 = 12.3、約 12 トークンに 1 回、FP16 とは違うトークンを 1 位に選んでいることになります。同じ設定の ΔPPL は +0.1755(PPL 比 1.028、わずか 2.8 % 増)です。PPL だけを見て「ほぼ同じ」と判断するのが危ういのは、この落差のせいです。
公式スコアボードは Llama-3-8B の値です。自分が使うモデルの数字が知りたいなら、llama-perplexity で測れます。ダウンロードと 2 回の実行で終わりますが、ディスクと時間は覚悟が要ります。
- Wikitext-2 のテストセットを取得する(llama.cpp のリポジトリ内で実行)
- FP16(または BF16)版の GGUF で logits を丸ごと保存する
- 量子化版に同じ logits ファイルを渡して KLD を計算する
./scripts/get-wikitext-2.sh
llama-perplexity -m models/Model-F16.gguf \
-f wikitext-2-raw/wiki.test.raw \
--kl-divergence-base f16-logits.kld -ngl 99
llama-perplexity -m models/Model-Q4_K_M.gguf \
-f wikitext-2-raw/wiki.test.raw \
--kl-divergence-base f16-logits.kld --kl-divergence -ngl 99
2 本目の実行が終わると、Mean PPL / Mean ΔPPL / Mean KLD / Mean Δp / RMS Δp / Same top p が表示されます。注意点は logits ファイルの大きさで、公式の記載は「11 GiB for LLaMA 2 or 37 GiB for LLaMA 3 when using the Wikitext-2 test set」。空き容量を先に確認してください。軽く試すだけなら wiki.test.raw の先頭だけを切り出した小さいファイルを -f に渡します(その場合は絶対値ではなく、同じファイルで測った量子化版どうしの差だけを見ます)。--kl-divergence と --kl-divergence-base は llama-perplexity 専用のオプションです。
実測値 — ビット数ごとの相場
llama.cpp 公式の Llama-3-8B スコアボードから抜粋します。測定条件は Revision f364eb6f / CUDA バックエンド / CPU AMD Epyc 7742 / GPU 1x NVIDIA RTX 4090、データは Wikitext-2 テストセットです。imatrix 列の「WT 10m」は Wikitext 1,000 万トークンで作った importance matrix を使ったことを意味します。f16 行が 0 でないのは、logits を 16bit 整数に落として保存している分の差です。
| 型 | imatrix | サイズ (GiB) | PPL | ΔPPL | KLD | Mean Δp |
|---|---|---|---|---|---|---|
| f16 | なし | 14.97 | 6.2332 | +0.0015 | 0.000551 | +0.001 % |
| q8_0 | なし | 7.96 | 6.2343 | +0.0027 | 0.001355 | −0.019 % |
| q6_K | なし | 6.14 | 6.2534 | +0.0217 | 0.005452 | −0.007 % |
| q5_K_M | なし | 5.33 | 6.2886 | +0.0570 | 0.010762 | −0.114 % |
| q4_K_M | WT 10m | 4.58 | 6.3829 | +0.1513 | 0.028152 | −0.389 % |
| q4_K_M | なし | 4.58 | 6.4071 | +0.1755 | 0.031273 | −0.596 % |
| q4_0 | なし | 4.34 | 6.7001 | +0.4685 | 0.071940 | −1.588 % |
| q3_K_M | WT 10m | 3.74 | 6.7343 | +0.5026 | 0.084358 | −1.198 % |
| q3_K_M | なし | 3.74 | 6.8885 | +0.6569 | 0.101913 | −1.990 % |
| q3_K_S | なし | 3.41 | 7.8638 | +1.6322 | 0.228217 | −5.604 % |
| q2_K | WT 10m | 2.96 | 8.6478 | +2.4162 | 0.332223 | −6.500 % |
| q2_K | なし | 2.96 | 9.7516 | +3.5199 | 0.445132 | −9.123 % |
| iq2_XXS | WT 10m | 2.24 | 14.0918 | +7.8601 | 0.812022 | −14.363 % |
| iq1_S | WT 10m | 1.88 | 60.6946 | +54.4630 | 2.254554 | −31.973 % |
この表と図から、出典に基づいて言えることを整理します。
- 8bit はほぼ無害。 q8_0 の ΔPPL は +0.0027、KLD は 0.001355。同じ条件の f16 行(+0.0015)とほとんど区別できない水準です
- 6bit も実質無害。 q6_K は ΔPPL +0.0217。k-quants を導入した PR #1684 も「the 6-bit quantized perplexity is within 0.1% or better from the original fp16 model」と書いています
- 4bit(K-quants)が実用域。 q4_K_M は ΔPPL +0.1755、PPL 比 1.028。HF 上の GGUF モデルカードで見かける「recommended」表記の出所は、llama.cpp にかつて同梱されていた量子化スクリプト
examples/make-ggml.py(現在は削除済み)の「Q4_K_M: medium, balanced quality - recommended」という 1 行です。ただし Same top p は 91.9 % で、無害ではありません - 同じ 4bit でも legacy は損。 q4_0 は q4_K_M より 0.24 GiB 小さいだけで ΔPPL が約 2.7 倍(+0.4685)、KLD が約 2.3 倍。同じスクリプトは「Q4_0: small, very high quality loss - legacy, prefer using Q3_K_M」とも書いていました。名前の数字ではなく設計で決まります(Q4_K_M の中身は第 6 章で開けます)
- 3bit 以下は用途次第。 q3_K_M は +0.6569、imatrix を使えば +0.5026 まで戻りますが、q3_K_S は +1.6322。ここから imatrix の効き方が大きくなります
- 2bit は imatrix 前提でも劣化が見える。 q2_K は imatrix ありで +2.4162、なしで +3.5199(PPL 比 1.565)。Same top p は 71.1 % まで落ちます。さらに iq1_S では PPL 60.69 と、FP16 の約 10 倍です
imatrix については、公式スコアボードの結論が「There seems to be no consistent improvement from using more Wikitext tokens for the importance matrix.」です。q2_K を 1,000 トークンで作った imatrix と 1,000 万トークンで作った imatrix で PPL は 8.683 と 8.648、誤差の範囲です。あり/なしの差は明確だが、量を増やす効果は当てにできないと読みます。imatrix の作り方は第 10 章で扱います。
同じメモリ予算なら、どちらが得か
「16 GB しか積んでいない。13B を強く量子化するか、7B を軽く量子化するか」。これは一次データで直接答えられます。k-quants 導入 PR #1684 が、同じ実装・同じデータで測った Wikitext perplexity を並べているからです。
PR #1684 自身の結論も「generation performance as measured by perplexity is basically a fairly smooth function of quantized model size」です。PPL は「量子化後のファイルサイズ」のほぼ滑らかな関数になり、同じ予算なら大きいモデルを強く量子化する方が有利になりやすい。学術側では arXiv:2212.09720(35,000 以上の実験、19M〜176B)が「4-bit precision is almost universally optimal for total model bits and zero-shot accuracy」と結論しています。HQQ 公式ブログの実測も、2bit の Llama-2-70B(PPL 4.12)が FP16 の Llama-2-13B(4.63)を上回ったと報告しています。実行時の GPU メモリは 30.27 GB 対 25.6 GB で、ほぼ同じ規模の機材に載るということです(図 9-3 はファイルサイズ、こちらは実行時メモリなので、軸が違う点に注意してください)。
ただし例外が 3 つあり、どれも一次データで確認できます。
- 小さいモデルの 2bit は崩壊する。 HQQ ブログの Llama-2-7B の 2bit は PPL 15.61(グループサイズ 32)/7.3(同 16。scale を共有する単位で、第 5 章で扱いました)で、FP16 の 5.18 から大きく離れます。「大きいモデルなら 2bit も使える」は 70B 級の話です
- 相対誤差はモデルサイズに単調ではない。 PR #1684 は「the relative quantization error ... does not decrease with increasing number of weights in the base model」と観測しています。13B は量子化しやすかったが、30B・65B では 7B 水準に戻った
- 新しくよく学習されたモデルほど壊れやすい。 下の表がそれです
| 指標 | L2 7B q4_K_M | L3 8B q4_K_M | L2 7B q2_K | L3 8B q2_K |
|---|---|---|---|---|
| Mean ΔPPL | 0.0825 | 0.1755 | 0.6256 | 3.5199 |
| Mean KLD | 0.012686 | 0.031273 | 0.108903 | 0.445132 |
| Mean Δp | −0.416 % | −0.596 % | −2.710 % | −9.123 % |
| Same top p | 94.665 % | 91.901 % | 85.584 % | 71.138 % |
同じ q4_K_M で KLD が約 2.5 倍、q2_K では約 4 倍に増えています。arXiv:2411.04330「Scaling Laws for Precision」はこれを定式化して、「the degradation introduced by post-training quantization increases as models are trained on more data, eventually making additional pretraining data actively harmful」と述べています。学習トークンを多く注ぎ込んだモデルは重みに情報が詰まっていて、削れる余白が少ないという理解です。したがって「去年 4bit で問題なかったから今年の新モデルも大丈夫」は成り立ちません。世代が変わったら測り直します。
先に壊れるタスクと、ベンチマークの落とし穴
劣化は全タスクに均等に来ません。出典のある観測をまとめます。
| 領域 | 観測されたこと | 出典 |
|---|---|---|
| 多言語(非ラテン文字) | 「a 1.7% average drop in Japanese across automatic tasks corresponds to a 16.0% drop reported by human evaluators on realistic prompts」。非ラテン文字の言語が最も影響を受ける | arXiv:2407.03211 |
| 多言語(反対の観測) | 「We do not observe significantly different impacts of quantization across different languages.」ただし根拠は中国語(CHID)と英語(Winogrande)の穴埋めタスク 2 言語の自動スコア比較のみ | arXiv:2402.18158 |
| 長文・long context | 「Long texts (≥4k) are more sensitive to Weight-only and KV Cache Quantization than short texts (<4k)」。かつ多くのモデルは重みより KV キャッシュの量子化に敏感 | arXiv:2402.18158 |
| 崩れ方の順序 | ビット幅を下げると、文単位の繰り返し → トークン単位の繰り返し → トークン単位のランダム化、の順で壊れる | arXiv:2402.18158 |
| 数学・多段推論 | 多段の数学推論は他の能力より許容度が低い。LLaMA2-70B の誤りを分類すると約半分が「incorrect logic」(論理そのものの誤り)で、計算間違いの約 20 % を大きく上回る。「challenging tasks like mathematical reasoning degrade fastest」 | arXiv:2402.18158 / arXiv:2407.03211 |
| コード生成・STEM | LLM 判定(MT-Bench)で「significant performance declines in Coding and STEM tasks」。ただし難易度そのものが決め手ではなく、量子化は「magnifies a model's inherent weaknesses rather than simply correlating with task difficulty」(元から弱い部分を拡大する) | arXiv:2409.11055 |
| 推論特化モデル | W8A8 と W4A16 はほぼ無損失、それより低いビット幅で顕著に劣化。決め手は「model size, model origin, and task difficulty」 | arXiv:2504.04823 |
日本語で使う人にとって重要なのは 1 行目です。同じモデル・同じ量子化について、自動ベンチマークでは −1.7 % に見えた日本語の劣化が、人間の評価では −16.0 % として現れた。この 1.7 対 16.0 という開きが「自動指標は人間が感じる劣化を過小評価する」ことの直接の証拠です。2 行目の「言語ごとの差は見られない」は矛盾する結論に見えますが、こちらは中国語と英語の穴埋めタスクを自動スコアで比べただけで、人間評価も日本語も入っていません。範囲が違うので、1 行目を打ち消す反証にはなりません。
もう 1 つ、結論が割れているのが難易度との関係です。arXiv:2407.03211 は「難しいタスクから先に劣化する」と書き、arXiv:2409.11055 は「難易度だけでは決まらない(元から弱い部分が拡大される)」と書いています。共通しているのは劣化が均等には来ないことなので、平均ではなく自分の用途に近い項目を見るしかありません。長文の崩れについては、重みのビット数ではなく KV キャッシュの量子化を先に疑ってください(KV キャッシュのメモリと設定は第 8 章、形式ごとの選び分けは第 7 章です)。
平均スコアは量子化の劣化に鈍感
MMLU のようなベンチマークの平均値は、量子化の判断材料としては鈍いことがあります。RedHatAI 公式モデルカード(Meta-Llama-3.1-8B-Instruct を INT4 weight-only、group_size 128、GPTQ で量子化)の recovery(= 量子化後スコア ÷ BF16 スコア)を見ると、OpenLLM v1 の平均は 98.9 % です。ところが個別には大きく割れます。下の図の 8 項目はモデルカードのカテゴリで言うと、Arena Hard が LLM 判定、MMLU と GSM8K が OpenLLM v1、MMLU-Pro・Math Lv5・MuSR が OpenLLM v2(BF16 の素点自体が 30.8 / 15.7 / 7.6 点と低い難問群)、HumanEval+ がコーディング、Hindi MMLU が多言語です。
上振れの項目があるのも見どころです。モデルカードには図に載せていない項目もあって、GPQA は 109.8 %、図にもある Arena Hard は 105.4 % で「量子化して良くなった」ように見えます。ただし素点を見ると GPQA は BF16 の 3.7 点に対し量子化版が 4.0 点、つまり低スコア帯での 0.3 点差です(Arena Hard も 25.8 → 27.2)。実力が上がったのではなく、arXiv:2407.09141 の flips、つまり正解と不正解が両方向に入れ替わる現象がスコアの揺れとして表に出たものと読むのが妥当です。同論文は自由生成タスク(MT-Bench)では「compressed models are significantly worse than baseline models」だとも報告しています。平均を見て安心せず、自分が使うタスクに近い項目を個別に見る。最後は自分のプロンプトで人が読んで判断するのが結論です。
なお 8bit については、Llama-3.1 全ファミリを 50 万回以上評価した arXiv:2411.02355 が「FP8 (W8A8-FP) is effectively lossless across all model scales」「well-tuned INT8 (W8A8-INT) achieves surprisingly low (1-3%) accuracy degradation」「INT4 weight-only (W4A16-INT) is more competitive than expected, rivaling 8-bit quantization」と結論しています。8bit は実質無損失、4bit の重みだけの量子化は 8bit と張り合える。llama.cpp の PPL / KLD が示す傾向と、タスク精度で測ったサーバ側の結論はここで一致します。
つまずきポイント
「モデル A の PPL は 6.2、モデル B は 7.1 だから A が良い」は成立しません。トークナイザが違えば「1 トークン」の定義が違い、実装が違えば計算も違います。公式が「not directly comparable between models」と明記しているのはこの理由です。PPL は同じモデルの FP16 版と量子化版の差を見るためだけに使います。
Llama-3-8B の q4_K_M は ΔPPL +0.1755(+2.8 %)ですが、Same top p は 91.9 %。約 12 トークンに 1 回、FP16 とは違う語を 1 位に選びます。短い応答では表に出ませんが、長文生成や多段推論ではその分岐が積み上がります。PPL・KLD・Same top p は 3 つ揃えて読んでください。
同じ 4bit モデルで Hindi MMLU の recovery は 94.1 %、Thai は 95.1 %、ラテン文字系は 96〜98 % です。さらに arXiv:2407.03211(Cohere)の測定では、日本語の自動指標 −1.7 % に対し人間評価は −16.0 % でした。日本語で使うなら、自分の実タスクで人が読んで確かめるしかありません。
KLD には FP16 モデルの logits を全部保存したファイルが必要で、公式の記載は「11 GiB for LLaMA 2 or 37 GiB for LLaMA 3」。しかも FP16 版のモデル本体も落としておく必要があります。「量子化版だけ持っていて KLD を測る」はできません。空きディスクを先に確認してください。
理解度チェック
Q1. PPL 6.2 のモデル A と PPL 7.1 のモデル B。A の方が優秀だと言えますか?
言えません。PPL はトークナイザと実装に強く依存するため、公式が「not directly comparable between models, especially if they use different tokenizers」と明記しています。ファインチューンしたモデルは PPL が悪化するのに人間評価は上がる、という例もあります。PPL は同じモデルの FP16 版と量子化版を比べる差分専用の指標です。
Q2. ΔPPL が +0.1755(2.8 % 増)なのに Same top p が 91.9 % というのは、どういう状態ですか?
「正解トークンに与えた確率の平均はほとんど変わっていないが、1 位に選ぶ語は約 12 トークンに 1 回入れ替わっている」状態です。PPL は正解トークンの確率だけを見るので、上位候補の順位の入れ替わりを直接は捉えません。長い生成ではこの分岐が積み上がるため、PPL の小ささを安全の根拠にはできません。
Q3. KLD を測るのに、なぜ量子化前のモデルが必要なのですか?
KLD は「元の分布 p と量子化後の分布 q のズレ」なので、p を作れる FP16(または BF16)版がないと定義できません。llama.cpp の手順では、まず FP16 モデルで --kl-divergence-base に logits を書き出し、次に量子化モデルで同じファイルを参照しつつ --kl-divergence を渡します。PPL のように量子化版だけでは測れません。
Q4. 5 GB の予算しかありません。13B の Q2_K と 7B の Q6_K、どちらを選びますか?
この 2 つなら 13B の Q2_K です。PR #1684 の実測では 13B Q2_K(5.13 GB)が PPL 5.8545、7B Q6_K(5.15 GB)が 5.9110 でした。ただし前提が 2 つあります。2bit が成立するのは十分大きいモデルのときで、HQQ の実測では 7B の 2bit は PPL 5.18 → 7.3〜15.61(グループサイズ次第)まで崩れます。また新しい世代のモデルは同じビット数でも劣化が大きいので、実際に使うモデルで測り直すのが安全です。
Q5. ある 4bit モデルの MMLU recovery が 97.9 % でした。安心して日本語のコード解説に使えますか?
その 1 つの数字では判断できません。同じモデルカードの中でも MuSR は 83.2 %、MMLU-Pro は 93.6 % まで落ちています。加えて日本語では自動指標 −1.7 % に対し人間評価 −16.0 % という報告があり、コードや STEM は LLM による評価で明確に落ちるという報告もあります。用途に近いタスクを個別に確認し、最終判断は自分のプロンプトで行ってください。
まとめ
- 量子化の劣化は「毎トークンの確率が少しずれる」形で現れる。短い試用では見えないので、PPL(予測力)と KLD(元との分布のズレ)で測る
- PPL は「実質何択で迷っていたか」。同じモデル・同じデータ・同じコンテキスト長・同じ実装の 4 条件が揃った差分でしか使えない
- KLD は語彙全体の分布のズレを 1 つの数にする。0 なら完全一致。llama.cpp が量子化タイプを並べる基準も KLD で、Same top p を添えて読む
- Llama-3-8B の実測では、8bit と 6bit はほぼ無害、4bit の K-quants が実用域(Same top p 91.9 %)、3bit 以下は用途次第、2bit は imatrix 前提でも劣化が見える
- 同じ予算なら大きいモデルを強く量子化する方が有利になりやすい。ただし小型モデルの 2bit は崩壊し、新しい世代のモデルは同じビット数でも劣化が大きい
- 先に壊れるのは非ラテン文字の言語・長文・数学・コード。ベンチマークの平均は鈍感なので、用途に近い項目を個別に見て、最後は人が読んで判断する
ここまでで「どれを選ぶか」の根拠は揃いました。次章では Ollama / LM Studio / llama.cpp / MLX / vLLM を実際に動かし、選んだモデルを手元に降ろします。
参考リンク
- llama.cpp — tools/perplexity/README.md(PPL / KLD の定義とスコアボード)
- llama.cpp — tools/quantize/README.md(実効 bpw と量子化オプション)
- llama.cpp PR #1684 — k-quants の導入と同一予算比較
- llama.cpp PR #6936 — perplexity に KLD 系統計を追加
- Hugging Face Transformers — Perplexity of fixed-length models
- RedHatAI — Meta-Llama-3.1-8B-Instruct-quantized.w4a16 モデルカード
- arXiv:2407.09141 — Accuracy is Not All You Need
- arXiv:2407.03211 — How Does Quantization Affect Multilingual LLMs?
- arXiv:2402.18158 — Evaluating Quantized Large Language Models
- arXiv:2409.11055 — Exploring the Trade-Offs: Quantization Methods, Task Difficulty, and Model Size
- arXiv:2504.04823 — Quantization Hurts Reasoning?(推論特化モデルの量子化)
- arXiv:2411.02355 — Accuracy-Performance Trade-Offs in LLM Quantization
- arXiv:2411.04330 — Scaling Laws for Precision
- arXiv:2212.09720 — The case for 4-bit precision
- HQQ 公式ブログ(2bit の 70B と FP16 の 13B の比較表)
- EleutherAI — lm-evaluation-harness