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

23
「TensorFlow Tutorialの数学的背景」クイックツアー Ver1.1 中井悦司 Twitter @enakai00 オープンクラウド・キャンパス 「TensorFlow Tutorialの数学的背景」 クイックツアー(パート1)

Upload: etsuji-nakai

Post on 08-Jan-2017

7.702 views

Category:

Technology


0 download

TRANSCRIPT

「TensorFlow Tutorialの数学的背景」クイックツアー

Ver1.1 中井悦司Twitter @enakai00

オープンクラウド・キャンパス

「TensorFlow Tutorialの数学的背景」

クイックツアー(パート1)

Open Cloud Campus2

「TensorFlow Tutorialの数学的背景」クイックツアー

自己紹介

中井悦司(なかいえつじ)– Twitter @enakai00

日々の仕事– Senior Solution Architect and

Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。

昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)

好評発売中!

「TensorFlow Tutorialの数学的背景」クイックツアー

「TensorFlow Tutorialの数学的背景」とは?

Open Cloud Campus4

「TensorFlow Tutorialの数学的背景」クイックツアー

「TensorFlow Tutorialの数学的背景」シリーズ

http://enakai00.hatenablog.com/entry/2016/02/29/121321

Open Cloud Campus5

「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 Campus6

「TensorFlow Tutorialの数学的背景」クイックツアー

TensorFlowを使ってNNを学習するメリット

前提となる数学知識の敷居が(ほんのちょっとだけ)下がります!– 例:Back-propagationによるパラメータ最適化計算

• 機械学習では、「ある関数を最小にするパラメータ値を求める」という処理を定番で行います。この処理を実現するアルゴリズムを導出するには、わりと高度な数学知識が必要となります。

• TensorFlowでは、このような最適化アルゴリズムはライブラリに組み込まれているので、「何を最適化しているか」だけ理解しておけば、「どのように最適化するのか」は厳密に理解しなくても大丈夫です。

Open Cloud Campus7

「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 Campus9

「TensorFlow Tutorialの数学的背景」クイックツアー

No.1:MNIST For ML Beginners(その1)

ロジスティック回帰とは?– 図のように直線的な境界でデータを分類する手法

(データが3次元の場合は「平面」による境界、4次元以上の場合は「超平面」による分類)。

– 最適に分類する直線の方向をトレーニングデータから学習します。

– 右図の例では、青色のデータでトレーニングした結果、赤色の直線が得られています。赤色のテストデータに対して、(あくまで偶然ですが)100%の正解率を達成しています。

ロジスティック回帰による「二項分類器」を解説しています。

二項分類器とは?– 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補から判別するの

はややこしいので、まずは、「A」か「B」かという2種類の判別を行う仕組み– 例として、図のような平面上のデータに対して、○か✕かを判定するサンプルを実装

Open Cloud Campus10

「TensorFlow Tutorialの数学的背景」クイックツアー

No.1:MNIST For ML Beginners(その1)

ロジスティック回帰の中身– 分割線を一次関数で定義します。

•    :分割線上の点

•        :分割線の両側の点

– ロジスティック関数で、 f の値を「○と判断する確率」に変換します。

– 「トレーニングデータ全体に対して正解を与える確率」を最大化するようにパラメータ      を最適化します(最尤推定法)。

Open Cloud Campus11

「TensorFlow Tutorialの数学的背景」クイックツアー

No.1:MNIST For ML Beginners(その1)

数学的に計算するとこんな感じ– n 番目のトレーニングデータを        とします。(○の時は    、✕の時は    )

–     の時、正解する確率は、–     の時、正解する確率は、

– これらを1つにまとめると次のように書けます。

– したがって、すべてのトレーニングデータに正解する確率は、次式の通り。

– この値ができるだけ大きくなるように、パラメーター      を最適化すればOK!※最適化のアルゴリズムは、TensorFlowが知っています。

Open Cloud Campus12

「TensorFlow Tutorialの数学的背景」クイックツアー

No.2:MNIST For ML Beginners(その2)

線形多項分類器の中身– 例として、平面上のデータを3種類に分割する場合を考え

ます。この場合は、3種類の一次関数を用意します。

– この中で最も値が大きい物に分類すると、右図のように直線で、3つの領域に平面が分割されます。

ここでは、ソフトマックス関数による「線形多項分類器」を解説しています。

線形多項分類器とは?– 「犬」か「猫」か「車」か「うまい棒」か「ガリガリ君」か・・・という多数の候補からの判別を行

