Slide 1

Slide 1 text

@tkengo 僕たちエンジニアにとっての PHPときどき機械学習 2017.06.10 PHPカンファレンス福岡

Slide 2

Slide 2 text

自己紹介 •立石 賢吾 (@tkengo) •LINE Fukuoka株式会社 データ分析チーム •CakePHP使いでした

Slide 3

Slide 3 text

今日話すこと •最近の機械学習 •回帰の実装 •運用の話 •機械学習と付き合うためには

Slide 4

Slide 4 text

機械学習 •機械学習やディープラーニングなどの単語が賑わってきて久しい

Slide 5

Slide 5 text

2015/06 Chainerリリース 2015/09 TensorFlowリリース 2015/03 Kerasリリース 2015/12 KerasがTensorFlowをサポート 機械学習 •機械学習やディープラーニングなどの単語が賑わってきて久しい

Slide 6

Slide 6 text

•様々なライブラリやフレームワーク •numpy •scikit-learn •gensim •TensorFlow •Chainer •Theano 機械学習 •Caffe •Keras •etc...

Slide 7

Slide 7 text

•様々なライブラリやフレームワーク •numpy •scikit-learn •gensim •TensorFlow •Chainer •Theano 機械学習 •Caffe •Keras •etc... •PHP-ML

Slide 8

Slide 8 text

•多種多様なオープンデータセット •MNIST Dataset •Iris Dataset •Faithful Dataset •Titanic Dataset •CIFAR-10 •CIFAR-100 •Wikipedia Dumps •Ubuntu Dialogue Corpus •etc... 機械学習

Slide 9

Slide 9 text

•多種多様なAPI •Twitter •Google+ •Github •Facebook •Instagram •Qiita 機械学習 •LinkedIn •Pinterest •etc...

Slide 10

Slide 10 text

•無料の入門教材・記事 •Coursera •Udemy •Youtube •cs224d •cs231n •Neural Networks and Deep Learning 機械学習 •gihyo Machine Learning Serial •etc...

Slide 11

Slide 11 text

•様々な便利なライブラリの登場 •多種多様な無料のデータセット •充実したサンプルコード •個人発信の情報(ブログ記事等)の増加 •翻訳済みドキュメントの整備 単純な問題ならペペペって書けちゃう 機械学習

Slide 12

Slide 12 text

•入門しやすい • ペペペって書けるならやってみるか... ペペペって書けることのメリット 機械学習

Slide 13

Slide 13 text

•入門しやすい • ペペペって書けるならやってみるか... •時間を節約できる • 雑多なことは考えずに本質に集中できるから。 • 難しい部分はライブラリやフレームワークが隠蔽してくれて気軽に試せるから。 ペペペって書けることのメリット 機械学習

Slide 14

Slide 14 text

•入門しやすい • ペペペって書けるならやってみるか... •時間を節約できる • 雑多なことは考えずに本質に集中できるから。 • 難しい部分はライブラリやフレームワークが隠蔽してくれて気軽に試せるから。 •機械学習の感覚を掴める • コピペしてそのまま動くコードがそれなりにあるから。 • そこから気になったところを修正して動作を確認できるから。 ペペペって書けることのメリット 機械学習

Slide 15

Slide 15 text

•基礎ができての応用 •引き出しが多くなって試行錯誤しやすくなる •専門用語などを身近に感じることができる •最新のアルゴリズムの動向など追いやすい ただし基礎理論を理解するに越したことはない 機械学習

Slide 16

Slide 16 text

•専門的な知識が必要なんじゃ... • 機械学習は難しく専門的な数学の知識が必要と思われがち • 基礎であれば高校数学程度の知識 があれば問題ない • 高校数学の復習で理解できるはず 行列の掛け算と微分の基礎くらい。でも最近は高校で行列の掛け算を習わないらしい… *1 *1 機械学習 *1

Slide 17

Slide 17 text

