プロダクション環境でオンラインで機械学習を動かすにあたってツライ話...

30
プロダクション環境で オンラインで機械学習を ぶん回すにあたってツラい話 Emotion Intelligence株式会社 (旧DoBoken) ところてん

Upload: shinta-nakayama

Post on 15-Jul-2015

6.056 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

プロダクション環境でオンラインで機械学習を

ぶん回すにあたってツラい話

Emotion Intelligence株式会社

(旧DoBoken)

ところてん

Page 2: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

お前誰よ

•ところてん• http://twitter.com/tokoroten

•高機能雑用• 半導体計測屋

• セキュリティ研究者

• ビッグデータ屋

• ソシャゲ・クロス集計おじさん

• ソシャゲ・ゲームデザイナ

• 広告部門の手伝い

• 機械学習おじさん Now

2

Page 3: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

最近の活動

•一般社団法人未踏のお手伝い• http://www.mitou.org/

Page 4: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

最近の活動

•タッチパネル性のゲーム開発

4http://www.nicovideo.jp/watch/sm25185906 https://www.youtube.com/watch?v=7-hPyxorhho

Page 5: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

最近の活動

5https://twitter.com/t_tutiya/status/591536291050704896 https://twitter.com/dnasoftwares/status/591421236653133824

Page 6: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

最近の活動

6

Page 7: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

Emotion Intelligence株式会社

気持ちを解するテクノロジーの探究

※4/1に社名変更しました

Page 8: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

ZenClerk

https://www.zenclerk.com/

Page 9: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

リアルタイムオファー

• ECサイトに訪れているお客様にとって、最適なタイミングでクーポンを提示する

•家電量販店の店員のイメージ• フロアを歩いて情報収集しているときは、声をかけてこない

• 商品を比較検討していると、声をかけてきて商品の説明をしてくれる

• 場合によっては、特別な割引を提案してくれる

Page 10: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

リアルタイム分析

•お客様の動きをリアルタイム分析• 複数の商品間で迷っているが、意思決定には至っていない?• ウィンドウショッピングで眺めているだけで、買う気ゼロ?• 買いたい商品がなくて離脱直前なのか?• テレビや雑誌で情報を得て、買う気満々で訪問した?

•適切な人にのみクーポンを提示する• 気持ちいいタイミングでクーポンが出るので、コンバージョンレートが大幅上昇

• クーポンの露出量の減少、ブランド価値の維持

• ABテストで成果を確認• クーポンを出すべきと判断した人のうち、数割をコントロールグループとして、クーポンを表示しない

• クーポンを出した群と、出さなかった群でCVRの変化を効果検証

Page 11: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

オンラインで機械学習

•お客様の動きをリアルタイムに予測する必要がある• オンライン予測が必要

•お客様の傾向は時間に対して大きくは変化しない• 学習はデイリーバッチでもよい

• 月間10億PVのデータを使って、オフラインでバッチ学習

• ZenClerkに必要な機械学習• オフライン学習

• オンライン予測

• 多少データの欠落や、エラーがあっても良い

• これに該当するライブラリが微妙にない

Page 12: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

データ分析の分類と、ツールの状況

学習がオンライン 学習がオフライン

予測がオンライン

アルゴリズムトレード(HFT)Twitterのタイムライン分析

ZenClerkアドテク

予測がオフライン

データ量多すぎて保存できない系、IoT系?

バッチで予測、分析コンサル協調フィルタリング系レコメンド

空白地帯

ブルーオーシャン?

↑たとえば、牛舎の大量のセンサーから、将来の牛乳の生産量を予測する問題とか。

Page 13: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

ツールの整備状況

•オンライン機械学習、オンライン予測• Jubatus、Spark MLlib• 分散処理を前提とするので、重厚長大になりがち

• エラー耐性を真面目にやりすぎている• ZenClerkは多少のエラーは許容できるビジネスモデル

• サーバで動くので、プロダクションに持っていきやすい• 学習、予測をオフラインにすることもできる

•オフライン機械学習、オフライン予測• R、Scikit-learn• 小さいデータに対して、気軽に機械学習が書ける• 精度面では十分であることが多い• スクリプトとして動くので、プロダクションに導入しづらい• オンラインで予測させるには、根性が必要

Page 14: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

機械学習の流れ

生データ特徴ベクトル

機械学習 パラメータ

予測器 学習結果

教師データ

テストデータ

前処理

Page 15: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

オンラインシステムでの処理の流れ

生データ特徴ベクトル

機械学習 パラメータ

予測器 学習精度テストデータ

生データ

コピー

特徴ベクトル

予測器本番データ

結果

教師データ

コピー

前処理

前処理

オフライン学習データ分析屋の世界

オンライン予測プロダクション環境

データ分析の世界(Pythonとか、Rとか)

本番環境の世界(RubyとかNodeとか)

Page 16: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

前処理を移植する

•リアルタイム予測の課題• データ分析環境とプロダクション環境で、同じ特徴量を予測器に入力する必要がある

• データ分析環境と、プロダクション環境では、言語が異なる

• 前処理用の言語を開発

•特徴ベクトル変換器• 特徴ベクトル変換言語を使って、source to sourceコンパイルすることで、同質のPythonとJSを出力

• 詳細は道玄坂LT祭りの資料を参照

http://www.slideshare.net/TokorotenNakayama/vector-converter-dogenzakalt-dogenzakalt

