本文へ移動

ホーム / ML / 第3部 データと特徴量

第3部 データと特徴量・第6章

実験と A/B テスト

★★☆ 重要7トピック・面接 3問

モデルの改善が本当に効いたかを確かめる方法を押さえる。

6.1実験管理

用語★★☆ 重要
ひとことで

データ・コード・パラメーター・結果を記録し、同じ結果を再現できるようにする(MLflow・W&B など)。

ML の開発では何十、何百という実験をします。記録がないと「先月の一番良かったモデルはどの設定だったか」が分からなくなり、本番のモデルを作り直すこともできません。MLflow や Weights & Biases(W&B)などの実験管理の道具を使い、実験ごとに自動で記録します。

1回の実験に、作り直すために必要なものを全部ひもづける実験(run)ID で引けるコードの版データの版パラメーター環境・ライブラリ評価の結果モデルのファイルMLflow・W&B などで、学習のコードから自動で記録する
1回の実験(run)にすべてをひもづける
記録するもの例
コードGit のコミット ID(未コミットの変更がある状態で本番用の学習をしない)
データどのテーブル・ファイルの、どの期間・どの版か
パラメーター学習率・木の深さ・特徴量のリストなど
環境ライブラリの版(ロックファイル)・コンテナのイメージ・GPU の種類
結果評価指標・学習曲線・混同行列などのグラフ
成果物学習したモデルのファイル・前処理の設定

面接ではこう答える

実験管理は、実験ごとにコードの版、データの版、パラメーター、環境、結果、モデルのファイルを記録しておくことです。ML の開発では何百もの実験をするので、記録がないと「先月一番良かったモデルの設定」が分からなくなり、本番のモデルを作り直すこともできません。MLflow や Weights & Biases のような道具で、学習のコードから自動で記録するようにします。

ひとことで

同じコード・データ・設定から同じ結果を出せること。シードの固定とデータの版の固定が要る。

乱数とデータのバージョン:

  • 乱数のシード(乱数の出発点)を固定して記録します。Python・NumPy・PyTorch など、使うライブラリごとに設定が必要です。ただし GPU の計算は並列の順番によって結果がわずかに変わることがあり、完全に同じにするには決定的な計算の設定が要り、遅くなることがあります。
  • シードを変えるだけで指標がどれくらい動くかも見ておきます。改善の幅がシードによるばらつきより小さければ、それは改善とは言えません。
  • データは後から変わります。テーブルの行が追加・修正されると、同じ SQL でも結果が変わります。学習に使ったデータは、スナップショット(その時点のコピー)を保存する、日付で区切った不変のファイルにする、DVC などのデータのバージョン管理を使う、のいずれかで固定します。
再現できないとき確かめること
指標が少し違うシード・GPU の非決定的な計算・ライブラリの版
指標が大きく違う学習データの期間・行数・特徴量の定義が変わっていないか
そもそも動かないロックファイル・コンテナのイメージ・未コミットの変更

面接ではこう答える

再現性は、同じコード、データ、設定から同じモデルと結果を作り直せることです。乱数のシードをライブラリごとに固定して記録し、データは後から行が変わるので、スナップショットや日付で区切った不変のファイル、DVC のようなデータの版管理で固定します。GPU の計算は並列の順番で結果がわずかに変わることがあるので、シードを変えたときのばらつきも測り、改善がそのばらつきより大きいかを確かめます。

6.3A/B テストの基本

用語★★☆ 重要
ひとことで

ユーザーを分けて新旧のモデルを比べる。統計的に有意か、指標の選び方を誤らないかが要点。

A/B テストは、ユーザーをランダムに2つに分け、片方には今のモデル(A)、もう片方には新しいモデル(B)を使って、ビジネスの指標を比べる方法です。オフラインの評価では分からない「実際に使われてどうか」を確かめる、最後の判断材料になります。

ユーザー単位でランダムに分け、同じ期間に新旧を比べるユーザー全体振り分けID のハッシュでA:今のモデル50%B:新しいモデル50%指標を比べる決めた期間の後最初に A と B の人数の比が設定どおりか(SRM がないか)を確かめる
A/B テストの分け方

ランダムに分ける単位は、基本はユーザーです。リクエストごとに分けると、同じ人が A と B を行き来して体験が混ざります。

決めること例
主な指標(1つ)購入率・1人あたり売上
ガードレール指標レイテンシ・苦情・解約
分ける単位ユーザー(基本)
割合と期間50:50・2週間(事前の計算から)

面接ではこう答える

