Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TensorFlowで機械学習ことはじめ(summer edition)

2,425 views

Published on

これから機械学習を始めてみようと考えている方に向けて、簡単な例題で機械学習の考え方とTensorFlow での実装方法とをご紹介します。
※「なにわTECH道@パソナテック はじめてのDeep Learning」での発表資料です。

Published in: Technology
  • Be the first to comment

TensorFlowで機械学習ことはじめ(summer edition)

  1. 1. TensorFlow を使った 機械学習ことはじめ 2016-08-27 上野⼭ Summar Edition
  2. 2. ⾃⼰紹介 „ 元 電機メーカ勤務の 似⾮ソフト屋 „ もともと組込み à 画像処理 à データ解析 と変遷し à Deep Learning の世界へ 2 上野⼭ 徹 うえのやま とおる 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 We‘re Hiring!
  3. 3. 0. 機械学習とは? 3
  4. 4. 機械学習とは? 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 4 数値・⽂字・画像・⾳声など多種多様な データの中から,規則性・パターン・知 識を発⾒し,現状を把握や将来の予測を したりする ※朱鷺の杜(”機械学習”)より引⽤ 機械学習を使わない場合: すでに分かっている規則性(e.g. 運動⽅程式) を使って,現状把握や将来を予測
  5. 5. 教師あり/なし 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 5 教師あり学習 教師なし学習 ※ その他,半教師あり学習や強化学習 と呼ばれるものもあります 正解がセットになったデータ から規則性やパターンを⾒つける 正解が含まれないデータから 規則性やパターンを⾒つける 来店頻度 購買⾦額 ⼊⼒ データ = 7 = 7 = 7 = 9 正解 データ 離れて いる が「7」の パターンっぽい
  6. 6. 回帰 / 識別 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 6 回帰 識別(判別) 連続的な値 を予測する とびとびな値(離散値) を予測する e.g. 家賃の予測 e.g. 広告メール判定 How much? … DISCOUNT … … CLICK NOW … … meeting … Spam? or Not?
  7. 7. 難しい規則性を機械学習するには 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 7 学習 アルゴ リズム 効率的な 計算環境 ⼤規模 データ が提供してくれる
  8. 8. 1. TensorFlow とは 8
  9. 9. TensorFlow とは „ Google社のMachine Intelligence 研究所が開発した数値計算ライブラリ „ Deep Learning をはじめとする 機械学習 の 研究や活⽤にGoogle社内で⽤いられている Ø 2011年から使⽤していたDistBeliefを強化 „ 複数のCPU/GPUや、複数のマシンに分散して 実⾏できる。 „ C++とPython 2or3 APIを持っている „ 2015年11⽉にオープンソース(Apache2.0)公開 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 9
  10. 10. データフローグラフ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 10 ß 掛け算 ß ⾜し算 ß 関数 テンソル が データフローグラフ 上を 流れるように計算処理している テンソル à (多次元配列) 𝐶 = … (𝑅𝑒𝐿𝑈 𝑏 + 𝑊𝑋 ) à 数式で表現すると、 TensorFlow 巨⼤なデータにも使える ⾏列計算ライブラリ ビッグデータの 機械学習に使える!出典)TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems, Google, 2015
  11. 11. TensorBoard „ データフローグラフのネットワーク構造や 学習経過をWeb上で確認できる 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 11
  12. 12. 詳細は Web へ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 12 https://speakerdeck.com/kazunori279/cloud-vision-api-and-tensorflow 例えば、佐藤さん@Google の資料など
  13. 13. 2. TensorFlow を使った 機械学習 13
  14. 14. さっそく問題です 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 14 たかしくんは⼋百屋へお使いに⾏きました。 リンゴ1個とミカン3個を買うと190円, リンゴ3個とミカン1個を買うと330円 するようです。 リンゴ2個とミカン4個を買うと いくらになるでしょうか? 例題1
  15. 15. 円 式で表すと... 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 15 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ?
  16. 16. 円 回答 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 16 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 100 30 100 30 100 30
  17. 17. 円 回答 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 17 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = 320 100 30 100 30 100 30
  18. 18. 円 これも機械学習(回帰)の問題です! 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 18 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = 320 100 30 100 30 100 30 学習 予測 実績データからパラメータを推定 パラメータを使って結果を予測
  19. 19. 実は店のおやじは気まぐれでした 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 19 円 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 円 × 5 + 円 × 7 = 660 円
  20. 20. 実は店のおやじは気まぐれでした 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 20 円 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 円 × 5 + 円 × 7 = 660 円 100 30 100 30 100 30 710
  21. 21. どうやってパラメータ(単価)を⾒つけるか? 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 21 考え⽅ 合計⾦額の誤差が⼩さくなるような 単価を採⽤しよう! 円 × 1 + 円 × 3 à 40円 - 190 円 円 × 3 + 円 × 1 à 40円 - 330 円 円 × 5 + 円 × 7 à 120円 - 660 円 10 10 10 10 10 10 合計⾦額 (正解) 合計⾦額 (予測) (2乗)誤差 à 22500 à 84100 à 291600 ( )2 ( )2 ( )2 平均 132733
  22. 22. すべての組合せを計算 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 22 ミカン 0 10 20 30 40 50 60 70 80 90 100 リンゴ 0 193533 158700 127800 100833 77800 58700 43533 32300 25000 21633 22200 10 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 20833 20 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 21800 30 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 25100 40 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 30733 50 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 38700 60 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 49000 70 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 61633 80 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 76600 90 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900 100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533 110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500 120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800 130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433 140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400 150 8033 14200 24300 38333 56300 78200 104033 133800 167500 205133 246700 近そうな値は⾒つかるけど、計算は⼤変! (もし単価が0円〜1万円で、10種類買ったら?)
  23. 23. よく⾒ると、徐々に変化している 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 23 ミカン 0 10 20 30 40 50 60 70 80 90 100 リンゴ 0 193533 158700 127800 100833 77800 58700 43533 32300 25000 21633 22200 10 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 20833 20 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 21800 30 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 25100 40 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 30733 50 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 38700 60 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 49000 70 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 61633 80 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 76600 90 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900 100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533 110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500 120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800 130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433 140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400 150 8033 14200 24300 38333 56300 78200 104033 133800 167500 205133 246700 ミカン 0 ミカン 40 ミカン 800 50000 100000 150000 200000 250000 0 20 40 60 80 100120 140 リンゴ 最⼩値
  24. 24. ⼩さくなる⽅向へたどっていくと... 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 24 ミカン 0 10 20 30 40 50 60 70 80 90 100 リンゴ 0 193533 10 132733 20 83667 30 46333 40 20733 50 6867 60 3500 70 2467 80 7267 2167 1000 90 2700 333 1900 100 467 833 5133 110 120 130 140 150 ミカン 0 ミカン 40 ミカン 800 50000 100000 150000 200000 250000 0 20 40 60 80 100120 140 リンゴ 最⼩値 少ない計算で早く最⼩値に! ※最⼩(⼤)値を求める処理="最適化"
  25. 25. 気まぐれおやじのこころを読む 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 25 円 円 × 1 + 円 × 3 ≒ 190 円 円 × 3 + 円 × 1 ≒ 330 円 円 × 2 + 円 × 4 ≒ 円 × 5 + 円 × 7 ≒ 660 円 90 30 90 30 90 30 90 30 310 650 300 180
  26. 26. ここまでの振り返り 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 26 TensorFlowでも同じように書いていく 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最⼩にする点を探す(最適化) 予測式&学習済パラメタで予測
  27. 27. TensorFlow の処理の流れ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 27 # coding: utf-8 # 必要なモジュールを読み込む import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 1. 予測式(モデル)を記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(tf.zeros((2, 1)), name="a") # モデル式 y = tf.matmul(x, a) # 2. 学習に必要な関数を定義する # 誤差関数(loss) loss = tf.reduce_mean(tf.square(y_ - y)) # 最適化⼿段を選ぶ(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss) # 3. 実際に学習処理を実⾏する # (1) 訓練データを⽣成する train_x = np.array([[1., 3.], [3., 1.], [5., 7.]]) train_y = np.array([190., 330., 660.]).reshape(3, 1) print "x=", train_x print "y=", train_y # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (100回更新する) for i in range(100): _, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 10 == 0: print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l) # (4) 学習結果を出⼒ est_a = sess.run(a, feed_dict={x: train_x, y_: train_y}) print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1]) # 4. 新しいデータに対して予測する # (1) 新しいデータを⽤意 new_x = np.array([2., 4.]).reshape(1, 2) # (2) 学習結果をつかって,予測実施 new_y = sess.run(y, feed_dict={x: new_x}) print new_y # 5. 後⽚付け # セッションを閉じる sess.close() 0. ライブラリをロード 1. 予測式(モデル)を記述 2. 誤差関数と最適化⼿法を記述 3. 訓練データを作成(or読込)し 学習実⾏ 4. 予測 5. 後⽚付け
  28. 28. 0. ライブラリをロード 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 28 import numpy as np import matplotlib.pyplot as plt import tensorflow as tf TensorFlow のほか ⾼速な配列演算パッケージであるNumPyや プロットしたい場合はmatplotlib.pyplotなど 使⽤するライブラリをロードする
  29. 29. 1. 予測式(モデル)を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 29 # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(tf.zeros((2, 1)), name="a") # モデル式 y = tf.matmul(x, a) ⼊出⼒変数 à placeholder, パラメータ à Variable ・値を⼊れる"箱"を作成 (注意)shape = (訓練データの数, 次元数) ※"訓練データの数"は None にすると可変⻑扱い ・予測式(モデル)を記述
  30. 30. 線形回帰(線形重回帰)モデル 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 30 ⼊⼒層 出⼒層 𝑦 𝑥1 𝑥2 × 𝑎1 𝑦 = 𝑎1 𝑥1 + 𝑎2 𝑥2 × 𝑎2 リンゴの数 à ミカンの数 à ß合計⾦額 リンゴ の単価 ↓ ↑ ミカン の単価
  31. 31. 1. 予測式(モデル)を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 31 # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(tf.zeros((2, 1)), name="a") # モデル式 y = tf.matmul(x, a) ⼊出⼒変数 à placeholder, パラメータ à Variable ・値を⼊れる"箱"を作成 (注意)shape = (訓練データの数, 次元数) ※"訓練データの数"は None にすると可変⻑扱い ・予測式(モデル)を記述 y x a 190 330 660 1 3 3 1 5 7
  32. 32. 2.誤差関数と最適化⼿法を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 32 # 誤差関数(loss) loss = tf.reduce_mean(tf.square(y_ - y)) # 最適化⼿段を選ぶ(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss) ・誤差関数を記述 ふつうの回帰問題 à 平均⼆乗誤差 1 𝑁 6 𝑦7 − 𝑦79 2 : 7 ・最適化⼿法を選ぶ ・⼊⾨ à 最急降下法(勾配降下法) GradientDescent〜 ※どれを選ぶかで学習(最適化)の速さが変わる ・引数に適度な"学習率"を指定する ※⼤きすぎると学習失敗(発散), ⼩さすぎると学習が遅い
  33. 33. 3. 訓練データを作成(or読込)し, 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 33 train_x = np.array([[1., 3.], [3., 1.], [5., 7.]]) train_y = np.array([190., 330., 660.]).reshape(3, 1) print "x=", train_x print "y=", train_y ※予測式で定義した形状(shape)に合わせること ※実⽤場⾯では,外部データを(ファイルやSQLなどから) 読みとって2次元配列に整形する。 190 330 660 1 3 3 1 5 7 train_x train_y
  34. 34. 学習実⾏ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 34 # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (100回更新する) for i in range(100): _, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 10 == 0: print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l) # (4) 学習結果を出⼒ est_a = sess.run(a, feed_dict={x: train_x, y_: train_y}) print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1]) おまじない(初期化) sess.run ( [出⼒, ...], feed_dict={⼊⼒リスト} ) sess.run を呼び出すことで、"出⼒"に指定した データフローグラフが計算される ※ 学習を回すには、先ほど作成した最適化⼿段(train_step)を 出⼒値に指定して sess.run を呼び出す。
  35. 35. 参考: 実⾏結果 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 35 うまく学習できると... step= 10, a1= 70.35, a2= 46.23, loss=2189.06 step= 20, a1= 83.06, a2= 36.70, loss=771.90 step= 30, a1= 90.13, a2= 31.41, loss=334.34 step= 40, a1= 94.05, a2= 28.47, loss=199.24 step= 50, a1= 96.23, a2= 26.84, loss=157.52 step= 60, a1= 97.44, a2= 25.93, loss=144.64 step= 70, a1= 98.12, a2= 25.42, loss=140.67 step= 80, a1= 98.49, a2= 25.14, loss=139.44 step= 90, a1= 98.70, a2= 24.99, loss=139.06 step=100, a1= 98.81, a2= 24.90, loss=138.94 Estimated: a1= 98.81, a2= 24.90 順 調 に 低 下 推定されたパラメータの値
  36. 36. 参考: 実⾏結果 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 36 学習率が⼤きすぎて学習失敗していると... step= 10, (中略), loss=72692296.00 step= 20, (中略), loss=54651076608.00 step= 30, (中略), loss=41087909494784.00 : : 順 調 に 増 加 学習率を⼩さくしてみる
  37. 37. 4. 予測 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 37 # (1) 新しいデータを⽤意 new_x = np.array([2., 4.]).reshape(1, 2) # (2) 学習結果をつかって,予測実施 new_y = sess.run(y, feed_dict={x: new_x}) print new_y 予測でも sess.run を⽤いる feed_dictには新しい⼊⼒値を指定することに留意。(当然ですが...) (参考)実⾏結果 [[ 297.22738647]] 円円 × 2 + 円 × 4 ≒99 25 297
  38. 38. 5. 後⽚付け 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 38 # セッションを閉じる sess.close()
  39. 39. TensorFlow の処理の流れ (再掲) 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 39 # coding: utf-8 # 必要なモジュールを読み込む import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 1. 予測式(モデル)を記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(tf.zeros((2, 1)), name="a") # モデル式 y = tf.matmul(x, a) # 2. 学習に必要な関数を定義する # 誤差関数(loss) loss = tf.reduce_mean(tf.square(y_ - y)) # 最適化⼿段を選ぶ(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss) # 3. 実際に学習処理を実⾏する # (1) 訓練データを⽣成する train_x = np.array([[1., 3.], [3., 1.], [5., 7.]]) train_y = np.array([190., 330., 660.]).reshape(3, 1) print "x=", train_x print "y=", train_y # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (100回更新する) for i in range(100): _, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 10 == 0: print "step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l) # (4) 学習結果を出⼒ est_a = sess.run(a, feed_dict={x: train_x, y_: train_y}) print "Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1]) # 4. 新しいデータに対して予測する # (1) 新しいデータを⽤意 new_x = np.array([2., 4.]).reshape(1, 2) # (2) 学習結果をつかって,予測実施 new_y = sess.run(y, feed_dict={x: new_x}) print new_y # 5. 後⽚付け # セッションを閉じる sess.close() 0. ライブラリをロード 1. 予測式(モデル)を記述 2. 誤差関数と最適化⼿法を記述 3. 訓練データを作成(or読込)し 学習実⾏ 4. 予測 5. 後⽚付け
  40. 40. (補⾜) 線形回帰の応⽤場⾯ „ 家賃 Ø 家賃 = a * 駅からの距離 + b * 築年数 + c * 広さ „ 明⽇の客数 Ø 客数 = a * 気温 + b * 昨年同⽇の客数 などなど 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 40
  41. 41. つぎの問題です 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 41 たかしくんは⼋百屋へ財布を預かってお使いに ⾏きました。しかしたかしくんはお⾦を 数えられません。 気まぐれおやじ⽈く、 リンゴ2個+ミカン3個、リンゴ0個+ミカン16個 なら買えるが、リンゴ3個+ミカン1個、 リンゴ2個+ミカン8個は買えないとのこと。 リンゴ1個+ミカン11個は買えますか? 例題2 識別問題
  42. 42. 機械学習の流れ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 42 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最⼩にする点を探す(最適化) 予測式&学習済パラメタで予測
  43. 43. 式で表そうとしてみる... 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 43 円 ×1+ 円 円 ×2+ 円 × 3) 円 ×0+ 円 ×16) 円 ×3+ 円 × 1) 円 円 円 円 ×2+ 円 × 8 )円 ×11)円 -( -( -( -( -( 買える 買える 買えない 買えない ?
  44. 44. 式で表そうとしてみる... 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 44 円 ×1+ 円 円 ×2+ 円 × 3) 円 ×0+ 円 ×16) 円 ×3+ 円 × 1) 円 円 円 円 ×2+ 円 × 8 )円 ×11)円 -( -( -( -( -( 買える 買える 買えない 買えない ? 予想される残⾦ 買える : 1 買えない : 0
  45. 45. シグモイド曲線 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 45 予想される残⾦ 0 0.5 買える 買えない 𝜎 𝑢 = 1 1 + exp (−𝑢) ロジット
  46. 46. 予測式(モデル)が作れた! 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 46 円 ×1+ 円 円 ×2+ 円 × 3)) = 1 円 ×0+ 円 ×16)) = 1 円 ×3+ 円 × 1)) = 0 円 円 円 円 ×2+ 円 × 8 )) = 0円 ×11) ) =円 -( -( -( -( -( ? σ( σ( σ( σ( σ(
  47. 47. ロジスティック回帰 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 47 ⼊⼒層 出⼒層 ※ロジスティック「回帰」ですが,識別(分類)の⼿法です。 𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2) 𝑦 𝑥1 𝑥2 × 𝑎1 × 𝑎2 リンゴの数 à ミカンの数 à ß買えるか リンゴ の単価 ↓ ↑ ミカン の単価 𝑏ß 財布の中⾝
  48. 48. TensorFlow での実装 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 48 # coding: utf-8 # ### 必要なモジュールを読み込む import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # ## TensorFlow でロジスティック回帰する # 1. 学習したいモデルを記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(-10 * tf.ones((2, 1)), name="a") b = tf.Variable(200., name="b") # モデル式 u = tf.matmul(x, a) + b y = tf.sigmoid(u) # 2. 学習やテストに必要な関数を定義する # 誤差関数(loss) loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_)) # 最適化⼿段(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 3. 実際に学習処理を実⾏する # (1) 訓練データを⽣成する train_x = np.array([[2., 3.], [0., 16.], [3., 1.], [2., 8.]]) train_y = np.array([1., 1., 0., 0.]).reshape(4, 1) print "x=", train_x print "y=", train_y # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (1000回更新する) for i in range(1000): _, l, a_, b_ = sess.run([train_step, loss, a, b], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 100 == 0: print "step=%3d, a1=%6.2f, a2=%6.2f, b=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], b_, l) # (4) 学習結果を出⼒ est_a, est_b = sess.run([a, b], feed_dict={x: train_x, y_: train_y}) print "Estimated: a1=%6.2f, a2=%6.2f, b=%6.2f" % (est_a[0], est_a[1], est_b) # 4. 新しいデータに対して予測する # (1) 新しいデータを⽤意 new_x = np.array([1., 11.]).reshape(1, 2) # (2) 学習結果をつかって,予測実施 new_y = sess.run(y, feed_dict={x: new_x}) print new_y # 5. 後⽚付け # セッションを閉じる sess.close() 0. ライブラリをロード 1. 予測式(モデル)を記述 2. 誤差関数と最適化⼿法を記述 3. 訓練データを作成(or読込)し 学習実⾏ 4. 予測 5. 後⽚付け ※線形回帰の実装と,ほとんど同⼀
  49. 49. 1. 予測式(モデル)を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 49 # 1. 学習したいモデルを記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(-10 * tf.ones((2, 1)), name="a") b = tf.Variable(200., name="b") # モデル式 u = tf.matmul(x, a) + b y = tf.sigmoid(u) 𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2) ロジット: u 今回の予測式に合わせて モデルとパラメータを修正 ß追加
  50. 50. ロジスティック回帰 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 50 ⼊⼒層 出⼒層 ※ロジスティック「回帰」ですが,識別(分類)の⼿法です。 𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2) 𝑦 𝑥1 𝑥2 × 𝑎1 × 𝑎2 リンゴの数 à ミカンの数 à ß買えるか リンゴ の単価 ↓ ↑ ミカン の単価 𝑏ß 財布の中⾝
  51. 51. 1. 予測式(モデル)を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 51 # 1. 学習したいモデルを記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(-10 * tf.ones((2, 1)), name="a") b = tf.Variable(200., name="b") # モデル式 u = tf.matmul(x, a) + b y = tf.sigmoid(u) 𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2) ロジット: u 今回の予測式に合わせて モデルとパラメータを修正 ß追加
  52. 52. 2. 誤差関数と最適化⼿法を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 52 # 誤差関数(loss) loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_)) # 最適化⼿段(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) ・誤差関数を変更 識別(分類)問題 à クロスエントロピー 6 −𝑦7 log 𝑦79 − 1 − 𝑦7 log(1 − 𝑦79) : 7 正解 予測値: 𝑦79 正解 予測値: 𝑦79
  53. 53. 3. 学習実⾏ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 53 # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (1000回更新する) for i in range(1000): _, l, a_, b_ = sess.run([train_step, loss, a, b], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 100 == 0: print "step=%3d, a1=%6.2f, a2=%6.2f, b=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], b_, l) # (4) 学習結果を出⼒ est_a, est_b = sess.run([a, b], feed_dict={x: train_x, y_: train_y}) print "Estimated: a1=%6.2f, a2=%6.2f, b=%6.2f" % (est_a[0], est_a[1], est_b) 線形回帰とほぼ同じ! 【変更箇所】 ・パラメータ b の出⼒を追加 ・更新回数を 100回 à 1000回 に ※更新回数は,対象問題やデータ,初期値,モデルなどでまちまちです。
  54. 54. 学習結果 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 54 step=100, a1=-22.50, a2=-12.28, b=196.26, loss=42.75 step=200, a1=-35.00, a2=-12.06, b=192.68, loss=25.84 step=300, a1=-47.36, a2=-11.78, b=189.14, loss=9.24 step=400, a1=-55.13, a2=-11.51, b=186.75, loss=2.54 step=500, a1=-58.92, a2=-11.29, b=185.58, loss=0.02 step=600, a1=-59.26, a2=-11.23, b=185.47, loss=0.01 step=700, a1=-59.43, a2=-11.19, b=185.43, loss=0.00 step=800, a1=-59.53, a2=-11.17, b=185.39, loss=0.00 step=900, a1=-59.62, a2=-11.15, b=185.37, loss=0.00 step=1000, a1=-59.68, a2=-11.14, b=185.35, loss=0.00 Estimated: a1=-59.68, a2=-11.14, b=185.35 順 調 に 低 下 推定されたパラメータの値
  55. 55. 予測結果 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 55 円 ×1+ 円 ×11) ) =円 -( 0.96σ( 185 60 11 リンゴ1個+ミカン11個は,おそらく買えそう
  56. 56. (補⾜) 線形識別の応⽤場⾯ „ スパムメール判定 Ø スパム = σ(a * ”Discount” + b * “Drug” + c * “RayBan”) „ 来店予測 Ø 来店あり = σ(a * 前⽉来店回数+ b * DM送付 + c * … ) などなど 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 56
  57. 57. 最後にもう少し複雑な問題 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 57 ⼿書き⽂字認識 MNISTデータ 0〜9の⼿書き⽂字画像を7万枚集めたデータセット 1枚の画像は 28 x 28 ピクセル (=768ピクセル) 7 3 4 6 多クラス識別(分類)問題 ⼊⼒: 出⼒:
  58. 58. 機械学習の流れ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 58 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最⼩にする点を探す(最適化) 予測式&学習済パラメタで予測
  59. 59. one-hot ベクトル (one-of-K表現) 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 59 7 3 4 6 出⼒ラベル(1次元) 出⼒ラベル(10次元) 0 0 0 0 0 0 0 1 0 0 0 1 2 3 4 5 6 7 8 9 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1つの多クラス識別問題が 10個の2クラス識別問題へ分解
  60. 60. 案1: ロジスティック回帰を拡張 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 60 ⼊⼒層 (768ノード) 出⼒層 (10ノード) 𝑦C 𝑦1 𝑦D 01 2 3 4 5 6 7 8 9 ロジスティクス回帰を⽂字種だけ並べる 数字“1”を表す?
  61. 61. 案1: ロジスティック回帰を拡張 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 61 ⼊⼒層 (768ノード) 出⼒層 (10ノード) 𝑦C 𝑦1 𝑦D ソフトマックス(Softmax) 𝑦 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥(𝑥𝑊 + 𝑏)
  62. 62. 案2: さらに中間層を追加 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 62 ⼊⼒層 (768ノード) 出⼒層 (10ノード) 𝑦C 𝑦1 𝑦D ニューラルネット(パーセプトロン) 隠れ層 (□ノード) 中間層(隠れ層)を追加すると,より複雑なパターンも⾒分けられる
  63. 63. TensorFlow での実装 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 63 # 0. 必要なモジュールを読み込む import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # MNISTデータの取得 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 1. 学習したいモデルを記述する # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) # モデルパラメータ(⼊⼒層:784ノード, 隠れ層:100ノード, 出⼒層:10ノード) W1 = tf.Variable(tf.truncated_normal([784, 100])) b1 = tf.Variable(tf.zeros([100])) W2 = tf.Variable(tf.truncated_normal([100, 10])) b2 = tf.Variable(tf.zeros([10])) # モデル式 h = tf.sigmoid(tf.matmul(x, W1) + b1) # ⼊⼒層->隠れ層 u = tf.matmul(h, W2) + b2 # 隠れ層->出⼒層 (ロジット) y = tf.nn.softmax(u) # 隠れ層->出⼒層 (ソフトマックス後) # 2. 学習やテストに必要な関数を定義する # 誤差関数(loss) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(u, y_)) # 最適化⼿段(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) # 正答率(学習には⽤いない) correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 3. 実際に学習処理を実⾏する # (1) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (2) バッチ型確率的勾配降下法でパラメータ更新 for i in range(10000): # 訓練データから100サンプルをランダムに取得 batch_xs, batch_ys = mnist.train.next_batch(100) # 学習 _, l = sess.run([train_step, loss], feed_dict={x: batch_xs, y_: batch_ys}) if (i + 1) % 1000 == 0: print "step=%3d, loss=%.2f" % (i + 1, l) # 4. テスト⽤データに対して予測し,性能を確認 # (1) テスト⽤データを1000サンプル取得 new_x = mnist.test.images[0:1000] new_y_ = mnist.test.labels[0:1000] # (2) 予測と性能評価 accuracy, new_y = sess.run([acc, y], feed_dict={x:new_x , y_:new_y_ }) print "Accuracy (for test data): %6.2f%%" % accuracy print "True Label:", np.argmax(new_y_[0:15,], 1) print "Est Label:", np.argmax(new_y[0:15, ], 1) # 5. 後⽚付け # セッションを閉じる sess.close() 0. ライブラリをロード 1. 予測式(モデル)を記述 2. 誤差関数と最適化⼿法を記述 3. 訓練データを作成(or読込)し 学習実⾏ 4. 予測 5. 後⽚付け
  64. 64. 1. 予測式(モデル)を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 64 # ⼊⼒変数と出⼒変数のプレースホルダを⽣成 x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) # モデルパラメータ(⼊⼒層:784ノード, 隠れ層:100ノード, 出⼒層:10ノード) W1 = tf.Variable(tf.truncated_normal([784, 100])) b1 = tf.Variable(tf.zeros([100])) W2 = tf.Variable(tf.truncated_normal([100, 10])) b2 = tf.Variable(tf.zeros([10])) # モデル式 h = tf.sigmoid(tf.matmul(x, W1) + b1) # ⼊⼒層->隠れ層 u = tf.matmul(h, W2) + b2 # 隠れ層->出⼒層 (ロジット) y = tf.nn.softmax(u) # 隠れ層->出⼒層 (ソフトマックス後) x 𝑥𝑊1 + 𝑏1 h 𝑠𝑖𝑔𝑚𝑜𝑖𝑑() 隠れ層 u y ℎ𝑊2 + 𝑏2 𝑠𝑜𝑓𝑡𝑚𝑎𝑥() 出⼒層⼊⼒層 784 10 予測式(モデル, ネットワーク)を実装
  65. 65. 2. 誤差関数と最適化⼿法を記述 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 65 # 誤差関数(loss) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(u, y_)) # 最適化⼿段(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) # 正答率(学習には⽤いない) correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) ・誤差関数を変更 多クラス識別(分類)問題 à 多クラス⽤クロスエントロピー (softmax_cross_entropy_with_logits)
  66. 66. 3. 学習実⾏ 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 66 # MNISTデータの取得 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # (2) バッチ型確率的勾配降下法でパラメータ更新 for i in range(10000): # 訓練データから100サンプルをランダムに取得 batch_xs, batch_ys = mnist.train.next_batch(100) # 学習 _, l = sess.run([train_step, loss], feed_dict={x: batch_xs, y_: batch_ys}) if (i + 1) % 1000 == 0: print "step=%3d, loss=%.2f" % (i + 1, l) ⼤規模なデータで学習する時の⼯夫 ・各ステップで,100個の訓練データを ランダムに取り出して学習 (確率的勾配降下法) à 速く学習が進む
  67. 67. 参考: 学習結果 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 67 step=1000, loss=2.09 step=2000, loss=1.45 step=3000, loss=1.38 step=4000, loss=0.77 step=5000, loss=0.63 step=6000, loss=0.52 step=7000, loss=0.78 step=8000, loss=0.73 step=9000, loss=0.55 step=10000, loss=0.58 ゆ ら ぎ な が ら 低 下
  68. 68. 4. 予測 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 68 # (1) テスト⽤データを1000サンプル取得 new_x = mnist.test.images[0:1000] new_y_ = mnist.test.labels[0:1000] # (2) 予測と性能評価 accuracy, new_y = sess.run([acc, y], feed_dict={x:new_x , y_:new_y_ }) print "Accuracy (for test data): %6.2f%%" % (accuracy * 100) print "True Label:", np.argmax(new_y_[0:15,], 1) print "Est Label:", np.argmax(new_y[0:15, ], 1) ここはこれまでと同様 【実⾏結果例】 Accuracy(test data): 80.0% True Label: [7 2 1 0 4 1 4 9 5 9 0 6 9 0 1] Est Label: [7 2 1 0 9 1 4 9 2 9 0 6 9 0 1]
  69. 69. (補⾜) ⾼度な識別の応⽤場⾯ „ 顔検出 Ø それぞれの画像領域が顔といえるかどうかを推定 „ 表情認識 Ø 顔画像がどの表情(e.g. 笑, 怒, …)かを推定 „ (⼀般)物体認識 Ø それぞれの画像領域が何なのかを推定 などなど 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 69
  70. 70. 階層はより深く… ⇒ “DeepLearning” „ AlexNet (2012) … 8層 „ GoogLeNet (2014) … 22層 „ ResiNet (2015) … 152層 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 70
  71. 71. まとめ(機械学習の流れ) 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 71 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最⼩にする点を探す(最適化) 予測式&学習済パラメタで予測
  72. 72. 参考書籍 2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 72 ディープラーニングの基礎的な理論と TensorFlowなどのサンプルコードあり ディープラーニングの 理論理解を深めたいかたはこちら。

×