TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)

34,319 views
34,328 views

Published on

TensorFlow の基本的な使い方やコーディング方法を、線形重回帰やロジスティック回帰、パーセプトロンの実装例を通じて解説しています。(機械学習初心者向け)

※2016/02/27に開催した「GDG京都 機械学習勉強会」で発表した資料です。

Published in: Technology
0 Comments
142 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
34,319
On SlideShare
0
From Embeds
0
Number of Embeds
3,276
Actions
Shares
0
Downloads
173
Comments
0
Likes
142
Embeds 0
No embeds

No notes for slide

TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)

  1. 1. TensorFlow を使った 機械学習ことはじめ 2016-02-27 GDG京都 上野山
  2. 2. 自己紹介  電機メーカ勤務の 似非ソフト屋  もともと組込み  画像処理  データ解析 と変遷  最近は Android より R言語(統計処理言語)と 格闘中 2 上野山 徹 うえのやま とおる
  3. 3. 1. TensorFlow とは 2016-02-27 GDG京都 機械学習勉強会 3
  4. 4. TensorFlow とは  Google社のMachine Intelligence 研究所が開発した数値計算ライブラリ  Deep Learning をはじめとする 機械学習 の 研究や活用にGoogle社内で用いられている  2011年から使用していたDistBeliefを強化  複数のCPU/GPUや、複数のマシンに分散して 実行できる。(※複数マシン対応版は未公開)  C++とPython 2or3 APIを持っている  2015年11月にオープンソース(Apache2.0)公開 2016-02-27 GDG京都 機械学習勉強会 4
  5. 5. データフローグラフ 2016-02-27 GDG京都 機械学習勉強会 5  掛け算  足し算  関数 テンソル が データフローグラフ 上を 流れるように計算処理している テンソル  (多次元配列) 𝐶 = … (𝑅𝑒𝐿𝑈 𝑏 + 𝑊𝑋 )  数式で表現すると、 TensorFlow 巨大なデータにも使える 行列計算ライブラリ ビッグデータの 機械学習に使える!出典)TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems, Google, 2015
  6. 6. TensorBoard  データフローグラフのネットワーク構造や 学習経過をWeb上で確認できる 2016-02-27 GDG京都 機械学習勉強会 6
  7. 7. 詳細は Web へ 2016-02-27 GDG京都 機械学習勉強会 7 https://speakerdeck.com/kazunori279/cloud-vision-api-and-tensorflow 例えば、佐藤さん@Google の資料など
  8. 8. 2. TensorFlow を使った 機械学習 2016-02-27 GDG京都 機械学習勉強会 8
  9. 9. さっそく問題です 2016-02-27 GDG京都 機械学習勉強会 9 たかしくんは八百屋へお使いに行きました。 リンゴ1個とミカン3個を買うと190円, リンゴ3個とミカン1個を買うと330円 するようです。 リンゴ2個とミカン4個を買うと いくらになるでしょうか? 例題1
  10. 10. 円 式で表すと... 2016-02-27 GDG京都 機械学習勉強会 10 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ?
  11. 11. 円 回答 2016-02-27 GDG京都 機械学習勉強会 11 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 100 30 100 30 100 30
  12. 12. 円 回答 2016-02-27 GDG京都 機械学習勉強会 12 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = 320 100 30 100 30 100 30
  13. 13. 円 これも機械学習(回帰)の問題です! 2016-02-27 GDG京都 機械学習勉強会 13 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = 320 100 30 100 30 100 30 学習 予測 実績データからパラメータを推定 パラメータを使って結果を予測
  14. 14. 実は店のおやじは気まぐれでした 2016-02-27 GDG京都 機械学習勉強会 14 円 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 円 × 5 + 円 × 7 = 660 円
  15. 15. 実は店のおやじは気まぐれでした 2016-02-27 GDG京都 機械学習勉強会 15 円 円 × 1 + 円 × 3 = 190 円 円 × 3 + 円 × 1 = 330 円 円 × 2 + 円 × 4 = ? 円 × 5 + 円 × 7 = 660 円 100 30 100 30 100 30
  16. 16. どうやってパラメータ(単価)を見つけるか? 2016-02-27 GDG京都 機械学習勉強会 16 考え方 合計金額の誤差が小さくなるような 単価を採用しよう! 円 × 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
  17. 17. すべての組合せを計算 2016-02-27 GDG京都 機械学習勉強会 17 ミカン 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種類買ったら?)
  18. 18. よく見ると、徐々に変化している 2016-02-27 GDG京都 機械学習勉強会 18 ミカン 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 リンゴ 最小値
  19. 19. 小さくなる方向へたどっていくと... 2016-02-27 GDG京都 機械学習勉強会 19 ミカン 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 リンゴ 最小値 少ない計算で早く最小値に! ※最小(大)値を求める処理="最適化"
  20. 20. 気まぐれおやじのこころを読む 2016-02-27 GDG京都 機械学習勉強会 20 円 円 × 1 + 円 × 3 ≒ 190 円 円 × 3 + 円 × 1 ≒ 330 円 円 × 2 + 円 × 4 ≒ 円 × 5 + 円 × 7 ≒ 660 円 90 30 90 30 90 30 90 30 310
  21. 21. ここまでの振り返り 2016-02-27 GDG京都 機械学習勉強会 21 TensorFlowでも同じように書いていく 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最小にする点を探す(最適化) 予測式&学習済パラメタで予測
  22. 22. 線形回帰(線形重回帰)の1つ 2016-02-27 GDG京都 機械学習勉強会 22 入力層 出力層 𝑦 𝑥1 𝑥2 × 𝑎1 𝑦 = 𝑎1 𝑥1 + 𝑎2 𝑥2 × 𝑎2 リンゴの数  ミカンの数  合計金額 リンゴ の単価 ↓ ↑ ミカン の単価
  23. 23. TensorFlow の処理の流れ 2016-02-27 GDG京都 機械学習勉強会 23 # 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. 後片付け
  24. 24. 0. ライブラリをロード 2016-02-27 GDG京都 機械学習勉強会 24 import numpy as np import matplotlib.pyplot as plt import tensorflow as tf TensorFlow のほか 高速な配列演算パッケージであるNumPyや プロットしたい場合はmatplotlib.pyplotなど 使用するライブラリをロードする
  25. 25. 1. 予測式(モデル)を記述 2016-02-27 GDG京都 機械学習勉強会 25 # 入力変数と出力変数のプレースホルダを生成 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
  26. 26. 2.誤差関数と最適化手法を記述 2016-02-27 GDG京都 機械学習勉強会 26 # 誤差関数(loss) loss = tf.reduce_mean(tf.square(y_ - y)) # 最適化手段を選ぶ(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss) ・誤差関数を記述 ふつうの回帰問題  平均二乗誤差 1 𝑁 𝑦𝑖 − 𝑦𝑖 2 𝑁 𝑖 ・最適化手法を選ぶ ・入門  最急降下法(勾配降下法) GradientDescent~ ※どれを選ぶかで学習(最適化)の速さが変わる ・引数に適度な"学習率"を指定する ※大きすぎると学習失敗(発散), 小さすぎると学習が遅い
  27. 27. 3. 訓練データを作成(or読込)し, 2016-02-27 GDG京都 機械学習勉強会 27 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
  28. 28. 学習実行 2016-02-27 GDG京都 機械学習勉強会 28 # (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 を呼び出す。
  29. 29. 参考: 実行結果 2016-02-27 GDG京都 機械学習勉強会 29 うまく学習できると... 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 順 調 に 低 下 推定されたパラメータの値
  30. 30. 参考: 実行結果 2016-02-27 GDG京都 機械学習勉強会 30 学習率が大きすぎて学習失敗していると... step= 10, (中略), loss=72692296.00 step= 20, (中略), loss=54651076608.00 step= 30, (中略), loss=41087909494784.00 : : 順 調 に 増 加 学習率を小さくしてみる
  31. 31. 4. 予測 2016-02-27 GDG京都 機械学習勉強会 31 # (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
  32. 32. 5. 後片付け 2016-02-27 GDG京都 機械学習勉強会 32 # セッションを閉じる sess.close()
  33. 33. TensorFlow の処理の流れ (再掲) 2016-02-27 GDG京都 機械学習勉強会 33 # 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. 後片付け
  34. 34. (補足) 線形回帰の応用場面  家賃  家賃 = a * 駅からの距離 + b * 築年数 + c * 広さ  明日の客数  客数 = a * 気温 + b * 昨年同日の客数 などなど 2016-02-27 GDG京都 機械学習勉強会 34
  35. 35. つぎの問題です 2016-02-27 GDG京都 機械学習勉強会 35 たかしくんは八百屋へ財布を預かってお使いに 行きました。しかしたかしくんはお金を 数えられません。 気まぐれおやじ曰く、 リンゴ2個+ミカン3個、リンゴ0個+ミカン16個 なら買えるが、リンゴ3個+ミカン1個、 リンゴ2個+ミカン8個は買えないとのこと。 リンゴ1個+ミカン11個は買えますか? 例題2 識別問題
  36. 36. 機械学習の流れ 2016-02-27 GDG京都 機械学習勉強会 36 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最小にする点を探す(最適化) 予測式&学習済パラメタで予測
  37. 37. 式で表そうとしてみる... 2016-02-27 GDG京都 機械学習勉強会 37 円 ×1+ 円 円 ×2+ 円 × 3) 円 ×0+ 円 ×16) 円 ×3+ 円 × 1) 円 円 円 円 ×2+ 円 × 8 )円 ×11)円 -( -( -( -( -( 買える 買える 買えない 買えない ?
  38. 38. 式で表そうとしてみる... 2016-02-27 GDG京都 機械学習勉強会 38 円 ×1+ 円 円 ×2+ 円 × 3) 円 ×0+ 円 ×16) 円 ×3+ 円 × 1) 円 円 円 円 ×2+ 円 × 8 )円 ×11)円 -( -( -( -( -( 買える 買える 買えない 買えない ? 予想される残金 買える : 1 買えない : 0
  39. 39. シグモイド曲線 2016-02-27 GDG京都 機械学習勉強会 39 予想される残金 0 0.5 買える 買えない 𝜎 𝑢 = 1 1 + exp(−𝑢) ロジット
  40. 40. 予測式(モデル)が作れた! 2016-02-27 GDG京都 機械学習勉強会 40 円 ×1+ 円 円 ×2+ 円 × 3)) = 1 円 ×0+ 円 ×16)) = 1 円 ×3+ 円 × 1)) = 0 円 円 円 円 ×2+ 円 × 8 )) = 0円 ×11) ) =円 -( -( -( -( -( ? σ( σ( σ( σ( σ(
  41. 41. ロジスティック回帰 2016-02-27 GDG京都 機械学習勉強会 41 入力層 出力層 ※ロジスティック「回帰」ですが,識別(分類)の手法です。 𝑦 = 𝜎(𝑏 + 𝑎1 𝑥1 + 𝑎2 𝑥2) 𝑦 𝑥1 𝑥2 × 𝑎1 × 𝑎2 リンゴの数  ミカンの数  買えるか リンゴ の単価 ↓ ↑ ミカン の単価 𝑏 財布の中身
  42. 42. TensorFlow での実装 2016-02-27 GDG京都 機械学習勉強会 42 # 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. 後片付け ※線形回帰の実装と,ほとんど同一
  43. 43. 1. 予測式(モデル)を記述 2016-02-27 GDG京都 機械学習勉強会 43 # 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 今回の予測式に合わせて モデルとパラメータを修正 追加
  44. 44. 2. 誤差関数と最適化手法を記述 2016-02-27 GDG京都 機械学習勉強会 44 # 誤差関数(loss) loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_)) # 最適化手段(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) ・誤差関数を変更 識別(分類)問題  クロスエントロピー −𝑦𝑖 log 𝑦𝑖 − 1 − 𝑦𝑖 log(1 − 𝑦𝑖) 𝑁 𝑖 正解 予測値: 𝑦𝑖 正解 予測値: 𝑦𝑖
  45. 45. 3. 学習実行 2016-02-27 GDG京都 機械学習勉強会 45 # (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回 に ※更新回数は,対象問題やデータ,初期値,モデルなどでまちまちです。
  46. 46. 学習結果 2016-02-27 GDG京都 機械学習勉強会 46 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 順 調 に 低 下 推定されたパラメータの値
  47. 47. 予測結果 2016-02-27 GDG京都 機械学習勉強会 47 円 ×1+ 円 ×11) ) =円 -( 0.96σ( 185 60 11 リンゴ1個+ミカン11個は,おそらく買えそう
  48. 48. 最後にもう少し複雑な問題 2016-02-27 GDG京都 機械学習勉強会 48 手書き文字認識 MNISTデータ 0~9の手書き文字画像を7万枚集めたデータセット 1枚の画像は 28 x 28 ピクセル 7 3 4 6 多クラス識別(分類)問題 入力: 出力:
  49. 49. 機械学習の流れ 2016-02-27 GDG京都 機械学習勉強会 49 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最小にする点を探す(最適化) 予測式&学習済パラメタで予測
  50. 50. one-hot ベクトル (one-of-K表現) 2016-02-27 GDG京都 機械学習勉強会 50 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クラス識別問題へ分解
  51. 51. 案1: ロジスティック回帰を拡張 2016-02-27 GDG京都 機械学習勉強会 51 入力層 (768ノード) 出力層 (10ノード) 𝑦0 𝑦1 𝑦9 ソフトマックス(Softmax) 𝑦 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥(𝑥𝑊 + 𝑏)
  52. 52. 案1: ロジスティック回帰を拡張 2016-02-27 GDG京都 機械学習勉強会 52 入力層 (768ノード) 出力層 (10ノード) 𝑦0 𝑦1 𝑦9 ソフトマックス(Softmax)
  53. 53. 案2: さらに中間層を追加 2016-02-27 GDG京都 機械学習勉強会 53 入力層 (768ノード) 出力層 (10ノード) 𝑦0 𝑦1 𝑦9 ニューラルネット(パーセプトロン) 隠れ層 (□ノード) 中間層(隠れ層)を追加すると,より複雑なパターンも見分けられる
  54. 54. TensorFlow での実装 2016-02-27 GDG京都 機械学習勉強会 54 # 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. 後片付け
  55. 55. 1. 予測式(モデル)を記述 2016-02-27 GDG京都 機械学習勉強会 55 # 入力変数と出力変数のプレースホルダを生成 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 予測式(モデル, ネットワーク)を実装
  56. 56. 2. 誤差関数と最適化手法を記述 2016-02-27 GDG京都 機械学習勉強会 56 # 誤差関数(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)
  57. 57. 3. 学習実行 2016-02-27 GDG京都 機械学習勉強会 57 # 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個の訓練データを ランダムに取り出して学習 (確率的勾配降下法)  速く学習が進む
  58. 58. 参考: 学習結果 2016-02-27 GDG京都 機械学習勉強会 58 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 ゆ ら ぎ な が ら 低 下
  59. 59. 4. 予測 2016-02-27 GDG京都 機械学習勉強会 59 # (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]
  60. 60. まとめ(機械学習の流れ) 2016-02-27 GDG京都 機械学習勉強会 60 学 習 予 測 ①予測式(モデル)をつくる ②誤差を計算する ③誤差を最小にする点を探す(最適化) 予測式&学習済パラメタで予測
  61. 61. 参考書籍 2016-02-27 GDG京都 機械学習勉強会 61 ディープラーニングの基礎的な理論と TensorFlowなどのサンプルコードあり ディープラーニングの 理論理解を深めたいかたはこちら。

×