A/B テストは、ユーザーをランダムに2つに分け、片方に今のモデル、もう片方に新しいモデルを使って、ビジネスの指標を比べる方法です。オフラインの評価では分からない、実際に使われたときの効果を確かめる最後の判断材料になります。始める前に、主な指標を1つ、悪化してはいけないガードレール指標、分ける単位、必要な人数と期間を決めておきます。分ける単位は基本はユーザーで、リクエストごとに分けると体験が混ざります。

ひとことで

差を見分けるのに必要な人数。見つけたい差・基準の値・有意水準・検出力から、始める前に計算する。

見つけたい差を半分にすると、必要な人数は約4倍必要な人数見つけたい差(小 → 大)差 0.5% → 約4倍差 1%
必要な人数は、見つけたい差の2乗に反比例する(形はイメージ)

サンプルサイズ:差が小さいほど、見分けるのに多くのユーザーが必要です。おおまかに、見つけたい差を半分にすると必要な人数は約4倍になります(必要な人数は、差の大きさの2乗に反比例するため)。始める前に、「どれくらいの差なら意味があるか(最小検出効果)」「基準の値(今の購入率など)」「有意水準(よく 5%)」「検出力(よく 80%)」から必要な人数を計算し、そこから期間を決めます。計算は統計のライブラリや、オンラインの計算機でできます。

入力意味よく使う値
基準の値今の購入率など過去のデータから
最小検出効果(MDE)これより小さい差は見つけなくてよい、という差事業として意味のある差
有意水準差がないのに「差がある」と言ってしまう確率5%
検出力本当に差があるときに見つけられる確率80%

面接ではこう答える

A/B テストの必要な人数は、基準の値、見つけたい最小の差、有意水準、検出力から、始める前に計算します。必要な人数は差の大きさの2乗に反比例するので、見つけたい差を半分にすると約4倍の人数が要ります。人数が足りないと、本当は効いていても差が見えず、「効果なし」と誤って判断します。計算した人数と1日の利用者数から期間を決め、途中で止めないことが大事です。

毎日見て「有意になった日」に止めると、偶然の勝ちを拾ってしまうp 値日数5%ここで止めると「勝ち」と誤る
覗き見:毎日見て、たまたま下回った日に止めてしまう(形はイメージ)
落とし穴対策
覗き見(peeking):毎日結果を見て、有意になった瞬間に止める偽の「勝ち」が大幅に増える。期間を先に決めて最後に判定する。途中で止めたいなら、それ用の手法(逐次検定)を使う
新奇効果:新しいものが珍しくて最初だけ使われる(逆に、慣れるまで使われないこともある)最低1〜2週間は回す。日ごとの差の推移を見て、だんだん縮んでいないか確かめる
曜日・季節のずれ少なくとも1週間単位で回す
指標をたくさん見て、良かったものだけ報告する主な指標を1つ先に決める。たくさん比べるなら補正する
分け方の不具合:A と B の人数の比率が設定とずれる(SRM)比率を最初に確かめる。ずれていたら結果を信じない
ユーザー同士が影響し合う(出品者と購入者、SNS)地域や時間で分けるなど、分ける単位を工夫する

オフラインの評価(過去のデータでの AUC など)が上がっても、A/B テストでビジネスの指標が動かないことはよくあります。原因を知っておくと、次に何を直すかが分かります。

オフラインで良くても、本番の指標が動くとは限らないオフラインの指標AUC・NDCGオンラインの指標購入率・売上指標が目的とずれる過去のログの偏り速さ・表示の違い
オフラインとオンラインの間に入るずれ
原因例対策
指標が目的とずれているクリック率を上げたが、購入にはつながらないオフラインの指標を、最終の目的に近いものにする
過去のログの偏り過去のモデルが表示したものしかクリックされていない一部をランダムに表示したデータで評価する
すでに十分良い上位の並びはほとんど同じで、利用者は違いに気づかない差が出そうな場面(新規ユーザーなど)を分けて見る
速さ・表示の違い新しいモデルが遅く、表示が遅れて離脱が増えたレイテンシをガードレール指標にする
リーク・学習と推論のずれオフラインの評価がそもそも甘かった特徴量の作り方と分け方を見直す
人数が足りない本当は効いているが差が見えない事前に必要な人数を計算する

6.7多腕バンディット

用語★☆☆ 発展
ひとことで

試しながら成績の良い案に配分を寄せていく方法。探索と活用のバランスを自動で取る。

