neural network + tensorflow 入門講座

187

Upload: maruyama097

Post on 08-Jan-2017

11.857 views

Category:

Internet


6 download

TRANSCRIPT

Page 1: Neural Network + Tensorflow 入門講座
Page 2: Neural Network + Tensorflow 入門講座

Agenda 脳とニューロン

脳研究の取り組み ニューロンの働き

ニューラル・ネットワークとその表現(1) 一つのニューロンの動きを考える 一つのニューロンの内部の状態の表現 複数のニューロンからなる一つの層の内部の状態の表現 式は便利だ! Y = W ・ X + b が表すもの

ニューラル・ネットワークとその表現( 2 ) ニューロンを動かす -- 活性化関数 (Activator) クラス分けの Activator -- SoftMax

Page 3: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークのパラメーターの最適化 ニューラル・ネットワークで数値予測(線形回帰) 損失関数 Loss Function 勾配降下法 Gradient Descent クラス分けの場合の損失関数 クロス・エントロピー

TensorFlow :ニューラル・ネットワークをグラフで表現する 複数のニューロンからなる一つの層をグラフで表す 複数の層からなるニューラル・ネットワークをグラフで表す グラフを流れる量 -- テンソル

TensorFlow プログラミング TensorFlow でグラフを定義する TensorFlow の変数定義 訓練: パラメーターを最適化をする TensorFlow プログラムサンプル

Page 4: Neural Network + Tensorflow 入門講座

はじめに 本講演は、ニューラル・ネットワークと TensorFlow

を初めて学ぶ人のための入門講座である。最小限の前提知識で、ニューラル・ネットワークの基本が理解できるように努めた。

ニューラル・ネットワークはコンピューター上で実装されて初めて意味を持つのだが、本講演は、 TensorFlow での実装を、意識したものになっている。

今回は取り上げられなかった、 Convolutional Neural Network や、 Recurrent Neural Networkについては、今後の、「 CNN と TensorFlow 」「 RNN/LSTM と TensorFlow 」といった講演で補いたいと考えている。

Page 5: Neural Network + Tensorflow 入門講座

この講演が扱う範囲

Page 6: Neural Network + Tensorflow 入門講座

脳とニューロン

脳研究の取り組み ニューロンの働き

Page 7: Neural Network + Tensorflow 入門講座

脳研究の取り組み

  現在は、それぞれ異なった道を歩いているのだが、ニューラル・ネットワークの研究と脳研究とは、「人間の知能」の解明という共通の目標で結ばれている。ここでは、脳研究のいくつかの取り組みを紹介する。

Page 8: Neural Network + Tensorflow 入門講座

Blue Brain ProjectHenry Markram “I wanted to model the brain because

we didn’t understand it.” “The best way to figure out how

something works is to try to build it from scratch.”

in vivo

in vitro

in silico

Page 9: Neural Network + Tensorflow 入門講座

http://seedmagazine.com/content/article/out_of_the_blue/P1/

Page 10: Neural Network + Tensorflow 入門講座

ネズミの脳

Page 11: Neural Network + Tensorflow 入門講座

http://seedmagazine.com/content/article/out_of_the_blue/P1/

Page 12: Neural Network + Tensorflow 入門講座

EU Human Brain Project

2013 年 10 月  10 年間で総額約 12 億ユーロ

Page 13: Neural Network + Tensorflow 入門講座

EU Human Brain Projectビジョン 人間の脳を理解することは、 21 世紀の科

学が直面している最も偉大な挑戦の一つである。もしも、我々が、それに対して立ちあがることが出来るならば、我々は、我々を人間にしているものが何であるかについて深い洞察を得て、革命的なコンピュータ技術を構築し、脳の異常に対して新しい治療法を開発出来るだろう。今日、初めて、現代の ICT 技術が、こうした目標を到達可能なものにしている。

Page 14: Neural Network + Tensorflow 入門講座

EU Human Brain Project批判 EC への公開質問状

Page 15: Neural Network + Tensorflow 入門講座

脳研究をめぐる「対立」の構図認知科学 vs 脳科学、トップダウン vs ボトムアップ

発端は、次年度のプロジェクトの予算配分で、認知科学的なアプローチの予算が、ばっさりと切られたことにあるらしい。それに反発した研究者のグループが、 150 名の連名で、欧州委員会に公開質問状を提出した。

対立の根底にあるのは、脳研究でのアプローチの違い。 Henry Markram ら主流派は、ニューロンとシナプスの数学的モデルに基づいて脳全体のモデルをボトムアップに作り上げようというアプローチ。 一方、反対派は、脳研究には、認知科学の知見に基づいたトップダウンのリバース・エンジニア的なアプローチが必要だという。

「鳥の羽の全てをシミュレーションしたとしても、鳥が空を飛べることを解明出来ないのと同じことだ」

Page 16: Neural Network + Tensorflow 入門講座

NIH Human Connectome Project

http://www.nih.gov/news/health/sep2010/nimh-15.htm2010 年 10 月  40 億円の賞金

Page 17: Neural Network + Tensorflow 入門講座

NIH Human Connectome Project

http://www.humanconnectomeproject.org/

Page 18: Neural Network + Tensorflow 入門講座
Page 19: Neural Network + Tensorflow 入門講座

US BRAIN Initiative   NIH のもとで、 12 年間で 4,500 億円投資する

2014/06/05 http://1.usa.gov/1pIIhvx

Page 20: Neural Network + Tensorflow 入門講座

ニューロンの働き

脳の働きも、最終的には、脳を構成する無数のニューロンの働きに帰着する。コンピューター上のニューラル・ネットワークを構成する個々の「ニューロン」の動作原理は、生体のニューロンの働きをシミレートしたものである。

Page 21: Neural Network + Tensorflow 入門講座

脳のニューロンのコンピュータ・グラフィックス

Page 22: Neural Network + Tensorflow 入門講座

脳は、 1mm 立方に5万個のニューロンを含み、一つのニューロンは6千個のシナプスをもつ。

大脳新皮質には、100 億のニューロンと60兆個のシナプスがある!

Page 23: Neural Network + Tensorflow 入門講座

http://www.tmd.ac.jp/artsci/biol/textlife/neuron.htm

クラゲだって神経はある

「神経系の起源と進化」http://bit.ly/1qR2Dmq

Page 24: Neural Network + Tensorflow 入門講座

http://goo.gl/0lbzRg

線虫の C. Elegance は、すべての神経の接続がわかっている唯一の生物である。302 の神経と 8,000 のシナプスがある。

1987 年

Page 25: Neural Network + Tensorflow 入門講座

60 年代から 70 年代にかけての、 Hubel と Wiesel の大脳視覚野の研究は、各方面に大きな影響を与えた。ニューラル・ネットワークの最初の研究も、こうした影響のもとで始まった。

Page 26: Neural Network + Tensorflow 入門講座

David H. Hubel

Torsten Wiesel 

1960 年代

Page 27: Neural Network + Tensorflow 入門講座
Page 28: Neural Network + Tensorflow 入門講座

ヘッブの法則Donald O. Hebb ヘッブの法則(ヘッブのほうそく)は、脳のシナプス可塑性についての法則である。ヘッブ則、ヘブ則とも呼ばれる。心理学者のドナルド・ヘッブによって提唱された。ニューロン間の接合部であるシナプスにおいて、シナプス前ニューロンの繰り返し発火によってシナプス後ニューロンに発火が起こると、そのシナプスの伝達効率が増強される。また逆に、発火が長期間起こらないと、そのシナプスの伝達効率は減退するというものである。

The Organization of Behavior. 1949 年

https://goo.gl/2HsDwK

Page 29: Neural Network + Tensorflow 入門講座

ヘッブの法則Donald O. Hebb

1950 年代

Page 30: Neural Network + Tensorflow 入門講座

http://kitsuon-kaizen.en.que.jp/hori/108.htm

Page 31: Neural Network + Tensorflow 入門講座

http://blogs.yahoo.co.jp/yuyamichidori/11068629.html

興奮性シナプスと抑制性シナプス

Page 32: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークとその表現(1)

一つのニューロンの動きを考える 一つのニューロンの内部の状態の表現 複数のニューロンからなる一つの層の内部の

状態の表現 式は便利だ! Y = W ・ X + b が表すもの

Page 33: Neural Network + Tensorflow 入門講座

一つのニューロンの動きを考える

以下の文中に現れる「ニューロン」は、コンピューター上でシミレートされた偽の「ニューロン」である。ただし、基本的な動作原理は、本物のニューロンを真似ていることを知っておくことは、役に立つと思う。

Page 34: Neural Network + Tensorflow 入門講座

ニューロンは、いつ発火するのか?

Page 35: Neural Network + Tensorflow 入門講座

ニューロンは、いつ発火するのか?

Page 36: Neural Network + Tensorflow 入門講座

ニューロンの働きは、発火するか発火しないかの

1 か 0 かのディジタル・スタイル

個々のシナプスの性質同じ発火信号を受けても、受け止めるニューロン内

でのその信号の「強さ」は、シナプスごとに異なる。

興奮性シナプスからの信号の強さから

抑制性シナプスからの信号の強さを

引いた値がある閾値を越えると、ニューロンは、「発火」する。

Page 37: Neural Network + Tensorflow 入門講座

興奮性シナプスからの信号の強さから

抑制性シナプスからの信号の強さを

引いた値がある閾値を越えると、ニューロンは、「発火」する。

ニューロンの働きは、発火するか発火しないかの

1 か 0 かのディジタル・スタイル

個々のシナプスの性質同じ発火信号を受けても、受け止めるニューロン内

でのその信号の「強さ」は、シナプスごとに異なる。

Page 38: Neural Network + Tensorflow 入門講座

ニューロン発火の条件 あるニューロンが「発火」するかは、次のようにし

て決まる。

