ディープラーニングゼミ
実践編
株式会社ネクスト リッテルラボラトリー
石田陽太
概要
深層学習(ディープラーニング)の初歩
TensorFlowのコードを書きながら学ぶ
MNISTで手書き数字を判別させる
対象
ディープラーニングがどんなものかなんとなく分
かっている人
Unixベースのコマンドラインがある程度使える人
参考URL・書籍
深層学習 (機械学習プロフェッショナ
ルシリーズ) 第二章
MNIST For ML Beginners
https://www.tensorflow.org/versions/r0.9/tut
orials/mnist/beginners/index.htmlhttps://www.amazon.co.jp/dp/B018K6C99A
進め方
理論の説明とTensorFlowによる実践
を交互に
手を動かすことで、理解を促進させる
目標
ニューラルネットワークの仕組みをよ
り深く理解する
機械学習の基礎知識を身に付ける
MNISTとは?
手書き数字のデータセット
機械学習における「Hello, World」
0~9までのどの数字かを予測する
55,000枚 10,000枚 5,000枚
Train Test Validation
MNIST
Train, Test, Validationの違い
Train: 訓練用データ
Test : 評価用データ
Validation: 訓練時検証データ
データを分ける意義
精度は訓練に使った画像に依存
→ちゃんと評価するには、別データを使うべき
訓練データの世界に特化しすぎて、未知の
データへの認識精度が悪くなる
→過学習
過学習の例
学習係数をValidationデータで制御する
MNISTの構成
値が[0-1]の28×28の配列 28×28=784次元のベクトル
MNISTの構成
画像
ラベル
例:正解が3の場合
[0,0,0,1,0,0,0,0,0,0]
ラベルは、10次元ベクトルで
表す
3は0から数えて4個目
画像と正解データのペア
one-hot ベクトル
TensorFlowでMNIST
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
解説
1行目:MNISTのライブラリをインポート
2行目:mnistという変数に、MNISTを読み込み(one-hotベクトル形式で)
Tensorflowでは
Trainの画像→ mnist.train.images [55000, 784]の配列
Trainのラベル→ mnist.train.labels [55000, 10]の配列
MNISTのソフトマックス回帰
何か
0
0
0
0
0
1
0
0
0
0
5
MNISTのソフトマックス回帰
何か
0
0
0.05
0.1
0
0.75
0
0
0.1
0
0である確率
1である確率
9である確率
5である確率
・
・
・
・
・
・
和が1になる!
MNISTのソフトマックス回帰
何か
0
0
0.05
0.1
0
0.75
0
0
0.1
0
0である確率
1である確率
9である確率
5である確率
・
・
・
・
・
・
0
0
0
0
0
1
0
0
0
0
この形になるよう学習
→ソフトマックス回帰
MNISTのソフトマックス回帰
ニューラルネットワーク
0
0
0.05
0.1
0
0.75
0
0
0.1
0
それぞれの数字
である確率
0.2
0.4
2.5
1.2
0.3
10.5
0.2
0.5
1.3
0
それぞれの数字っぽさ
のスコア
ソフトマックス
関数
MNISTのソフトマックス回帰
ニューラルネットワーク
0
0
0.05
0.1
0
0.75
0
0
0.1
0
y
0.2
0.4
2.5
1.2
0.3
10.5
0.2
0.5
1.3
0
evidence
ソフトマックス
関数
y = Softmax(evidence)
MNISTのソフトマックス回帰
y = softmax(evidence)
softmax(𝑥𝑖) =
exp(𝑥 𝑖)
𝑗 exp(𝑥 𝑗)
exp(x) = 𝑒 𝑥
ソフトマックス関数の定義
例
𝑗
exp(𝑥 𝑗) = 𝑒0.2
+ 𝑒0.4
+ ⋯ + 𝑒0
= 36342
𝒙 =
𝑥0
𝑥1
𝑥2
𝑥3
𝑥4
𝑥5
𝑥6
𝑥7
𝑥8
𝑥9
=
0.2
0.4
2.5
1.2
0.3
10.5
0.2
0.5
1.3
0
Softmax(x) =
1
36342
𝑒0.2
𝑒0.4
𝑒2.5
𝑒1.2
𝑒0.3
𝑒10.5
𝑒0.2
𝑒0.5
𝑒1.3
𝑒0.0
=
0.00003
0.00004
0.00033
0.00009
0.00004
0.99927
0.00003
0.00004
0.00010
0.00003
MNISTのソフトマックス回帰
ニューラルネットワーク
0
0
0.05
0.1
0
0.75
0
0
0.1
0
y
0.2
0.4
2.5
1.2
0.3
10.5
0.2
0.5
1.3
0
evidence
ソフトマックス
関数
y = Softmax(evidence)
MNISTのソフトマックス回帰
0
0
0.05
0.1
0
0.75
0
0
0.1
0
出力y
10次元
0.2
0.4
2.5
1.2
0.3
10.5
0.2
0.5
1.3
0
evidence
10次元
ソフトマックス
関数
入力x
784次元
重みw
784×10次元
バイアスw
10次元
重みwの可視化
青:ポジティブ
赤:ネガティブ
𝒚 = softmax(𝑾𝒙 + 𝒃)
𝒚 = softmax(𝑾𝒙 + 𝒃)
入力x
784次元
出力y
10次元
重みW
784×10次元
バイアスb
10次元
画像 各数字の確率
モデルの実装
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
TensorFlowのインポート
入力xの入れ物を用意。
Float型で、次元が、n枚×784となる。
モデルの実装
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
入力x
784次元
出力y
10次元
重みW
784×10次元
バイアスb
10次元
重みWとバイアスbの変数の定義
初期値を0にする
モデルの実装
y = tf.nn.softmax(tf.matmul(x, W) + b)
出力y
10次元
重みW
784×10次元
バイアスb
10次元
𝒚 = softmax(𝑾𝒙 + 𝒃)出力までのモデルを定義する
モデルの実装
出力y
10次元
重みW
784×10次元
バイアスb
10次元
𝒚 = softmax(𝑾𝒙 + 𝒃)
出力までのモデルを定義する
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
コスト関数
モデル
0
0
0.05
0.1
0
0.75
0
0
0.1
0
0
0
0
0
0
1
0
0
0
0
推定結果 正解
どの程度正確か?
どれほど良い
モデルなのか?
コスト関数
コスト関数
0
0
0.05
0.1
0
0.75
0
0
0.1
0
0
0
0
0
0
1
0
0
0
0
推定結果y 正解y’ コスト関数
𝐻′ 𝑦 = −
𝑖
𝑦𝑖
′
log(𝑦𝑖)
交差エントロピー
どれくらい予測が非効率かの指標
交差エントロピーを最小化させる
→モデルの精度があがる
コスト関数 交差エントロピー実装
y_ = tf.placeholder(tf.float32, [None,10])
正解ラベルの入れ物を用意 n枚×10次元
交差エントロピーの定義
※複数枚の合計の値になる
𝐻′
𝑦 = −
𝑖
𝑦𝑖
′
log(𝑦𝑖)
交差エントロピー
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
学習について
交差エントロピー
予測誤差が分かった
→モデルに反映させる
誤差逆伝搬法
誤差逆伝搬法
交差エントロピーによる
コスト関数
誤差を元に、最適なW, bに近づける
どうやって最適化する?
x
どうやって最適化する?
x
どうやって最適化する?
x
どうやって最適化する?
x
どうやって最適化する?
x
どうやって最適化する?
x
どうやって最適化する?
x
http://www.slideshare.net/hirsoshnakagawa3/opt-algorithm1
勾配降下法による誤差逆伝搬法の実装
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
Gradient Descent = 勾配降下法
勾配降下法で交差エントロピーを減少させる訓練ステップを実装
残りのおまじない
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
変数を初期化するメソッドを定義
セッションを定義
変数を初期化
学習を回す
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
1000回繰り返し
MNISTから次の100枚分のデータを取得
入力画像と正解ラベルより学習させる
評価と結果の表示
正解の定義をする。 argmax(y,1)は、yの中で最もスコアが高いものを返す
精度の定義をする。 正答の割合を算出
精度を計算して表示。評価には、テストデータを使う
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
ここまでチュートリアル
 実行させると、MNISTをダウンロード、学習、最
終的な精度を計算してくれるはず
学習過程を表示したい
→TensorBoardのチュートリアルへ
もっと高度で高精度な手法を試したい
→エキスパート向けチュートリアルへ

ディープラーニングゼミ TensorFlowで学ぶ理論と実践