プロダクション環境でオンラインで機械学習を動かすにあたってツライ話...
TRANSCRIPT
プロダクション環境でオンラインで機械学習を
ぶん回すにあたってツラい話
Emotion Intelligence株式会社
(旧DoBoken)
ところてん
お前誰よ
•ところてん• http://twitter.com/tokoroten
•高機能雑用• 半導体計測屋
• セキュリティ研究者
• ビッグデータ屋
• ソシャゲ・クロス集計おじさん
• ソシャゲ・ゲームデザイナ
• 広告部門の手伝い
• 機械学習おじさん Now
2
最近の活動
•タッチパネル性のゲーム開発
4http://www.nicovideo.jp/watch/sm25185906 https://www.youtube.com/watch?v=7-hPyxorhho
最近の活動
5https://twitter.com/t_tutiya/status/591536291050704896 https://twitter.com/dnasoftwares/status/591421236653133824
最近の活動
6
Emotion Intelligence株式会社
気持ちを解するテクノロジーの探究
※4/1に社名変更しました
リアルタイムオファー
• ECサイトに訪れているお客様にとって、最適なタイミングでクーポンを提示する
•家電量販店の店員のイメージ• フロアを歩いて情報収集しているときは、声をかけてこない
• 商品を比較検討していると、声をかけてきて商品の説明をしてくれる
• 場合によっては、特別な割引を提案してくれる
リアルタイム分析
•お客様の動きをリアルタイム分析• 複数の商品間で迷っているが、意思決定には至っていない?• ウィンドウショッピングで眺めているだけで、買う気ゼロ?• 買いたい商品がなくて離脱直前なのか?• テレビや雑誌で情報を得て、買う気満々で訪問した?
•適切な人にのみクーポンを提示する• 気持ちいいタイミングでクーポンが出るので、コンバージョンレートが大幅上昇
• クーポンの露出量の減少、ブランド価値の維持
• ABテストで成果を確認• クーポンを出すべきと判断した人のうち、数割をコントロールグループとして、クーポンを表示しない
• クーポンを出した群と、出さなかった群でCVRの変化を効果検証
オンラインで機械学習
•お客様の動きをリアルタイムに予測する必要がある• オンライン予測が必要
•お客様の傾向は時間に対して大きくは変化しない• 学習はデイリーバッチでもよい
• 月間10億PVのデータを使って、オフラインでバッチ学習
• ZenClerkに必要な機械学習• オフライン学習
• オンライン予測
• 多少データの欠落や、エラーがあっても良い
• これに該当するライブラリが微妙にない
データ分析の分類と、ツールの状況
学習がオンライン 学習がオフライン
予測がオンライン
アルゴリズムトレード(HFT)Twitterのタイムライン分析
ZenClerkアドテク
予測がオフライン
データ量多すぎて保存できない系、IoT系?
バッチで予測、分析コンサル協調フィルタリング系レコメンド
空白地帯
ブルーオーシャン?
↑たとえば、牛舎の大量のセンサーから、将来の牛乳の生産量を予測する問題とか。
ツールの整備状況
•オンライン機械学習、オンライン予測• Jubatus、Spark MLlib• 分散処理を前提とするので、重厚長大になりがち
• エラー耐性を真面目にやりすぎている• ZenClerkは多少のエラーは許容できるビジネスモデル
• サーバで動くので、プロダクションに持っていきやすい• 学習、予測をオフラインにすることもできる
•オフライン機械学習、オフライン予測• R、Scikit-learn• 小さいデータに対して、気軽に機械学習が書ける• 精度面では十分であることが多い• スクリプトとして動くので、プロダクションに導入しづらい• オンラインで予測させるには、根性が必要
機械学習の流れ
生データ特徴ベクトル
機械学習 パラメータ
予測器 学習結果
教師データ
テストデータ
前処理
オンラインシステムでの処理の流れ
生データ特徴ベクトル
機械学習 パラメータ
予測器 学習精度テストデータ
生データ
コピー
特徴ベクトル
予測器本番データ
結果
教師データ
コピー
前処理
前処理
オフライン学習データ分析屋の世界
オンライン予測プロダクション環境
データ分析の世界(Pythonとか、Rとか)
本番環境の世界(RubyとかNodeとか)
前処理を移植する
•リアルタイム予測の課題• データ分析環境とプロダクション環境で、同じ特徴量を予測器に入力する必要がある
• データ分析環境と、プロダクション環境では、言語が異なる
• 前処理用の言語を開発
•特徴ベクトル変換器• 特徴ベクトル変換言語を使って、source to sourceコンパイルすることで、同質のPythonとJSを出力
• 詳細は道玄坂LT祭りの資料を参照
http://www.slideshare.net/TokorotenNakayama/vector-converter-dogenzakalt-dogenzakalt
https://github.com/tokoroten/forth_fv_converter
オンライン予測器を根性移植する
•根性でアルゴリズムを移植• 決定木の移植
• ロジスティック回帰の移植
•既存のオフライン予測器をオンライン化• scikit-learnをオンライン化
決定木を移植する
• Scikit-learnの出力した決定木のdotファイルをパースJS(Coffee)を出力する
決定木を移植する
• JSに変換された決定木を、Node.jsでevalする• Nodeで実行されるので、プロダクションに組み込める
• V8でJITされて、Pythonを叩くよりも高速に実行される
•ツライ• 決定木は簡単に移植できた
• AdaBoostへの適用は?RandomForestは?• JS側にゴリゴリとロジックを書く必要がある
• 個別の部品の移植だけでは、分類器の組み合わせが困難
ロジスティック回帰を移植する
• 特徴ベクトル変換器が吐いたJSをmongoに格納• スタック型仮想マシンによる特徴ベクトル変換
• Scikit-learnが出力したロジスティック回帰の係数をmongoに格納
この画面は、compose.io(旧mongohq)のmongodbの管理画面
ロジスティック回帰を移植する
• ロジスティック回帰の変換式と係数をNodeで読み込む• 特徴ベクトル変換式をevalして実行
• クソコードだけど、JITしているので、そこそこ早い
• ロジスティック回帰の式を利用して、Node側でProbaを算出
http://www.mwsoft.jp/programming/numpy/logistic_regression.html
もう限界
•これ以上複雑なアルゴリズムを移植するのは無理• エラー処理とか心折れる
• テスト工数が半端ない
• プロダクションコードと密結合になるので、アルゴリズムの多段化などが難しい
•Nodeで作られたシステムの中にpythonでscikit-learnが動くサーバを持ち込む
Python分析サーバ
Python分析サーバを立てる
生データ特徴ベクトル
機械学習 パラメータ
予測器 学習精度テストデータ
生データ
コピー
結果
教師データ
コピー
前処理
オフライン学習データ分析屋の世界
オンライン予測プロダクション環境
データ分析の世界(Pythonとか、Rとか)
本番環境の世界(RubyとかNodeとか)
予測タスクQueueモデル
Front Server(JS) JS系分析サーバ
ApplicationServer (JS)
ApplicationServer (JS)
Python Demon
予測タスクをPush
Pull
Python DemonLB
固いところは固く、柔軟なところは柔軟に
•データ分析はPDCA速度が第一• 実験コードを本番投入して、アイディアをすぐに検証したい• データ分析の書くコードの品質はヒドイ
• データ分析者にNW系のコード書かせると、サービスが死ぬ• データ分析側のコードは余計なことを考えないですむ仕組みが必要
•お客様と直接つながるフロントサーバは固く作る• 分析サーバが落ちても問題ないようにする
• Python系分析サーバは、タスクQueue• プロダクション環境と切り離されたPython分析環境を構築• Pythonのデーモンがタスクをpull、分析スクリプトを実行• コードの品質が安定したら、本番系mongodbに書き込み
顧客が本当に必要だった物
• issue• プロダクションとデータ分析から同じ意味のものが叩ける
• 分析の実験コードを気軽にプロダクション投入したい
•要件• オンラインで利用できる
• レイテンシーが低い
• 保守性、安定性が高い
• プロダクションに影響を与えない
•アプローチ• 独立サーバに切り離された、機械学習用サーバ
機械学習サーバの検討
•独立サーバ型のシステム• Jubatus
• オンライン機械学習がしたいほどのデータ量ではない• マルチテナントほしい、欲しい学習機がない
• Spark MLlib• Sparkが重厚長大すぎる• プロダクションがJavaで書かれていたら、選択肢としてはありえそう?• このためだけにJVMのメンテはおつらい
• 金の弾丸• SPSS、 Amazon Machine Learning、Azure Machine Learning• 情報求む
•根性で自作する• 今回のアプローチ• R serve を本番投入している人いる?
まとめ
•機械学習をオンライン系サービスで利用するツラミ• プロダクションとデータ分析の言語が異なる
• サービスと予測器を疎結合にするのがつらい
•機械学習サーバによる解決• 独立系サーバシステムによる解決
• Jubatus,Spark MLlib
• 根性による実装• 今回採用した手段
•ホント、機械学習は地獄だぜ!フゥハハハーハァー
採用の話
• Emotion Intelligenceは機械学習がコアコンピタンス• 精度を上げればあげるほど、利益が増える
• 新しいアルゴリズムを開発すればするほど、適用可能範囲が増えて、利益が増える
• 金稼ぎが好きな機械学習エンジニアを募集中
採用の話
•募集しているポジション• エンジニア(機械学習がわかっている)
• 機械学習モデラー
• 機械学習基盤エンジニア
• 機械学習のビジュアライズ(管理画面エンジニア)
•会社は恵比寿• ガーデンプレイス(ここ)から徒歩五分
•月間10億PVを分析しましょう