# Hidden Technical Debt in Machine Learning Systems
> [!abstract] 概要
> 機械学習は、有用で複雑な予測システムを素早く構築するための驚くほど強力なツールキットを提供する。本論文は、こうした素早い成果を無償で得られるものと考えるのは危険だと論じる。技術的負債というソフトウェア工学の枠組みを用いて、実世界の機械学習システムでは莫大な継続的保守コストを負うことが一般的だと分かる。本論文は、システム設計で考慮すべき機械学習特有のいくつかのリスク要因を探る。これには、境界侵食、entanglement、隠れたフィードバックループ、未宣言の消費者、データ依存性、設定の問題、外部世界の変化、およびさまざまなシステムレベルのアンチパターンが含まれる。
## 論文情報
| 項目 | 内容 |
|---|---|
| タイトル | Hidden Technical Debt in Machine Learning Systems |
| 著者 | D. Sculley, Gary Holt, Daniel Golovin, Eugene Davydov, Todd Phillips, Dietmar Ebner, Vinay Chaudhary, Michael Young, Jean-François Crespo, Dan Dennison |
| 所属 | Google, Inc. |
| 媒体 | NeurIPS 2015(Advances in Neural Information Processing Systems 28) |
| 発表年 | 2015 |
| 種別 | 位置づけ論文。新規アルゴリズムも実験も含まない |
| 前身 | 短縮版を SE4ML ワークショップ(2014、モントリオール)で発表した [[@2014__SE4ML2014__Machine Learning - The High-Interest Credit Card of Technical Debt]] |
## 概要
Ward Cunningham が 1992 年に提唱した技術的負債の比喩で、稼働中の機械学習システムの保守が「開発・配備は速く安いが、維持は難しく高い」という非対称になる理由を整理した論文である。機械学習システムは従来コードの保守問題をすべて持つうえ、データがシステム挙動を左右するため抽象化の境界が崩れ、負債がコードでなくシステムレベルに潜む。境界侵食、データ依存性、フィードバックループ、アンチパターン、設定、外部世界の変化、その他の負債を順に列挙し、最後に負債の測り方を問いの形で示す。2014 年の短縮版に対し、設定負債・監視とテスト・その他の負債(データテスト・再現性・プロセス管理・文化)の節が加わった構成である。
## 問題設定
機械学習コミュニティが実運用の経験を積むにつれ、開発と配備は比較的速く安いが、時間をかけた保守は難しく高価だという傾向が広がった。負債は返済しないと複利で膨らみ、隠れた負債は静かに複利で増えるため危険である。機械学習システムの負債は、コードでなくシステムレベルに存在するため検出が難しい。データがシステムの挙動を左右する以上、従来の抽象化や境界が気づかぬうちに壊れたり無効になったりし、リファクタリングや単体テストといったコードレベルの返済手法では足りない。
## 提案手法
新しいアルゴリズムは示さず、システムレベルの相互作用とインターフェースに着目して、負債の発生源を次の観点で分類し、それぞれに緩和策を添える。
- **複雑なモデルが境界を侵食する**(§2)
- entanglement: 特徴量 x1 の入力分布を変えると、残りの n-1 個の特徴量の重要度・重み・使われ方が変わりうる。特徴量の追加・削除も同様である。これを **CACE 原則**(Changing Anything Changes Everything)と呼び、入力信号だけでなくハイパーパラメータ・学習設定・サンプリング・収束閾値・データ選択にも及ぶ。緩和策は、モデルの隔離とアンサンブル提供、予測挙動の変化検知(高次元可視化、スライス別メトリクス)である。ただしアンサンブルは成分の誤差が無相関だから機能するので、個別成分の改善が全体を悪化させることもある。
- 訂正カスケード: 問題 A のモデル ma を入力に、少し違う問題 A' 用の小さな訂正モデルを重ねると、ma への新たなシステム依存が生じる。積み重なると、どの部品の精度向上もシステム全体を悪化させる改善のデッドロックになる。緩和は、同一モデル内で特徴量を足して訂正を直接学習するか、別モデルのコストを受け入れることである。
- 未宣言の消費者: 予測がアクセス制御なしに実行時やファイル・ログ経由で公開されると、無断で他システムの入力に使われる。従来の可視性負債(visibility debt)に当たり、隠れた密結合と隠れたフィードバックループを生む。アクセス制限や厳格な SLA で防ぐ。
- **データ依存性はコード依存性より高くつく**(§3)
- 不安定なデータ依存性: 他の機械学習モデルの出力や TF/IDF のようなデータ依存の対応表など、時間とともに質的・量的に挙動が変わる入力信号。所有者が別だと更新はいつでも起こり、過去の誤較正に適合したモデルは、その修正で急変する。緩和策は信号の版管理(凍結コピー)だが、陳腐化と複数版の維持コストがある。
- 未活用のデータ依存性: 増分の効果が小さい入力信号。レガシー特徴量、バンドル特徴量、ε 特徴量、相関特徴量が典型である。網羅的な leave-one-feature-out 評価で検出する。
- データ依存性の静的解析: コンパイラのような道具が乏しい。データ源と特徴量に注釈を付ける自動特徴量管理システムで依存木を解決し、移行と削除を安全にする。
- **フィードバックループ**(§4): 更新される稼働中システムは自らの挙動に影響し、リリース前の予測が難しくなる分析負債を生む。
- 直接: モデルが自身の将来の学習データの選択に影響する。理論上はバンディットが正解だが、行動空間が大きいと現実的でない。緩和は、一定量のランダム化やデータの一部の隔離である。
- 隠れ: 2 つのシステムが世界を介して間接的に影響し合う。商品選択とレビュー選択を別々のシステムが決める Web ページや、別会社の株式売買予測モデル同士がその例である。
- **機械学習システムのアンチパターン**(§5): 図1のとおり、学習・予測に充てられるコードはごく一部で、残りは Lin と Ryaboy の言う「配管」である。
- glue code: 汎用パッケージへの入出力用コードが膨らみ、システムを特定パッケージの癖に固定する。成熟したシステムは高々 5% が機械学習コードで少なくとも 95% が glue code になりうる。ブラックボックスを共通 API で包んで対処する。
- pipeline jungle: データ準備が、スクレイピング・結合・サンプリング・中間ファイルの藪になる。全体を見渡した設計が要る。
- dead experimental codepath: 実験を本番コード内の条件分岐にすると循環的複雑度が指数的に増える。Knight Capital が古い実験コードパスの意図せぬ挙動で 45 分間に 4 億 6,500 万ドルを失った例を挙げる。
- 抽象化負債: 関係データベースに匹敵する基本抽象が機械学習に無い。分散学習ではパラメータサーバが Map-Reduce より頑健だが、仕様が競合する。
- スメル: 素のデータ型、複数言語、プロトタイプ環境への依存。
- 根因の 1 つは、研究とエンジニアリングの過度な分離である。両者を同じチームに埋め込むハイブリッド研究で摩擦を減らす。
- **設定負債**(§6): 成熟したシステムでは設定行数がコード行数を超えうる。特徴量ごとの記録誤りや利用可否の日付条件などの例を挙げ、良い設定システムの原則を 6 つ示す。小さな差分で指定でき、手作業の誤りが起きにくく、2 モデル間の差分が見え、基本事実(特徴量数、データ依存の推移閉包など)を自動検証でき、未使用の設定を検出でき、コードレビューとリポジトリ管理の対象にする。
- **外部世界の変化**(§7)
- 固定閾値: 手動設定の判定閾値は、モデルの更新で無効になる。保持検証データでの学習による設定が緩和策になる。
- 監視とテスト: 単体テストとエンドツーエンドテストだけでは不十分で、リアルタイム監視と自動対応が要る。出発点として、予測バイアス(予測ラベル分布と観測ラベル分布の一致)、行動上限、上流生産者の監視を挙げる。
- **その他の負債**(§8): データテスト、再現性、プロセス管理(数十〜数百モデルの同時運用)、文化(特徴量削除や複雑さ削減を精度向上と同等に評価する)。
![[wiki/sources/_attachments/2015__NeurIPS__Hidden-Technical-Debt-in-Machine-Learning-Systems/fig01-ml-system-components.png]]
*図1(Figure 1): 実世界の機械学習システムのうち機械学習コードが占める割合はごくわずかで、中央の小さな黒い箱にすぎない。周囲に必要なインフラは広大で複雑である。*
## 新規性
- 個々のアルゴリズムでなく、システムレベルの相互作用を負債の発生源とみなし、機械学習特有の負債を体系的に列挙した。
- 「データが挙動を決める」ことに起因する境界侵食を、CACE 原則という名前で定式化した。
- 2014 年の短縮版から、設定負債・監視とテストの具体的な出発点・その他の負債(データテスト、再現性、プロセス管理、文化)・負債の測定に関する問いを追加した。
## 実験設定
実験はない。Google の広告クリック予測などでの実務経験にもとづく観察と、参考文献に挙げた先行事例(Knight Capital の障害報告など)を根拠にする。
## 実験結果
定量的な結果はない。定性的な主張として、成熟したシステムでは機械学習コードが高々 5%、glue code が少なくとも 95% になりうること、設定行数がコード行数を超えうることが述べられる(いずれも出典の示す可能性の記述であり、測定値ではない)。
## 考察
負債を測る厳密な指標は無い。速く動けていること自体は負債が低い証拠にならず、負債の全費用は時間が経ってから見える。代わりに次の問いを示す。
- 全く新しい算法的アプローチを本番規模でどれだけ簡単に試せるか。
- データ依存性の推移閉包は何か。
- 新しい変更の影響をどれだけ正確に測れるか。
- あるモデルや信号の改善が他を悪化させないか。
- 新メンバーをどれだけ早く立ち上げられるか。
最も重要な洞察として、技術的負債は研究者とエンジニアの双方が意識すべき問題であり、わずかな精度向上のためにシステムの複雑さを大きく増やす研究解は賢明でないと述べる。負債の返済にはチーム文化の転換が要る。
## 強み / 弱点・課題
強み:
- 機械学習システムの保守性の議論に共通語彙(CACE、glue code、pipeline jungle、未宣言の消費者)を与えた。
- 各負債に、版管理、leave-one-out 評価、ラッパー API、設定の原則といった具体的な緩和策を添えている。
弱点・課題:
- 実験や測定がなく、主張は著者らの実務経験に依拠する。glue code 95% も可能性の記述である。
- 負債を定量化する指標を提示できていない(著者ら自身が認める)。
- 深層学習以前の広告・スパム検知などが背景で、大規模言語モデルの時代の負債には直接及ばない。
## 関連
- 概念: [[技術的負債]] / [[データ依存性負債]] / [[機械学習システムの本番モニタリング]] / [[フィードバックループ]] / [[データ分布のシフト]] / [[ソシオテクニカル負債]]
- ソース: [[@2014__SE4ML2014__Machine Learning - The High-Interest Credit Card of Technical Debt]](同一著者陣による短縮版)
- 実体: [[Google]] / [[D. Sculley]] / [[Gary Holt]] / [[Daniel Golovin]] / [[Eugene Davydov]] / [[Todd Phillips]] / [[Dietmar Ebner]] / [[Vinay Chaudhary]] / [[Michael Young]] / [[Jean-François Crespo]] / [[Dan Dennison]]