SlideShare a Scribd company logo
「TensorFlow Tutorialの数学的背景」クイックツアー
Ver1.1 中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
「TensorFlow Tutorialの数学的背景」
クイックツアー(パート1)
Open Cloud Campus
2
「TensorFlow Tutorialの数学的背景」クイックツアー
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
 昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
好評発売中!
「TensorFlow Tutorialの数学的背景」クイックツアー
「TensorFlow Tutorialの数学的背景」とは?
Open Cloud Campus
4
「TensorFlow Tutorialの数学的背景」クイックツアー
「TensorFlow Tutorialの数学的背景」シリーズ
http://enakai00.hatenablog.com/entry/2016/02/29/121321
Open Cloud Campus
5
「TensorFlow Tutorialの数学的背景」クイックツアー
このシリーズを書いた背景
 TensorFlow Tutorials
– 典型的なニューラルネットワーク(NN)のTensorFlowによるサンプル実装を解説したド
キュメント集
• https://www.tensorflow.org/versions/master/tutorials/index.html
– 例題の並び順が秀逸で、例題の中身を順番に勉強することで、CNNが段階的に理解できる
ようになっている
– ただし、コードの解説が中心で、理論的解説はやや軽め
 参考:CNN(Convolutional Neural Network)
– 右図のような構造を持つ、画像認識に特化したニューラルネット
ワーク
– 画像の判別問題で高い性能を発揮することが知られている
– Google Vision APIの基礎となる技術!
Tutorialの流れに沿って、NNの理論解説をしていけば、
ちょっとイケてるCNNの学習コースができるはず!
Open Cloud Campus
6
「TensorFlow Tutorialの数学的背景」クイックツアー
TensorFlowを使ってNNを学習するメリット
 前提となる数学知識の敷居が(ほんのちょっとだけ)下がります!
– 例:Back-propagationによるパラメータ最適化計算
• 機械学習では、「ある関数を最小にするパラメータ値を求める」という処理を定番で行います。
この処理を実現するアルゴリズムを導出するには、わりと高度な数学知識が必要となります。
• TensorFlowでは、このような最適化アルゴリズムはライブラリに組み込まれているので、「何を
最適化しているか」だけ理解しておけば、「どのように最適化するのか」は厳密に理解しなくて
も大丈夫です。
Open Cloud Campus
7
「TensorFlow Tutorialの数学的背景」クイックツアー
全体構成
 CNNを構成する個々のパーツの役割を段階的に学んでいきます。
No.1 〜 No.2: Softmax関数による多項分類器の仕組みを解説
No.3 〜 No.4 : 1層だけの最も単純なNNを解説
No.5: NNを多段にする目的(メリット)を解説
No.6〜7: 「畳込みフィルター」の仕組みと役割を解説
No.8: 「畳込みフィルター」を多段化して識別精度を向上
「TensorFlow Tutorialの数学的背景」クイックツアー
No.1〜No.2のダイジェスト
Open Cloud Campus
9
「TensorFlow Tutorialの数学的背景」クイックツアー
No.1:MNIST For ML Beginners(その1)
 ロジスティック回帰とは?
– 図のように直線的な境界でデータを分類する手法
(データが3次元の場合は「平面」による境界、4
次元以上の場合は「超平面」による分類)。
– 最適に分類する直線の方向をトレーニングデータ
から学習します。
– 右図の例では、青色のデータでトレーニングした
結果、赤色の直線が得られています。赤色のテス
トデータに対して、(あくまで偶然ですが)100%
の正解率を達成しています。
 ロジスティック回帰による「二項分類器」を解説しています。
 二項分類器とは?
– 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補から判別するの
はややこしいので、まずは、「A」か「B」かという2種類の判別を行う仕組み
– 例として、図のような平面上のデータに対して、○か✕かを判定するサンプルを実装
Open Cloud Campus
10
「TensorFlow Tutorialの数学的背景」クイックツアー
No.1:MNIST For ML Beginners(その1)
 ロジスティック回帰の中身
– 分割線を一次関数で定義します。
•    :分割線上の点
•        :分割線の両側の点
– ロジスティック関数で、 f の値を「○と判断する確率」
に変換します。
– 「トレーニングデータ全体に対して正解を与える確率」
を最大化するようにパラメータ      を最適化し
ます(最尤推定法)。
Open Cloud Campus
11
「TensorFlow Tutorialの数学的背景」クイックツアー
No.1:MNIST For ML Beginners(その1)
 数学的に計算するとこんな感じ
