ローカル LLM 量子化 入門ガイド|2026-08 版
第 9 章

品質はどれだけ落ちるのか

perplexity と KL ダイバージェンス、そして壊れやすいタスク

この章で分かること

「体感で変わらない」は証拠にならない

Q4_K_M のモデルを落として何度か話しかけ、「特に問題なさそう」と結論する。よくある判断ですが、材料としては使えません。理由は劣化の出方にあります。

量子化がもたらす変化は「モデルが壊れる」ではなく、1 トークンごとに、次の 1 語を選ぶ確率がわずかにずれることです。ずれは大半の場面で無害です。1 位の候補が圧倒的なとき、確率が少し動いても 1 位は 1 位のままだからです。表に出るのは 1 位と 2 位が競っている場面だけで、そこで選択が入れ替わると、以降の文章はその分岐の上に積み上がっていきます。つまり劣化には「短い応答では見えにくく、長い生成や多段の推論で増幅される」という性質があります。人間が数回試して確かめられる量ではありません。

だから数値で測ります。この章で使う指標は 2 つです。

量子化の評価で本命は後者です。私たちが知りたいのは「このモデルは賢いか」ではなく「元のモデルと同じものが手元で動いているか」だからです。

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 つです。

さらに 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」となっています。

「日本の首都は」の次に来るトークン候補(模式例) FP16 の分布 p 量子化後の分布 q 1 位が入れ替わる 確率 0.40 0.34 0.36 0.41 0.12 0.13 0.08 0.08 0.04 0.04 東京 東京都 日本 大阪 京都 KLD = Σ p × ln(p/q) = 0.0086(この 1 トークンぶん) 確率の差は小さいが、1 位と 2 位が競っている場面では答えが変わる
図 9-1 左(白)が量子化前、右(灰)が量子化後の確率です。差はどれも 0.06 以内で、KLD も 0.0086 という小さな値です。それでも 1 位の座は「東京」から「東京都」へ移ります。PPL は正解トークンの確率しか見ないので、この入れ替わりを直接は捉えません。数値は仕組みを見せるための模式例です。

計算例として図 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 点までです。

学術側の裏づけは 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 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 だけを見て「ほぼ同じ」と判断するのが危ういのは、この落差のせいです。

やってみる 9-1|自分のモデルで PPL と KLD を測る

公式スコアボードは Llama-3-8B の値です。自分が使うモデルの数字が知りたいなら、llama-perplexity で測れます。ダウンロードと 2 回の実行で終わりますが、ディスクと時間は覚悟が要ります。

  1. Wikitext-2 のテストセットを取得する(llama.cpp のリポジトリ内で実行)
  2. FP16(または BF16)版の GGUF で logits を丸ごと保存する
  3. 量子化版に同じ 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ΔPPLKLDMean Δp
f16なし14.976.2332+0.00150.000551+0.001 %
q8_0なし7.966.2343+0.00270.001355−0.019 %
q6_Kなし6.146.2534+0.02170.005452−0.007 %
q5_K_Mなし5.336.2886+0.05700.010762−0.114 %
q4_K_MWT 10m4.586.3829+0.15130.028152−0.389 %
q4_K_Mなし4.586.4071+0.17550.031273−0.596 %
q4_0なし4.346.7001+0.46850.071940−1.588 %
q3_K_MWT 10m3.746.7343+0.50260.084358−1.198 %
q3_K_Mなし3.746.8885+0.65690.101913−1.990 %
q3_K_Sなし3.417.8638+1.63220.228217−5.604 %
q2_KWT 10m2.968.6478+2.41620.332223−6.500 %
q2_Kなし2.969.7516+3.51990.445132−9.123 %
iq2_XXSWT 10m2.2414.0918+7.86010.812022−14.363 %
iq1_SWT 10m1.8860.6946+54.46302.254554−31.973 %
perplexity(低いほど良い・対数目盛) 6.2 8 10 20 40 60 2 3 4 5 6 7 8 ファイルサイズ (GiB) IQ2_XXS 以下で急に崩れる IQ1_S 60.69 IQ2_XXS 14.09 Q2_K 9.75 Q3_K_S 7.86 Q4_0 6.70 Q3_K_M 6.89 Q6_K 6.25 Q4_K_M 6.41 Q8_0 6.23
図 9-2 横軸がファイルサイズ、縦軸が perplexity(対数目盛)です。FP16 の値は 6.2332 で、Q8_0 から Q4_K_M までは実質そこに張り付いています。Q4_0 だけは曲線の上(悪い側)に外れていますが、対数目盛では差がほとんど見えません。数字で見ると ΔPPL は +0.4685 対 +0.1755 で 2.7 倍の開きがあります。IQ2_XXS と IQ1_S は imatrix あり(WT 10m)の行、それ以外は imatrix なしの行です。

