対照を取るまで、「なぜ」を語らない
n=1 の観測は機構を語れない——改善を交絡と切り分ける唯一の道具、それが対照アーム
数字が動いたとき、いちばん語りたくなるのは「なぜ良くなったか」だ。そして、そこがいちばん間違えやすい。
一つの観測から機構を語る前に、対照を一本取る。検証したい要因だけが違い、それ以外は揃った比較対象だ。実際、ある機能の n=1 の観測から「この処理が犯人だ」と結論しかけて、対照(n=14)で無実だと分かった。設計を別案へ切り替える寸前だった。
対照は、嘘の改善も静かに弾く。安いパラメータ調整が高価な再学習を全軸で上回ったなら、その再学習は何も足していない——改善に見えたものは交絡だ。
数字が動いた。良くなった。そして——なぜ良くなったのかを語りたくなる。「このレバーが効いた」「こういう機構で改善した」。自然な衝動だ。だが、この衝動こそが、計測ファーストの現場でいちばん高くつく間違いを生む。
一つの観測から機構を語る前に、やることがある。対照(control arm)を一本取ることだ。対照とは、検証したい要因だけが treatment と異なり、それ以外はすべて揃った比較対象——たとえば「同じ設定のまま、閾値を一つ戻しただけの版」——を指す。対照がなければ、あなたが見た改善が本当にその変更のおかげなのか、それとも別の何かのおかげなのかを、区別できない。
この記事は、私がその区別を怠って危うく誤診断に飛び込みかけた話と、対照が嘘の改善を静かに弾いてくれた話だ。
n=1 は、機構を語れない
あるとき、ある機能を ON にした版で、明らかな異常を一つ見つけた。片方の計測経路では中身が空なのに、もう片方の経路では中身がある。「ONにしたこの処理が、データを落としているに違いない」。1サンプルで機構が見えた——そう思った。次の一手(設計を丸ごと別案に切り替える)に手をかけていた。
止められたのは、たった一つの問いだった。「その ON、OFF でも同じ現象は出ないのか?」
対照——同じ検査を、機能を OFF にして回す——を取った。すると OFF(n=14)でも 1件だけ同種の不一致が出た。しかもそれは、向きが逆だった。正体は、私が疑った処理ではなく、二つの計測経路が取得された瞬間のわずかなズレ(タイムスキュー)だった。一方は「次の瞬間」を、もう一方は「今この瞬間」を写していただけ。ONは無実だった。
n=1 は、機構を語れない。特に間欠的に出る現象は、境界のタイミング一つで簡単に化ける。異常を treatment 側で見つけたら、機構を口にする前に、まず control で同じ検査を同じ n で回す。不一致率が同等なら、それはあなたのレバーの効果ではなく、ただの測定ノイズだ。
「改善した」——対照を並べるまでは
もっと静かで、もっと危険なのが二つ目のケースだ。異常ではなく、改善に見えるときのほうが、対照を省きたくなる。
あるとき、再学習したモデルが「良くなった」ように見えた。前より数字が上だ。当然、再学習が効いたのだと思った。ここで対照を並べた——古いモデルの、閾値を一つ変えただけの版。再学習という高価な変更に対して、これはほとんどタダの比較対象だ。
結果はこうだった。
| 版 | 変更のコスト | 全評価軸 |
|---|---|---|
| 再学習版(treatment) | 高い(再学習ジョブ一式) | 基準 |
| 旧モデル+閾値1つ調整(control) | ほぼゼロ | 全軸で再学習版を上回る |
安い対照が、高価な変更をすべての軸で上回った(Pareto支配=全軸で劣らず、少なくとも1軸で上回ること)。意味は残酷なほど明快だ。ただのパラメータ調整で作れる選択肢が、あなたの変更を全面的に上回るなら、その変更は何も足していない。 改善に見えたものは、再学習とは無関係の別要因の効果——交絡(confounding=比べたい効果と別の要因が分離できず、どちらのおかげか言えない状態)——だった。
この「対照が改善を殺す」構図は、Pareto フロンティアで嘘の改善を弾く話と同じコインの裏表だ。フロンティアは、支配された点を機械的に消してくれる。安い対照がフロンティア上で高価な変更を覆い隠したら、その変更の寄与はゼロだと、絵が教えてくれる。
「統制した」と言う前に、それを本当に振ったか
対照をめぐる、もう一段深い罠がある。「その要因は統制したから交絡しない」と論証で片づけてしまうことだ。
一つ目のケースで、私は最初こう考えていた。「同一セッション内で ON/OFF をトグルしているのだから、環境要因は交絡しない」。もっともらしい。だが、私が統制していたのはトグルという変更であって、環境要因そのものではなかった。疑うべきだった要因を、私は一度も実際に振っていなかった。振っていない因子について「交絡しない」と言うのは、測定ではなく願望だ。
だから、対照を語るときの自問はこうなる。「Xは統制した」と言う前に、Xを実際に変化させた測定が手元にあるか。 なければ、それは統制ではない。ただ「Xは関係ないと思う」と言っているだけだ。
対照とは、結局なにか
三つのケースが同じことを言っている。
- 対照とは、検証したい要因だけが treatment と異なり、それ以外はすべて揃った比較対象である。
- 対照は、あなたのレバーの効果を、それ以外の全て(測定ノイズ、タイミング、無関係な副次変更)から引き算するための基準線だ。
- 対照なしの n=1 は、改善であれ異常であれ、機構を語る資格を持たない。
そして対照を取る前提として、計測器そのものが揃っていることが要る。treatment と control で違うものを測っていたら、引き算は成り立たない。だから対照実験の前に、同じコードを2回流して数字が一致するか——ハーネスの決定性——を先に確かめておく。足場が揺れていたら、対照は差の代わりに揺れを写すだけだ。
教訓
- 機構を語る前に、対照を一本取れ。 「効いた」「こういう機構だ」は、対照と並べてからの言葉だ。とくに n=1 は機構を語れない——間欠現象は境界タイミングで化ける。
- 安い対照が Pareto 支配したら、その変更は無。 ただのパラメータ調整が高価な変更を全軸で上回るなら、改善に見えたものは交絡だ。何も足していない。
- 「統制した」と言う前に、それを実際に振ったか自問する。そして対照の前に、計測器を揃える。 振っていない因子を「交絡しない」と論じるのは願望だ。treatment と control で別物を測っていたら、引き算は成り立たない。
計測ファーストの怖さは、数字が速く出るほど、その数字に物語を付けたくなることにある。「なぜ良くなったか」は、いちばん語りたく、いちばん間違えやすい。まず、正しいものを正しく測れ——その「正しく」の最後の一枚が、対照だ。対照を取るまで、「なぜ」を語らない。
付録:生データ
| 事例 | 何が起きたか | 教訓・留保 |
|---|---|---|
| n=1 の誤診断 | 機能ONの1サンプルで「この処理が犯人」と結論しかけたが、対照(OFF・n=14)で逆向きの同種不一致が出た | 正体は二経路の取得時刻のタイムスキュー。対照なしでは設計を別案へ切り替える寸前だった |
| Pareto支配による棄却 | 再学習版を、閾値を1つ変えただけの対照版(ほぼコストゼロ)が全評価軸で上回った | この比較では再学習の寄与ゼロ、観測された改善は交絡(Pareto) |
| 「統制した」の誤り | 「同一セッション内トグルだから環境要因は交絡しない」 | 統制していたのはトグルであって環境要因ではない。統制の主張には、その因子を実際に振った測定が要る |
| 前提条件 | 対照の妥当性は計測器の決定性に依存する | treatment/control で同一ハーネス・同一設定を用い、同じコードを2回流して一致することを先に確認する |