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

61
TensorFlow を使った 機械学習ことはじめ 2016-02-27 GDG京都 上野山

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

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

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

2016-02-27

GDG京都 上野山

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

自己紹介

電機メーカ勤務の 似非ソフト屋

もともと組込み 画像処理 データ解析 と変遷

最近は Android より R言語(統計処理言語)と 格闘中

2

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

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

1. TensorFlow とは

2016-02-27 GDG京都 機械学習勉強会 3

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

TensorFlow とは

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

Deep Learning をはじめとする 機械学習 の 研究や活用にGoogle社内で用いられている

2011年から使用していたDistBeliefを強化

複数のCPU/GPUや、複数のマシンに分散して 実行できる。(※複数マシン対応版は未公開)

C++とPython 2or3 APIを持っている

2015年11月にオープンソース(Apache2.0)公開

2016-02-27 GDG京都 機械学習勉強会 4

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

データフローグラフ

2016-02-27 GDG京都 機械学習勉強会 5

掛け算

足し算

関数

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

テンソル (多次元配列)

𝐶 = … (𝑅𝑒𝐿𝑈 𝑏 +𝑊𝑋 )

数式で表現すると、

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

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

on Heterogeneous Distributed Systems, Google, 2015

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

TensorBoard

データフローグラフのネットワーク構造や 学習経過をWeb上で確認できる

2016-02-27 GDG京都 機械学習勉強会 6

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

2. TensorFlow を使った 機械学習

2016-02-27 GDG京都 機械学習勉強会 8

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

さっそく問題です

2016-02-27 GDG京都 機械学習勉強会 9

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

リンゴ1個とミカン3個を買うと190円,

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

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

例題1

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

式で表すと...

2016-02-27 GDG京都 機械学習勉強会 10

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = ?

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

回答

2016-02-27 GDG京都 機械学習勉強会 11

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = ?

100 30

100 30

100 30

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

回答

2016-02-27 GDG京都 機械学習勉強会 12

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = 320

100 30

100 30

100 30

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

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

2016-02-27 GDG京都 機械学習勉強会 13

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = 320

100 30

100 30

100 30

学習

予測

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

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

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

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

2016-02-27 GDG京都 機械学習勉強会 14

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = ?

円 × 5 + 円 × 7 = 660 円

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

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

2016-02-27 GDG京都 機械学習勉強会 15

円 × 1 + 円 × 3 = 190 円

円 × 3 + 円 × 1 = 330 円

円 × 2 + 円 × 4 = ?

円 × 5 + 円 × 7 = 660 円

100 30

100 30

100 30

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

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

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

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

すべての組合せを計算

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種類買ったら?)

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

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

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

ミカン 80 0

50000

100000

150000

200000

250000

0 20 40 60 80100 120

140リンゴ

最小値

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

小さくなる方向へたどっていくと...

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

ミカン 80 0

50000

100000

150000

200000

250000

0 20 40 60 80100 120

140リンゴ

最小値

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

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

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

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

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

ここまでの振り返り

2016-02-27 GDG京都 機械学習勉強会 21

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

学習

予測

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

②誤差を計算する

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

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

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

線形回帰(線形重回帰)の1つ

2016-02-27 GDG京都 機械学習勉強会 22

入力層 出力層

𝑦

𝑥1

𝑥2

×𝑎1

𝑦 = 𝑎1𝑥1 + 𝑎2𝑥2

×𝑎2

リンゴの数

ミカンの数

合計金額

リンゴ の単価

↑ ミカン の単価

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

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. 後片付け

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

0. ライブラリをロード

2016-02-27 GDG京都 機械学習勉強会 24

import numpy as np

import matplotlib.pyplot as plt

import tensorflow as tf

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

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

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

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

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

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

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

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

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

学習実行

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

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

参考: 実行結果

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

順調に低下

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

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

参考: 実行結果

2016-02-27 GDG京都 機械学習勉強会 30

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

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

: :

順調に増加

学習率を小さくしてみる

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

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

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

5. 後片付け

2016-02-27 GDG京都 機械学習勉強会 32

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

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

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. 後片付け

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

(補足) 線形回帰の応用場面

家賃

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

明日の客数