A/B は最後まで半々、バンディットは良い案へ配分を寄せていくA/B テストバンディット時間 →濃い色:成績の良い案への配分
A/B テストとバンディットの配分(イメージ)

多腕バンディットは、試しながら成績の良い案に配分を寄せていく方法です。「まだよく分からない案を試す(探索)」と「今いちばん良い案を使う(活用)」のバランスを、トンプソンサンプリングなどで自動で決めます。テスト中の損(悪い案を見せ続ける分)が小さいのが利点です。

A/B テストバンディット
目的差があるかを正しく判断するテスト中の成果を最大にする
向いている場面モデルの入れ替えなど、影響の大きい判断広告のクリエイティブ・見出しなど、案が多く寿命が短い
弱点テスト中は悪い案にも半分を使う効果の大きさを正確に測るのには向かない

面接ではこう答える

多腕バンディットは、複数の案を出しながら、成績の良い案への配分を少しずつ増やしていく方法です。まだ分からない案を試す探索と、今いちばん良い案を使う活用のバランスを、トンプソンサンプリングなどで自動で決めます。テスト中の損が小さいので、広告や見出しのように案が多く寿命が短いものに向きます。一方で、効果の大きさを正確に測って判断したい場合は A/B テストのほうが向いています。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 実験管理(再現性)
  • オンラインの A/B テストで効果を確かめる
  • 実験管理:データ・コード・パラメーター・結果を記録し、同じ結果を再現できるようにする(MLflow・W&B など)。
  • 再現性(乱数とデータの版):同じコード・データ・設定から同じ結果を出せること。シードの固定とデータの版の固定が要る。
  • A/B テストの基本:ユーザーを分けて新旧のモデルを比べる。統計的に有意か、指標の選び方を誤らないかが要点。
  • サンプルサイズと検出力:差を見分けるのに必要な人数。見つけたい差・基準の値・有意水準・検出力から、始める前に計算する。
  • 多腕バンディット:試しながら成績の良い案に配分を寄せていく方法。探索と活用のバランスを自動で取る。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1A/B テストで気をつけることは?

模範回答

始める前に4つを決めます。まず指標で、何を改善したいかの主な指標を1つと、悪化してはいけないガードレール指標(レイテンシや解約など)を決めます。次に期間で、必要なサンプルサイズを見つけたい差の大きさから計算し、曜日の影響を消すため最低でも1週間単位で回します。新奇効果があるので、日ごとの推移も見ます。

有意差は、途中で何度も覗いて有意になった時点で止めると誤った勝ちが増えるので、決めた期間が終わってから判定します。ユーザーの分け方は、ユーザー単位でランダムに分け、A と B の人数比が設定どおりかを最初に確かめます。比率がずれていたら、分け方の不具合を疑って結果を使いません。

深掘りされたら

  • トラフィックが少なく、A/B テストに何か月もかかる場合はどうしますか?

見られているポイント指標・期間・有意差・ユーザーの分け方

Q2先月の一番良かったモデルが再現できません。何を確かめますか?

模範回答

コード・データ・パラメーター・環境・乱数の5つを順に確かめます。コードは学習したときの Git のコミットに戻せるか、データは同じ期間・同じ版か(テーブルが後から更新されていないか)、パラメーターは実験管理の記録と一致しているか、ライブラリの版やコンテナのイメージは同じか、乱数のシードは固定していたかです。

多いのはデータが変わっているケースなので、学習に使ったデータはスナップショットで残すようにします。シードを変えるだけでどれくらい成績が動くかも見て、そのばらつきの範囲なら「再現できている」と判断します。

深掘りされたら

  • 実験管理の道具を入れるとき、最低限何を自動で記録しますか?

見られているポイントコード・データ・パラメーター・環境・乱数の切り分け

Q3オフラインの指標では良いのに、A/B テストで差が出ませんでした。どう考えますか?

模範回答

まず、テストそのものが正しいかを確かめます。A と B の人数の比が設定どおりか、新しいモデルが本当に使われていたか(フォールバックしていないか)、サンプルサイズが小さい差を見つけられるだけあったかです。

テストが正しければ、オフラインの指標とビジネスの指標がつながっていない可能性があります。たとえばクリックの予測が良くなっても、すでに買うつもりの商品を上に出しているだけなら売上は増えません。オフラインの評価のやり方(指標・データ)を見直す材料にし、差がないことも1つの結果として記録します。

深掘りされたら

  • オフラインの指標とオンラインの結果の関係を、どう確かめていきますか?

見られているポイントテストの正しさ・検出力・指標の不一致