Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

PHP and sometimes Machine Learning

PHP and sometimes Machine Learning

けんご

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が使えるからと言って、それだけで勝てるわけがない • ライブラリやフレームワークはあくまで目的達成のための道具である 機械学習との付き合い方