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

72
TensorFlow を使った 機械学習ことはじめ 2016-08-27 上野⼭ Summar Edition

Upload: -

Post on 09-Feb-2017

1.377 views

Category:

Technology


0 download

TRANSCRIPT

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

TensorFlow を使った機械学習ことはじめ

2016-08-27上野⼭

Summar Edition

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

⾃⼰紹介� 元 電機メーカ勤務の

似⾮ソフト屋

� もともと組込みà 画像処理à データ解析 と変遷しà DeepLearning の世界へ

2

上野⼭ 徹うえのやま とおる

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』

We‘reHiring!

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

0. 機械学習とは?

3

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

機械学習とは?

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 4

数値・⽂字・画像・⾳声など多種多様なデータの中から,規則性・パターン・知識を発⾒し,現状を把握や将来の予測をしたりする

※朱鷺の杜(”機械学習”)より引⽤

機械学習を使わない場合:すでに分かっている規則性(e.g.運動⽅程式)を使って,現状把握や将来を予測

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

教師あり/なし

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 5

教師あり学習 教師なし学習

※その他,半教師あり学習や強化学習 と呼ばれるものもあります

正解がセットになったデータから規則性やパターンを⾒つける

正解が含まれないデータから規則性やパターンを⾒つける

来店頻度購

買⾦

額⼊⼒データ

=7

=7

=7

=9

正解データ

離れている

が「7」のパターンっぽい

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

回帰 / 識別

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 6

回帰 識別(判別)

連続的な値を予測する

とびとびな値(離散値)を予測する

e.g. 家賃の予測 e.g. 広告メール判定

Howmuch?

…DISCOUNT

…CLICKNOW

…meeting

… Spam?orNot?

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

難しい規則性を機械学習するには

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 7

学習アルゴリズム

効率的な計算環境

⼤規模データ

が提供してくれる

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

1. TensorFlow とは

8

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

TensorFlow とは

� Google社のMachineIntelligence研究所が開発した数値計算ライブラリ

� Deep Learning をはじめとする機械学習の研究や活⽤にGoogle社内で⽤いられているØ 2011年から使⽤していたDistBeliefを強化

� 複数のCPU/GPUや、複数のマシンに分散して実⾏できる。

� C++とPython 2or3 APIを持っている� 2015年11⽉にオープンソース(Apache2.0)公開

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 9

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

データフローグラフ

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 10

ß 掛け算

ß ⾜し算

ß 関数

テンソルがデータフローグラフ上を流れるように計算処理している

テンソル à(多次元配列)

𝐶 = … (𝑅𝑒𝐿𝑈 𝑏 +𝑊𝑋 )à 数式で表現すると、

TensorFlow巨⼤なデータにも使える⾏列計算ライブラリ

ビッグデータの機械学習に使える!出典)TensorFlow:Large-ScaleMachineLearning

onHeterogeneousDistributedSystems,Google,2015

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

TensorBoard� データフローグラフのネットワーク構造や

学習経過をWeb上で確認できる

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 11

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

詳細は Web へ

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 12https://speakerdeck.com/kazunori279/cloud-vision-api-and-tensorflow

例えば、佐藤さん@Google の資料など

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

2. TensorFlow を使った機械学習

13

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

さっそく問題です

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 14

たかしくんは⼋百屋へお使いに⾏きました。

リンゴ1個とミカン3個を買うと190円,リンゴ3個とミカン1個を買うと330円するようです。

リンゴ2個とミカン4個を買うといくらになるでしょうか?

例題1

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

式で表すと...

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 15

円 × 1 + 円 × 3 = 190円

円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = ?

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

回答

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 16

円 × 1 + 円 × 3 = 190円

円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = ?

100 30

100 30

100 30

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

回答

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 17

円 × 1 + 円 × 3 = 190円

円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = 320

100 30

100 30

100 30

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

これも機械学習(回帰)の問題です!

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 18

円 × 1 + 円 × 3 = 190円

円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = 320

100 30

100 30

100 30

学習

予測

実績データからパラメータを推定

パラメータを使って結果を予測

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

実は店のおやじは気まぐれでした

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 19

円 × 1 + 円 × 3 = 190円円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = ?

円 × 5 + 円 × 7 = 660円

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

実は店のおやじは気まぐれでした

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 20

円 × 1 + 円 × 3 = 190円円 × 3 + 円 × 1 = 330円

円 × 2 + 円 × 4 = ?

円 × 5 + 円 × 7 = 660円

100 30100 30100 30

710

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

どうやってパラメータ(単価)を⾒つけるか?

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 21

考え⽅

合計⾦額の誤差が⼩さくなるような単価を採⽤しよう!