•専門的な知識が必要なんじゃ... • 機械学習は難しく専門的な数学の知識が必要と思われがち • 基礎であれば高校数学程度の知識 があれば問題ない • 高校数学の復習で理解できるはず •とは言え実装が大変なんじゃ... • 簡単な回帰であればスクラッチで実装できるくらい簡単 • ほとんどが単純な配列操作 • データからパラメータが更新されていく様子をイメージできる 行列の掛け算と微分の基礎くらい。でも最近は高校で行列の掛け算を習わないらしい… *1 *1 機械学習 *1

Slide 18

Slide 18 text

•専門的な知識が必要なんじゃ... • 機械学習は難しく専門的な数学の知識が必要と思われがち • 基礎であれば高校数学程度の知識 があれば問題ない • 高校数学の復習で理解できるはず •とは言え実装が大変なんじゃ... • 簡単な回帰であればスクラッチで実装できるくらい簡単 • ほとんどが単純な配列操作 • データからパラメータが更新されていく様子をイメージできる •でもPythonでしょう... • 簡単な回帰であればスクラッチで実装できるくらい簡単 行列の掛け算と微分の基礎くらい。でも最近は高校で行列の掛け算を習わないらしい… *1 *1 機械学習 *1

Slide 19

Slide 19 text

PHPで機械学習の実装に挑戦

Slide 20

Slide 20 text

•とはいえ基礎理論を1からわかりやすく説明するのは無理 •たぶん30分じゃ足りない •勾配法を使った簡単な回帰の例と実装だけ説明します PHPで回帰 http://tkengo.github.io/blog/2016/06/06/yaruo-machine-learning0/ 詳しく知りたい方は後ほどこれを読んでみてください *1 *1

Slide 21

Slide 21 text

• と に相関がありそうなデータがあるとする •たとえば適当なこんなデータ... y x $x = [1.0, 2.0, 3.0, 4.0, 5.0, ...]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, ...]; PHPで回帰

Slide 22

Slide 22 text

x y • と に相関がありそうなデータがあるとする •適当にプロットしてみたとする y x PHPで回帰

Slide 23

Slide 23 text

•データがないけど、この辺の状況も知りたい x y PHPで回帰

Slide 24

Slide 24 text

•データがないけど、この辺の状況も知りたい •適当な        という関数を考えてみる •データを一番正しく表現してくれそうな と を探す x y a b f(x) = ax + b PHPで回帰

Slide 25

Slide 25 text

•データがないけど、この辺の状況も知りたい •適当な        という関数を考えてみる •データを一番正しく表現してくれそうな と を探す x y だいぶずれてる a b f(x) = ax + b PHPで回帰

Slide 26

Slide 26 text

•データがないけど、この辺の状況も知りたい •適当な        という関数を考えてみる •データを一番正しく表現してくれそうな と を探す x y だいぶずれてる a b f(x) = ax + b PHPで回帰

Slide 27

Slide 27 text

•データがないけど、この辺の状況も知りたい •適当な        という関数を考えてみる •データを一番正しく表現してくれそうな と を探す x y うまくデータを説明できていそう a b f(x) = ax + b PHPで回帰

Slide 28

Slide 28 text

•   と の誤差を計算する •誤差の合計が一番小さくなるような と を探す f(x) x y y a b PHPで回帰

Slide 29

Slide 29 text

a := a n i=0 f(x(i)) y(i) x(i) b := b n i=0 f(x(i)) y(i) •   と の誤差を計算する •誤差の合計が一番小さくなるような と を探す •途中経過を全部とばすとこういう式で と が探せる f(x) y a b a b PHPで回帰

Slide 30

Slide 30 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } PHPで回帰

Slide 31

Slide 31 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } 適当に準備した  と  のデータ y x PHPで回帰

Slide 32

Slide 32 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } の と をランダムに初期化 y = ax + b a b PHPで回帰

Slide 33

Slide 33 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } の定義 y = ax + b PHPで回帰

Slide 34