客数 = a * 気温 + b * 昨年同日の客数

などなど

2016-02-27 GDG京都 機械学習勉強会 34

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

つぎの問題です

2016-02-27 GDG京都 機械学習勉強会 35

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

気まぐれおやじ曰く、

リンゴ2個+ミカン3個、リンゴ0個+ミカン16個

なら買えるが、リンゴ3個+ミカン1個、

リンゴ2個+ミカン8個は買えないとのこと。

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

例題2

識別問題

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

機械学習の流れ

2016-02-27 GDG京都 機械学習勉強会 36

学習

予測

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

②誤差を計算する

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

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

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

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

2016-02-27 GDG京都 機械学習勉強会 37

円 ×1+ 円

円 ×2+ 円 × 3)

円 ×0+ 円 ×16)

円 ×3+ 円 × 1)

円 ×2+ 円 × 8 ) 円

×11) 円

-(

-(

-(

-(

-(

買える

買える

買えない

買えない

?

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

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

2016-02-27 GDG京都 機械学習勉強会 38

円 ×1+ 円

円 ×2+ 円 × 3)

円 ×0+ 円 ×16)

円 ×3+ 円 × 1)

円 ×2+ 円 × 8 ) 円

×11) 円

-(

-(

-(

-(

-(

買える

買える

買えない

買えない

?

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

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

シグモイド曲線

2016-02-27 GDG京都 機械学習勉強会 39

予想される残金

0

0.5

買える

買えない

𝜎 𝑢 =1

1 + exp (−𝑢)

ロジット

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

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

2016-02-27 GDG京都 機械学習勉強会 40

円 ×1+ 円

円 ×2+ 円 × 3)) = 1

円 ×0+ 円 ×16)) = 1

円 ×3+ 円 × 1)) = 0

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

×11) ) = 円

-(

-(

-(

-(

-( ?

σ(

σ(

σ(

σ(

σ(

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

ロジスティック回帰

2016-02-27 GDG京都 機械学習勉強会 41

入力層 出力層

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

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

𝑦 𝑥1

𝑥2

×𝑎1

×𝑎2

リンゴの数

ミカンの数

買えるか

リンゴ の単価

↑ ミカン の単価

𝑏 財布の中身

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

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. 後片付け

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

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

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

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

追加

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

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 − 𝑦𝑖 )

𝑁

𝑖

正解

予測値: 𝑦𝑖

正解

予測値: 𝑦𝑖

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

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回 に ※更新回数は,対象問題やデータ,初期値,モデルなどでまちまちです。

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

学習結果

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

順調に低下

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

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

予測結果

2016-02-27 GDG京都 機械学習勉強会 47

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

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

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

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

2016-02-27 GDG京都 機械学習勉強会 48

手書き文字認識

MNISTデータ 0~9の手書き文字画像を7万枚集めたデータセット 1枚の画像は 28 x 28 ピクセル

7 3 4 6

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

入力:

出力:

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

機械学習の流れ

2016-02-27 GDG京都 機械学習勉強会 49

学習

予測

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

②誤差を計算する

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

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

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

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

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

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

2016-02-27 GDG京都 機械学習勉強会 51

入力層 (768ノード)

出力層 (10ノード)

𝑦0

𝑦1

𝑦9

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

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

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

2016-02-27 GDG京都 機械学習勉強会 52

入力層 (768ノード)

出力層 (10ノード)

𝑦0

𝑦1

𝑦9

ソフトマックス(Softmax)

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

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

2016-02-27 GDG京都 機械学習勉強会 53

入力層 (768ノード)

出力層 (10ノード)

𝑦0

𝑦1

𝑦9

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

隠れ層 (□ノード)

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

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

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. 後片付け

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

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

𝑥𝑊1 + 𝑏1

h

𝑠𝑖𝑔𝑚𝑜𝑖𝑑()

隠れ層

u y

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

出力層 入力層

78

4

10

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

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

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)

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

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

速く学習が進む

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

参考: 学習結果

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

ゆらぎながら低下

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

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]

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

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

2016-02-27 GDG京都 機械学習勉強会 60

学習

予測

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

②誤差を計算する

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

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

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

参考書籍

2016-02-27 GDG京都 機械学習勉強会 61

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

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