Pro Yearly is on sale from $80 to $50! »

PHP and sometimes Machine Learning

PHP and sometimes Machine Learning

Eca2f293c36947e2a8944b39e57d105c?s=128

けんご

June 10, 2017
Tweet

Transcript

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

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

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

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

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

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

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

    •etc... •PHP-ML
  8. •多種多様なオープンデータセット •MNIST Dataset •Iris Dataset •Faithful Dataset •Titanic Dataset •CIFAR-10

    •CIFAR-100 •Wikipedia Dumps •Ubuntu Dialogue Corpus •etc... 機械学習
  9. •多種多様なAPI •Twitter •Google+ •Github •Facebook •Instagram •Qiita 機械学習 •LinkedIn •Pinterest

    •etc...
  10. •無料の入門教材・記事 •Coursera •Udemy •Youtube •cs224d •cs231n •Neural Networks and Deep

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

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

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

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

    コピペしてそのまま動くコードがそれなりにあるから。 • そこから気になったところを修正して動作を確認できるから。 ペペペって書けることのメリット 機械学習
  15. •基礎ができての応用 •引き出しが多くなって試行錯誤しやすくなる •専門用語などを身近に感じることができる •最新のアルゴリズムの動向など追いやすい ただし基礎理論を理解するに越したことはない 機械学習

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

    *1 機械学習 *1
  17. •専門的な知識が必要なんじゃ... • 機械学習は難しく専門的な数学の知識が必要と思われがち • 基礎であれば高校数学程度の知識 があれば問題ない • 高校数学の復習で理解できるはず •とは言え実装が大変なんじゃ... •

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

    簡単な回帰であればスクラッチで実装できるくらい簡単 • ほとんどが単純な配列操作 • データからパラメータが更新されていく様子をイメージできる •でもPythonでしょう... • 簡単な回帰であればスクラッチで実装できるくらい簡単 行列の掛け算と微分の基礎くらい。でも最近は高校で行列の掛け算を習わないらしい… *1 *1 機械学習 *1
  19. PHPで機械学習の実装に挑戦

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

  21. • と に相関がありそうなデータがあるとする •たとえば適当なこんなデータ... 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で回帰
  22. x y • と に相関がありそうなデータがあるとする •適当にプロットしてみたとする y x PHPで回帰

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

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

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

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

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

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

  29. 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で回帰
  30. $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で回帰
  31. $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で回帰
  32. $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で回帰
  33. $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で回帰
  34. $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で回帰
  35. $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で回帰
  36. •すると正しい  と が見つかる •先の回帰を実行すると、このような結果が得られるはず •つまり得られた関数は $a = 0.50545454555142 $b = 0.97999999932555

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

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

  39. •ミニマムなプログラムであれば20行程度で実装できる • しかもライブラリなどは何も使わずスクラッチで • しかもPHPで •これも立派な機械学習 • 複雑怪奇なものこそが機械学習ではない • HelloWorldで感動した想い出を機械学習でも

    • 結果をプロットしてみるともっと理解が進む。楽しい • 機械学習やってみた!と自負できる 大事なのは
  40. •理論は難しそうに思えても実装は単純だったりする •数式を極端に怖がらずにどんと構える態度は必要かも 大事なのは

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

    自分が試した手法がどう応用できるかを必ず探してみる • そうしてはじめて知識として定着する 大事なのは
  42. •自分で理解して実装して感覚を掴む •重要なのはデータからパラメータが更新されていく様子 •それがイメージできることが大事 大事なのは

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

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

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

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

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

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

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

    チーム内に詳しい人がいるとは限らない • 変数名やインデントだけのレビュー... •リリース後の運用 • 開発者がチームから抜けることも • 属人的なほど負債になりがち •学習データの管理 • このバージョンのモデルに使った学習データどこ? 運用フェーズ
  50. 普通のシステム開発と同様に 考慮しなければならないことはたくさんある

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

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

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

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

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

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

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

    いつでも当時のモデルを再現できるように 運用フェーズ
  58. そして一歩下がって考えてみる

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

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

  61. •今後は運用に関するノウハウも増えてくる(という希望) 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) 機械学習との付き合い方
  62. 機械学習のコモディティ化

  63. •機械学習が話題になる機会が増えたことによる認知度の向上 •難解さをうまく隠蔽したライブラリやフレームワークの充実 •それにより必要な前提知識が少なく誰でも気軽に使える • という雰囲気 •が、それ即ち「使える」だけではダメ • Google / Facebook

    / Microsoftなどの巨人たちは大量のデータと大量の計算資源を持っているから強い • CakePHPやLaravelが使えるからと言って、それだけで勝てるわけがない • ライブラリやフレームワークはあくまで目的達成のための道具である 機械学習との付き合い方
  64. •今も昔も必要なものはデータと計算資源 •そして達成したい目的とそれを達成するためのアイデア •基礎を知り手法を知り応用先を考える •さらに、機械学習が必要かどうか今一度考えてみる •やるならば導入後の運用もしっかり考える 機械学習との付き合い方