Digital Reactor
機械学習

乱数シードを変えるだけでスコアは動く:モデル比較に必要な統計的作法

乱数シードを変えるだけでスコアは動く:モデル比較に必要な統計的作法

はじめに

新しい手法がベースラインを1ポイント上回りました。シードを変えたら逆転しました。どちらを信じればよいのでしょうか。モデル比較の現場で、この種の迷いは日常的に起きます。

今回、同じモデルを乱数シードだけ変えて50回学習させたところ、テスト精度は88.1%から90.5%まで、2.4ポイントの幅で散らばりました。標準偏差にして0.57ポイントです。さらに変動の源を分解すると、シードよりも学習・テストの分割やテストセットの有限性のほうが大きく効いていました。この記事では、評価スコアの分散がどこから来るのかを分解して測り、観測された差が本物の改善なのか単なる誤差なのかを見分ける作法を確かめます。

対象読者:

  • モデル改善の効果検証を日常的に行う機械学習エンジニア
  • 論文や社内レポートのスコア差を解釈する立場の方
  • ベンチマーク数値の再現性に疑問を持ったことのある方

記事のポイント:

  • 評価スコアの分散の源(シード・分割・テストサンプリング)を分解して測る
  • スコア差の有意性を判定する実務的な方法を身につける
  • 何シード走らせれば十分かの目安を導く

スコアが揺れる源

評価スコアが揺れる原因は一つではありません。大きく分けて4つあります。重みの初期化やミニバッチのシャッフルといった学習の確率性、train/validationの分割の取り方、テストセットが有限であることによる標本誤差、そしてGPUの非決定的な演算です。このうち最初の3つを切り分けて測ると、それぞれの寄与が見えてきます。

まず、シードだけを変えたときの散らばりを見ます。データの分割は固定したまま、モデルの乱数シードを50通りに変えて学習しました。下の図がその分布です。同じデータ、同じ設定でも、精度は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ポイントです。

同一モデルの2回の実行の差の分布

この分布から計算すると、まったく同じモデルなのに片方が1ポイント以上「良く見える」確率は12.6%ありました。1シードずつの比較で「新手法が1ポイント改善」と報告しても、8回に1回はこの見せかけの差を掴んでいる計算になります。符号すら当てにならない場面があるということです。

正しく比較するには、複数シードで平均し、対応のある検定を使います。同じシード集合で両手法を走らせる対応のある比較は、共通の変動を打ち消すので検出力が上がります。検出したい差の大きさと分散から、必要なシード数を逆算できます。

k(zα/22σδ)2k \gtrsim \left( \frac{z_{\alpha/2}\,\sqrt{2}\,\sigma}{\delta} \right)^2

σ\sigma はシード起因の標準偏差、δ\delta は検出したい真の差です。今回の σ=0.57\sigma=0.57 ポイントで計算すると、真の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の選択バイアスがさらに乗る点にも注意が必要です。

まとめ

スコアは点ではなく分布です。差を主張するなら、その分散の見積もりが要ります。今回の実験では、同じモデルがシードだけで2.4ポイントの幅で動き、テストセットの標本誤差はそれ以上に効きました。差がゼロでも12.6%の確率で1ポイントの見せかけの差が生じます。モデル比較を行うときは、まず数シードで分散の大きさを実測し、報告は平均±標準偏差とシード数を添え、主張したい改善幅に見合うシード数を確保する、という順で進めるのが手堅い進め方です。

関連記事

← 技術ブログ一覧へ