この表と図から、出典に基づいて言えることを整理します。

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 を並べているからです。

同じ約 5.1 GB の予算での対決 予算 5.15 GB LLaMA 13B LLaMA 7B Q2_K 5.13 GB Q6_K 5.15 GB PPL 5.8545 PPL 5.9110 同じ 13B を 4bit にすると、7B の FP16 より小さくて良い LLaMA 13B LLaMA 7B Q4_K_S 6.80 GB F16 13.00 GB PPL 5.3404 PPL 5.9066 0 2 4 6 8 10 12 GB
図 9-3 バーの長さがファイルサイズ、右端の数字が Wikitext perplexity です。上の 2 本は同じ約 5.1 GB での対決で、2bit の 13B が 6bit の 7B に勝っています。下の 2 本では、13B の 4bit が半分のサイズで 7B の FP16 を上回りました。出典は llama.cpp PR #1684(LLaMA 1 系、同一実装・同一データ)です。

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 つあり、どれも一次データで確認できます。

指標L2 7B q4_K_ML3 8B q4_K_ML2 7B q2_KL3 8B q2_K
Mean ΔPPL0.08250.17550.62563.5199
Mean KLD0.0126860.0312730.1089030.445132
Mean Δp−0.416 %−0.596 %−2.710 %−9.123 %
Same top p94.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
コード生成・STEMLLM 判定(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 が多言語です。

100%(BF16 と同等) Arena Hard GSM8K MMLU HumanEval+ Math Lv5 Hindi MMLU MMLU-Pro MuSR 105.4% 100.2% 97.9% 97.4% 94.4% 94.1% 93.6% 83.2% 80% 85% 90% 95% 100% 105% recovery = 量子化後スコア ÷ BF16 スコア。横軸は 80 % 起点(0 起点ではない)
図 9-4 同じ 1 つの 4bit モデルの数値です。破線が「BF16 と同じ」の位置で、MuSR は 83.2 % まで落ち、Arena Hard は 105.4 %(上振れ)になっています。差を見やすくするため横軸は 80 % から始めているので、バーの長さの比ではなく破線からの距離で読んでください。平均 98.9 % という 1 つの数字では、この散らばりは見えません。

上振れの項目があるのも見どころです。モデルカードには図に載せていない項目もあって、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 が示す傾向と、タスク精度で測ったサーバ側の結論はここで一致します。

つまずきポイント

PPL の絶対値で別のモデルを比べてしまう

「モデル A の PPL は 6.2、モデル B は 7.1 だから A が良い」は成立しません。トークナイザが違えば「1 トークン」の定義が違い、実装が違えば計算も違います。公式が「not directly comparable between models」と明記しているのはこの理由です。PPL は同じモデルの FP16 版と量子化版の差を見るためだけに使います。

ΔPPL が小さいから安全だと判断する

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 つ揃えて読んでください。

英語ベンチマークの recovery を日本語運用の根拠にする

同じ 4bit モデルで Hindi MMLU の recovery は 94.1 %、Thai は 95.1 %、ラテン文字系は 96〜98 % です。さらに arXiv:2407.03211(Cohere)の測定では、日本語の自動指標 −1.7 % に対し人間評価は −16.0 % でした。日本語で使うなら、自分の実タスクで人が読んで確かめるしかありません。

KLD の測定コストを見落とす

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 による評価で明確に落ちるという報告もあります。用途に近いタスクを個別に確認し、最終判断は自分のプロンプトで行ってください。

まとめ

ここまでで「どれを選ぶか」の根拠は揃いました。次章では Ollama / LM Studio / llama.cpp / MLX / vLLM を実際に動かし、選んだモデルを手元に降ろします。

参考リンク