https://github.com/tokoroten/forth_fv_converter

Page 17: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

オンライン予測器を根性移植する

•根性でアルゴリズムを移植• 決定木の移植

• ロジスティック回帰の移植

•既存のオフライン予測器をオンライン化• scikit-learnをオンライン化

Page 18: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

決定木を移植する

• Scikit-learnの出力した決定木のdotファイルをパースJS(Coffee)を出力する

Page 19: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

決定木を移植する

• JSに変換された決定木を、Node.jsでevalする• Nodeで実行されるので、プロダクションに組み込める

• V8でJITされて、Pythonを叩くよりも高速に実行される

•ツライ• 決定木は簡単に移植できた

• AdaBoostへの適用は?RandomForestは?• JS側にゴリゴリとロジックを書く必要がある

• 個別の部品の移植だけでは、分類器の組み合わせが困難

Page 20: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

ロジスティック回帰を移植する

• 特徴ベクトル変換器が吐いたJSをmongoに格納• スタック型仮想マシンによる特徴ベクトル変換

• Scikit-learnが出力したロジスティック回帰の係数をmongoに格納

この画面は、compose.io(旧mongohq)のmongodbの管理画面

Page 21: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

ロジスティック回帰を移植する

• ロジスティック回帰の変換式と係数をNodeで読み込む• 特徴ベクトル変換式をevalして実行

• クソコードだけど、JITしているので、そこそこ早い

• ロジスティック回帰の式を利用して、Node側でProbaを算出

http://www.mwsoft.jp/programming/numpy/logistic_regression.html

Page 22: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

もう限界

•これ以上複雑なアルゴリズムを移植するのは無理• エラー処理とか心折れる

• テスト工数が半端ない

• プロダクションコードと密結合になるので、アルゴリズムの多段化などが難しい

•Nodeで作られたシステムの中にpythonでscikit-learnが動くサーバを持ち込む

Page 23: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

Python分析サーバ

Python分析サーバを立てる

生データ特徴ベクトル

機械学習 パラメータ

予測器 学習精度テストデータ

生データ

コピー

結果

教師データ

コピー

前処理

オフライン学習データ分析屋の世界

オンライン予測プロダクション環境

データ分析の世界(Pythonとか、Rとか)

本番環境の世界(RubyとかNodeとか)

Page 24: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

予測タスクQueueモデル

Front Server(JS) JS系分析サーバ

ApplicationServer (JS)

ApplicationServer (JS)

Python Demon

予測タスクをPush

Pull

Python DemonLB

Page 25: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

固いところは固く、柔軟なところは柔軟に

•データ分析はPDCA速度が第一• 実験コードを本番投入して、アイディアをすぐに検証したい• データ分析の書くコードの品質はヒドイ

• データ分析者にNW系のコード書かせると、サービスが死ぬ• データ分析側のコードは余計なことを考えないですむ仕組みが必要

•お客様と直接つながるフロントサーバは固く作る• 分析サーバが落ちても問題ないようにする

• Python系分析サーバは、タスクQueue• プロダクション環境と切り離されたPython分析環境を構築• Pythonのデーモンがタスクをpull、分析スクリプトを実行• コードの品質が安定したら、本番系mongodbに書き込み

Page 26: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

顧客が本当に必要だった物

• issue• プロダクションとデータ分析から同じ意味のものが叩ける

• 分析の実験コードを気軽にプロダクション投入したい

•要件• オンラインで利用できる

• レイテンシーが低い

• 保守性、安定性が高い

• プロダクションに影響を与えない

•アプローチ• 独立サーバに切り離された、機械学習用サーバ

Page 27: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

機械学習サーバの検討

•独立サーバ型のシステム• Jubatus

• オンライン機械学習がしたいほどのデータ量ではない• マルチテナントほしい、欲しい学習機がない

• Spark MLlib• Sparkが重厚長大すぎる• プロダクションがJavaで書かれていたら、選択肢としてはありえそう?• このためだけにJVMのメンテはおつらい

• 金の弾丸• SPSS、 Amazon Machine Learning、Azure Machine Learning• 情報求む

•根性で自作する• 今回のアプローチ• R serve を本番投入している人いる?

Page 28: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

まとめ

•機械学習をオンライン系サービスで利用するツラミ• プロダクションとデータ分析の言語が異なる

• サービスと予測器を疎結合にするのがつらい

•機械学習サーバによる解決• 独立系サーバシステムによる解決

• Jubatus,Spark MLlib

• 根性による実装• 今回採用した手段

•ホント、機械学習は地獄だぜ!フゥハハハーハァー

Page 29: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

採用の話

• Emotion Intelligenceは機械学習がコアコンピタンス• 精度を上げればあげるほど、利益が増える

• 新しいアルゴリズムを開発すればするほど、適用可能範囲が増えて、利益が増える

• 金稼ぎが好きな機械学習エンジニアを募集中

Page 30: プロダクション環境でオンラインで機械学習を動かすにあたってツライ話 #MLCT

採用の話

•募集しているポジション• エンジニア(機械学習がわかっている)

• 機械学習モデラー

• 機械学習基盤エンジニア

• 機械学習のビジュアライズ(管理画面エンジニア)

•会社は恵比寿• ガーデンプレイス(ここ)から徒歩五分

•月間10億PVを分析しましょう