興奮性シナプスから受け取る信号の強さ全体 A から抑制性シナプスから受け取る信号の強さ全体 B を引いて、その値がある閾値 C より大きければ発火する。

     A – B > C 発火     ( A – B – C > 0 )     A – B < C 発火しない ( A – B – C < 0 )

発火賛成と発火反対の多数決のようなもの。ただし、賛成票が、ある一定数以上(閾値)、反対票を上回らないといけないというルール。至極、単純である。

Page 39: Neural Network + Tensorflow 入門講座

賛成票: 3+3+2=7反対票: 2+1+2=5

賛成票 - 反対票 = 2 > 1(閾値 )

発火!

ニューロン発火の判断閾値=1の場合

個々のシナプスの性質は異なる内部の数字は、シナプスごとに異なる

信号を受けた時に伝えられる、信号の「強さ」

X1=1

X2=1

X3=1

X4=1

X5=1

X6=1

23

1

32 2

Page 40: Neural Network + Tensorflow 入門講座

賛成票: 0+0+2=2反対票: 2+1+2=5

賛成票 - 反対票 = -3 < 1(閾値 )

発火せず!

ニューロン発火の判断閾値=1の場合

X2, X4 からの信号なしX1=1

X2=0

X3=1

X4=0

X5=1

X6=1

23

1

32 2

個々のシナプスの性質は異なる内部の数字は、シナプスごとに異なる

信号を受けた時に伝えられる、信号の「強さ」

Page 41: Neural Network + Tensorflow 入門講座

賛成票: 3+3+0=6反対票: 2+0+2=4

賛成票 - 反対票 = 2 > 1(閾値 )

発火!

ニューロン発火の判断閾値=1の場合

X3, X5 からの信号なしX1=1

X2= 1

X3=0

X4= 1

X5=0

X6=1

23

1

32 2

個々のシナプスの性質は異なる内部の数字は、シナプスごとに異なる

信号を受けた時に伝えられる、信号の「強さ」

Page 42: Neural Network + Tensorflow 入門講座

X

  X1,X2,..X6 は、 0または 1 で   

W1X1+W2X2+W3X3+  W4X4+W5X5+W6X6

+ b > 0 の時発火

重み: Wiシナプスごとの賛成票の強さ A をプラスの値に

反対票の強さ B をマイナスの値にすると、式が簡単になる。そうした Wi を「重み」という。

バイアス :bついでに、閾値 C の符号を逆にすれば、

式はもっと簡単になる。それを「バイアス」という。

X1

X2

X3

X4

X5

X6

W2=3W3=-1

W4=3W5=2

W6=-2

W1=-2

先の次式を想起せよA – B – C > 0符号を変えるとA + B’+ C’ > 0 の形になる。

Page 43: Neural Network + Tensorflow 入門講座

      W1X1+W2X2+W3X3+

  W4X4+W5X5+W6X6+ b =

(-2)x1+3x0+(-1)x1+3x0+2x1+(-2)x1

-1 =-2-2+2-2-1= -5<0

発火せず!

重み Wi= [-2,3,-1,3,2,-2]バイアス b=-1

入力 Xi=[1,0,1,0,1,1]の場合

X1=1

X2=0

X3=1

X4=0

X5=1

X6=1

-23

-1

32 -2

Page 44: Neural Network + Tensorflow 入門講座

W1X1+W2X2+W3X3+  W4X4+W5X5+W6X6

+ b =(-2)x1+3x1+(-1)x0+

3x1+2x0+(-2)x1-1 =

-2+3+3-2= 2>0発火!

X1=1

X2= 1

X3=0

X4= 1

X5=0

X6=1

-23

-1

32 -2

重み Wi= [-2,3,-1,3,2,-2]バイアス b=-1

入力 Xi=[1,1,0,1,0,1]の場合

Page 45: Neural Network + Tensorflow 入門講座

一つのニューロンの内部の状態の表現

一つのニューロンの内部の状態は、ニューロンがシナプスを通じて受け取る刺激である「入力」と、シナプスごとの「重み」と、発火の閾値に対応する「バイアス」の三つの量で表現できる。

Page 46: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

W1X1+W2X2+W3X3+W4X4+W5X5+W6X6+b > 0 ?

重み W=[W1,W2,W3,W4,W5,W6]バイアス b

入力 X=[X1,X2,X3,X4,X5,X6]の場合の発火の条件

まず、一つのニューロンで考えてみよう

Page 47: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

W1X1+W2X2+W3X3+W4X4+W5X5+W6X6+b > 0 ?

重み W=[W1,W2,W3,W4,W5,W6]バイアス b

入力 X=[X1,X2,X3,X4,X5,X6]の場合の発火の条件

X1X2X3X4X5X6

先の行ベクトル X を列ベクトルに変えたものを XT で表す

XT =

Page 48: Neural Network + Tensorflow 入門講座

行ベクトルと列ベクトルの積 行ベクトル W=[W1,W2,W3,W4,W5,W6] と行ベクトル X=[X1,X2,X3,X4,X5,X6] を列ベクトルに変えた XT との積を次のように定義する。

W ・ XT = [W1,W2,W3,W4,W5,W6] ・

= W1X1+W2X2+W3X3+W4X4+W5X5+W6X6 対応する要素を掛けて、足し合わせたものである。

X1X2X3X4X5X6

Page 49: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

W ・ XT + b > 0 ?

この時、重み W=[W1,W2,W3,W4,W5,W6]

バイアス b入力 X=[X1,X2,X3,X4,X5,X6]

の場合の発火の条件は、次のように、簡単に書ける。

もしも、 X が最初から行ベクトルの形で与えられていれば、重み W とバイアス b を持つあるニューロンの発火の条件は、 W ・ X+b > 0 で与えられることになる。これは、 y = ax + b > 0 と同じくらい、簡単な式の形である。

Page 50: Neural Network + Tensorflow 入門講座

複数のニューロンからなる一つの層の内部の状態の表現

複数のニューロンの集まりが、一つの「層」として、入力を受け取り出力を返すことがある。この層の内部の状態も、この層が受け取る「入力の全体」と、シナプスごとの「重みの全体」と、層を構成するニューロンの閾値に対応する「バイアスの全体」という三つの量で表現できる。

Page 51: Neural Network + Tensorflow 入門講座

X1

X2

X3

ニューロン 1

ニューロン 2

ニューロン 3

入力 X=[X1,X2,X3]

例えば、入力 X=[1,0,1] で

ニューロン1の重みが [2,-3,4] バイアスが -4 ならニューロン 1 の出力は、 2 ・1 +(-3) ・ 0+4 ・ 1-4=2>0 で発火。

ニューロン 2 の重みが [-4,1,-5] バイアスが 5 ならニューロン 2 の出力は、 (-4) ・1 +1 ・ 0+(-5) ・ 1+5=-4<0 で発火せず。

ニューロン 3 の重みが [-4,-2,5] バイアスが 2 ならニューロン 3 の出力は、 (-4) ・1 +(-2) ・ 0+5 ・ 1+2=3>0 で発火。

三つのニューロンで考えてみよう

Page 52: Neural Network + Tensorflow 入門講座

X1

X2

X3

ニューロン 1W1 ・ XT + b1 > 0

ニューロン 2W2 ・ XT + b2 > 0

ニューロン 3W3 ・ XT + b3 > 0

入力 X=[X1,X2,X3]

重み W1=[W11,W12,W13]バイアス b1

重み W2=[W21,W22,W23]バイアス b2

重み W3=[W31,W32,W33]バイアス b3

ニューロン 1 の値: W1 ・ XT + b1 = W11X1+W12X2+W13X3+b1

ニューロン 2 の値: W2 ・ XT + b2 = W21X1+W22X2+W23X3+b2

ニューロン 3 の値:  W3 ・ XT + b3 = W31X1+W32X2+W33X3+b3

一般的には、

Page 53: Neural Network + Tensorflow 入門講座

X1

X2

X3

ニューロン 1W1 ・ XT + b1 > 0

ニューロン 2W2 ・ XT + b2 > 0

ニューロン 3W3 ・ XT + b3 > 0

入力 X=[X1,X2,X3]

重み W1=[W11,W12,W13]バイアス b1

重み W2=[W21,W22,W23]バイアス b2

重み W3=[W31,W32,W33]バイアス b3

W11X1+W12X2+W13X3+b1

W21X1+W22X2+W23X3+b2

W31X1+W32X2+W33X3+b3

これを、行列の積と和を使うと  ( あとで少し述べる )

W11,W12,W13 X1    b1

W21,W22,W23 X2 + b2 =W31,W32,W33 X3     b3

これも、 W ・ XT + b の形をしている!

Page 54: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

ニューロン 1

ニューロン 2

ニューロン 3

ニューロン 4

ニューロン 5

ニューロン 6

入力 X=[X1,X2,X3,X4,X5,X6]

六つのニューロンで考えてみよう。基本的には、同じである。

Page 55: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

ニューロン 1W1 ・ XT + b1 > 0

ニューロン 2W2 ・ XT + b2 > 0

ニューロン 3W3 ・ XT + b3 > 0

ニューロン 4W4 ・ XT + b4 > 0

ニューロン 5W5 ・ XT + b5 > 0

ニューロン 6W6 ・ XT + b6 > 0

入力 X=[X1,X2,X3,X4,X5,X6]

重み W1=[W11,W12,W13,W14,W15,W16]バイアス b1

重み W2=[W21,W22,W23,W24,W25,W26]バイアス b2

重み W3=[W31,W32,W33,W34,W35,W36]バイアス b3

重み W4=[W41,W42,W43,W44,W45,W46]バイアス b4

重み W5=[W51,W52,W53,W54,W55,W56]バイアス b5

重み W6=[W61,W62,W63,W64,W65,W66]バイアス b6

Page 56: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