Slide 34 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } 以下の式の実装 a := a n i=0 f(x(i)) y(i) x(i) b := b n i=0 f(x(i)) y(i) PHPで回帰

Slide 35

Slide 35 text

$x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]; $y = [1.64, 2.05, 2.30, 2.90, 3.46, 4.09, 4.56, 5.00, 5.50, 6.10]; $a = (mt_rand(0, 100) - 50) * 0.01; $b = (mt_rand(0, 100) - 50) * 0.01; function f($x) { return $GLOBALS['a'] * $x + $GLOBALS['b']; } $ETA = 0.001; for ($loop = 0; $loop < 10000; $loop++) { $a_sum = $b_sum = 0; for ($i = 0; $i < count($x); $i++) { $a_sum += (f($x[$i]) - $y[$i]) * $x[$i]; $b_sum += (f($x[$i]) - $y[$i]); } $a = $a - $ETA * $a_sum; $b = $b - $ETA * $b_sum; } それを1万回繰り返す(回数は適当) PHPで回帰

Slide 36

Slide 36 text

•すると正しい  と が見つかる •先の回帰を実行すると、このような結果が得られるはず •つまり得られた関数は $a = 0.50545454555142 $b = 0.97999999932555 a b f(x) = 0.505x + 0.979 PHPで回帰

Slide 37

Slide 37 text

x y PHPで回帰 傾き≒ 1 2 切片≒ 1 f(x) = 0.505x + 0.979

Slide 38

Slide 38 text

•ミニマムなプログラムであれば20行程度で実装できる • しかもライブラリなどは何も使わずスクラッチで • しかもPHPで 大事なのは

Slide 39

Slide 39 text

•ミニマムなプログラムであれば20行程度で実装できる • しかもライブラリなどは何も使わずスクラッチで • しかもPHPで •これも立派な機械学習 • 複雑怪奇なものこそが機械学習ではない • HelloWorldで感動した想い出を機械学習でも • 結果をプロットしてみるともっと理解が進む。楽しい • 機械学習やってみた!と自負できる 大事なのは

Slide 40

Slide 40 text

•理論は難しそうに思えても実装は単純だったりする •数式を極端に怖がらずにどんと構える態度は必要かも 大事なのは

Slide 41

Slide 41 text

•理論は難しそうに思えても実装は単純だったりする •数式を極端に怖がらずにどんと構える態度は必要かも •ただし基礎を学んで終わらない • 実データにも適用してみることも必要 • 最初から数百万件規模とか目指さなくていい • サービスDBから適当にデータ抜いて試すとか(そういうのがOKなら) • 自分が試した手法がどう応用できるかを必ず探してみる • そうしてはじめて知識として定着する 大事なのは

Slide 42

Slide 42 text

•自分で理解して実装して感覚を掴む •重要なのはデータからパラメータが更新されていく様子 •それがイメージできることが大事 大事なのは

Slide 43

Slide 43 text

最も重要なのは アルゴリズムではなくデータ

Slide 44

Slide 44 text

•基礎がわかると応用が効き始める •やってみたを重ねてだんだんと洗練されてくる •評価やテスト手法も覚えて精度が上がってくる •スポットの分析なら1回で終わりだけどサービスに投入する場合は プロダクションへのデプロイも必要 •次のステップは? 運用フェーズ

Slide 45

Slide 45 text

•ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 運用フェーズ

Slide 46

Slide 46 text

•ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 •テストコード • 機械学習だからってテストいらないわけない 運用フェーズ

Slide 47

Slide 47 text

•ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 •テストコード • 機械学習だからってテストいらないわけない •コードレビュー • チーム内に詳しい人がいるとは限らない • 変数名やインデントだけのレビュー... 運用フェーズ

Slide 48

Slide 48 text

•ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 •テストコード • 機械学習だからってテストいらないわけない •コードレビュー • チーム内に詳しい人がいるとは限らない • 変数名やインデントだけのレビュー... •リリース後の運用 • 開発者がチームから抜けることも • 属人的なほど負債になりがち 運用フェーズ

