ベンチで賢かったAIが、本番で急に間違え始めた
「テストの点」と「本番の実力」がずれた、たった一つの理由
微調整した8Bモデルが、ベンチマークでは優等生なのに、本番想定では小さい4Bに負けた(21対11)。器の限界に見えた。
犯人はモデルでも学習でもなく、学習した環境と本番の環境で精度が違っていたことだった。同じアダプターを両方の土台に載せて比べると、23対2で環境のずれだと分かった。
本番の圧縮を織り込んで仕込み直すと、8Bは4Bを上回った。腕を仕込む条件と、出す条件を揃える。それだけで、消えていた腕前がそのまま出た。
勝つはずの手札があった。
翻訳の品質を上げたい。ならばモデルは大きいほうがいい——8B(80億パラメータ)は、小さい4Bより多くのことを覚えていて、微妙な文脈を読み取れる。実際、前回の微調整で仕込んだ8Bは、手元のベンチマークで文句なしの成績を出していた。あとは本番に載せるだけ。そう思っていた。
ところが、本番想定の環境に載せて品質を測り直すと、その8Bが、小さいはずの4Bに負けた。ある評価では21対11。順序が逆だ。大きいモデルのほうが賢いはず——なのに、本番では小さいモデルのほうが勝っている。
一度は、こう結論しかけた。「Liveの翻訳は、素直に4Bに載せよう」と。大きいモデルは、この用途には向かないのだ、と。
それが間違いだった。8Bは弱くなっていない。測っていた8Bと、本番に載せた8Bが、別物だったのだ。
ベンチと本番で、モデルの「精度」が違っていた
種明かしをする前に、言葉を1つだけ。量子化(りょうしか)とは、モデルという「巨大な数字の山」を、より少ないビット数で保存し直して軽くする圧縮技術だ。詳しくは第1回に書いたが、要点はこうだ——本番のGPUで速く・安く動かすために、モデルは圧縮して載せる。
ここに落とし穴があった。ワークフローが、無自覚にこうなっていた。
- 微調整(学習)は、高精度のまま行う。数字を細かく持ったBF16という形式で、モデルに翻訳の腕を仕込む。
- 本番(デプロイ)は、圧縮して動かす。4分の1に縮めたINT4という形式で載せて、速さとコストを稼ぐ。
つまり、腕を仕込んだときの姿と、お客に出したときの姿が、違っていた。ベンチマークは高精度の姿で測り、本番は圧縮した姿で動く。テストの答案と、本番の答案を、別の人間が書いていたようなものだ。
同じアダプター、違う土台で、結果が裏返った
疑いを確かめるのは、拍子抜けするほど簡単だった。まったく同じ微調整(アダプター)を、2つの土台の上に載せて、同じ40問で戦わせればいい。
- 土台A=高精度(BF16)。学習したときと同じ姿。
- 土台B=圧縮(INT4)。本番でデプロイする姿。
(アダプターとは、土台のモデルに後付けする「腕の補正パーツ」のこと。土台が変わっても、載せる補正は寸分同じにした。)
結果が、露骨だった。審判は opus(第三者の高性能AIに2つの訳を並べ、どちらが良いかを判定させる手法)に任せた。
| 同じアダプター・土台だけ違う・40問中・opus判定 | 勝ち | 引き分け | 負け | 重大な欠陥 |
|---|---|---|---|---|
| 高精度(BF16)=学習時と同じ | 23 | 15 | 2 | 3 |
| 圧縮(INT4)=本番デプロイ | 2 | 15 | 23 | 22 |
同じ腕前を仕込んだはずのモデルが、土台を圧縮しただけで、勝ち23が2に転落した。しかも欠陥の中身を目で追うと、主語の取り違え(誰が言った台詞かを間違える)と否定の反転(「〜しない」を「〜する」にひっくり返す)——文の骨を折るタイプの誤りは、すべて圧縮側から出ていた。高精度側に残った欠陥3件は、いずれもそれ以外の軽微なものだった。
ベンチの好成績は、本番では再現しなかった。理由は性能でも学習の失敗でもない。測った姿と、動かす姿が、違った。それだけだった。
なぜ、圧縮すると腕が鈍るのか
不思議に思うかもしれない。第1回では「圧縮しても賢さはほぼ落ちない(品質−1ポイント)」と書いたはずだ。話が違うではないか、と。
矛盾はしていない。効きどころが違うのだ。
微調整で仕込む腕前は、モデル全体に薄く広く乗る補正だ。「この文脈なら主語はこちら」「この語調はこう訳す」という、僅差の判断を正しい側へ倒すための、繊細な上乗せ。ところが圧縮は、まさにその僅差の部分を最初に削る。数字を粗く丸めると、大勢は動かないが、きわどい判断は反転しやすい。せっかく微調整で倒した「主語」「否定」が、圧縮の丸め誤差で、また逆に倒れてしまう。
比喩を使えばこうだ。腕を仕込むときは、高精度の——目盛りの細かい定規で線を引いた。ところが本番では、目盛りの粗い定規に持ち替えて、その線を写し取ろうとした。細かく引いた線ほど、粗い定規では写しきれない。
直し方は、「本番の姿で仕込む」
原因がこれなら、直し方は明快だ。本番でデプロイするのと同じ圧縮した土台の上で、微調整を仕込み直す。目盛りの粗い定規を、最初から使って線を引く。丸め誤差を織り込んだ上で腕前を作れば、その腕前は本番でそのまま出る。この「学習と本番の精度を揃える」やり方を、quant-aware(本番精度を織り込んだ)学習と呼んでいる。
同じ40問で測り直した。
| Live翻訳 40問・opus判定 | 勝ち | 引き分け | 負け |
|---|---|---|---|
| 本番精度で仕込み直した8B vs 本番形式(INT8)の4B | 16 | 15 | 9 |
| 本番精度で仕込み直した8B vs 旧・不一致の8B | 20 | 12 | 8 |
一番はっきり効いたのは、旧来の不一致な8Bとの直接対決だ。20対8で上回り、なかでも優劣が決定的だった問だけを数えると10対0——主語と否定の誤りは、すべて旧来側に残り、仕込み直した側はきれいだった。相手を「本番形式のままの4B」に替えても、8Bは非後退だった(16勝/引分15/9敗、n=40。引分が15あるため「勝ち越し」と断ずるには足りないが、少なくとも負けてはいない)。「4Bに負ける」という思い込みは、ここで崩れた。マンガ翻訳でも、原文丸写し(echo)ゼロを434問で維持した。
「Liveは4Bに」という判断は、撤回した。8Bは、最初から弱くなどなかった。
モデルを疑う前に、測り方を疑う
一番こたえたのは、あやうくモデルの器(capacity)のせいにするところだった、という点だ。「8Bは、この用途には向かない」。もっともらしい仮説だし、そう結論すれば話は早い。だが真犯人は、モデルの中ではなく、モデルを測る手順のほうにいた。学習と本番で環境がずれていた——モデルの問題ではなく、システムの問題だった。
「賢いはずのAIが、本番で急に馬鹿になる」。この現象を見たとき、真っ先に疑うべきはモデルの実力ではない。ベンチと本番が、本当に同じ条件かである。
教訓
-
モデルより先に、測り方を疑え。 賢いはずのAIが本番で急に間違え始めたら、疑うのはモデルの器ではなく測定の手順だ。同じアダプターを学習時と本番の両方の姿に載せれば、犯人がモデルか環境かを切り分けられる(23対2で後者だった)。
-
腕を仕込む条件と、出す条件を揃える。 微調整と圧縮は別工程だが、噛み合わせを誤ると仕込んだ腕前が本番で消える。学習から配信までを一続きの系として揃えて、初めて品質が届く。
-
大きな設計判断ほど、土俵の公平性を検証する。 8Bから4Bへの切り替えが、測定のずれ一つで危うく決まりかけた。「向いていない」と結論する前に、比べている条件が本当にフェアかを確かめる。
付録:生データ
条件: すべて Live 40問、opus pairwise 判定(勝ち/引き分け/負け)。
| 実験 | 結果 | 条件・留保 |
|---|---|---|
| 診断(同一アダプター・土台違い) | BF16土台 = 23勝/15分/2負、INT4土台 = 2勝/15分/23負 | 重大欠陥 3 対 22。主語誤り・否定反転はすべてINT4側 |
| 修正実証(本番精度で仕込み直した8B) | vs 4B-INT8 = 16/15/9(非後退)、vs 旧・不一致8B = 20/12/8 | 優劣が決定的な問では 10対0。quant-aware SFT-aug→CPO |
| マンガ | echo(原文丸写し)0/434 を維持 | 副作用なし |
| 撤回した誤結論 | 「Liveは4Bに」(旧8Bが 21対11 で負け) | 学習BF16→本番INT4 の不一致が生んだ見かけの負けだった |