う仕組みです。– 特に、直線/平面/超平面の境界線でデータを分類します。

Open Cloud Campus13

「TensorFlow Tutorialの数学的背景」クイックツアー

No.2:MNIST For ML Beginners(その2)

ハードな分類からソフトな分類(確率)への変換–     の値によって、「各種別に分類する確率」を与えるようにしたい– 次のソフトマックス関数でOK

 ※                    が成立しています。

トレーニングデータに対するパラメータの最適化– 個々のトレーニングデータついて上記の確率で種別を判定していった結果、「すべてに正解する確率」を最大化するようにパラメータを最適化します。※ 内容的には同じことですが、「上記の確率でデータを生成した結果、トレーニングセットと同じ データが得られる確率」を最大化する、という事もできます。

Open Cloud Campus14

「TensorFlow Tutorialの数学的背景」クイックツアー

手書き数字分類器の実装

ここまで理解できると、有名(?)な「MNIST手書き数字」の分類器をTensorFlowで実装することができるようになります!

「MNIST手書き数字」とは?– 図のような28x28ピクセル(合計784ピクセル)の手書き数字のデータセット– 各ピクセルは、色の濃度を示す数値が振られている

先ほどの話と何の関係があるの?– 各画像のデータは、濃度の数値を横一列に並べると「784次元ベクトル」、つまり「784次元空間上の1つの点」と見なせる

– したがって、784次元空間を「0」〜「9」の10種類の領域に分割すればよい※ 同じ数字の画像は、784次元空間上で近い場所に集まる という暗黙の想定をおいています。

Open Cloud Campus15

「TensorFlow Tutorialの数学的背景」クイックツアー

手書き数字分類器の実装

具体的な計算は次の通りです。– 「0」〜「9」に分類するために10個の一次関数       を定義します。

– それぞれに分類される確率をソフトマックス関数で計算します。

– この時、n 番目のトレーニングデータの「正解ラベル」を次のようなベクトルで表現すると・・・

– この確率を用いてトレーニングデータを予測した際に、n 番目のデータに正解を与える確率は次式になります。

正解を「r」として、r+1 番目の値のみが1

Open Cloud Campus16

「TensorFlow Tutorialの数学的背景」クイックツアー

手書き数字分類器の実装

– したがって、すべてのトレーニングセットに正解する確率は次式の通り。

– これを最大にするようにパラメータ(最初の一次関数の係数 w, b)を最適化すればOK!※未知の手書き数字を判別する際は、ソフトマックス関数による確率が最大のものと判定します。

– 実際にTensorFlowに最適化させる際は、(内部的な)計算を簡単にするために、「Pの対数の符号違い」(ロス関数)を与えて、これを最小にするパラメータを探していきます。

Open Cloud Campus17

「TensorFlow Tutorialの数学的背景」クイックツアー

サンプルコードの解説

Tutorialのサンプルコードを見ると、前述の計算式が、ほぼそのままコード化されていることがわかります。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py

# Create the modelx = 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 optimizery_ = 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)

# Traintf.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 modelcorrect_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 Campus18

「TensorFlow Tutorialの数学的背景」クイックツアー

サンプルコードの解説

実行結果・・・。

正答率をさらに上げるには何が必要・・・?

# time python mnist_softmax.pyExtracting /tmp/data/train-images-idx3-ubyte.gzExtracting /tmp/data/train-labels-idx1-ubyte.gzExtracting /tmp/data/t10k-images-idx3-ubyte.gzExtracting /tmp/data/t10k-labels-idx1-ubyte.gzI tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 16I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 160.9135

real 0m5.911suser 0m7.010ssys 0m4.650s

テストセットに対して91%の正答率

Open Cloud Campus19

「TensorFlow Tutorialの数学的背景」クイックツアー

続きはまた次回!

「TensorFlow Tutorialの数学的背景」クイックツアー

「TensorFlow Tutorialの数学的背景」クイックツアー

20

おまけ: Jupyterの紹介

Open Cloud Campus21

「TensorFlow Tutorialの数学的背景」クイックツアー

Jupyterとは

Python(IPython)による対話的なデータ分析処理をWebブラウザ上の「ノートブック」で実施するツール

– Markdownで記述した文章とコード、実行結果が記録されていきます。– ノートブック上のコードは、自由に修正して再実行可能⇒ データ分析コードとその説明をノートブックにまとめておけば、「実行できる教科書」が実現!

Open Cloud Campus22

「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で楽しく機械学習を学びましょう!