円 × 1 + 円 × 3à 40円 - 190円円 × 3 + 円 × 1à 40円 - 330円円 × 5 + 円 × 7à 120円 - 660円

10 1010 1010 10

合計⾦額(正解)

合計⾦額(予測) (2乗)誤差

à 22500à 84100à 291600

( )2

( )2

( )2

平均132733

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

すべての組合せを計算

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 2220010 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 2083320 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 2180030 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 2510040 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 3073350 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 3870060 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 4900070 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 6163380 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 7660090 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400150 8033 14200 24300 38333 56300 78200 104033 133800 167500 205133 246700

近そうな値は⾒つかるけど、計算は⼤変!(もし単価が0円〜1万円で、10種類買ったら?)

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

よく⾒ると、徐々に変化している

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 2220010 164833 132733 104567 80333 60033 43667 31233 22733 18167 17533 2083320 138467 109100 83667 62167 44600 30967 21267 15500 13667 15767 2180030 114433 87800 65100 46333 31500 20600 13633 10600 11500 16333 2510040 92733 68833 48867 32833 20733 12567 8333 8033 11667 19233 3073350 73367 52200 34967 21667 12300 6867 5367 7800 14167 24467 3870060 56333 37900 23400 12833 6200 3500 4733 9900 19000 32033 4900070 41633 25933 14167 6333 2433 2467 6433 14333 26167 41933 6163380 29267 16300 7267 2167 1000 3767 10467 21100 35667 54167 7660090 19233 9000 2700 333 1900 7400 16833 30200 47500 68733 93900100 11533 4033 467 833 5133 13367 25533 41633 61667 85633 113533110 6167 1400 567 3667 10700 21667 36567 55400 78167 104867 135500120 3133 1100 3000 8833 18600 32300 49933 71500 97000 126433 159800130 2433 3133 7767 16333 28833 45267 65633 89933 118167 150333 186433140 4067 7500 14867 26167 41400 60567 83667 110700 141667 176567 215400150 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リンゴ

最⼩値

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

⼩さくなる⽅向へたどっていくと...

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 24

ミカン0 10 20 30 40 50 60 70 80 90 100

リン

0 19353310 13273320 8366730 4633340 2073350 686760 350070 246780 7267 2167 100090 2700 333 1900100 467 833 5133110120130140150

ミカン 0

ミカン 40ミカン 800

50000

100000

150000

200000

250000

0 20 40 60 80 100120 140リンゴ

最⼩値

少ない計算で早く最⼩値に!※最⼩(⼤)値を求める処理="最適化"

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

気まぐれおやじのこころを読む

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 25

円 × 1 + 円 × 3≒ 190円円 × 3 + 円 × 1≒ 330円

円 × 2 + 円 × 4≒

円 × 5 + 円 × 7≒ 660円

90 3090 3090 30

90 30 310

650

300

180

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

ここまでの振り返り

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 26

TensorFlowでも同じように書いていく

学習

予測

①予測式(モデル)をつくる

②誤差を計算する

③誤差を最⼩にする点を探す(最適化)

予測式&学習済パラメタで予測

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

TensorFlow の処理の流れ

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 27

# coding: utf-8

# 必要なモジュールを読み込むimport numpy as npimport matplotlib.pyplot as pltimport 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_xprint "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.後⽚付け

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

0. ライブラリをロード

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 28

import numpy as npimport matplotlib.pyplot as pltimport tensorflow as tf

TensorFlow のほか⾼速な配列演算パッケージであるNumPyやプロットしたい場合はmatplotlib.pyplotなど使⽤するライブラリをロードする

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

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にすると可変⻑扱い

・予測式(モデル)を記述

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

線形回帰(線形重回帰)モデル

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 30⼊⼒層 出⼒層

𝑦𝑥1

𝑥2

×𝑎1

𝑦 = 𝑎1𝑥1 + 𝑎2𝑥2

×𝑎2

リンゴの数à

ミカンの数à

ß合計⾦額

リンゴの単価

↑ミカンの単価

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

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 a190330660

133157

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

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〜※どれを選ぶかで学習(最適化)の速さが変わる

・引数に適度な"学習率"を指定する※⼤きすぎると学習失敗(発散),⼩さすぎると学習が遅い

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

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_xprint "y=", train_y

※予測式で定義した形状(shape)に合わせること

※実⽤場⾯では,外部データを(ファイルやSQLなどから)読みとって2次元配列に整形する。

190330660

133157

train_x train_y

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

学習実⾏

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 を呼び出す。

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

参考: 実⾏結果

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 35

うまく学習できると...step= 10, a1= 70.35, a2= 46.23, loss=2189.06step= 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.94Estimated: a1= 98.81, a2= 24.90

順調に低下

推定されたパラメータの値

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

参考: 実⾏結果

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 36