– n 番目のトレーニングデータを        とします。(○の時は    、✕の時は    )
–     の時、正解する確率は、
–     の時、正解する確率は、
– これらを1つにまとめると次のように書けます。
– したがって、すべてのトレーニングデータに正解する確率は、次式の通り。
– この値ができるだけ大きくなるように、パラメーター      を最適化すればOK!
※最適化のアルゴリズムは、TensorFlowが知っています。
Open Cloud Campus
12
「TensorFlow Tutorialの数学的背景」クイックツアー
No.2:MNIST For ML Beginners(その2)
 線形多項分類器の中身
– 例として、平面上のデータを3種類に分割する場合を考え
ます。この場合は、3種類の一次関数を用意します。
– この中で最も値が大きい物に分類すると、右図のように
直線で、3つの領域に平面が分割されます。
 ここでは、ソフトマックス関数による「線形多項分類器」を解説しています。
 線形多項分類器とは?
– 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補からの判別を行
う仕組みです。
– 特に、直線/平面/超平面の境界線でデータを分類します。
Open Cloud Campus
13
「TensorFlow Tutorialの数学的背景」クイックツアー
No.2:MNIST For ML Beginners(その2)
 ハードな分類からソフトな分類(確率)への変換
–     の値によって、「各種別に分類する確率」を与えるようにしたい
– 次のソフトマックス関数でOK
 ※                    が成立しています。
 トレーニングデータに対するパラメータの最適化
– 個々のトレーニングデータついて上記の確率で種別を判定していった結果、「すべてに正解する確
率」を最大化するようにパラメータを最適化します。
※ 内容的には同じことですが、「上記の確率でデータを生成した結果、トレーニングセットと同じ
 データが得られる確率」を最大化する、という事もできます。
Open Cloud Campus
14
「TensorFlow Tutorialの数学的背景」クイックツアー
手書き数字分類器の実装
 ここまで理解できると、有名(?)な「MNIST手書き数字」の分類器をTensorFlowで実装す
ることができるようになります!
 「MNIST手書き数字」とは?
– 図のような28x28ピクセル(合計784ピクセル)の手書き数字のデータセット
– 各ピクセルは、色の濃度を示す数値が振られている
 先ほどの話と何の関係があるの?
– 各画像のデータは、濃度の数値を横一列に並べると「784
次元ベクトル」、つまり「784次元空間上の1つの点」と
見なせる
– したがって、784次元空間を「0」〜「9」の10種類の領
域に分割すればよい
※ 同じ数字の画像は、784次元空間上で近い場所に集まる
 という暗黙の想定をおいています。
Open Cloud Campus
15
「TensorFlow Tutorialの数学的背景」クイックツアー
手書き数字分類器の実装
 具体的な計算は次の通りです。
– 「0」〜「9」に分類するために10個の一次関数       を定義します。
– それぞれに分類される確率をソフトマックス関数で計算します。
– この時、n 番目のトレーニングデータの「正解ラベル」を次のようなベクトルで表現すると・・・
– この確率を用いてトレーニングデータを予測した際に、n 番目のデータに正解を与える確率は次式に
なります。
正解を「r」として、r+1 番目の値のみが1
Open Cloud Campus
16
「TensorFlow Tutorialの数学的背景」クイックツアー
手書き数字分類器の実装
– したがって、すべてのトレーニングセットに正解する確率は次式の通り。
– これを最大にするようにパラメータ(最初の一次関数の係数 w, b)を最適化すればOK!
※未知の手書き数字を判別する際は、ソフトマックス関数による確率が最大のものと判定します。
– 実際にTensorFlowに最適化させる際は、(内部的な)計算を簡単にするために、「Pの対数の符号違
い」(ロス関数)を与えて、これを最小にするパラメータを探していきます。
Open Cloud Campus
17
「TensorFlow Tutorialの数学的背景」クイックツアー
サンプルコードの解説
 Tutorialのサンプルコードを見ると、前述の計算式が、ほぼそのままコード化されているこ
