# Machine Learning: The High-Interest Credit Card of Technical Debt > [!abstract] 概要(abstract の日本語訳) > 機械学習は複雑なシステムを迅速に構築するための幻惑的なほど強力なツールキットを提供する。本論文は、こうした速い成果をコスト無しに得られるものと考えるのは危険だと主張する。技術的負債の枠組みを用いて、機械学習を適用する際にシステムレベルで莫大な継続的保守コストを発生させることが驚くほど容易であることを指摘する。本論文の目標は、いくつかの機械学習特有のリスク要因と、回避あるいはリファクタリングすべき設計パターンを強調することにある。これらには境界侵食、entanglement、隠れたフィードバックループ、未宣言の消費者、データ依存性、外部世界の変化、そして多様なシステムレベルのアンチパターンが含まれる。 ## 論文情報 | 項目 | 内容 | |---|---| | タイトル | Machine Learning: The High-Interest Credit Card of Technical Debt | | 著者 | D. Sculley, Gary Holt, Daniel Golovin, Eugene Davydov, Todd Phillips, Dietmar Ebner, Vinay Chaudhary, Michael Young | | 所属 | Google, Inc. | | 媒体 | SE4ML: Software Engineering for Machine Learning(NIPS 2014 Workshop) | | 発表年 | 2014 | | 種別 | 位置づけ論文(position paper)。実験は伴わず、実務上の観察とリスク要因のカタログ化が中心 | ## 概要 Ward Cunninghamが1992年に導入した技術的負債の枠組みを機械学習システムに適用し、機械学習パッケージが通常のコードと同じコード複雑性の問題に加えて、より大きなシステムレベルの複雑性という隠れた負債を生み出すことを論じる。従来のリファクタリング・単体テスト・デッドコード削除といった技術的負債の返済手法は、こうしたシステムレベルの負債には十分に対応できないと指摘し、機械学習システムと周辺システムとの相互作用という領域に焦点を当てて、境界侵食・データ依存性・システムレベルのアンチパターン・外部世界の変化という4つの軸でリスク要因を整理する。 ## 問題設定 ソフトウェアエンジニアは新しい製品やサービスを迅速に出荷する必要に迫られており、実行速度とエンジニアリング品質の間のジレンマに直面する。技術的負債はこのジレンマの帰結を定量化する枠組みとして導入されたが、負債は複利的に増大する傾向を持ち、返済を先延ばしにするとコスト増大・システムの脆弱化・イノベーション速度の低下を招く。従来の技術的負債の返済手法(リファクタリング・単体テストカバレッジの向上・デッドコードの削除・依存関係の削減・APIの引き締め・文書化の改善)は新機能の追加を目的とせず、将来の改善を容易にし保守コストを下げ、バグの可能性を減らすことを目的とする。 本論文の基本的な主張は、機械学習パッケージは通常のコードが持つ基本的なコード複雑性の問題をすべて備えつつ、隠れた負債を生み出しうるより大きなシステムレベルの複雑性を追加で持つという点にある。したがって、これらのライブラリのリファクタリングやより良い単体テストの追加といった活動は時間をかける価値があるが、システムレベルの負債には必ずしも対応しない。本論文は機械学習コードと、それを取り巻くより大きなシステムとのシステムレベルの相互作用を、隠れた技術的負債が急速に蓄積しうる領域として焦点化する。 ## リスク要因のカタログ 論文は機械学習システム特有のリスク要因を、境界侵食・データ依存性・システムレベルのスパゲッティ・外部世界の変化という4つの節に整理する。実験による検証ではなく、Googleでの実務経験に基づく観察とその緩和戦略の提示という形式を取る。 ### 複雑なモデルによる境界侵食 伝統的なソフトウェア工学は、カプセル化とモジュール設計による強い抽象境界が保守可能なコードを生むことを示してきた。しかし機械学習システムに厳密な抽象境界を強制することは難しい。機械学習システムを使う最も重要な理由はまさに、望ましい振る舞いを外部データへの依存なしにソフトウェアロジックとして実装できない点にあり、抽象的な振る舞いの不変条件をデータの癖から切り離す方法がほとんど存在しないためである。 **Entanglement(CACE原則)**: 機械学習パッケージは高い視点から見ればデータソースを混ぜ合わせる道具であり、改善の分離を実質的に不可能にする機械である。特徴 $x_1, ..., x_n$ を使うシステムで $x_1$ の入力分布を変えると、残る $n-1$ 個の特徴の重要度・重み・使われ方がすべて変わりうる(バッチ再学習でもオンライン適応でも同様)。新しい特徴 $x_{n+1}$ の追加や特徴 $x_j$ の削除も同様の変化を引き起こす。どの入力も真に独立ではない。論文はこれを **CACE原則(Changing Anything Changes Everything、何かを変えればすべてが変わる)** と呼ぶ。同じ原則がハイパーパラメータにも当てはまり、正則化強度・学習設定・訓練時のサンプリング手法・収束閾値などのあらゆる調整が広範な影響を持ちうる。緩和策として、(1) モデルを分離してアンサンブルとして提供する、(2) 高次元可視化ツールなどでモデル予測の振る舞いに深い洞察を得る、(3) より洗練された正則化手法で予測性能の変化に目的関数上のコストを課す、の3つが挙げられるが、いずれも決定打ではなく、entanglementは学習アルゴリズムの種類によらず機械学習に本質的な問題だとされる。バージョン1.0の出荷は容易だが、その後の改善は予想外に困難になりやすいため、この点を締切のプレッシャーと慎重に比較検討すべきだと論文は述べる。 **隠れたフィードバックループ**: 世界の振る舞いから学習するシステムは明示的にフィードバックループの一部として意図されるが、隠れたフィードバックループは分析を困難にする。例として、ニュース見出しのクリック率(CTR)予測システムが、ユーザーが過去1週間にクリックした見出し数を表す特徴 $x_{week}$ を使う場合を考える。CTRモデルが改善されると多くのユーザーがより多くの見出しをクリックするようになるが、その効果は $x_{week}$ が調整されるまで少なくとも1週間は完全には表面化しない。モデルが新しいデータで更新されると(バッチでもオンラインでも)、$x_{week}$ に対するモデルの評価がさらに変化し、システムは1週間よりもはるかに長い時間スケールで緩やかに振る舞いを変え続けうる。こうした緩やかな変化は短時間の実験では見えず、提案された変更の効果分析を極めて困難にし、単純な改善にもコストを追加する。論文は隠れたフィードバックループを注意深く探し、可能な限り除去することを推奨する。 **未宣言の消費者**: モデルAの予測が実行時にアクセス可能になったり、ログに書き込まれて他システムに後で消費されたりする場合、アクセス制御がなければ一部の消費者が未宣言の消費者(undeclared consumer)、すなわちある予測モデルの出力を別コンポーネントの入力として消費する存在になりうる。未宣言の消費者はモデルAを他のスタック部分に突然密結合させ、Aへのどんな変更も意図しない・十分に理解されない・有害な形で他部分に影響を与えうるため、Aへの変更自体が困難かつ高コストになる。さらに危険なのは、未宣言の消費者が新たな隠れたフィードバックループを持ち込みうる点である。例としてCTR予測を見出しのフォントサイズ決定モジュールが入力信号として使い始め、フォントサイズがクリック傾向に影響する場合、フォントサイズにCTRを含めることが新しい隠れたフィードバックループを追加し、システムがすべての見出しのフォントサイズを際限なく徐々に大きくし続けるような事態も起こりうる。 ### データ依存性はコード依存性より高コストである 先行研究([7])は依存関係の負債を伝統的なソフトウェア工学における技術的負債の主要な寄与要因として指摘するが、本論文は機械学習システムにおけるデータ依存性が同様に負債を蓄積する能力を持つと論じる。コード依存性が静的解析やリンク図で比較的容易に特定できるのに対し、データ依存性には同種の解析ツールが乏しく、絡み合ったデータ依存性チェーンを不適切に容易に構築してしまいがちである。 **不安定なデータ依存性**: 迅速に動くために他システムが生成する信号を入力特徴として消費するのは便利だが、一部の入力信号は不安定、すなわち時間とともに質的に振る舞いを変える。これは別の機械学習モデル自体が時間とともに更新される場合やTF/IDFスコア・意味的マッピングなどのデータ依存ルックアップテーブルの場合に暗黙的に起こるほか、入力信号のエンジニアリング所有権がそれを消費するモデルの所有権と分離している場合に明示的に起こる。CACE原則により、入力信号への「改善」は診断・対処にコストのかかる任意の(時に有害な)効果を持ちうる。緩和策として信号のバージョン管理されたコピーを作成する方法があるが、これは陳腐化のコストと複数バージョンを維持する負担という別の技術的負債を生む。 **未活用のデータ依存性**: 精度への増分価値がほとんどない入力特徴・信号は不必要な変更への脆弱性をシステムにもたらす。これは3つの経路で紛れ込む。(1) **レガシー特徴**: 開発初期に含まれた特徴Fが、後から追加された他の特徴によってほぼ・完全に冗長になっても検出されない。(2) **バンドル特徴**: 一群の特徴が有益と評価されると締切のプレッシャー等でバンドル全体がまとめてモデルに追加され、価値をほとんど・全く追加しない特徴が隠れる。(3) **$\epsilon$特徴**: 精度をわずかでも改善する新特徴の追加は魅力的だが、精度向上が非常に小さいか複雑性オーバーヘッドが高い場合もある。論文は、企業合併後に新旧の商品番号スキームを両方特徴として残した実例を挙げ、翌年に善意で古い番号のデータベース投入を止めるコード整理が行われた際、回帰テストでは検出されず機械学習システムの保守担当者に問題が生じるという具体的な事例を示す。緩和策として、個々の特徴を除去した場合の効果を定期的に評価し、この情報に基づいて行動することが挙げられる。 **データ依存性の静的解析**: データ依存性負債の重要な問題の一つは静的解析の難しさである。コンパイラやビルドシステムは通常この機能をコードに提供するが、データ依存性を追跡するには追加のツールが必要になる。多数のエンジニアが関与する大規模企業では、辞書のバージョンを変更する際に全消費者を特定することさえ容易ではない場合がある。McMahanら([6])で説明された自動化された特徴管理ツールは、データソースと特徴にアノテーションを付け、すべての依存関係が適切なアノテーションを持つことを確認する自動チェックを実行し、依存関係ツリーを完全に解決できるようにする。この手法の導入以降、Googleのあるチームは四半期ごとに数千行の特徴関連コードを安全に削除できるようになり、バージョンや他の問題の検証も自動化された。 **訂正カスケード**: 問題Aに対するモデル $a$ が既に存在し、わずかに異なる問題 $A'$ の解が必要な場合、$a$ を入力として小さな訂正を学習するモデル $a'(a)$ を学習することが魅力的に見える。これは訂正モデルが通常非常に小さく、独立したチームで実施できるため、迅速で低コストな勝利に見えることが多い。しかしこの訂正モデルはモデル $a$ へのシステム依存性を作り出し、将来 $a$ への改善を分析する際のコストを著しく増大させる。訂正モデルがカスケード(問題 $A''$ に対するモデルが $a'$ の上にさらに学習される、など)すると事態はさらに悪化し、$a$ の精度改善がシステムレベルではむしろ悪化を招く状況や、結合した機械学習システムが局所最適に陥り個別のコンポーネントモデルを改善できなくなる「デッドロック」を生みうる。緩和策として、各ユースケースを区別する特徴を追加することで訂正をモデル $a$ 自体に直接学習させる方法があるが、CACE原則により関連する問題群は結合されたままであり、これは無償の解決策ではない。 ### システムレベルのスパゲッティ 機械学習手法を組み込んだシステムは、高負債の設計パターンに陥りがちである。 **Glue Code**: 機械学習研究者は汎用ソリューションを自己完結パッケージとして開発する傾向があり、これを使うと汎用パッケージへのデータの出し入れのために大量の支援コードが書かれる「glue code」パターンが生じる。このパターンはシステムを特定パッケージの特殊性に長期的に固定してしまう。汎用ソリューションは多くの問題を解く1つの学習システムを提供しようとするが、実務的なソフトウェアシステムの多くは1つの大規模問題に高度に工学的に特化しており、多くの実験的解を求める。glue codeパターンは問題空間の構築を、原理的に設計されたコンポーネントではなく支援コードに暗黙的に埋め込み、他の機械学習アプローチでの実験を法外に高コストにし、イノベーションへの継続的な税となる。論文は、成熟した機械学習システムのコードのうち実際に「機械学習」を行っているのはごく一部にすぎず、多くのシステムで**最大でも5%が機械学習コードで少なくとも95%がglue code**になりうると指摘し、既存パッケージのAPIをそのまま再利用するよりC++やJavaで特定アルゴリズムを再実装するほうが、より少ないglue code・容易なテスト・容易な保守・代替手法の差し替え可能性という点で優れた戦略になりうると論じる。 **Pipeline Jungles**: glue codeの特殊形態としてデータ準備部分に現れる。新しい信号の特定・新しい情報源の追加とともに有機的に進化し、注意を払わなければスクレイプ・結合・サンプリングの手順(しばしば中間ファイル出力を伴う)が絡み合ったジャングルと化す。こうしたパイプラインの管理・エラー検知・障害回復は困難かつ高コストであり、テストには高価なエンドツーエンド統合テストが必要になる。回避策は、データ収集と特徴抽出について全体論的に考え、パイプラインジャングルを一掃してゼロから再設計する大規模な工学的投資しかない。論文はさらに、glue codeとpipeline junglesは「研究」と「エンジニアリング」の役割が過度に分離していることに根本原因があるとし、Googleでは研究者とエンジニアが同じチームに埋め込まれるハイブリッド研究アプローチ([10])がこの摩擦源を大きく低減してきたと述べる。 **Dead Experimental Codepaths**: glue codeやpipeline junglesが硬直化すると、代替アルゴリズムや調整を本番コード内の条件分岐として実装する実験がますます魅力的になる。個々の変更単体のコストは低い一方、こうした実験的コードパスが時間とともに蓄積すると成長する負債を生み、実験的コードパスとの後方互換性の維持がより本質的な変更の重荷になり、廃止された実験的コードパス同士が予測不能に相互作用してシステム複雑性を指数関数的に増大させうる。論文はここでの危険の有名な実例として、Knight Capital社が廃止された実験的コードパスに起因すると見られる予期しない振る舞いによって**45分間で4億6,500万ドルを失った**事例([9])を挙げる。健全な機械学習システムでは実験的コードは複数モジュールに触手を残さないよう十分に隔離されているべきであり、これはコードAPIの再考を要することが多い。Googleでのある重要な機械学習システムの最近のクリーンアップでは未使用の実験的コードパスを数万行削除でき、後続のより緊密なAPIによる書き換えで新アルゴリズムの実験を大幅に軽減された労力・本番リスク・システム複雑性で実施できるようになったという実例が報告される。 **Configuration Debt**: 大規模システムは使用する特徴・データ選択方法・アルゴリズム固有の学習設定・前処理/後処理・検証手法など幅広い設定可能なオプションを持つ。多くのエンジニアは本番コードの抽象化や単体テストには真剣に取り組むが、設定(とその拡張)は後回しにされがちで、設定の検証やテストは重要と見なされないことすらある。論文は例として、特徴Aが9/14〜9/17に誤ってログされていた、特徴Bは10/7以前のデータで利用できない、特徴Cを計算するコードはログ形式変更のため11/1前後で変更が必要、特徴Dは本番で利用できず代替特徴D'とD''を使う必要がある、特徴Zを使う場合は訓練ジョブに追加メモリを与えないと非効率になる、特徴Qはレイテンシ制約から特徴Rの使用を排除する、といった具体的な混乱を挙げる。成熟し活発に開発されるシステムでは設定の行数が実際に機械学習を行うコードの行数を大きく上回ることもあり、各行がミスの可能性を持つ一方で設定は本質的に一時的で十分にテストされにくい。緩和策として、設定不変条件に関するアサーション、2つの設定の視覚的な差分(diff)表示ツール、コードと同水準の真剣さでの設定のレビューが挙げられる。 ### 外部世界の変化への対処 機械学習システムを魅力的にする要因の一つが外部世界と直接相互作用する点であり、外部世界はめったに安定しないため、これ自体が機械学習システムにおける技術的負債の一因となる。 **動的システムにおける固定閾値**: 真偽の予測・スパムメールの判定・広告の表示可否など何らかの行動を取るために決定閾値を選ぶことが必要になるが、こうした閾値はしばしば手動設定される。モデルが新しいデータで更新されると、古い手動設定の閾値が無効になりうる。緩和策としてホールドアウト検証データでの単純な評価によって閾値を学習する手法([8])が挙げられる。 **相関がもはや相関しなくなるとき**: 2つの特徴が常に相関しているが一方だけが真に因果的である場合でも、その共起に依拠して両方に功績を帰することが問題なく見えることがある。しかし世界が突然これらの特徴を共起させなくなると、予測の振る舞いが大きく変化しうる。論文は非因果的な相関が隠れた負債のもう一つの源であると指摘する。 **モニタリングとテスト**: 個別コンポーネントの単体テストと稼働システムのエンドツーエンドテストは価値があるが、変化する世界に直面するとシステムが意図通り動作している証拠として十分ではない。リアルタイムのライブモニタリングが重要である。論文は2つの妥当な出発点を提示する。(1) **Prediction Bias**: 意図通り動作するシステムでは、予測ラベルの分布が観測ラベルの分布と等しいのが通常であり、これは包括的なテストではないが(ラベル出現の平均値を特徴によらず予測するnullモデルでも満たされうる)、驚くほど有用な診断であり、世界の振る舞いが突然変化し過去データから引かれた訓練分布が現在の実態を反映しなくなった場合の検知に役立つ。次元ごとにprediction biasをスライスすることで問題を迅速に切り分けられ、自動アラートにも使える。(2) **Action Limits**: 現実世界で行動を取るシステムでは、健全性チェックとして行動制限を設定・強制することが有用である。制限は偽陽性で発火しない程度に十分広く取るべきで、システムがある行動の制限に達した場合は自動アラートが発火し手動介入・調査を促すべきである。 ## 考察 論文は結論として、機械学習は悪ではなく技術的負債も絶対に避けるべきものではないとしつつ、短期的に速く動くための穏当な技術的負債を許容することは合理的でありうるが、これを認識し会計処理しなければ急速に手に負えなくなると述べる。最も重要な洞察は、技術的負債がエンジニアと研究者の双方が意識すべき課題だという点にあり、システム複雑性の巨大な増大というコストと引き換えにわずかな精度向上しかもたらさない研究上の解決策は稀にしか賢明でない。1つや2つの一見無害なデータ依存性の追加ですら、その後の進捗を遅らせうる。技術的負債の返済は新定理の証明ほど華々しくはないが、一貫した強いイノベーションにとって不可欠な部分である。 ## 強み / 弱点・課題 ### 強み - 技術的負債という既存のソフトウェア工学の枠組みを機械学習システムに初めて体系的に適用し、entanglement(CACE原則)・隠れたフィードバックループ・未宣言の消費者・訂正カスケードなど機械学習特有の負債パターンに具体名を与えた - Googleでの実務経験に基づく具体的な実例(商品番号スキームの実例、Knight Capital社の45分間4億6,500万ドル損失事例など)を交え、抽象論に終わらせていない - 各リスク要因に対して緩和戦略を併記しており、実務者にとっての行動指針としても機能する ### 弱点・課題 - 実験や定量評価を伴わない位置づけ論文(position paper)であり、挙げられたリスク要因や緩和策の効果は体系的に検証されていない - Googleという単一組織・広告/検索領域での実務経験に基づくため、他組織・他分野への一般化可能性は論文内では検証されていない - entanglementの緩和策(モデル分離・可視化ツール・正則化)はいずれも「決定打ではない」と論文自身が認めており、根本的な解決策は提示されていない ## 関連 - 概念: [[技術的負債]] / [[ソシオテクニカル負債]] - エンティティ: [[D. Sculley]] / [[Gary Holt]] / [[Daniel Golovin]] / [[Eugene Davydov]] / [[Todd Phillips]] / [[Dietmar Ebner]] / [[Vinay Chaudhary]] / [[Michael Young]] / [[Google]] - 関連 MOC: [[structures/Software Engineering - MOC]] ## 出典 - Sculley, D., Holt, G., Golovin, D., Davydov, E., Phillips, T., Ebner, D., Chaudhary, V., Young, M. (2014). "Machine Learning: The High-Interest Credit Card of Technical Debt." *SE4ML: Software Engineering for Machine Learning (NIPS 2014 Workshop)*.