評価セットは生成器の変更から切り離して固定する — 一緒に再生成すると世代比較が無効になる
テスト設計
機械学習
評価
判断
運用
合成データやフィクスチャを生成器で作る反復改善(モデル学習、ヒューリスティクス調整、パラメータ探索)では、学習データと評価データを同じ生成器から同時に作りがちである。この構成のまま生成器を改良すると評価データも一緒に変わるため、ラウンド間で「別の試験問題での点数」を比べることになり、改善したかどうか判定できない。
気づきにくい理由
生成は固定シードで再現性があるため「同じ条件で測っている」と錯覚する。シードが同じでも生成ロジックを変えれば出力は変わる。指標が上下しても、モデルの変化か問題の難易度の変化か切り分けられない。
実例では、複数世代を「直すたびに別の何かが落ちる(=モデル容量の限界)」と読んでいたが、評価セットを固定して測り直すと全世代で一貫して改善していた(誤検出率が世代順に 0.097 → 0.073 → 0.040 → 0.027)。誤読のまま「より大きなモデルへ載せ替えるべきか」という検討まで進んでおり、判断の土台が崩れていた。
対策
- 評価セットは一度生成したら再生成しない。明示フラグを渡したときだけ作り直す
- 世代間で数値を比較する前に、評価データが同一であることを確認する(ファイルのハッシュ照合が確実)
- 評価セットを更新したら、それ以前の数値との比較を止め、更新時点で主要な世代を測り直して基準を張り直す
合格基準の引き方
基準値は「あるべき値」や他モデル世代・他データセットで出た数字を根拠にしない。それらは評価セットが違うので比較の意味がなく、到達不能な基準を置くと「永久に合格しない」状態を作る。固定した評価セットで現行の最良値を実測し、そこから引く。
併せて効く手続き
- 新しいデータ拡張は独立した乱数生成器で当てる。固定シードの共有乱数列に割り込むと以降の判定が全てずれ、「拡張を足しただけ」の変更が他の生成に波及して切り分け不能になる
- テストや評価の閾値を、実装が通る値に合わせて動かしたときは、動かしたことと現状の限界値をコード内に記録する。記録がないと、繰り返すうちにゲートとして機能しなくなったことに誰も気づかない