とがわかります。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py
# Create the model
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)
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# Train
tf.initialize_all_variables().run()
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run({x: batch_xs, y_: batch_ys})
# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))
トレーニングデータ          を入れる箱
トレーニングデータ             を入れる箱
「勾配降下法」を用いて
パラメータを最適化
Open Cloud Campus
18
「TensorFlow Tutorialの数学的背景」クイックツアー
サンプルコードの解説
 実行結果・・・。
 正答率をさらに上げるには何が必要・・・?
# time python mnist_softmax.py
Extracting /tmp/data/train-images-idx3-ubyte.gz
Extracting /tmp/data/train-labels-idx1-ubyte.gz
Extracting /tmp/data/t10k-images-idx3-ubyte.gz
Extracting /tmp/data/t10k-labels-idx1-ubyte.gz
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 16
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 16
0.9135
real 0m5.911s
user 0m7.010s
sys 0m4.650s
テストセットに対して91%の正答率
Open Cloud Campus
19
「TensorFlow Tutorialの数学的背景」クイックツアー
続きはまた次回!
「TensorFlow Tutorialの数学的背景」クイックツアー
「TensorFlow Tutorialの数
学的背景」クイックツアー
20
おまけ: Jupyterの紹介
Open Cloud Campus
21
「TensorFlow Tutorialの数学的背景」クイックツアー
Jupyterとは
 Python(IPython)による対話的なデータ分析処理をWebブラウザ上の「ノートブック」で
実施するツール
– Markdownで記述した文章とコード、実行結果が記録されていきます。
– ノートブック上のコードは、自由に修正して再実行可能
⇒ データ分析コードとその説明をノートブックにまとめておけば、「実行できる教科書」が実現!
Open Cloud Campus
22
「TensorFlow Tutorialの数学的背景」クイックツアー
JupyterからTensorFlowを利用する方法
 TensorFlowとJupyterを導入したサーバーを用意する
– 環境セットアップ済みのDockerイメージを公開しています。
• JupyterでTensorFlowが使えるDockerイメージ
• http://enakai00.hatenablog.com/entry/2016/03/28/131157
 Google Cloud Datalabを利用する
– GCEのVMインスタンスで環境を自動セットアップ
– TensorFlowに加えて、BigQueryなども実行可能
「TensorFlow Tutorialの数学的背景」クイックツアー
中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
TensorFlowで楽しく
機械学習を学びましょう!

More Related Content