X5

X6

ニューロン 1W1 ・ XT + b1 > 0

ニューロン 2W2 ・ XT + b2 > 0

ニューロン 3W3 ・ XT + b3 > 0

ニューロン 4W4 ・ XT + b4 > 0

ニューロン 5W5 ・ XT + b5 > 0

ニューロン 6W6 ・ XT + b6 > 0

入力 X=[X1,X2,X3,X4,X5,X6]

値: W11X1+W12X2+W13X3+ W14X4+W15X5+W16X6+b1

値: W21X1+W22X2+W23X3+ W24X4+W25X5+W26X6+b2

値: W31X1+W32X2+W33X3+ W34X4+W35X5+W36X6+b3

値: W41X1+W42X2+W43X3+ W44X4+W45X5+W46X6+b4

値: W51X1+W52X2+W53X3+ W54X4+W55X5+W56X6+b5

値: W61X1+W62X2+W63X3+ W64X4+W65X5+W66X6+b6

Page 57: Neural Network + Tensorflow 入門講座

W11, W12, W13, W14, W15, W16 X1 b1W21, W22, W23, W24, W25, W26 X2 b2W31, W32, W33, W34, W35, W36 X3 + b3 =W41, W42, W43, W44, W45, W46 X4 b4W51, W52, W53, W54, W55, W56 X5 b5W61, W62, W63, W64, W65, W66 X6 b6

W11X1+W12X2+W13X3+W14X4+W15X5+W16X6+b1W21X1+W22X2+W23X3+W24X4+W25X5+W26X6+b2W31X1+W32X2+W33X3+W34X4+W35X5+W36X6+b3W41X1+W42X2+W43X3+W44X4+W45X5+W46X6+b4W51X1+W52X2+W53X3+W54X4+W55X5+W56X6+b5W61X1+W62X2+W63X3+W64X4+W65X5+W66X6+b6

行列による表現 (六個のニューロンの場合 )

これも、 W ・ XT + b の形をしている!

Page 58: Neural Network + Tensorflow 入門講座

式は便利だ!Y = W ・ XT + b が表すもの

数学的な表記を使うと、問題を簡潔に定式化できる。ここでは、一つのニューロンの状態だけでなく、複数のニューロンからなる層も、一つの式で表現できる背景について述べる。この節は、読み飛ばしてもらって結構です。

Page 59: Neural Network + Tensorflow 入門講座

式は便利だ!Y = W ・ XT + b が表すもの ニューラル・ネットワークの本を読んで、最初につまずくのは、行列が出てくるあたりだと思う。ただ、ニューラル・ネットワークの理解で、当面、必要なことは、式 Y = W ・ XT + b が表現しているものを理解することだ。見慣れていないだけで、難しい数学ではない。

具体的な例で、式 Y = W ・ XT + b が表しているものを、紹介したいと思う。一見、複雑に見える沢山の関係が、この式一つで表現されていることがわかるはずだ。式は便利だということがわかってもらえると思う。

以下の例では、 X も Y も b も、最初から列ベクトルだとしよう(このことを、仮に、 X=[X1,X2,...Xn]T

のように表そう)。この時、 Y = W ・ X + b が、何を表すかを考えよう。

Page 60: Neural Network + Tensorflow 入門講座

Y = W ・ X + b が表すもの

W が数値(スカラー)の時 Y=y, X=x, W=a, b=b なら、この式は、

y = ax + b という、式を表す。 Y=y, X=x, W=2, b=3 なら、この式は、

y = 2x + 3 という、式を表す。 Y=y, X=x, W=4, b=0 なら、この式は、

y = 4x という、式を表す。

Page 61: Neural Network + Tensorflow 入門講座

Y = W ・ X + b が表すもの

W がベクトルの時 Y=y, X=[x1,x2]T W=[w1,w2] b=b0 なら、この式は、

y = w1 ・ x1+w2 ・ x2+b0 という、式を表す。 Y=y, X=[c,d]T W=[m,n] b=b なら、この式は、

y = m ・ c+n ・ d+b という、式を表す。 Y=y, X=[1,0]T W=[2,3] b=4 なら、この式は、

y = 2 ・ 1+3 ・ 0+4 = 6 という、式を表す。 Y=y, X=[x1,x2,x3]T W=[w1,w2,w3] b=b0 なら、

y = w1 ・ x1+w2 ・ x2+w3 ・ x3+b0 Y=y, X=[x1,x2,x3,x4]T W=[w1,w2,w3,w4] b=b0 なら、

y = w1 ・ x1+w2 ・ x2+w3 ・ x3+w4 ・ x4+b0

Page 62: Neural Network + Tensorflow 入門講座

Y = W ・ X + b が表すもの

W が行列の時 2x2 の行列( 2行 2列の行列)を、 [ [a,b], [c,d] ]

と表そう。同様に、 3x3 ( 3行 3列の行列)の行列を、 [ [d,e,f], [g,h,i], [j,k.l] ] と表そう。 ....

Y=[y1,y2]T, X=[x1,x2]T 、 W= [ [2,3], [4,5] ] 、b=[1,2]T のとき、 Y = W ・ X + b は、次の二つの式を表す。 y1 = 2x1+3x2+1 、 y2 = 3x1+5x2+2

Y=[y1,y2,y3]T, X=[x1,x2,x3]T 、 W= [ [2,3,-1], [4,-5,1], [1,2,3] ] 、 b=[1,2,3]T のとき、 Y = W ・ X + b は、次の三つの式を表す。 y1 = 2x1+3x2-x3+1 、 y2 = 4x1+5x2+x3+2 、 y3 = x1+2x2+3x3+3

Page 63: Neural Network + Tensorflow 入門講座

Y = W ・ X + b が表すものW が行列の時 例えば、 W が 6x6(6行 6列 ) の行列の時、 Y =

W ・ X + b が表すものの例については、先に見た。もちろん n が 100 でも 10,000 でも同じ式で、表現できる。

W が n行 m列の行列の時、 Y = W ・ X + b が、n個の式を表していることを示すために、次のように書くこともある。 Yn = Wn ・ X + bn

こうした表記は、数百・数千のノードからなるニューラル・ネットワークが満たす多数の関係式を、一つの式で簡潔にまとめることができるので、プログラミング上も極めて有用である。

Page 64: Neural Network + Tensorflow 入門講座

Y=W ・ XT+b と Y=X ・ W+b という二つの表記 これまで、入力の X=[X1,X2,...,Xn] を行ベクトルと

して、 Y=W ・ XT+b という表記を用いてきた。多くのドキュメントもこうした表記を採用している。

X=[X1,X2,...,Xn]T として、 Y=W ・ X+b と表しても、この二つの表記は、同じ内容を表し、重みを表す行列W も、同じものである。 どちらでも XT, b は列ベクトルである。

ただ、 X=[X1,X2,...,Xn] を行ベクトルとした時、 Y=X ・ W+b という表記も可能である。ここでのW は、先の W の行と列を入れ替えたものである。W=WT 。 b は、行ベクトルとなる。 b=bT である。基本的には同じである。

ただ、 TensorFlow では、 Y=X ・ W+b の方の表記を採用している。 TensorFlow に関連する部分に入ったら、この表記に切り替えたいと思う。

Page 65: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークとその表現(2)

ニューロンを動かす -- 活性化関数 (Activator)

クラス分けの Activator -- SoftMax

Page 66: Neural Network + Tensorflow 入門講座

ニューロンを動かす -- 活性化関数 (Activator)

活性化関数は、その名前の通りに、一つのニューロンが発火(活性化)する時の条件と出力を関数の形で表したものである。いろいろな種類の活性化関数がある。

Page 67: Neural Network + Tensorflow 入門講座

活性化関数 先に見たようにように、重み W とバイアス b を用い

て、W ・ X + b という式で、ニューロンの興奮のレベルが計算できるとするなら、 「 W ・ X + b > 0 なら、ニューロンは発火する」という条件は、どのように表現できるだろうか?

W ・ X + b は、ニューロンの内部の状態を表す量なので、その値を、ニューロンの出力に変える関数 φ をうまく定義して、 φ (W ・ X + b ) がそのニューロンの発火・出力を表現するようにすればいい。こうした関数 φ を、「活性化関数」とよぶ。

例えば、ニューロンの発火の信号の強さが 1 で、発火しない時は信号が 0 であるなら、次のような関数 φ を考えればいい。        0 x<=0 の時                 1 x> 0 の時   

φ (x) =

Page 68: Neural Network + Tensorflow 入門講座

sigmoid 関数 (logistic 関数 ) 先の φ を、右のグラフでは、赤線で示した。 x=0

の時に、非連続に変化する。 実際の応用では、こうし

た飛躍のない、青線のような関数が持ちいられることが多い。

これを sigmoid 関数という。( logistic 関数)

近似的には、x<0 の時  0x>0 の時  1  基本的には 0 と 1 の間の値をとる。

Page 69: Neural Network + Tensorflow 入門講座

ReLU (rectified linear unit) rectifier は、「整流器」。 ReLU は、マイナスの値

は通さず 0 を返すが、プラスの値は、そのまま通す。(青線)

sigmoid は、 0 と 1の間の値を出力するが、 ReLU の出力には、そうした制限はない。

断続はないが、 x=0 のところで折れ曲がっている。それを、スムースに近似した関数も存在する。( Softplus  緑線)

x<0 の時  0 x>0 の時  x の値をとる。

Page 70: Neural Network + Tensorflow 入門講座

tanh 関数 sigmoid の仲間だが、ちょうどそれを 1/2ほど、下

に移動した形である。 -1 と +1 との間の値を出力する。 tanh以外にも、同じ性質を持つ、様々な関数が提案されている。

Page 71: Neural Network + Tensorflow 入門講座

