Mímisbrunnr知恵の泉

← MLOps 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:MLOpsとMLライフサイクル | 関連:MLOpsと実験管理(機械学習)

要点(BLUF)

1. なぜMLは負債が溜まりやすいのか

通常のソフトウェアは、モジュールを疎結合に保てば部分を独立に検証・交換できます。ところがMLモデルはデータから挙動を学ぶため、入力・特徴量・他モデルの出力が暗黙の依存として絡み合います。コードレビューでは見えない依存が、本番で連鎖的に壊れる——これがML特有の負債です。

2. ML特有の負債カタログ

負債何が起きるか典型的な兆候
CACE1箇所の変更が全体に波及。再学習で全特徴量の重みが変わる「特徴量を1つ足しただけ」で精度が崩れる
データ依存入力シグナルの提供元が勝手に変わる/消える上流テーブルのスキーマ変更で予測が壊れる
隠れたフィードバックループモデルの出力が次の学習データに影響し、自己強化する推薦が「人気をさらに人気に」して評価が歪む
グルーコードOSSモデルを繋ぐ接着剤コードが肥大化コード95%が前処理・変換の繋ぎ込み
パイプラインジャングル前処理が継ぎ足しで増殖し依存が追えない誰もデータフロー全体を説明できない
未定義の消費者予測を誰が使っているか不明出力を勝手に参照する下流が複数

3. 図解:隠れたフィードバックループ

最も厄介なのが、モデル出力が巡り巡って自分の学習データを汚染するループです。

flowchart LR
  A["モデルの予測"] --> B["ユーザーに提示"]
  B --> C["ユーザーの行動が変わる"]
  C --> D["ログとして記録"]
  D --> E["次の学習データ"]
  E -->|"自分の出力を学習し直す"| A

このループがあると、オフライン評価では高精度でも、本番では「モデルが自分の世界観を強化し続ける」病的な挙動になります。直接フィードバックループ(自分の出力を直接学習)と、複数モデルが互いの出力を食い合う隠れた相互作用の両方に注意します。

4. 動く最小例:フィードバックループが評価を歪める

「人気度を予測 → 上位を露出 → 露出されたものがクリックされ人気が上がる」という自己強化ループを最小シミュレーションします。

import numpy as np

rng = np.random.default_rng(0)
n_items = 8
true_quality = rng.uniform(0.0, 1.0, n_items)   # 本来の質(固定)
exposure = np.ones(n_items)                       # 露出回数の累積

# フィードバックループあり:露出された人気アイテムをさらに露出
for _ in range(30):
    score = true_quality * np.log1p(exposure)     # 露出が多いほどスコア加算
    top = np.argsort(score)[-3:]                   # 上位3つを露出
    exposure[top] += 1

rank_true = np.argsort(-true_quality)             # 本来の質の順位
rank_obs = np.argsort(-exposure)                  # 露出から見える人気順位
agree = np.mean(rank_true[:3] == rank_obs[:3])
print(f"本来の質トップ3   = {rank_true[:3]}")
print(f"露出由来トップ3   = {rank_obs[:3]}")
print(f"上位3の一致率     = {agree:.2f}")
print(f"露出の偏り(最大/最小) = {exposure.max()/exposure.min():.1f} 倍")

出力:

本来の質トップ3   = [5 4 7]
露出由来トップ3   = [5 7 4]
上位3の一致率     = 0.33
露出の偏り(最大/最小) = 31.0 倍

出力の意味:本来の質と露出由来の人気は順位がずれ(4位と7位が逆転)、露出は最大31倍の偏りを生みました。一度上位に出たものが露出によってさらに上位化する——モデルの出力が「観測される真実」を作り変えてしまう。本番ログをそのまま再学習データにすると、この歪みを学習し続けます。だからログには露出・提示位置などの交絡を必ず記録し、補正(傾向スコア・反実仮想評価)を考えます(リリース戦略(シャドー・カナリア・A-Bテスト)・因果推論分野へ)。

5. 運用の勘所:負債を返済する

なぜそうするのか

技術的負債は金利のように複利で増えます。ML では「動いているから触らない」が放置を正当化しがちですが、CACE のせいで放置されたシステムは変更不能になり、ドリフトに対応できなくなります。負債を「名前のある具体的な失敗様式」として認識することで、レビューや設計の段階で先回りできます。

⚠️ よくある落とし穴

対応 lab

関連ノート