「TensorFlow Tutorialの数学的背景」 クイックツアー(パート1)

  • 1. 「TensorFlow Tutorialの数学的背景」クイックツアー Ver1.1 中井悦司 Twitter @enakai00 オープンクラウド・キャンパス 「TensorFlow Tutorialの数学的背景」 クイックツアー(パート1)
  • 2. Open Cloud Campus 2 「TensorFlow Tutorialの数学的背景」クイックツアー 自己紹介  中井悦司(なかいえつじ) – Twitter @enakai00  日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。  昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 好評発売中!
  • 4. Open Cloud Campus 4 「TensorFlow Tutorialの数学的背景」クイックツアー 「TensorFlow Tutorialの数学的背景」シリーズ http://enakai00.hatenablog.com/entry/2016/02/29/121321
  • 5. Open Cloud Campus 5 「TensorFlow Tutorialの数学的背景」クイックツアー このシリーズを書いた背景  TensorFlow Tutorials – 典型的なニューラルネットワーク(NN)のTensorFlowによるサンプル実装を解説したド キュメント集 • https://www.tensorflow.org/versions/master/tutorials/index.html – 例題の並び順が秀逸で、例題の中身を順番に勉強することで、CNNが段階的に理解できる ようになっている – ただし、コードの解説が中心で、理論的解説はやや軽め  参考:CNN(Convolutional Neural Network) – 右図のような構造を持つ、画像認識に特化したニューラルネット ワーク – 画像の判別問題で高い性能を発揮することが知られている – Google Vision APIの基礎となる技術! Tutorialの流れに沿って、NNの理論解説をしていけば、 ちょっとイケてるCNNの学習コースができるはず!
  • 6. Open Cloud Campus 6 「TensorFlow Tutorialの数学的背景」クイックツアー TensorFlowを使ってNNを学習するメリット  前提となる数学知識の敷居が(ほんのちょっとだけ)下がります! – 例:Back-propagationによるパラメータ最適化計算 • 機械学習では、「ある関数を最小にするパラメータ値を求める」という処理を定番で行います。 この処理を実現するアルゴリズムを導出するには、わりと高度な数学知識が必要となります。 • TensorFlowでは、このような最適化アルゴリズムはライブラリに組み込まれているので、「何を 最適化しているか」だけ理解しておけば、「どのように最適化するのか」は厳密に理解しなくて も大丈夫です。
  • 7. Open Cloud Campus 7 「TensorFlow Tutorialの数学的背景」クイックツアー 全体構成  CNNを構成する個々のパーツの役割を段階的に学んでいきます。 No.1 〜 No.2: Softmax関数による多項分類器の仕組みを解説 No.3 〜 No.4 : 1層だけの最も単純なNNを解説 No.5: NNを多段にする目的(メリット)を解説 No.6〜7: 「畳込みフィルター」の仕組みと役割を解説 No.8: 「畳込みフィルター」を多段化して識別精度を向上
  • 9. Open Cloud Campus 9 「TensorFlow Tutorialの数学的背景」クイックツアー No.1:MNIST For ML Beginners(その1)  ロジスティック回帰とは? – 図のように直線的な境界でデータを分類する手法 (データが3次元の場合は「平面」による境界、4 次元以上の場合は「超平面」による分類)。 – 最適に分類する直線の方向をトレーニングデータ から学習します。 – 右図の例では、青色のデータでトレーニングした 結果、赤色の直線が得られています。赤色のテス トデータに対して、(あくまで偶然ですが)100% の正解率を達成しています。  ロジスティック回帰による「二項分類器」を解説しています。  二項分類器とは? – 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補から判別するの はややこしいので、まずは、「A」か「B」かという2種類の判別を行う仕組み – 例として、図のような平面上のデータに対して、○か✕かを判定するサンプルを実装
  • 10. Open Cloud Campus 10 「TensorFlow Tutorialの数学的背景」クイックツアー No.1:MNIST For ML Beginners(その1)  ロジスティック回帰の中身 – 分割線を一次関数で定義します。 •    :分割線上の点 •        :分割線の両側の点 – ロジスティック関数で、 f の値を「○と判断する確率」 に変換します。 – 「トレーニングデータ全体に対して正解を与える確率」 を最大化するようにパラメータ      を最適化し ます(最尤推定法)。
  • 11. Open Cloud Campus 11 「TensorFlow Tutorialの数学的背景」クイックツアー No.1:MNIST For ML Beginners(その1)  数学的に計算するとこんな感じ – n 番目のトレーニングデータを        とします。(○の時は    、✕の時は    ) –     の時、正解する確率は、 –     の時、正解する確率は、 – これらを1つにまとめると次のように書けます。 – したがって、すべてのトレーニングデータに正解する確率は、次式の通り。 – この値ができるだけ大きくなるように、パラメーター      を最適化すればOK! ※最適化のアルゴリズムは、TensorFlowが知っています。
  • 12. Open Cloud Campus 12 「TensorFlow Tutorialの数学的背景」クイックツアー No.2:MNIST For ML Beginners(その2)  線形多項分類器の中身 – 例として、平面上のデータを3種類に分割する場合を考え ます。この場合は、3種類の一次関数を用意します。 – この中で最も値が大きい物に分類すると、右図のように 直線で、3つの領域に平面が分割されます。  ここでは、ソフトマックス関数による「線形多項分類器」を解説しています。  線形多項分類器とは? – 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補からの判別を行 う仕組みです。 – 特に、直線/平面/超平面の境界線でデータを分類します。
  • 13. Open Cloud Campus 13 「TensorFlow Tutorialの数学的背景」クイックツアー No.2:MNIST For ML Beginners(その2)  ハードな分類からソフトな分類(確率)への変換 –     の値によって、「各種別に分類する確率」を与えるようにしたい – 次のソフトマックス関数でOK  ※                    が成立しています。  トレーニングデータに対するパラメータの最適化 – 個々のトレーニングデータついて上記の確率で種別を判定していった結果、「すべてに正解する確 率」を最大化するようにパラメータを最適化します。 ※ 内容的には同じことですが、「上記の確率でデータを生成した結果、トレーニングセットと同じ  データが得られる確率」を最大化する、という事もできます。
  • 14. Open Cloud Campus 14 「TensorFlow Tutorialの数学的背景」クイックツアー 手書き数字分類器の実装  ここまで理解できると、有名(?)な「MNIST手書き数字」の分類器をTensorFlowで実装す ることができるようになります!  「MNIST手書き数字」とは? – 図のような28x28ピクセル(合計784ピクセル)の手書き数字のデータセット – 各ピクセルは、色の濃度を示す数値が振られている  先ほどの話と何の関係があるの? – 各画像のデータは、濃度の数値を横一列に並べると「784 次元ベクトル」、つまり「784次元空間上の1つの点」と 見なせる – したがって、784次元空間を「0」〜「9」の10種類の領 域に分割すればよい ※ 同じ数字の画像は、784次元空間上で近い場所に集まる  という暗黙の想定をおいています。
  • 15. Open Cloud Campus 15 「TensorFlow Tutorialの数学的背景」クイックツアー 手書き数字分類器の実装  具体的な計算は次の通りです。 – 「0」〜「9」に分類するために10個の一次関数       を定義します。 – それぞれに分類される確率をソフトマックス関数で計算します。 – この時、n 番目のトレーニングデータの「正解ラベル」を次のようなベクトルで表現すると・・・ – この確率を用いてトレーニングデータを予測した際に、n 番目のデータに正解を与える確率は次式に なります。 正解を「r」として、r+1 番目の値のみが1
  • 16. Open Cloud Campus 16 「TensorFlow Tutorialの数学的背景」クイックツアー 手書き数字分類器の実装 – したがって、すべてのトレーニングセットに正解する確率は次式の通り。 – これを最大にするようにパラメータ(最初の一次関数の係数 w, b)を最適化すればOK! ※未知の手書き数字を判別する際は、ソフトマックス関数による確率が最大のものと判定します。 – 実際にTensorFlowに最適化させる際は、(内部的な)計算を簡単にするために、「Pの対数の符号違 い」(ロス関数)を与えて、これを最小にするパラメータを探していきます。
  • 17. Open Cloud Campus 17 「TensorFlow Tutorialの数学的背景」クイックツアー サンプルコードの解説  Tutorialのサンプルコードを見ると、前述の計算式が、ほぼそのままコード化されているこ とがわかります。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py # Create the model 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) # Define loss and optimizer y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # Train tf.initialize_all_variables().run() for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) train_step.run({x: batch_xs, y_: batch_ys}) # Test trained model correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels})) トレーニングデータ          を入れる箱 トレーニングデータ             を入れる箱 「勾配降下法」を用いて パラメータを最適化
  • 18. Open Cloud Campus 18 「TensorFlow Tutorialの数学的背景」クイックツアー サンプルコードの解説  実行結果・・・。  正答率をさらに上げるには何が必要・・・? # time python mnist_softmax.py Extracting /tmp/data/train-images-idx3-ubyte.gz Extracting /tmp/data/train-labels-idx1-ubyte.gz Extracting /tmp/data/t10k-images-idx3-ubyte.gz Extracting /tmp/data/t10k-labels-idx1-ubyte.gz I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 16 I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 16 0.9135 real 0m5.911s user 0m7.010s sys 0m4.650s テストセットに対して91%の正答率
  • 19. Open Cloud Campus 19 「TensorFlow Tutorialの数学的背景」クイックツアー 続きはまた次回!
  • 21. Open Cloud Campus 21 「TensorFlow Tutorialの数学的背景」クイックツアー Jupyterとは  Python(IPython)による対話的なデータ分析処理をWebブラウザ上の「ノートブック」で 実施するツール – Markdownで記述した文章とコード、実行結果が記録されていきます。 – ノートブック上のコードは、自由に修正して再実行可能 ⇒ データ分析コードとその説明をノートブックにまとめておけば、「実行できる教科書」が実現!
  • 22. Open Cloud Campus 22 「TensorFlow Tutorialの数学的背景」クイックツアー JupyterからTensorFlowを利用する方法  TensorFlowとJupyterを導入したサーバーを用意する – 環境セットアップ済みのDockerイメージを公開しています。 • JupyterでTensorFlowが使えるDockerイメージ • http://enakai00.hatenablog.com/entry/2016/03/28/131157  Google Cloud Datalabを利用する – GCEのVMインスタンスで環境を自動セットアップ – TensorFlowに加えて、BigQueryなども実行可能