乱数シードを変えるだけでスコアは動く:モデル比較に必要な統計的作法
はじめに
新しい手法がベースラインを1ポイント上回りました。シードを変えたら逆転しました。どちらを信じればよいのでしょうか。モデル比較の現場で、この種の迷いは日常的に起きます。
同じモデルを乱数シードだけ変えて50回学習させたところ、テスト精度は2.4ポイントの幅で散らばりました。1ポイントの「改善」が丸ごと収まる広さです。変動の源を分解すると、シードよりも学習・テストの分割やテストセットの有限性のほうが大きく寄与していました。評価スコアの分散がどこから来るのかを切り分けて測り、観測された差が本物の改善なのか単なる誤差なのかを見分ける作法を確かめます。
対象読者:
- モデル改善の効果検証を日常的に行う機械学習エンジニア
- 論文や社内レポートのスコア差を解釈する立場の方
- ベンチマーク数値の再現性に疑問を持ったことのある方
記事のポイント:
- 評価スコアの分散の源(シード・分割・テストサンプリング)を分解して測る
- スコア差の有意性を判定する実務的な方法を身につける
- 何シード走らせれば十分かの目安を導く
スコアが揺れる源
評価スコアが揺れる原因は一つではありません。大きく分けて4つあります。重みの初期化やミニバッチのシャッフルといった学習の確率性、train/validationの分割の取り方、テストセットが有限であることによる標本誤差、そしてGPUの非決定的な演算です。このうち最初の3つを切り分けて測ると、それぞれの寄与が見えてきます。
まず、シードだけを変えたときの散らばりを見ます。データの分割は固定したまま、モデルの乱数シードを50通りに変えて学習しました。下の図がその分布です。同じデータ、同じ設定でも、精度は88.1%から90.5%まで、2.4ポイントの幅で動いています。

分散を源ごとに分解する
分散の源を切り分けるには、片方を固定してもう片方を動かします。シードの寄与は、分割を固定してシードを変えたときの分散から測れます。分割の寄与は、シードを固定してtrain/testの分割を変えたときの分散です。テストサンプリングの寄与は、学習済みモデルを1つ固定し、テストセットをブートストラップで再標本して測ります。
# シード起因: 分割を固定し、モデルのseedだけ変える
seed_accs = [train_eval(seed=s) for s in range(50)]
# テスト標本誤差: 1つのモデルの予測を固定し、テストセットをブートストラップ
for _ in range(1000):
idx = rng.integers(0, len(yte), len(yte))
boot.append(accuracy_score(yte[idx], pred0[idx]))
3つの標準偏差を並べると、意外な序列が見えます。
| 変動の源 | 標準偏差(精度ポイント) |
|---|---|
| シード(初期化・最適化) | 0.57 |
| train/test分割 | 0.96 |
| テストセットの標本誤差 | 1.03 |

シードの寄与は3つの中で最も小さく、テストセットの有限性と分割の取り方のほうが大きく効いていました。シードを固定して安心しても、テストセットが小さければスコアはそれ以上に動きます。テスト標本誤差の見積もりには、LLMリーダーボードの記事で扱ったブートストラップがそのまま使えます。
その「+1ポイント」は改善か誤差か
ここで、差がまったくないケースを考えます。同じモデルを2回、別々のシードで学習し、テスト精度を比べます。真の差はゼロのはずです。ところが50回分のスコアから2つを取り出して差を取ると、その差は0を中心にしながらも±2ポイント近くまで広がりました。標準偏差は0.82ポイントです。

この分布から計算すると、まったく同じモデルなのに片方が1ポイント以上「良く見える」確率は12.6%ありました。1シードずつの比較で「新手法が1ポイント改善」と報告しても、8回に1回はこの見せかけの差を掴んでいる計算になります。符号すら当てにならない場面があるということです。
正しく比較するには、複数シードで平均し、対応のある検定を使います。同じシード集合で両手法を走らせる対応のある比較は、共通の変動を打ち消すので検出力が上がります。検出したい差の大きさと分散から、必要なシード数を逆算できます。
はシード起因の標準偏差、 は検出したい真の差です。今回の ポイントで計算すると、真の0.5ポイント差を検出するには約11シード、1ポイント差なら約3シード、2ポイント差なら1シードで足ります。小さな改善を主張するほど、多くのシードが要ります。
分散の読み方と必要シード数
シード分散だけを気にしても足りません。今回の設定ではテストセットの標本誤差(1.03ポイント)と分割の分散(0.96ポイント)のほうがシード分散(0.57ポイント)より大きく出ました。再現性を上げたいなら、シードを固定するだけでなく、テストセットを十分な大きさにし、分割の取り方まで管理する必要があります。
1シードどうしの比較は、それだけでは根拠になりません。真の差がゼロでも、12.6%の確率で1ポイント以上の見せかけの差が生まれました。論文や社内レポートで「1シードで◯%改善」とだけ書かれた数字は、この誤差の範囲内かもしれません。報告する側は、平均±標準偏差とシード数を明記するのが最低限の作法になります。
必要シード数にも目安が立てられます。検出したい差が小さいほど、必要なシード数は差の2乗に反比例して増えます。0.5ポイントの改善を主張したいなら10シード規模が要る一方、2ポイントの明確な差なら1〜数シードで十分です。改善幅の見込みから、かけるべき計算資源が逆算できます。
ここで得た分散の値は、あくまで今回の条件でのものです。モデル規模・データ量・タスクに依存します。今回の数値をそのまま一般化はできません。大規模モデルでは複数シードで学習し直すコストが現実的でないこともあり、その場合は、せめて評価側のブートストラップでテスト標本誤差だけでも見積もっておくのが現実的な落としどころです。ハイパーパラメータ探索と絡むと、best-of-Nの選択バイアスがこの上にさらに乗ります。
まとめ
1回の実行で得たスコアは、シードや分割を変えるたびに動く分布からの1標本にすぎません。差を主張するなら、その分布の広がりを併せて見積もらなければなりません。今回の実験では、同じモデルがシードだけで2.4ポイントの幅で動き、テストセットの標本誤差はそれを上回りました。差がゼロでも12.6%の確率で1ポイントの見せかけの差が生じます。次のモデル比較では、まず手元の設定を数シードで実行して分散の大きさを実測し、報告には平均±標準偏差とシード数を添え、主張したい改善幅に見合うシード数を確保する、という順で進めれば無理がありません。