精度が0.3%下がったという報告はいつ意味を持つのか
一言でいうと
精度の差は、2つの数字を引き算して出てくるものではなく、サンプル数と、判定が分かれたサンプルの数から出てきます。同じサンプルで比べなければ、0.3パーセントポイントは何の意味も持ちません。
なぜこれが問題になるのか
量子化したモデルをデプロイするかどうかを決める場で、いちばん多く出てくる文が「精度が0.3%落ちました」です。この文だけでは、何も決められません。サンプルが300個なら、0.3パーセントポイントはサンプル1個の差です。同じデータを取り直せば、向きが変わるかもしれない大きさです。
精度は比率で、比率をサンプルで測れば、サンプルが揺れる分だけ揺れます。テストサンプル400個で精度が0.78なら、この数字1つの95%信頼区間は、おおよそ0.74から0.82までです。幅は8パーセントポイントです。この幅を見た人は、0.3パーセントポイントを根拠にしません。
ところが、ここでよくある間違いがもう1つ出てきます。区間が重なっているから差はない、と言ってしまうことです。それも間違いです。2つのモデルを同じサンプルで測ったなら、使える情報はずっと多くなります。
どう判断するのか
核心は、2つのモデルが同じ入力を見たということです。400個のうち380個は2つのモデルがどちらも当て、3個はどちらも外したなら、その383個は、2つのモデルを分けるのに何の役にも立ちません。残りの17個、つまり片方は当たり、もう片方は外れたサンプルだけが情報です。
そこで、表を2x2で作ります。
B 맞음 B 틀림
A 맞음 307 6 <- A 만 맞은 6건
A 틀림 8 79 <- B 만 맞은 8건
この表で、精度の差は(8 - 6) / 400 = 0.005です。しかし、重要なのは、分母が400ではなく、判定が分かれた14件だという事実です。14件が6対8に分かれたなら、コインを14回投げて6対8が出たのと変わりません。この判定を1つの数字にしたのがペア比較の統計量で、このラボでは、分かれた件数で割った物差しを使います。分かれた件数が少なければ、差がどれだけ大きく見えても、統計量は大きくなりません。
サンプルを増やせばよいのではないか、と聞かれるかもしれません。そのとおりですが、コストが高くつきます。区間の幅は、サンプル数の平方根に反比例して縮まるので、幅を半分にするには、サンプルを4倍に増やす必要があります。精度0.78のモデルで、95%信頼区間の半幅を0.04から0.005まで狭めるには、テストサンプルが2万6千個ほど必要です。ラベルをそれだけ付けるのは現実的ではないので、サンプルを増やす前に、同じサンプルでペアにして比べる方法を先に使います。ペア比較は、2つのモデルが一緒に受ける揺れをそっくり消してくれるので、同じサンプル数で、ずっと小さな差を捉えられます。
ベースラインも1つではありません。たいてい2つです。FP32のオリジナルは「量子化でどれだけ削られたか」に答え、以前のデプロイ版は「今動いているものより悪くなるか」に答えます。2つの質問の答えが、互いに逆の向きになることがあります。オリジナルより悪くなったのに、以前のデプロイ版よりは良い候補が、実際に出てきます。
現場で区別すべき2つのこと
出力の差と、タスクの指標は別のものです。最大絶対誤差やコサイン類似度は、出力ベクトルがどれだけ動いたかを測り、精度は、判断が変わったかを測ります。この2つは、一緒に動きません。最大絶対誤差が1.7にもなるのに、精度はむしろ上がることがあります。判断の境界から遠くにあるサンプルは、出力が大きく揺れても、答えが変わらないからです。
そのため、報告は3つを一緒に書きます。出力がどれだけ動いたか(最大絶対誤差・コサイン)、判断が何件ひっくり返ったか(反転したサンプル数と向き)、その結果、タスクの指標がどうなったか(精度とその区間)。1つしか書かなければ、読む人が残りを想像します。
もう1つ気をつけることがあります。同じテストサンプルを複数の候補に繰り返し使うと、そのサンプルにたまたま合う候補が選ばれてしまいます。候補を10個測って、そのうち最も良い1つを選べば、その1つの区間は、最初に測ったときより楽観的です。そのため、複数の候補を比べたあとは、選んだ候補を一度も使っていないサンプルで測り直す手順が必要です。このラボでは候補を1つだけ扱いますが、候補が増えた瞬間にこの問題がついてくることは、知っておく必要があります。
もう1つあります。反転したサンプルを数えるときは、向きを分ける必要があります。当たっていたものが外れた件数、外れていたものが当たった件数、そして、間違った答えが別の間違った答えに変わった件数です。3つ目は、精度に何の影響もありませんが、モデルが揺れた証拠であり、ユーザーの目には「答えが変わった」と見えます。
実務で本当に大切なこと
- 精度は区間と一緒に書きます。数字1つで書くと、読む人が精密さを誤解します。
- 2つのモデルは同じサンプルで比べます。別々に測った2つの数字を引き算しません。
- 分かれたサンプルの数も一緒に書きます。それが実際の分母です。
- ベースラインを2つ置きます。オリジナルと以前のデプロイ版で、答えが違うことがあります。
- 出力の差とタスクの指標を別々に書きます。片方でもう片方の代わりにしません。
次のラボですること
テストデータと、3つのバージョン(FP32のオリジナル・以前のデプロイ版・整数化した候補)の予測を自分で作り、精度の区間・ペア比較の表・反転したサンプル・出力の差を測るツールを、1ステップずつ育てます。採点ツールは、皆さんが書いた数字を信じません。毎回違うシードで自分の予測表を用意して皆さんのツールを実際に動かし、採点ツールが同じ計算をやり直して照合します。ステップ1では、皆さんが残したシードでテスト入力を作り直して、皆さんのモデルを直接動かしてみます。