機械学習を含む開発をアジャイルに取り組む

f:id:tune:20181201221918p:plain
機械学習のイメージ

概要

機械学習ディープラーニングなどアルゴリズム検討を含めてうまくアジャイル開発を回すやり方を考えたい。

Spotify機械学習に取り組むDavid Murgatroyd氏がSlideshareに公開している資料をベースとしている。

www.slideshare.net

詳細

機械学習の検討がアジャイル開発でうまく回せない要因

アプリケーション・システムの開発と比較してアルゴリズム開発は予測しづらい事項が多い。また手番も長くかかるため、製品全体を固定期間のスプリントで区切り、アジャイルに開発しようとするとアルゴリズム周りでうまくいかないことが多い。近年だと機械学習ディープラーニングが関係する箇所が特にそうなりやすいのではないか。

機械学習の検討の流れ

David Murgatroyd氏の資料では下記のように整理されている。楽曲の推薦アルゴリズムを業務で開発していると思われるが、検出や認識など他のアルゴリズムでも大枠は外してないと思われる。

  1. 問題を明らかにする (Identify Problem) : 解決すべき課題を明確にする。
  2. メトリクスを明らかにする (Identify Metrics) : 課題が解決できたか確認できる指標を明確にする。
  3. データを明らかにする (Identify Data) : 扱うデータセットの用意・整備
  4. モデルを明らかにする (Identify Model(s)) : どのようなアプローチで問題に取り組むか。ディープラーニングのネットワーク検討など。
  5. 探索・実験 (Explore & Experiment) : データセットをもとに学習を施行する。
  6. 分析 (Analyze) : モデルがうまく動作しているか、仮定に見落としが無いかを確認する。
  7. 優先順位づけ (Prioritize) : 課題の対処法を検討する。
  8. 製品投入 (Productize) : 完成したモデル・アルゴリズム・モジュールを製品に組み込む。

開発フロー案

別チームとして扱い、アジャイル開発のサイクルに取り込まない。定期的に成果物をリリースしてもらう。

機械学習の検討を行うチームとアジャイル開発を行うチームを完全に分ける。機械学習検討チームはアジャイル開発を行わず、彼らの都合の良いタイミングで不定期にリリース物を出してもらう。そしてタイミングを見てアジャイル開発チームが成果物を製品に統合する。。全体としてアジャイル開発は実現できていないが、とりあえず機能する。

デリバリーまでに時間がかかること、顧客からのフィードバックが届きにくいこと、フィードバックを踏まえた開発項目の優先順位見直しがやりにくいことが課題である。

機械学習の検討ステージによってスプリント内で扱う開発項目を絞る。

よくあるスクラムを用いたアジャイル開発は固定期間のスプリント内(1週間〜1ヶ月)で要求分析・設計・実装・テストまでを行う。先の機械学習の流れで言うと1から8まで1週間〜1ヶ月で終わらせるイメージとなる。これでは検討時間が十分に確保できず、スプリント内で不足の自体が起きると成果なしとなってしまう。

そこで機械学習の検討ステージによってスプリント内で検討する項目を限定し、開発期間の短縮を図る。具体的には次のようにする。

  1. 課題の明確化・基本方針の決定→1〜4を扱う : 課題・指標がうまくつかめるまで試行錯誤を行う段階。基本方針となりうる候補をいくつか見つける。
  2. モデルの選定・改善→4〜7を扱う : モデル・データ・アプローチを変えながら改善を試みる。最終製品で用いるモデル・アルゴリズムを決定する。
  3. 製品投入前の仕上げ→ 5〜8を扱う : パラメータの調整を行い、製品品質に精度を高める。

チーム構成案

クロスファンクショナルチームを構成する

各チームに機会学習に長けた人材を配置し、アプリケーション・システム開発を行うメンバと協調して開発を進める。 アジャイル開発としてはもっとも望ましい状態。 各チームに機械学習エンジニアが大勢いることはないので、機械学習アルゴリズムの深掘りがしにくい課題がある。 製品にたくさんのモデル・アルゴリズムがあり、それぞれが比較的シンプルな場合に有効。

専門チーム

機械学習に長けた人材をチームに集め、成果を別チームに提供する。 機械学習アルゴリズムの深掘りはやりやすくなる。 システム・アプリケーションを開発する別チーム間と開発スピード・サイクルを揃える必要が出てくる。 製品に少数で複雑なモデル・アルゴリズムがある場合に有効。

機械学習エンジニアの分類と役割

ひとくちに機械学習エンジニアといっても本人の特性・資質によって役割が異なる。

機械学習の適用」を行うエンジニア

ツール・ライブラリ・既知のモデルを元に、製品で活用できる機械学習技術を開発するエンジニア。 ArXivに投稿される最新論文や、分野ごとの技術動向をウォッチし、自社の製品に活用できるものを見定めて取り込むことを行う。 求められる素養としては「アルゴリズムもわかるエンジニア」。

機械学習に必要なツール」を開発するエンジニア

最新の論文、分野ごとの技術動向をウォッチし、背景の理論を理解し、技術の検討・開発に必要なツールを開発するエンジニア。 求められる素養としては「理論がわかり、実装にも強い研究者・またはエンジニア」。

「機会学習の理論」を開発する研究者

機械学習の新アルゴリズムを考案する研究者。

みんなどうしているんだろう?

事例を集めてもっと良いやり方を見つけたい。