学習率が⼤きすぎて学習失敗していると...

step= 10, (中略), loss=72692296.00step= 20, (中略), loss=54651076608.00step= 30, (中略), loss=41087909494784.00

: :

順調に増加

学習率を⼩さくしてみる

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

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

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

5. 後⽚付け

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 38

# セッションを閉じるsess.close()

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

TensorFlow の処理の流れ (再掲)

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 39

# coding: utf-8

# 必要なモジュールを読み込むimport numpy as npimport matplotlib.pyplot as pltimport 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_xprint "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.後⽚付け

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

(補⾜) 線形回帰の応⽤場⾯

� 家賃Ø 家賃 =a *駅からの距離 +b* 築年数 +c*広さ

� 明⽇の客数Ø 客数 =a*気温 +b*昨年同⽇の客数

などなど

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 40

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

つぎの問題です

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 41

たかしくんは⼋百屋へ財布を預かってお使いに⾏きました。しかしたかしくんはお⾦を数えられません。

気まぐれおやじ⽈く、リンゴ2個+ミカン3個、リンゴ0個+ミカン16個なら買えるが、リンゴ3個+ミカン1個、リンゴ2個+ミカン8個は買えないとのこと。

リンゴ1個+ミカン11個は買えますか?

例題2

識別問題

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

機械学習の流れ

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 42

学習

予測

①予測式(モデル)をつくる

②誤差を計算する

③誤差を最⼩にする点を探す(最適化)

予測式&学習済パラメタで予測

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

式で表そうとしてみる...

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 43

円 ×1+ 円

円 ×2+ 円 × 3)円 ×0+ 円 ×16)円 ×3+ 円 × 1)

円 ×2+ 円 × 8 )円

×11)円

-(-(-(-(

-(

買える買える買えない買えない

?

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

式で表そうとしてみる...

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 44

円 ×1+ 円

円 ×2+ 円 × 3)円 ×0+ 円 ×16)円 ×3+ 円 × 1)

円 ×2+ 円 × 8 )円

×11)円

-(-(-(-(

-(

買える買える買えない買えない

?

予想される残⾦ 買える :1買えない :0

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

シグモイド曲線

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 45

予想される残⾦0

0.5

買える

買えない

𝜎 𝑢 =1

1 + exp(−𝑢)ロジット

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

予測式(モデル)が作れた!

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 46

円 ×1+ 円

円 ×2+ 円 × 3))= 1円 ×0+ 円 ×16))= 1円 ×3+ 円 × 1))= 0

円 ×2+ 円 × 8 ))= 0円

×11))=円

