再学習戦略
田中VPoE「ドリフト検出の仕組みを学んだ。ドリフトが検知された後にどう対処するかが次の課題だ。再学習のトリガーと戦略を設計しよう。」
あなた「定期的に再学習するか、ドリフトを検知したら再学習するか、どちらが良いんでしょうか。」
田中VPoE「ユースケースによるが、両方を組み合わせるのが実践的だ。それぞれの戦略とトレードオフを見ていこう。」
再学習のトリガー戦略
| 戦略 | トリガー | 利点 | 欠点 |
|---|---|---|---|
| 定期再学習 | スケジュール(日次/週次/月次) | 予測可能、運用が安定 | 不要な再学習、急変に対応遅れ |
| イベント駆動 | ドリフト検知、精度低下 | 必要な時のみ再学習 | 検出精度に依存、運用が複雑 |
| ハイブリッド | 定期 + イベント駆動 | バランスが良い | 設計・運用がやや複雑 |
ハイブリッド戦略の設計例
RETRAIN_CONFIG = {
"scheduled": {
"frequency": "weekly",
"day": "monday",
"time": "02:00",
},
"event_driven": {
"drift_psi_threshold": 0.25,
"accuracy_drop_threshold": 0.05,
"consecutive_alerts": 3,
},
"cooldown_hours": 24, # 再学習後の最小待機時間
}
再学習データの選択
| 方式 | 説明 | ユースケース |
|---|---|---|
| 全期間データ | 過去の全データで再学習 | データ量が少ない、安定したドメイン |
| スライディングウィンドウ | 直近N日間のデータのみ使用 | トレンドが変化するドメイン |
| 重み付きサンプリング | 新しいデータに高い重みを付与 | 緩やかな変化のあるドメイン |
def select_training_window(strategy: str, window_days: int = 90) -> tuple:
"""再学習用データの期間を選択する"""
from datetime import datetime, timedelta
end_date = datetime.now()
if strategy == "full":
start_date = datetime(2020, 1, 1)
elif strategy == "sliding_window":
start_date = end_date - timedelta(days=window_days)
elif strategy == "weighted":
start_date = end_date - timedelta(days=window_days * 2)
else:
raise ValueError(f"Unknown strategy: {strategy}")
return start_date, end_date
再学習パイプラインの安全策
再学習は自動化しつつも、安全策を組み込むことが重要です。
| 安全策 | 内容 |
|---|---|
| チャンピオン/チャレンジャー | 新モデルを現行モデルと比較してから入れ替え |
| 品質ゲート | 精度・レイテンシの閾値をクリアした場合のみデプロイ |
| 自動ロールバック | デプロイ後に性能劣化を検知したら即座に切り戻し |
| 人間による承認 | 重要なモデルは手動承認を必須にする |
まとめ
| 項目 | ポイント |
|---|---|
| トリガー戦略 | 定期・イベント駆動・ハイブリッドの3つから選択 |
| データ選択 | 全期間・スライディングウィンドウ・重み付きサンプリング |
| 安全策 | チャンピオン/チャレンジャー比較、品質ゲート、自動ロールバック |
チェックリスト
- 3つの再学習トリガー戦略のトレードオフを説明できる
- 再学習データの選択方式を使い分けられる
- 再学習パイプラインに組み込むべき安全策を列挙できる
次のステップへ
再学習戦略を理解しました。次は演習で、モニタリングとドリフト検出の仕組みを実際に構築してみましょう。
推定読了時間:15分