Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP and sometimes Machine Learning

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

PHP and sometimes Machine Learning

Avatar for けんご

けんご

June 10, 2017
Tweet

More Decks by けんご

Other Decks in Technology

Transcript

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

    コピペしてそのまま動くコードがそれなりにあるから。 • そこから気になったところを修正して動作を確認できるから。 ペペペって書けることのメリット 機械学習
  2. •専門的な知識が必要なんじゃ... • 機械学習は難しく専門的な数学の知識が必要と思われがち • 基礎であれば高校数学程度の知識 があれば問題ない • 高校数学の復習で理解できるはず •とは言え実装が大変なんじゃ... •

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

    簡単な回帰であればスクラッチで実装できるくらい簡単 • ほとんどが単純な配列操作 • データからパラメータが更新されていく様子をイメージできる •でもPythonでしょう... • 簡単な回帰であればスクラッチで実装できるくらい簡単 行列の掛け算と微分の基礎くらい。でも最近は高校で行列の掛け算を習わないらしい… *1 *1 機械学習 *1
  4. 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で回帰
  5. $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で回帰
  6. $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で回帰
  7. $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で回帰
  8. $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で回帰
  9. $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で回帰
  10. $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で回帰
  11. •ドキュメントの整備 • アルゴリズムの説明や学習データの在り処 • レビューしてもらうためにも必要 •テストコード • 機械学習だからってテストいらないわけない •コードレビュー •

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

    チーム内に詳しい人がいるとは限らない • 変数名やインデントだけのレビュー... •リリース後の運用 • 開発者がチームから抜けることも • 属人的なほど負債になりがち •学習データの管理 • このバージョンのモデルに使った学習データどこ? 運用フェーズ
  13. •今後は運用に関するノウハウも増えてくる(という希望) 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) 機械学習との付き合い方
  14. •機械学習が話題になる機会が増えたことによる認知度の向上 •難解さをうまく隠蔽したライブラリやフレームワークの充実 •それにより必要な前提知識が少なく誰でも気軽に使える • という雰囲気 •が、それ即ち「使える」だけではダメ • Google / Facebook

    / Microsoftなどの巨人たちは大量のデータと大量の計算資源を持っているから強い • CakePHPやLaravelが使えるからと言って、それだけで勝てるわけがない • ライブラリやフレームワークはあくまで目的達成のための道具である 機械学習との付き合い方