学習用データ
3 つの主張を、手で動かせる 25 個の図で証明する。データセットの誤差は 4 種類あり、それぞれ別の予算で買うもので、「もっと集める」で直るのは 1 つだけだということ。テストセットを訓練へ漏らすやり方はどれも静かに、しかも上向きに壊れ、だからこそレビューを生き延びるということ。そして重み付け・再サンプリング・閾値移動は 1 本のレバーの 3 つの名前だということ。
手元にある山
モデルが知っているのは、その行が知っていたことだけだ。以降の 6 つの section は、この節の取りこぼしの修理である。
データセットは標本だ。どこかに気にしている母集団があり、手元にあるのは火曜の午後にスクリプトが届いた範囲でしかない。ここで壊れるものは 4 つあり、「もっと集める」で直るのは最初の 1 つだけである —— スライダーで残した行を増やし、その平均が母集団の平均へ歩くのを見てほしい:
落ち着くのがどれだけ速いかに注目してほしい。6 行では推定値は 45.8 分(真値は 39.2)、 60 行で 38.1、残りの 180 行はほとんど動かさない。標本ノイズは 1 / √n で縮む —— 金で買い戻せる唯一の誤差である。
選択バイアスは縮まない。「届くかどうか」は測りたい量とまず独立ではないからだ。壁をドラッグして抽出枠を狭め、枠が報告する平均が本当の平均から離れるのを見てほしい:
ヘビーユーザーこそ枠が最初に落とす層だから、枠を 120 人に半減させると推定値は 39.2 分から 28.2 分へ落ちる。その枠の中で 10 倍の行を集めても、より精密なだけで同じだけ間違った数が出る。データが増えるほど悪化する唯一の誤差だ —— 信頼できそうに見えてしまうからである。
3 つ目は網羅性である。本番のトラフィックには長い裾があり、標本にはたまたま当たったクラスしか入らない。8 行から 行へ引き上げ、8 番目のクラスがゼロのままなのを見てほしい:
8 行の時点で、8 クラスのうち 5 クラスには 1 例もない。最も希少なクラスはトラフィックの 0.72% なので、 128 行でも 40% の確率で取り逃がし、1,024 行でも 10 例しかない(1 番目のクラスは 709 例)。10 例のクラスは本番で必ず間違え、それで減点もされない。
4 つ目は、どの行を持っているかとは無関係だ。同じ行を見た 2 人のアノテータは食い違う。誤り率を まで上げ、端的に間違っているラベルが、今後誰が報告するスコアにも天井を作るのを見てほしい:
240 のうち 26 を反転させると、真のラベルをすべて当てる予測器でも、記録されたラベルに対しては 89.2% しか出ない。 Northcutt らは、この分野で最も引用される 10 のベンチマークのテストラベルに、少なくとも 3.3% の誤りがあることを見つけた。4 つの誤差に 4 つの予算 —— 行数、より良い抽出枠、狙いを定めた収集、より良いアノテーション。データ量の問題は 1 つ目だけで、予算がつくのもそれだけである。
クリーニングは決定の連続である
行は 4 通りの壊れ方で届き、どの修理も、あとで引用する数字を動かす。
どれも「片づけ」ではない。4 つのいずれもデータの意味についての選択で、ローダを書いた人が一度決め、以後すべての実験が引き継ぐ。まず、同じページを見たことを覚えていないクローラから。スライダーを引いて、複製が本当に新しい文書を上回るのを見てほしい:
の時点で新しいのは 98 件だけだ。 142 件は複製で、最悪の 1 件は 23 回現れる。複製のぶんだけその文書の勾配への引きが増えるし、§04 で見るとおり、分割の両側に落ちた複製は、良いスコアを捏造する最も安上がりな方法である。
次は穴だ。20 行 4 列、そして収入が最も高い人ほど収入を答えない。コントロールを切り替えて、各修理が穴のあいた列に何をするか見てほしい:
平均がまったく動かないことに注目してほしい。真の平均は 42.0 だが、 3 つの修理はどれも 34.9 と報告する。欠けている行が高い値の行だからだ。動くのは散らばりのほうで、平均で埋めると 20 行すべてが残り、標準偏差は 13.3 になる —— 真値は 20.7 で、誰も観測していない一致が 6 行ぶん増えている。
外れ値は逆で、欠けているのではなく効きすぎる。最小二乗は、中心からどれだけ外にいるかで各行に重みを与える。丸で囲んだ行を好きな場所へドラッグして、直線がついてくるのを見てほしい:
静止状態ではその行は直線上にあり、当てはめはほとんど気づかない —— 入れて傾き 0.66、外して 0.67。右下へ引っ張ると傾きは 0.42 まで落ちる。23 行のうち 1 行がモデル全体を動かすのは、そこでのてこ比が 0.19 だからだ(平均的な行は 0.087)。
4 つ目は、ほかのどの検査もすり抜ける。同じ語のつもりで取得された 4 つの文字列を、空白除去・大文字小文字の畳み込み・Unicode NFC と順に適用し、4 通りのバイト列が1 つに潰れるのを見てほしい:
取得時点では 6、5、6、5 バイトで、3 番目は é を e と結合アクセントで綴っている —— 合成済みなら 2 バイトのところが 3 バイトだ。この段より前に走らせた完全一致の重複排除はすべて、1 件の文書を4 件と数えている。順序は手順と同じくらい効く。正規化してから重複排除、重複排除してから分割、そして埋める前に欠損が何を意味するのかを決めること。
3 つに切る
3 つの切片に 3 つの役割 —— 報告する数の精度は、いちばん小さい切片で決まる。
訓練行はオプティマイザが見るもの、検証行はモデル同士を選ぶもの、テスト行は最後に一度だけ開けるもの。2 つではなく 3 つなのは、検証結果がハイパーパラメータを動かした瞬間、その切片は漏れ始めるからだ。取り置く割合をドラッグし、測定する側が訓練する側から何行奪うのかを見てほしい:
ドラッグしながら右端の数を見てほしい。10% のテスト切片 —— 1,000 行 —— は 90% のモデルを 95% 信頼区間で ±1.86 ポイントまで測る。と区間は ±2.63 に広がる。テストセットは余剰ではなく、自分の記録板の分解能そのものだ。
この区間は形式ではない。まったく同じ 1 つのモデルを、独立に引いた 12 個のテストセットで採点したものである。サイズをドラッグして、12 個の測定値が実際の正解率へ収束するのを見てほしい:
テストセットが小さくなった途端、測定は意味を失う。50 行では同じモデルが 83.1% とも 96.7% とも出るので、そのテストセットで 84% と 96% を報告した 2 チームは、同一のモデルを出荷している。でも幅は 88.9% から 91.1% で、たいていの論文が報告する改善はまだこの中に収まる。
切片が誤るのはサイズだけではない。1,000 行のうち陽性は 20 件、そのうち 100 行をテストへ回す。40 通りの抽出を引いて、無作為な片が捕まえた陽性の数がふらつくのを見てほしい:
40 回で捕まえる陽性は 0 件から 6 件まで散り、12% の確率で 1 件も入らない —— 唯一気にしているクラスを採点できないテストセットである。層化した片は毎回きっかり 2 件を持つ。行ごとではなくクラスごとに組み立てているからだ。
そして行は必ずしも独立ではない。40 人の患者に 6 枚ずつのスキャン。モデルは病気ではなくこの患者を覚えられる。行で切るか患者で切るかを切り替え、壁をまたぐグループが消えるのを見てほしい:
患者 1 人につき 6 行あるので、行で切ると 40 人中 31 人が壁の両側にスキャンを持ち、テスト 60 行すべてにモデルが学習済みの同じ人の行がある。患者で切れば両方ゼロになり、報告スコアも一緒に落ちる。その低下こそが結果だ。小さなデータセットの 10% では何も測れないとき、k 分割交差検証は計算資源で分解能を買う —— k 回学習し、毎回違う 1/k を取り置き、平均と散らばりを報告する。
モデルに答案を見せる 4 つの方法
リークは例外を投げない。指標を良くするだけだ —— だからこそレビューを生き延びる。
ここでの失敗はどれも 1 行のコードが間違った場所にあるだけで、どれもすでに走らせているテストからは見えない。まずどのノートブックにもあるもの —— スケーラを当てはめてから分割する。テストの割合をドラッグして、全行で当てはめた平均と訓練行だけで当てはめた平均を比べてほしい:
2 本の線が重ならないことに注目してほしい。全データでは 51.5、訓練行だけでは 48.8。テスト行は前者より 1.14 標準偏差、後者より 1.64 標準偏差だけ上にあり、テスト行を見たスケーラは、モデルがこれから踏み込むドリフトを均してしまった。
2 つ目の形は、答えが帽子をかぶった列だ。解約モデルの refund_issued、死亡率モデルの discharge_ward。その列が持ち去るラベルの量をドラッグして、 2 つのクラスが割れていくのを見てほしい:
で検証 AUC は 0.967、一方正直な特徴は 0.756 のままだ —— 本番で得られるのは 0.756 である。予測すべき時点で、その列はまだ書かれていない。予測しなければならない瞬間を基準に各列がいつ書き込まれるのかを問い、「あとで」と答える列は消すこと。
3 つ目は §02 の重複が遅れて来るものだ。分割してから重複排除すると、複製が両側に落ちる。モデルがすでに読んだテスト行をドラッグして、報告するスコアが実際に得られるスコアから離陸するのを見てほしい:
モデルは覚えた行を必ず当てるから、60 行中 18 行が汚染されるだけで、正直な 81.0% は報告上 86.7% になり、半分が汚染されれば 90.5% になる。実行中におかしなところは何も見えない。これが言語モデルのベンチマーク汚染そのものだ —— 学習コーパスがベンチマークを含み、ベンチマークは何も測らなくなる。
4 つ目は時間である。行に日付があるなら、無作為分割は未来で学習して過去で試すことになる。時間軸に沿って壁をドラッグし、行での分割と日付での分割を比べてほしい:
無作為に切ると、訓練 180 行のうち 176 行が最初のテスト行より後の日付になる。来週を渡して先週を予測させているわけだ。日付で切ればこれはゼロになる。 4 つに共通する診断はひとつ —— たいして期待していなかった変更から、期待をはるかに超える検証スコアが出ること。成果ではなく不具合報告として扱うこと。
欲しいものが希少なとき
不正、疾患、障害、解約。面白いクラスはいつも小さいほうで、既定値はすべてもう一方に合わせてある。
不均衡はモデルではなく世界の性質であり、指標・損失・閾値を 3 通りに壊す。一晩で 240 件の取引が届いた ——本当に不正な件数を 1 件まで下げて、すべてに「正常」と答えるモデルが何点を取るか見てほしい:
何もしないモデルを見てほしい。240 件中 12 件は 5% で、すべてに「正常」と答えるだけで 95.0% を取りながら何も見つけていない。まで下げれば 99.6% になる。不均衡な問題の正解率とは、多数クラスの割合が測定の衣装を着たものである。
そこでモデルがスコアを出し、誰かが線を引く。これは不正が得るスコアと、それ以外が得るスコアだ。線をドラッグして、捕まえた不正と空振りの警報が交換されるのを見てほしい:
静止状態では線は不正の半分を捕まえ、警報の 54% が本物だ。再現率 84% まで左へ引くと適合率は 22% に落ちる —— 出現率 5% では警報 4.6 件に 1 件しか本物がない。どちらを取るかは原価計算の問題だ —— 見逃した不正 1 件と、アナリスト 1 時間。
よく報告される 2 本の曲線は、その重大さについて意見が一致しない。 1 つの分類器、同じ 2 つの分布を、ROC(再現率対偽陽性率)と適合率対再現率で描いてある。出現率をドラッグし、動くのが片方だけであることを見てほしい:
均衡から まで下げても、ROC 曲線は動かない。AUROC は 0.921 のままだ —— 2 つの分布だけで決まる量だからである。平均適合率は 0.921 から 0.181 へ落ちる。希少事象で立派な AUROC が出たとき、それはまだ誰も値付けしていない数字だ。
標準的な対処は、損失で希少クラスに重みを付けることだ。重みをドラッグして、決定境界が実際どこへ行くのかを見てほしい:
校正済みのスコアなら、陽性を w 倍に重み付けした判断は、重み無しのモデルが閾値 1/(1+w) で下す判断と同じだ —— は閾値 0.077、再現率 78%、適合率 27%。妥当な動作点だが新しい情報ではなく、確率の校正は壊れ、下流はすべて間違う。比 r への再サンプリングは同じ移動に複製行を足したものだ。重み付け・再サンプリング・閾値調整は 1 本のレバーの 3 つの名前で、どれも陽性を増やしはしない。
集めなかった行
データ拡張は、外に出ずに行を増やせる唯一の方法だ。不変性の主張の上に立ち、その主張が崩れる場所で崩れる。
主張はこうだ —— ラベルを変えない変換の集合が存在する。 6 を平行移動しても 6 のままなら、移動させた 6 はすべて正当な訓練行であり、量産できる。再生を押すか、トラックをドラッグして、パイプラインが収集したままの例から作る複製 ——どれも新しい訓練行を歩いてほしい:
コストがどれだけ不均一かに注目してほしい。上下左右に 1 マスずらすと 121 マスのうち 30 マスが変わり、元との重なりは 0.52 に落ちる。一方 12 度回しても変わるのは 12 マスで、重なりは 0.80 を保つ。 5 つとも 6 としてオプティマイザに届く —— データで述べた不変性の主張である。
この種の主張には必ず縁があり、この縁はまたぎやすい。回転を 4 分の 1 回転より先へドラッグして、複製がまだどれだけ 6 かとすでにどれだけ 9 かが交差するのを見てほしい:
2 つの数は 77° で収束して入れ替わり、 では複製はまさに 9 でありながらラベルは 6 のままだ。その間には、どちらの数字でもない帯がまるごとある。この交差より先で生成した複製は、すべて誤った答えの付いた訓練行になる —— §01 のラベルノイズを、自分で、データローダの速度で量産していることになる。
そこで誰も声に出して聞かない問いが残る —— 複製 1 つはいくらか。誤差は行数のべき乗で落ちるので、複製の価値は実効行数をどれだけ押したかで決まる。複製の数を決め、次に 1 つが本物の行いくつぶんかを決めてほしい:
横軸は対数なので、一定の倍率は行数によらず一定の右移動になる —— この取引が成り立ち、やがて尽きる理由である。本物の行 4 分の 1 ぶんの複製を 作ればデータ 6.75 倍に相当し、誤差は 3.9% から 2.2% へ動く。価値を 0.05 にすれば、同じ複製は 2.15 倍で 3.1% にとどまる。 2 つ目の数は誰も埋めてくれない —— 変換が例を動かす距離を、タスク本来のばらつきで割った量だからだ。 ImageNet-1k の実写訓練画像は 1,281,167 枚。クロップと反転はその何倍もの価値があるが、2 つ目の ImageNet には及ばない。
クイックリファレンス
このページ全体はひとつの順序の問題であり、これがその順序である。
生のファイルから学習済みモデルまでに 8 つの段があり、1 つだけが壁だ —— 上はすべての行を見て、下は訓練行しか見ない。分割を梯子の上で上下にドラッグし、おかしくなる段が変わるのを見てほしい:
はちょうど 1 か所。壁より上に置くのは、全体を見なければ正しくならない 2 段だけだ —— 読み込みと重複排除。分割のあとで消した重複は、すでに分割をまたいでいる。壁より下はすべて当てはめである。
コードにすると、現場で最も多いリークは 1 つの文が間違った順序にあるだけだ。どんなテストにも型にも捕まらない:
# wrong - the scaler saw every row X = scaler.fit_transform(X) Xtr, Xte = split(X) # right - the split comes first Xtr, Xte = split(X) Xtr = scaler.fit_transform(Xtr) Xte = scaler.transform(Xte)
最後の予算 —— §03 の区間は誰も聞かない問いを含んでいる。見たい改善幅をドラッグして、必要なテスト行数を手元の 1,000 行と見比べてほしい:
1 ポイントの改善には片側 13,493 行のテストデータ ——§03 の片の 13 倍が要る。どの失敗も同じ不変条件を破る —— 採点時、テストに触れたものが何も動かしていないこと。
- 理由も分からずスコアが跳ねた。§04 の 4 形を当たる。
- 特徴 1 つがモデル全体と同じ強さ。その列はいつ書かれるか。
- 正解率がラベルノイズの天井超え。アノテータは超えられない。
- 不均衡な問題で正解率が語られた。まず基準率を。
- 小数第 1 位まで語られたスコア。1,000 行なら ±1.9 点。