-(-(-(-(

-( ?

σ(σ(σ(σ(

σ(

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

ロジスティック回帰

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 47

⼊⼒層 出⼒層

※ロジスティック「回帰」ですが,識別(分類)の⼿法です。

𝑦 = 𝜎(𝑏 + 𝑎1𝑥1 + 𝑎2𝑥2)

𝑦𝑥1

𝑥2

×𝑎1

×𝑎2

リンゴの数à

ミカンの数à

ß買えるか

リンゴの単価

↑ミカンの単価

𝑏ß財布の中⾝

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

TensorFlow での実装

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 48

# coding: utf-8

# ### 必要なモジュールを読み込むimport numpy as npimport matplotlib.pyplot as pltimport 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) + by = 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_xprint "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.後⽚付け

※線形回帰の実装と,ほとんど同⼀

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

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) + by = tf.sigmoid(u)

𝑦 = 𝜎(𝑏 + 𝑎1𝑥1 + 𝑎2𝑥2)ロジット: u

今回の予測式に合わせてモデルとパラメータを修正

ß追加

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

ロジスティック回帰

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 50

⼊⼒層 出⼒層

※ロジスティック「回帰」ですが,識別(分類)の⼿法です。

𝑦 = 𝜎(𝑏 + 𝑎1𝑥1 + 𝑎2𝑥2)

𝑦𝑥1

𝑥2

×𝑎1

×𝑎2

リンゴの数à

ミカンの数à

ß買えるか

リンゴの単価

↑ミカンの単価

𝑏ß財布の中⾝

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

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) + by = tf.sigmoid(u)

𝑦 = 𝜎(𝑏 + 𝑎1𝑥1 + 𝑎2𝑥2)ロジット: u

今回の予測式に合わせてモデルとパラメータを修正

ß追加

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

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

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

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回 に

※更新回数は,対象問題やデータ,初期値,モデルなどでまちまちです。

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

学習結果

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 54

step=100, a1=-22.50, a2=-12.28, b=196.26, loss=42.75step=200, a1=-35.00, a2=-12.06, b=192.68, loss=25.84step=300, a1=-47.36, a2=-11.78, b=189.14, loss=9.24step=400, a1=-55.13, a2=-11.51, b=186.75, loss=2.54step=500, a1=-58.92, a2=-11.29, b=185.58, loss=0.02step=600, a1=-59.26, a2=-11.23, b=185.47, loss=0.01step=700, a1=-59.43, a2=-11.19, b=185.43, loss=0.00step=800, a1=-59.53, a2=-11.17, b=185.39, loss=0.00step=900, a1=-59.62, a2=-11.15, b=185.37, loss=0.00step=1000, a1=-59.68, a2=-11.14, b=185.35, loss=0.00

Estimated: a1=-59.68, a2=-11.14, b=185.35

順調に低下

推定されたパラメータの値

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

予測結果

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 55

円 ×1+ 円 ×11))=円 -( 0.96σ( 185 60 11

リンゴ1個+ミカン11個は,おそらく買えそう

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

(補⾜) 線形識別の応⽤場⾯

� スパムメール判定Ø スパム =σ(a *”Discount”+b* “Drug” +c*“RayBan”)

� 来店予測Ø 来店あり =σ(a*前⽉来店回数+b* DM送付 +c*…)

などなど

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 56

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

最後にもう少し複雑な問題

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 57

⼿書き⽂字認識MNISTデータ

0〜9の⼿書き⽂字画像を7万枚集めたデータセット1枚の画像は 28x28ピクセル (=768ピクセル)

7 3 4 6

多クラス識別(分類)問題

⼊⼒:

出⼒:

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

機械学習の流れ

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 58

学習

予測

①予測式(モデル)をつくる

②誤差を計算する

③誤差を最⼩にする点を探す(最適化)

予測式&学習済パラメタで予測

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

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 00123456789

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クラス識別問題へ分解

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

案1: ロジスティック回帰を拡張

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 60

⼊⼒層(768ノード)

出⼒層(10ノード)

𝑦C𝑦1

𝑦D

����������

0123456789

ロジスティクス回帰を⽂字種だけ並べる

数字“1”を表す?

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

案1: ロジスティック回帰を拡張

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 61

⼊⼒層(768ノード)

出⼒層(10ノード)

𝑦C𝑦1

𝑦D

ソフトマックス(Softmax) 𝑦 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥(𝑥𝑊 + 𝑏)

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

案2: さらに中間層を追加

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 62

⼊⼒層(768ノード)

出⼒層(10ノード)

𝑦C𝑦1

𝑦D

ニューラルネット(パーセプトロン)

隠れ層(□ノード)

中間層(隠れ層)を追加すると,より複雑なパターンも⾒分けられる

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

TensorFlow での実装

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 63

# 0. 必要なモジュールを読み込むimport numpy as npimport matplotlib.pyplot as pltimport tensorflow as tffrom 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%%" % accuracyprint "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.後⽚付け

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

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) # 隠れ層->出⼒層 (ソフトマックス後)

𝑥𝑊1 + 𝑏1

h

𝑠𝑖𝑔𝑚𝑜𝑖𝑑()

隠れ層

u y

ℎ𝑊2 + 𝑏2 𝑠𝑜𝑓𝑡𝑚𝑎𝑥()

出⼒層⼊⼒層

784

10

予測式(モデル,ネットワーク)を実装

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

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)

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

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個の訓練データをランダムに取り出して学習 (確率的勾配降下法)à 速く学習が進む

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

参考: 学習結果

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 67

step=1000, loss=2.09step=2000, loss=1.45step=3000, loss=1.38step=4000, loss=0.77step=5000, loss=0.63step=6000, loss=0.52step=7000, loss=0.78step=8000, loss=0.73step=9000, loss=0.55step=10000, loss=0.58

ゆらぎながら低下

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

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]

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

(補⾜) ⾼度な識別の応⽤場⾯

� 顔検出Ø それぞれの画像領域が顔といえるかどうかを推定

� 表情認識Ø 顔画像がどの表情(e.g.笑,怒,…)かを推定

� (⼀般)物体認識Ø それぞれの画像領域が何なのかを推定

などなど

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 69

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

階層はより深く… ⇒ “DeepLearning”

� AlexNet (2012) … 8層

� GoogLeNet (2014) … 22層

� ResiNet (2015)…152層

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 70

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

まとめ(機械学習の流れ)

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 71

学習

予測

①予測式(モデル)をつくる

②誤差を計算する

③誤差を最⼩にする点を探す(最適化)

予測式&学習済パラメタで予測

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

参考書籍

2016-08-27 ☆2週連続!秋のテック祭 『はじめてのDeep Learning』 72

ディープラーニングの基礎的な理論とTensorFlowなどのサンプルコードあり

ディープラーニングの理論理解を深めたいかたはこちら。