唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

論文感想: "Machine Learning: The High-Interest Credit Card of Technical Debt"

NIPS 2014のWorkshopのSE4ML: Software Engineering for Machine Learningというので発表された論文っぽいです
Twitterで話題になっていたので読んだメモです

久しぶりに英語論文を読んだらしっかり読めてないっぽいので、内容がおもしろそうだと思った人はぜひ原文を読んでください

概要

タイトルを和訳すると「機械学習は技術的負債の高利子なクレジットカード」的な感じでしょうか
機械学習は便利だけど技術的負債も大変なので気をつけよう、的な話です

コードレベルの負債はリファクタリングユニットテスト、デッドコードの削除、ドキュメント化などで対策できるけどシステムレベルの負債はそれらでは対処できない
システムの相互作用による隠れた負債について取り上げる

複雑なモデルはうまく分離できない

重みベクトルの次元同士に依存関係があるから、一つの次元の分布を変えたら、他の次元の重みも大きく変える必要がある
ハイパーパラメーターを変えたら劇的に動作が変わる
問題の軽減策としては、部分問題のアンサンブルや洗練された正則化の方法(?)などがあげられている

隠れたフィードバックループがある場合があって、結果がわかりづらくなる(?)
いつの間にか知らないシステムが出力を利用していることがあって、新たに隠れたフィードバックループが生まれていることがある

データの依存

機械学習のシステムは外部のデータに依存するから抽象化が難しい

他のシステムの出力を使っているといつの間にか出力の性質が変わってしまう場合があるので、利用するバージョンのシステムのコピーをとっておくべき

使われていない特徴量は取り除くべき

いくつものモデルの出力を複数の別のモデルにつなげていくのは複雑になるからよくない

システムレベルのスパゲッティ

一般用のパッケージを使うと、ライブラリ同士などをつなぎ合わせるための多くのコードが必要になる

C++Java機械学習プログラムを再実装するのは大変だけど、テストやメンテナンスのしやすさなどの利点がある

データを準備するときに、データの加工のパイプラインだらけになることがある

実験中に使った、最終的には使われない部分がコードに残ってしまう

設定も負債になる

外の世界の変化を扱う

システムができた後の変化に対応する必要がある

出力のしきい値などは固定ではなく、自動で求められるようにしておくべき

因果関係にない相関は、急に共起しなくなったりするので負債になる

システムの出力を監視し続ける必要がある

まとめ

負債を減らすように気をつけましょう
小さな精度の改善でシステムに大きな複雑さを求めるような方法はよくない

感想

Googleほどの規模になると、いつの間にかシステムに依存関係が生まれているのか、怖いですね……
実際に機械学習を使ったシステムを実運用するとなると、技術的負債になるかどうかとかスケールするかどうかとか精度が必要かどうかとかいろいろと考えることが多くて大変そう