Slide 49

Slide 49 text

•ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 •テストコード • 機械学習だからってテストいらないわけない •コードレビュー • チーム内に詳しい人がいるとは限らない • 変数名やインデントだけのレビュー... •リリース後の運用 • 開発者がチームから抜けることも • 属人的なほど負債になりがち •学習データの管理 • このバージョンのモデルに使った学習データどこ? 運用フェーズ

Slide 50

Slide 50 text

普通のシステム開発と同様に 考慮しなければならないことはたくさんある

Slide 51

Slide 51 text

機械学習特有の複雑さは何から 生み出されるのか?

Slide 52

Slide 52 text

•機械学習という領域の敷居の高さ •完全なるデータへの依存性(データが最重要) •モデルのブラックボックス化 •どうすれば? 運用フェーズ

Slide 53

Slide 53 text

•全員が完璧に理解しているわけではない • Web/JavaScript/Android/iOSなど得意分野が分かれるように機械学習も同じ • 機械学習エンジニアもひとつのロールとして認識する 運用フェーズ

Slide 54

Slide 54 text

•全員が完璧に理解しているわけではない • Web/JavaScript/Android/iOSなど得意分野が分かれるように機械学習も同じ • 機械学習エンジニアもひとつのロールとして認識する •負債にならないようにこちら側から歩み寄る必要がある • ドキュメントの整備 • 説明会や勉強会などの情報共有の場の用意 運用フェーズ

Slide 55

Slide 55 text

•早いうちに継続的にデプロイできるインフラ環境を整える 運用フェーズ

Slide 56

Slide 56 text

•早いうちに継続的にデプロイできるインフラ環境を整える •最初のモデルは極力シンプルに • データが少ないうちから複雑さが増すと良くない • データを集めるフェーズも重要 運用フェーズ

Slide 57

Slide 57 text

•早いうちに継続的にデプロイできるインフラ環境を整える •最初のモデルは極力シンプルに • データが少ないうちから複雑さが増すと良くない • データを集めるフェーズも重要 •学習に使ったデータは長期間保存しておく • たとえば日付毎にスナップショットを管理 • いつでも当時のモデルを再現できるように 運用フェーズ

Slide 58

Slide 58 text

そして一歩下がって考えてみる

Slide 59

Slide 59 text

その機械学習は本当に必要か?

Slide 60

Slide 60 text

•機械学習やディープラーニングの実装の障壁は確実に下がった •やってみるだけなら言語は問わない •しかし本当に機械学習が必要かどうか一歩下がって考える •機械学習を使わない選択をすることを恐れない 機械学習との付き合い方

Slide 61

Slide 61 text

•今後は運用に関するノウハウも増えてくる(という希望) Rules of Machine Learning: Best Practices for ML Engineering (http://martin.zinkevich.org/rules_of_ml/rules_of_ml.pdf) Machine Learning: The High-Interest Credit Card of Technical Debt (https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43146.pdf) 機械学習との付き合い方

Slide 62

Slide 62 text

機械学習のコモディティ化

Slide 63

Slide 63 text

•機械学習が話題になる機会が増えたことによる認知度の向上 •難解さをうまく隠蔽したライブラリやフレームワークの充実 •それにより必要な前提知識が少なく誰でも気軽に使える • という雰囲気 •が、それ即ち「使える」だけではダメ • Google / Facebook / Microsoftなどの巨人たちは大量のデータと大量の計算資源を持っているから強い • CakePHPやLaravelが使えるからと言って、それだけで勝てるわけがない • ライブラリやフレームワークはあくまで目的達成のための道具である 機械学習との付き合い方

Slide 64

Slide 64 text

•今も昔も必要なものはデータと計算資源 •そして達成したい目的とそれを達成するためのアイデア •基礎を知り手法を知り応用先を考える •さらに、機械学習が必要かどうか今一度考えてみる •やるならば導入後の運用もしっかり考える 機械学習との付き合い方