(

      W ・ X + b =

(-2)x1+3x0+(-1)x1+3x0+2x1+(-2)x1 -1 =

-2-2+2-2-1= -5

φ(W ・ X + b ) =sigmoid(-5) ≒ 0

重み W= [-2,3,-1,3,2,-2] 、バイアス b=-1入力 X = [1,0,1,0,1,1]T

φ(x) = sigmoid(x) の場合X1=1

X2=0

X3=1

X4=0

X5=1

X6=1

-23

-1

32 -2

0

一つのニューロンの出力は、 φ( W ・ X + b ) の形で表せる。

Page 72: Neural Network + Tensorflow 入門講座

W ・ X + b =(-2)x1+3x1+(-1)x0+3x1+2x0+(-2)x1 -1 =

-2+3+3-2= 2

φ(W ・ X + b ) =ReLU(2) =2

X1=1

X2= 1

X3=0

X4= 1

X5=0

X6=1

-23

-1

32 -2

重み W= [-2,3,-1,3,2,-2] 、バイアス b=-1入力 X = [1,1,0,1,0,1]T

φ(x) = ReLU(x) の場合

2

一つのニューロンの出力は、 φ( W ・ X + b ) の形で表せる。

Page 73: Neural Network + Tensorflow 入門講座

X1

X2

X3

ニューロン 1 φ(W1 ・ X + b1)

ニューロン 2 φ(W2 ・ X + b2)

ニューロン 3 φ(W3 ・ X + b3)

入力 X=[X1,X2,X3] T 出力 Yi = φ(Wi ・ X + bi)

重み W1=[W11,W12,W13]バイアス b1

重み W2=[W21,W22,W23]バイアス b2

重み W3=[W31,W32,W33]バイアス b3

W11,W12,W13 X1    b1

W21,W22,W23 X2 + b2 W31,W32,W33 X3     b3

φφ ( W11X1+W12X2+W13X3+b1 )

φ(W21X1+W22X2+W23X3+b2 =φ(W31X1+W32X2+W33X3+b3)

複数のニューロンの出力も、 φ( W ・ X + b ) の形で表せる。

Page 74: Neural Network + Tensorflow 入門講座

クラス分けの ActivatorSoftMax

画像認識等のクラス分けの出力には、 Softmaxという活性化関数がよく利用される

Page 75: Neural Network + Tensorflow 入門講座

クラス分けの場合の出力に利用される activator 。手書き数字画像の認識だと、提示された画像が 0 から 9までの 10個の数字のどれかだと判断しなければいけない。

ニューラル・ネットワークでは、こうした場合、出力層に、 0 から 9までの 10個の数字に対応した 10個のノードが並び、それぞれのノードの値が、「提示された画像がその数字である確率」であるようにする。

ノードごとに、確率を計算するのが softmax 関数である。最終的には、 10個のノードの中で、その確率が最大であるものが選ばれる。

softmax 関数

Page 76: Neural Network + Tensorflow 入門講座

softmax 関数の出力例

ノード 0 ノード 1 ノード 2   ノード 3 ノード 4 ノード 5 ノード 6 ノード 7 ノード 8 ノード 9

0 0 0 1 0 0 0 0 0 0

Page 77: Neural Network + Tensorflow 入門講座

softmax 関数の出力例

ノード 0 ノード 1 ノード 2   ノード 3 ノード 4 ノード 5 ノード 6 ノード 7 ノード 8 ノード 9

0 0 0 0 0 1 0 0 0 0

Page 78: Neural Network + Tensorflow 入門講座

softmax 関数の出力例

ノード 0 ノード 1 ノード 2   ノード 3 ノード 4 ノード 5 ノード 6 ノード 7 ノード 8 ノード 9

0 0 0 0 0 1 0 0 0 0

Page 79: Neural Network + Tensorflow 入門講座

softmax 関数の性質 softmax 関数は、それが適用される層のノードの

softmac 関数の値をすべて足し合わせると 1 になるという性質を持つ。それは、 softmax の出力が「確率」であることを考えれば、すぐわかる。

例えば、先の例で、ある画像が 3 である確率が 0.75 であったとしよう。そのことは、その画像が 3以外の数字である確率は、 1 - 0.75 = 0.25 だということである。 3以外のノードの確率 (softmax の出力の値 ) を全部足しても、 0.25 にしかならないということである。

次のこともわかる。あるノードの softmax の値が上がれば、他のノードの値は下がる。あるノードの値を下げれば、他のノードの値は上がる。全部足して1 になるように、値は変化する。

Page 80: Neural Network + Tensorflow 入門講座

One-Hot-Vector 先の softmax 関数の出力例の、一番上のノードは、

「この画像は数字 n である」という、ニューラル・ネットワークの判断を表しているの。もちろん、 softmax の値が一番大きいところが選ばれて、そこに一つだけに 1 が入っていて、残りはすべて 0になっている。

こうした一つだけに 1 が、残りすべてが 0 のベクトルを、 One-Hot-Vector と呼ぶ。

One-Hot-Vector は、クタス分けの出力に現れるだけではない。ニューラル・ネットワークを「学習」させるための訓練用データは、画像と一緒に「この画像は数字 n である」という「正解」の情報を持っていなければならない。訓練用データは、画像と正解を示す One-Hot-Vector の二種類のデータから構成されている。

Page 81: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークのパラメーターの最適化

ニューラル・ネットワークで数値予測(線形回帰)

損失関数 Loss Function 勾配降下法 Gradient Descent クラス分けの場合の損失関数 クロス・エント

ロピー

Page 82: Neural Network + Tensorflow 入門講座

出力結果を見て、パラメーターを修正するBackpropagation 出力結果が、予期していたものと異なっていたら、

その出力を行った一つ前の層にさかのぼって、パラメーター(重み W とバイアス b )を修正すればいい。ただ、手動の試行錯誤で、こうした修正を行っていては、ラチがあかない。

Rumelhart らが開発した (1986 年 ) Backpropagation は、こうしたパラメーターの修正を、システマチックに行う方法を提供する。

以下、ニューラル・ネットワークでのパラメーター修正を行うのに必要な道具立てを、あらかじめ、簡単に紹介しよう。具体的な例については、その後に述べることにする。

Page 83: Neural Network + Tensorflow 入門講座

出力結果と「正解」とのずれLoss Function ( 損失関数 ) まず、出力結果と予期していた「正解」とのズレを、

何らかの方法で定式化する必要がある。そのズレを関数の形で表したものを Loss Function (損失関数)という。 Cost Function (コスト関数)ということもある。

出力が「正解」と一致した時、 Loss Function の値が最小値を取るようにする。この時、パラメーター修正の目的を、 Loss Function の値をできるだけ小さくすることだと言い換えることができる。

ある問題に対して、 Loss Function は一つとは限らない。どのような Loss Function を選ぶかで、パラメーター修正の効率は変化する。

Page 84: Neural Network + Tensorflow 入門講座

Gradient Descent (勾配降下法) パラメーター修正で、最もよく使われる方法が、こ

の Gradient Descent (勾配降下法)である。 Loss Function を J だとしよう。パラメーターの W

と b の値が、それぞれ少し変化した時に、 J の値がどう変化するかを調べる。この J の変化が「勾配」である。「勾配」にそって、 J の値が下がるように、W と b を変化させればいい。それが、 Gradient Descent である。

数学的には、∂ J/∂W と ∂ J/∂b をチェックすることになる。 J は、ニューラル・ネットワークの出力と「正解」とのズレなので、 φ(WX+b) という形の項を含んでいる。アクティベーター φ として、微分可能なものが好まれるのは、この Gradient Descentに関係している。

Page 85: Neural Network + Tensorflow 入門講座

一つのニューロンで、パラメーターの最適化を考える

単純なニューロンの集まりでも、パラメーター最適化のメカニズムと組み合わせれば、強力な機能を持ちうる。ここでは、一つのニューロンが、線形回帰の数値予測の能力を持ちうることを示す。

Page 86: Neural Network + Tensorflow 入門講座

一つのニューロンのパラメーターを動かす ニューロン一つの働きは、先に見たように

φ ( W ・ X+b) と表現できる。 φ は活性化関数、W, X, b はベクトルである。ここではさらに単純化して、入力を数字一つにする。この時、 W もただの数字になる。さらに、 Activator φ も取り除く。

このニューロン一つの「ニューラル・ネットワーク」は、一つの数字の入力 x に対して、内部のパラメーター(単なる実数である) a, b に応じて、 ax+b を返すのである。この値を y としよう。

y=ax+b は、直線を表す式である。この単純なニューラル・ネットワークでパラメーターを様々に変更するというのは、様々な直線を考えることに等しい。

Page 87: Neural Network + Tensorflow 入門講座

一つの入力と出力を持ち、一つだけのニューロンからなるネットワークは、 y=ax+b という直線に対応している。このニューロンのパラメーターを動かすということは、下の図のようにこの直線を、いろいろに動かすということである。

a, b の値を変えれば、 y=ax+b の形は変化する(傾きが a で、切片が b の直線である)

Page 88: Neural Network + Tensorflow 入門講座

この図は、あるデータ(赤点)の分布を直線で近似しようというものである。統計学では「線形回帰」と飛ばれているものだ。(左の直線より、右の直線の方がいい近似を与えている。)もっとも単純なものでも、パラメーターの変更を考えることで、ニューラル・ネットワーク、は「線形回帰」と同じ数値予測の能力を持つ。

Page 89: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークで数値予測(線形回帰)

データ群に一番「近い」直線を求める。直線が見つかれば、それに基づいて、数値予測が可能になる。

Page 90: Neural Network + Tensorflow 入門講座
Page 91: Neural Network + Tensorflow 入門講座
Page 92: Neural Network + Tensorflow 入門講座
Page 93: Neural Network + Tensorflow 入門講座
Page 94: Neural Network + Tensorflow 入門講座
Page 95: Neural Network + Tensorflow 入門講座

損失関数

損失関数は、ニューラル・ネットワークで、重要な役割を果たす。ニューラル・ネットワークでの「学習」は、すべて「損失関数を最小のものにせよ」という指示に従ったパラメーター変更に帰着する。

Page 96: Neural Network + Tensorflow 入門講座

損失関数を定めて、誤差を最小にする a,b を求める サンプル中の i 番目の点を (x(i), y(i)) とすれ

ば、 y=ax+b 上の点と点 (x(i), y(i)) との垂直方向の誤差は、(ax(i)+b) – y(i) となる。

誤差は、正負の値をとるので、単純に、誤差の平均を取っても、打ち消しあって、全体としての誤差の大きさはわからなくなる。

そこで、誤差の二乗をとって、その平均を最小にすることを考える。

a, b の関数である、この誤差の二乗の平均を、損失関数とすればいい。

Page 97: Neural Network + Tensorflow 入門講座

誤差誤差

誤差誤差

データの各点と、 y=ax+b との誤差が、もっとも小さくなるように、 a,b の値を修正する。

(x(i), y(i))

(ax(i)+b) – y(i)

( ax(i)+b), y(i) )

誤差の二乗を Loss 関数にする

こうした形の損失関数を、 “ quadratic cost” という

Page 98: Neural Network + Tensorflow 入門講座

仮説 :

パラメーター : a, b

損失関数 :

目標 :

問題の整理

y(x) = ax + b

a, b y

a, ba, b

Page 99: Neural Network + Tensorflow 入門講座

損失関数 J(a, b) は、 a,b についての関数で、この例では、次のような形をしている

a b

Page 100: Neural Network + Tensorflow 入門講座

1

0

J(0,1)

損失関数 J(θ0   , θ1) の別の例

Page 101: Neural Network + Tensorflow 入門講座

Gradient descent勾配降下法

Gradient descent 勾配降下法は、ニューラル・ネットワークのパラメーター更新の基本的な手段である。 TensorFlow では、 Gradient descent が、標準的な関数として、あらかじめ組み込まれている。

Page 102: Neural Network + Tensorflow 入門講座

ある関数があってその値を最小にしたい

基本的な考え方 :• ある     からはじめる。

• の値を、       が減少す

るように変化させる。

• 最小値になるまで、繰り返す。

Gradient descent (勾配降下法)

Page 103: Neural Network + Tensorflow 入門講座

簡単にするために、二次元のグラフで考えよう。ある点から始めて、その点から極小点に近ずくためには、どうすればいいか?

二つの場合がある。その点が極小点の右側にある場合には、その点の x 座標を少し減らせばいい。その点が極小点の左側にある場合には、その点の x 座標を少し増やせばいい。

その点が、極小点の右にあるか左にあるかは、その点での接戦の傾きが、正であるか負であるかでわかる。

よって、 α を正の数値とすれば、次の式が、より近づいた点の位置を与える。

直感的な説明

損失関数を、パラメーターで微分している

Page 104: Neural Network + Tensorflow 入門講座

If α is too small, gradient descent can be slow.

If α is too large, gradient descent can overshoot the minimum. It may fail to converge, or even diverge.

アルファが、あまりに小さいと、Gradient descent は、ゆっくりにしか進まない。

アルファが、あまりに大きいと、Gradient descent は、最小値を通り越してしまう。場合によっては、振動したり、収束しない場合もある。

このアルファを学習率( Learning Rate )という。

Page 105: Neural Network + Tensorflow 入門講座

Gradient descent は、アルファが固定されていても、極小値に収束できる。

局所的な最小値に近づくにつれ、 gradient descent は、自動的に小さなステップを取るようになるので、繰り返しアルファを小さくしてゆく必要はない。

Page 106: Neural Network + Tensorflow 入門講座

どう、重みとバイアスを修正するのか?

もう少し、一般的に、 Gradient Descent をまとめてみよう。損失関数を C とするとき、次の式に従って、重み Wk とバイアス bl を変更すればいい。

損失関数が、 ここで見た、 quadratic cost の形をしていない場合(例えば、後で見る Cross Entropy の場合)でも、この考え方は、変わらない。

η は学習率

Page 107: Neural Network + Tensorflow 入門講座

1

0

J(0,1)

Page 108: Neural Network + Tensorflow 入門講座

0

1

J(0,1)

ある場合には、最小値ではなく、局所的な極小値に、入り込むことがある。

Page 109: Neural Network + Tensorflow 入門講座

http://arxiv.org/pdf/1210.0811v2.pdfgradient descent method

Page 110: Neural Network + Tensorflow 入門講座

クラス分けの場合の損失関数

出力が数値一つだけだったら、正解の数字との「誤差」を定義するのは容易である。それを損失関数にすればいい。ただ、出力が、画像認識のようなクラス分けだったら、誤差の定義は簡単ではない。

Page 111: Neural Network + Tensorflow 入門講座

クロス・エントロピー

クラス分けによく使われる Softmax の出力の場合で考えてみよう。例えば、数字の画像認識なら0 から 9までの数字に対応した 10個のノードそれぞれに、その画像がそのノードに対応した数字である確率が入ってくる。こうした場合の損失関数に利用されるのが、クロス・エントロピーである。

Page 112: Neural Network + Tensorflow 入門講座

クロス・エントロピー H(p,q)  の定義

Σ Σ p(x)log(q(x))N   x

サンプルの数  分類の数

目標の確率  データの確率

マイナス

Page 113: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=2/3,p(2)=1/4,p(3)=5/24,p(4)=5/24 q(1)=1/8,q(2)=1/8, q(3)=5/8,q(4)=1/8

x=1 の時   2/3log(1/8) = -2/3log8 = -2log2x=2 の時   1/4log(1/8) = -1/4log(8) = -3/4log2x=3 の時   5/24log(5/8)= 5/24log(5) - 15/24log2x=4 の時   5/24log(1/8)= -5/24log(8) = -15/24log2全部足し合わせると -(48log2+18log2-5log5+15log2+15log2)/24=-(96log2-5log5)/24

H(p,q) = (96log2-5log5)/24 Σ p(x)log(q(x)) x

の計算

Page 114: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=2/3,q(2)=1/4,q(3)=5/24,q(4)=5/24

x=1 の時   0log2/3x=2 の時   1log1/4x=3 の時   0log5/24x=4 の時   0log5/24全部足して log1/4 = -log4 = -2log2H1(p,q) = 2log2

H1

Σ p(x)log(q(x)) x

の計算

p(2) = 1 の場合の

「目標」の p の分布は、こういう形になる。

Page 115: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=1/4,q(2)=2/3,q(3)=5/24,q(4)=5/24

x=1 の時   0log1/4x=2 の時   1log2/3x=3 の時   0log5/24x=4 の時   0log5/24全部で log2/3 = log2 – log3

H2(p,q) = log3-log2

H2

Σ p(x)log(q(x)) x

の計算

p(2) = 1 の場合の

「目標」の p の分布は、こういう形になる。

Page 116: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=5/24,q(2)=2/3,q(3)=1/4,q(4)=5/24

x=1 の時   0log5/24x=2 の時   1log2/3x=3 の時   0log1/4x=4 の時   0log5/24全部足し合わせるとlog2/3

H3(p,q) = log3-log2

H3

Σ p(x)log(q(x)) x

の計算

p(2) = 1 の場合の

「目標」の p の分布は、こういう形になる。

Page 117: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=0,q(2)=1,q(3)=0,q(4)=0

x=1 の時   0log0 = 0x=2 の時   1log1 = 0x=3 の時   0log0 = 0x=4 の時   0log0 = 0

H5(p,q) = 0

H4

Σ p(x)log(q(x)) x

の計算

p(2) = 1 の場合の

「目標」の p の分布は、こういう形になる。

Page 118: Neural Network + Tensorflow 入門講座

p(x) が one-hot-value の時

Σ Σ p(x)log(q(x))N   x

=  - { サンプル中の正解値をとった i についての log(q(i)) の和 }

H(p,q) =

0 ≦ q(i) ≦ 1 で、 log(q(i)) ≦ 0 だが、   q(i) 0 の時 log(q(i)) - ∞ q(i) 1 の時 log(q(i)) 0だから、 q(i) が正解に近いほど、 H(p,q) は小さくなる。

Σ log(q(i))N

ー=

Page 119: Neural Network + Tensorflow 入門講座

バイナリー・クロス・エントロピー

先に見たクロス・エントロピーは、二つの分布 pと q が「似ているか?」については、あまり有効な情報を与えない。なぜなら、 p(x)=1 以外の x の値での q の値は、すべて無視するので。ただ、次のように定義を変更すると、二つの分布の「近さ」を数値化できる。(計算が増えるので、必要ないかもしれないのだが) この節は、読み飛ばしてもらって結構です。

Page 120: Neural Network + Tensorflow 入門講座

H(p, q) = - { p(x)log(q(x)) + (1-p(x))log(1-q(x)) }Σx

P(x),q(x) は、確率を表しているので    0 ≦ p(x) ≦ 1 、 0 ≦ q(x) ≦ 1    0 ≦ 1-p(x) ≦ 1 、 0 ≦ 1-q(x) ≦ 1

P(x) ≧ 0 で、 log(q(x)) ≦ 0 だから    p(x)log(q(x)) ≦ 0(1−p(x)) ≧ 0 で、 log(1-q(x)) ≦ 0 だから    (1-p(x))log(1-q(x)) ≦ 0よって、 Σ の中の    p(x)log(q(x)) + (1-p(x))log(1-q(x)) ≦ 0 となる

Σ の前に マイナス符号が付いているので、 H(p, q) ≧ 0

Page 121: Neural Network + Tensorflow 入門講座

H(p, q) = - { p(x)log(q(x)) + (1-p(x))log(1-q(x)) }Σx

マイナスが付いている

p(x) が成り立つ確率 p(x) が成り立たない確率

目標とする確率

データの確率

H(p, q) = - { p(x)log(q(x)) + (1-p(x))log(1-q(x)) }Σx

p(x)=0 の時は、この項が消える

p(x)=1 の時は、この項が消える

H(p) = - p(x)log(p(x))Σx

Shannon の Entoropy

Binary Entoropyの式の特徴

Page 122: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=2/3,p(2)=1/4,p(3)=5/24,p(4)=5/24 q(1)=1/8,q(2)=1/8, q(3)=5/8,q(4)=1/8

x=1 の時   2/3log(1/8)+(1-2/3)log(1-1/8) = 2/3log(1/8)+1/3log(7/8)x=2 の時   1/4log(1/8)+(1-1/4)log(1-1/8) = 1/4log(1/8)+3/4log(7/8)x=3 の時   5/24log(5/8)+(1-5/24)log(1-5/8) = 5/24log(5/6)+19/24log(3/8)x=4 の時   5/24log(1/8)+(1-5/24)log(1-1/8) = 5/24log(1/8)+19/24log(7/8)全部足し合わせると (-2/3log8+1/3(log7-log8)) + (-1/4log8+3/4(log7-log8)) + (5/24(log5-log6)+19/24(log3-log8) + (-5/24log8+19/24(log7-log8)) = ( -16log8+8log7-8log8-6log8+18log7-18log8 + 5log5-5log6+19log3-19log8-5log8+19log7-19log8)/24 = ( -(16+8+6+18+19+5+19)log8+(8+18+19)log7-5log6+19log3)/24 H(p,q) = - ( -91log8 + 45log7 – 5(log2+log3) +19log3)/24 = (278log2-45log7+14log3)/24

Page 123: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=2/3,q(2)=1/4,q(3)=5/24,q(4)=5/24

x=1 の時   0log2/3+1log(1-2/3) = log(1/3) = -log3x=2 の時   1log1/4+0log(1-1/4) = log(1/4) = -2log2x=3 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24x=4 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24全部足し合わせると -log3-2log2+log19-log24+log19-log24 = -log3-2log2+2log19-2(log3+log8)= -3log3+2log19 – 8log2

H1(p,q) = 3log3+8log2-2log19

H1

Page 124: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=2/3,q(2)=1/4,q(3)=5/24,q(4)=5/24

H’1

H(p, q) = - { p(x)log(q(x)) + (1-p(x))log(1-q(x)) }Σx

p(x) が、 One Hot Value の分布の場合でも、q(x) の分布の情報を拾っている。

Page 125: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=1/4,q(2)=2/3,q(3)=5/24,q(4)=5/24

x=1 の時   0log1/4+1log(1-1/4) = log(3/4) = log3 – log4x=2 の時   1log2/3+0log(1-2/3) = log2/3 = log2 –log3x=3 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24x=4 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24全部足し合わせると log3–log4+log2-log3+log19-log24+log19-log24 = log4+2log19-2(log3+log8)= -log3-8log4+2log19

H2(p,q) = log3+8log2-2log19

H1-H2 = (3log3+8log2-2log19) –(log3+8log2-2log19) = 2log3 > 0

H2

Page 126: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=5/24,q(2)=2/3,q(3)=1/4,q(4)=5/24

x=1 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24x=2 の時   1log2/3+0log(1-2/3) = log(2/3) = log2 – log3x=3 の時   0log1/4+1log(1-1/4) = log(3/4) = log3 – log4x=4 の時   0log5/24+1log(1-5/24) = log(19/24) = log19 –log24全部足し合わせると先の H2 と同じになる

H3(p,q) = H2(p,q) =log3+8log2-2log19

H3

Page 127: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=0,q(2)=3/4,q(3)=1/8,q(4)=1/8

x=1 の時   0log0+1log(1- 0) = 0x=2 の時   1log3/4+0log(1-3/4) = log(3/4) = log3 – log4x=3 の時   0log1/8+1log(1-1/8) = log(7/8) = log7 –log8x=4 の時   0log1/8+1log(1-1/8) = log(7/8) = log7 –log8全部足し合わせると log3-log4+log7-log8+log7-log8 = log3+2log7-8log2

H4(p,q) = 8log2-2log7-log3

H3-H4 = (log3+8log2-2log19) – (8log2-2log7-log3) = 2log3+ 2log7 -2log19 > 0 9x49 > 19x19

H4

Page 128: Neural Network + Tensorflow 入門講座

p(x) q(x)

P(1)=0,p(2)=1,p(3)=0,p(4)=0 q(1)=0,q(2)=1,q(3)=0,q(4)=0

x=1 の時   0log0+1log(1-0) = 0x=2 の時   1log1+0log(1-1) = 0x=3 の時   0log0+1log(1-0) = 0x=4 の時   0log0+1log(1-0) = 0

H5(p,q) = 0

H5

Page 129: Neural Network + Tensorflow 入門講座

TensorFlowニューラル・ネットワークをグラフで表現する

複数のニューロンからなる一つの層をグラフで表す

複数の層からなるニューラル・ネットワークをグラフで表す

グラフを流れる量 -- テンソル

Page 130: Neural Network + Tensorflow 入門講座

TensorFlow : 複数のニューロンからなる一つの層を、グラフで表す

ここから、 TensorFlow を使った、ニューラル・ネットワークの実装のスタイルを紹介する。「グラフ」「演算ノード」「テンソル」というのが、基本的なコンセプトとなる。

Page 131: Neural Network + Tensorflow 入門講座

複数のニューロンからなる一つの層の出力の計算、 φ( W ・ X + b ) を、次のような図形で表わすことにしよう。

行列の積X

W

行列の和

b

φ の適用

先の例で言うと、 X は、 [X1,X2,X3]T の列ベクトルで、W は 3x3 の行列、b は、 [b1,b2,b3]T の列ベクトルである。

Page 132: Neural Network + Tensorflow 入門講座

複数のニューロンからなる一つの層の出力の計算、 φ( X ・ W + b ) を、次のような図形で表わすことにしよう。

行列の積X

W

行列の和

b

φ の適用

先の例で言うと、 X は、 [X1,X2,X3] の行ベクトルで、W は 3x3 の行列、b は、 [b1,b2,b3] の行ベクトルである。

TensorFlow のスタイルに準じて、表記を切り替えていることに注意!φ( X ・ W + b )

Page 133: Neural Network + Tensorflow 入門講座

TensorFlow では、こうした図形を「グラフ」と呼んでいる。グラフは、「ノード」とノード同士を結ぶ「辺」からできている。

行列の積X

W

行列の和

b

φ の適用

TensorFlow のグラフのノードは、基本的には、演算を行う「演算ノード」である。様々な演算が用意されている。演算を行わない「変数ノード」「プレースゴルダー・ノード」も存在する。

変数ノード      変数ノード

プレースホルダー     演算ノード     演算ノード      演算ノード

Page 134: Neural Network + Tensorflow 入門講座

TensorFlow のグラフが有用なのは、一つの同じグラフで、様々な複雑なニューラル・ネットワークを表現できるからである。(もちろん、 X,W,b のタイプはことなるのだが)

行列の積X

W

行列の和

b

φ の適用

もっとも、そのことは、基本的には、このグラフの場合には、すでに見た φ( X ・ W + b ) という数学的な抽象化に負っている。ただ、グラフの方が具体的に処理をイメージしやすい。

TensorFlow のスタイルに準じて、表記を切り替えていることに注意!φ( X ・ W + b )

Page 135: Neural Network + Tensorflow 入門講座

いくつかの例で考えてみよう。4 つの入力を受け取り、 3 つの出力を返す、 3 つのニューロンからなる「層」を考えてみよう。これも、このグラフで表現できる。

行列の積X

W

行列の和

b

φ の適用

[X1,X2,X3 ,X4]

4行 3列の行列    [b1,b2,b3]

ある「層」の出力の数は、その層に含まれるニューロンの数に等しいのは、当然である。

Page 136: Neural Network + Tensorflow 入門講座

2 つの入力を受け取り、 5 つの出力を返す、 5 つのニューロンからなる「層」を考えてみよう。これも、このグラフで表現できる。

行列の積X

W

行列の和

b

φ の適用

[X1,X2]

2行 5列の行列    [b1,b2,b3,b4,b5]

一般に、 n個の入力を受け取り、 m個の出力を返すニューロンの「層」では、 X は n 次元の行ベクトル、 W は n行m列の行列、 b はm次元の行ベクトルである。

Page 137: Neural Network + Tensorflow 入門講座

複数の層からなるニューラル・ネットワークを、グラフで表す

もちろん、通常の表現でも、ニューラル・ネットワークはグラフとして表現される。ただ、 TensorFlow のグラフは、それをさらに単純化する。そうした単純化されたグラフ表現は、 TensorFlow の大きな能力である。そのことと、グラフを流れる「テンソル」というデータの捉え方とは、結びついている。

Page 138: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

H1

H2

H3

M1

M2

M3

M4

Y1

Y2

Full Connect なニューラル・ネットワークの旧来のグラフでの表現

Full Connect というのは、向かい合ったノードがすべて接続されているということ

Page 139: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

H1

H2

H3

M1

M2

M3

M4

Y1

Y2

入力層・隠れ層・出力層旧来のグラフでの表現

入力層      隠れ層       出力層

Page 140: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

H1

H2

H3

M1

M2

M3

M4

Y1

Y2

X 層 H 層 M 層 Y 層

H 層の 重み WH バイアス bH 活性化 φH

M 層の 重み WM バイアス bM 活性化 φM

Y 層の 重み WY バイアス bY 活性化 φY

旧来のグラフ

Page 141: Neural Network + Tensorflow 入門講座

一つの「層」のグラフでの表現

行列の積

X

W

行列の和

b

φ の適用

W和

Page 142: Neural Network + Tensorflow 入門講座

X1

X2

X3

X4

H1

H2

H3

M1

M2

M3

M4

Y1

Y2

X 層 H 層 M 層 Y 層

H 層の 重み WH バイアス bH 活性化 φH

M 層の 重み WM バイアス bM 活性化 φM

Y 層の 重み WY バイアス bY 活性化 φY

旧来のグラフ

Page 143: Neural Network + Tensorflow 入門講座

積XW

bφ 積

W和

bφ 積

W和

H 層の ニューロン数 :3 重み W : 4x 3 次元 バイアス b:3 次元

M 層の ニューロン数 :4 重み W : 3x4 次元 バイアス b:4 次元

Y 層の ニューロン数 :2 重み W : 4x2 次元 バイアス b:2 次元

X 層 H 層 M 層 Y 層

こっちのグラフの方が、ずっとわかりやすい!

X 層の 入力:4  4 次元

TensorFlow のグラフ

Page 144: Neural Network + Tensorflow 入門講座

ニューラル・ネットワークの例

これでも省略されている 784->8

旧来のグラフ

Page 145: Neural Network + Tensorflow 入門講座

積X

W和

bφ 積

W和

隠れ層の ニューロン数 :15 重み WH : 784x15 次元 バイアス bH : 15 次元

出力層の ニューロン数 :10 重み WO : 15x10 次元 バイアス bO : 10 次元

入力層 隠れ層 出力層

こっちのグラフの方が、ずっとわかりやすい!

隠れ層の 入力:784 784 次元

TensorFlow のグラフ

Page 146: Neural Network + Tensorflow 入門講座

グラフの例(学習用)

https://www.tensorflow.org/

Logit Layer, ReLu Layer を見れば、先に見た「層」のパターンが現れているのがわかる。

演算ノードの、 MatMul は行列の積、 BiassAdd はバイアスの加算である。

Logit Layer の Activator は、Softmax で、 ReLu Layer のActivator は、 ReLu である。

(このグラフ、 GitHub で提供されているコードのグラフとは、少し、違っている。)

Page 147: Neural Network + Tensorflow 入門講座

グラフの例(学習済み)

ニューラル・ネットワークでは、学習の過程と、学習済みの結果を利用する過程では、計算量には、大きな差がある。

学習に持ちいたグラフの一部を再利用して、学習済みのデータ(基本的には、学習された各レーヤーの重みとバイアスである)を利用すれば、スマホでも機械学習の成果を利用できる。TensorFlow は、それを可能にする

Page 148: Neural Network + Tensorflow 入門講座

少し複雑なグラフの例(これは、 LSTM のセル)σ(sigmoid のこと ), tanh は、活性化関数

次の式をグラフで追ってみるといい。

Chris Olah "Understanding LSTM Networks" http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 

Page 149: Neural Network + Tensorflow 入門講座

グラフを流れる量 -- テンソル

旧来のグラフの沢山の線は、どこへ行ったのか?TensorFlow のグラフでは、グラフを流れるデータは、すべて「テンソル」にまとめられている。

Page 150: Neural Network + Tensorflow 入門講座

4 つの入力を受け取り、 3 つの出力を返す、 3 つのニューロンからなる「層」を考えてみよう。

行列の積X

W

行列の和

b

φ の適用

[X1,X2,X3 ,X4]

4行 3列の行列    [b1,b2,b3]

ただ、ここでは、ノードではなく辺の方に注目してみよう。どのようなタイプのデータが、辺の上を流れるかを考えよう。

Page 151: Neural Network + Tensorflow 入門講座

4 つの入力を受け取り、 3 つの出力を返す、 3 つのニューロンの「層」

行列の積X

W

行列の和

b

φ の適用

[X1,X2,X3 ,X4]

4行 3列の行列    [b1,b2,b3]

TensorFlow では、こうしたデータをすべてテンソルと呼んでいる。どのような、タイプのデータか見てみよう。

Page 152: Neural Network + Tensorflow 入門講座

4 つの入力を受け取り、 3 つの出力を返す、 3 つのニューロンの「層」

行列の積X

W

行列の和

b

φ の適用

[X1,X2,X3 ,X4]

4行 3列の行列   [b1,b2,b3]

テンソルには、いろいろなタイプがある。

3 次元の       3 次元の      3 次元の行ベクトル     行ベクトル    行ベクトル

Page 153: Neural Network + Tensorflow 入門講座

2 つの入力を受け取り、 5 つの出力を返す、 5 つのニューロンの「層」

行列の積X

W

行列の和

b

φ の適用

[X1,X2]

2行5列の行列   [b1,b2,b3,b4,b5]

テンソルには、いろいろなタイプがある。

5 次元の       5 次元の      5 次元の行ベクトル     行ベクトル    行ベクトル

Page 154: Neural Network + Tensorflow 入門講座

TensorFlow とテンソル TensorFlow のプログラムは、すべてのデータを表現

するものとしてテンソル・データ構造を利用する。 TensorFlow のテンソルは、 n 次元の配列あるいはリストだと考えることができる。

テンソルは、静的な型と動的な次元を持っている。 計算グラフのノード間を移動するのは、テンソルだ

けである。

Page 155: Neural Network + Tensorflow 入門講座

テンソルのランク(階数) TensorFlow のシステムでは、テンソルは「ラン

ク」と呼ばれる次元の単位で記述される。 テンソルのランクは、行列のランクとは異なるもの

である。 テンソルのランクは、(時には、位数( order )と

か度数( degree )とか n 次元とも呼ばれることがあるのだが)、テンソルの次元の数である。

例えば、 Python のリストで定義された次のテンソルのランクは 2 である。

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Page 156: Neural Network + Tensorflow 入門講座

テンソルのランク(階数) ランク 2 のテンソルで、われわれが典型的に考える

のは「行列」である。 ランク 1 のテンソルは、「ベクトル」である。 ランク 2 のテンソルに対しては、 t[i,j] という構文

で、任意の要素にアクセスできる。 ランク 3 のテンソルには、 t[i,j,k] でアクセスする必要がある。

Page 157: Neural Network + Tensorflow 入門講座

ランク 数学的実体 Python での表記

0 スカラー ( 大きさのみ) s = 483

1 ベクトル(大きさと向き) v = [1.1, 2.2, 3.3]

2 行列 ( 数字のテーブル ) m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

3 3- テンソル t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]

n n-Tensor ....

テンソルのランク(階数)

Page 158: Neural Network + Tensorflow 入門講座

テンソルの形 TensorFlow のドキュメントでは、テンソルの次元

を記述するのに、ランク、形、次元数の三つを用いる。

Rank Shape Dimension number Example

0 [] 0-D A 0-D tensor. A scalar.

1 [D0] 1-D A 1-D tensor with shape [5].

2 [D0, D1] 2-D A 2-D tensor with shape [3, 4].

3 [D0, D1, D2] 3-D A 3-D tensor with shape [1, 4, 3].

n [D0, D1, ... Dn] n-D A tensor with shape [D0, D1, ... Dn].

Page 159: Neural Network + Tensorflow 入門講座

TensorFlow プログラミング

TensorFlow でグラフを定義する TensorFlow の変数定義 訓練: パラメーターを最適化をする TensorFlow プログラムサンプル

Page 160: Neural Network + Tensorflow 入門講座

TensorFlow でグラフを定義する

TensorFlow のプログラムは、まず、グラフを定義することから始まる。表現は単純化されているが、多数のノードからなる、多層のグラフも、簡単に定義できる。

Page 161: Neural Network + Tensorflow 入門講座

TensorFlow では、複数のニューロンからなる一つの層は、次のようなグラフで表現されることを、思い出して欲しい。

行列の積X

W

行列の和

b

φ の適用

5 つのノードがあるが、 W と b には、重みとバイアスの値が入り、残りの 3 つのノードは、演算を行うノードである。この層の働きは、φ(X ・ W+b) で表現される。

一つの層

Page 162: Neural Network + Tensorflow 入門講座

W と b の値は、この層の中での計算に利用されるだけでなく、その次の段階では、 Back Propagation で修正を受ける。それは、変数Variable である。

行列の積X

W

行列の和

b

φ の適用

Python の TensorFlow プログラムでは、固有の役割をもったそれぞれのノードは、固有の名前が割り当てられている。先頭の tf は TensorFlow 、 nn は Neural Net の略だと思えばいい。

tf.Variable tf.Variable

tf.matmul + tf.nn.relu

φ(X ・ W+b)

Page 163: Neural Network + Tensorflow 入門講座

グラフ定義は、次のようなわずか 3行のプログラムになる。

weights = tf.Variable( ... ) # weight を入れる変数の定義bias = tf.Variable( ... )      # bias を入れる変数の定義# 層の働きを  φ ( X ・ W+b ) で定義する。# ここでは φ に relu を使っている# images は、この層が受ける入力# hidden1 は、この層の出力であるhidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)

φ ( X ・ W+b )

このプログラムに出てくる、 images, weights, bias, hidden1は、いずれもテンソルである。それがどのような形をしているかは、ここでは省略した Variable の定義を述べる際に詳しく述べる。Variable の定義によってテンソルの形は決まる。

Page 164: Neural Network + Tensorflow 入門講座

二層からなるグラフのプログラムを見てみよう。

# 第一層weights1 = tf.Variable( ... ) bias1 = tf.Variable( ... )      hidden1 = tf.nn.relu(tf.matmul(images, weights1) + biases1)

# 第二層weights2 = tf.Variable( ... ) bias2 = tf.Variable( ... )     hidden2 = tf.nn.relu(tf.matmul( hidden1, weights2) + biases2)

第一層の出力の hidden1 テンソルが、第二層の入力に、そのまま利用されているのがわかる。

Page 165: Neural Network + Tensorflow 入門講座

W

images 和

bφ 積

W和

weight1 bias1 weight2 bias2

relu relu

images hidden1 hidden2

# 第一層weights1 = tf.Variable( ... ) bias1 = tf.Variable( ... )      hidden1 = tf.nn.relu(tf.matmul(images, weights1) + biases1)

# 第二層weights2 = tf.Variable( ... ) bias2 = tf.Variable( ... )     hidden2 = tf.nn.relu(tf.matmul( hidden1, weights2) + biases2)

TensorFlow プログラムと対応するグラフ

Page 166: Neural Network + Tensorflow 入門講座

三層からなるグラフのプログラムも簡単に書ける。

# 第一層weights1 = tf.Variable( ... ) bias1 = tf.Variable( ... )      hidden1 = tf.nn.relu(tf.matmul(images, weights1) + biases1)

# 第二層weights2 = tf.Variable( ... ) bias2 = tf.Variable( ... )     hidden2 = tf.nn.relu(tf.matmul( hidden1, weights2) + biases2)

# 第三層weights3 = tf.Variable( ... ) bias3 = tf.Variable( ... )     logit = tf.matmul( hidden2, weights3) + biases3)

この例では、第三層は、 Activator を呼んでいない。

Page 167: Neural Network + Tensorflow 入門講座

TensorFlow の変数定義

TensorFlow の変数( Variable )は、データの格納場所として、他のプログラミング言語の変数と同じ役割を果たす。ただ、 TensorFlow の変数は、テンソルの格納場所である。変数の定義では、それがどのような「形」のテンソルの格納場所であるかを定義することが、重要な意味を持つ。

Page 168: Neural Network + Tensorflow 入門講座

TensorFlow の変数 他のプログラミング言語での変数と同じよう

に、 TensorFlow の変数も、プログラムの中で、その値を読みだしたり、値を変更したりできる。

ただ、 TensorFlow の変数は、一つの値を持つのではなく、多次元の行列であるテンソルを格納している。実装としては、それは、大きなメモリー・バッファーである。

TensorFlow の変数は、どのようなテンソルを格納するのかの情報をはじめとして、利用前に明示的に初期化されなければならない。

TensorFlow の変数は、その値を直接ディスクにSave でき、また、プログラムの中で、それをディスクから Restore できる。

Page 169: Neural Network + Tensorflow 入門講座

TensorFlow の変数の生成 変数を生成するためには、そのコンストラクターに

初期値としてテンソルを渡す必要がある。そのための幾つかの Helper 関数が用意されている。

この例では、 tf.random_normal と tf.zeros という Helper を使っている。前者は乱数で、後者はゼロで変数を初期化する。

重要なことは、この Helper の第一引数が、この変数の初期化に使われたテンソルの形( shape )を示しているということである。

# Create two variables. weights = tf.Variable(       tf.random_normal([784,200], stddev=0.35), name="weights") biases = tf.Variable(tf.zeros([200]), name="biases")

Page 170: Neural Network + Tensorflow 入門講座

変数の初期化

# 二つの変数を生成するweights = tf.Variable(tf.random_normal([784, 200],                  stddev=0.35), name=“weights”)         biases = tf.Variable(tf.zeros([200]), name="biases") ... # この変数を初期化する演算を追加しておくinit_op = tf.initialize_all_variables()

# モデルを起動した後で、この初期化を呼び出す。with tf.Session() as sess:    # Run the init operation.    sess.run(init_op) ... # モデルを使う...                           

ここではまだ実行されないノードが追加されただけ

ノードで構成されたモデルはSession で初めて動き出す呼出には、 run を使う

[784,200] あるいは[200] の形をしたテンソルが用意されている。

Page 171: Neural Network + Tensorflow 入門講座

変数の初期化(他の変数から)

# 乱数からなる変数を作る。 784x200 の行列。weights = tf.Variable(tf.random_normal([784, 200],            stddev=0.35), name="weights")

# 先の weights の初期値と同じ値を持つ変数 w2 を作るw2 = tf.Variable(weights.initialized_value(), name="w2")

# weights の初期値を二倍した値を持つ変数 twice を作るtwice = tf.Variable(weights.initialized_value() * 2.0,             name="w_twice")                           

Page 172: Neural Network + Tensorflow 入門講座

変数の save# 変数を作るv1 = tf.Variable(..., name="v1") v2 = tf.Variable(..., name="v2") ...

# 変数を初期化する init_opノードを追加init_op = tf.initialize_all_variables() # すべての変数を save,restore する saveノードを追加saver = tf.train.Saver()

# モデルを起動し、変数を初期化し、何かの仕事をした後で# 変数をディスクに save するwith tf.Session() as sess: sess.run(init_op) # モデルで何かの仕事をする ... # 変数をディスクに save する save_path = saver.save(sess, "/tmp/model.ckpt") print("Model saved in file: %s" % save_path)

Page 173: Neural Network + Tensorflow 入門講座

変数の restore# 変数を作るv1 = tf.Variable(..., name="v1") v2 = tf.Variable(..., name="v2") ... ...# すべての変数を save,restore する saveノードを追加saver = tf.train.Saver()

# モデルを起動し、 変数をディスクから restore して# 何かの仕事をするwith tf.Session() as sess: # 変数をディスクに save する saver.restore(sess, "/tmp/model.ckpt") print("Model restored" ) # モデルで何かの仕事をする ...

Page 174: Neural Network + Tensorflow 入門講座

訓練: ニューラル・ネットワークのパラメーター(重みとバイアス)を最適化をする

ニューラル・ネットワークの「訓練」は、プログラム上では簡単に記述されているが、計算時間の大部分は、この「訓練」に費やされる。

Page 175: Neural Network + Tensorflow 入門講座

パラメーター(重みとバイアス)の最適化

パラメーター(重みとバイアス)の最適化は、次のような繰り返しのステップで行われる。(幾つかのバリエーションあり)1. グラフが組みあがったら、そのグラフで入力データ

に対して出力を計算する。2. その出力結果を、正しい答えと比較する。比較には、

あらかじめ定義していた損失関数を用いる。3. Gradient Descent( 勾配降下法 ) を使って、損失関

数の値が小さくなるようにパラメーター(重みとバイアス)を修正する。

4. 新しいパラメーターのもとで、入力データに対して出力を計算し、 2. に戻る。損失関数が十分小さくなるまでこの処理を繰り返す。

Page 176: Neural Network + Tensorflow 入門講座

GradientDescentOptimizer TensorFlow では、 GradientDescent を使ったパラ

メーターの最適化のための最適化演算 GradientDescentOptimizer があらかじめ用意されている。

この Optimizer を使って、損失関数を最小化せよという指示を出せば、ニューラル・ネットワークのパラメーターは、自動的に更新される。

TensorFlow では、こうして、パラメーター最適化のアルゴリズムが極めて簡単に書ける。

Page 177: Neural Network + Tensorflow 入門講座

最適化のアルゴリズムの例 1(数値予測の場合)

loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

(y-y_data)2Σ1/2m損失関数  C =

学習率

Page 178: Neural Network + Tensorflow 入門講座

最適化のアルゴリズムの例(クラス分けの場合)

y_ = tf.placeholder("float", [None, 10])cross_entropy = -tf.reduce_sum(y_ * tf.log(y))optimizer = tf.train.GradientDescentOptimizer(0.01)train = optimizer.minimize(cross_entropy)

(y_*log(y))Σ損失関数  C =

学習率

Page 179: Neural Network + Tensorflow 入門講座

TensorFlow プログラムサンプル

数値予測とクラス分けは、ニューラル・ネットワークの二大機能である。ここでは、この二つのタイプの簡単なプログラム・サンプルを示す。

Page 180: Neural Network + Tensorflow 入門講座

数値予測(線形回帰)の例

Page 181: Neural Network + Tensorflow 入門講座

....W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

# Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first. init = tf.initialize_all_variables()

# Launch the graph. sess = tf.Session() sess.run(init)

# Fit the line. for step in xrange(201): sess.run(train) if step % 20 == 0: print(step, sess.run(W), sess.run(b))

Page 182: Neural Network + Tensorflow 入門講座

....W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))y = W * x_data + b

# Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first. init = tf.initialize_all_variables()

# Launch the graph. sess = tf.Session() sess.run(init)

# Fit the line. for step in xrange(201): sess.run(train) if step % 20 == 0: print(step, sess.run(W), sess.run(b))

グラフの定義

最適化のアルゴリズム

グラフの起動

グラフで訓練繰り返し

Page 183: Neural Network + Tensorflow 入門講座

クラス分け(手書き文字の認識)の例

Page 184: Neural Network + Tensorflow 入門講座

....# Create the modelx = tf.placeholder("float", [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("float", [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})

ソースの全体は、こちらにある。https://goo.gl/MwscZO

Page 185: Neural Network + Tensorflow 入門講座

....# Create the modelx = tf.placeholder("float", [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("float", [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})

グラフの定義

最適化のアルゴリズム

グラフで訓練繰り返し

ソースの全体は、こちらにある。https://goo.gl/MwscZO

Page 186: Neural Network + Tensorflow 入門講座

この講演が扱った範囲

予告1Convolutional NN と

TensorFlow

φ(conv(X,W,...)+b)    φ(X ・ W+b)例えば、 Filter W: [32,32,1,32]

Page 187: Neural Network + Tensorflow 入門講座

予告2Neural Net とクラウドの最新動向

日時:  4 月 4 日 19:00~場所:  Google 六本木

登壇者   丸山不二夫、佐藤一憲 (Google)  他

3 月 23-24 日に行われる Google の GCP Next (Google Cloud Platform Next) の報告会を兼ねて、ニューラル・ネットワークとクラウドの最新動向を探ります。