MNIST for ML Beginnersの数学的な意味合い

Tensor flowの初めの一歩のチュートリアルであるMNIST For ML Beginners
について、数学的な意味合いを書いてみようと思います。

(ブログに不慣れなもので、修正/継ぎ足しながら公開していくことをお許しください)

 

まず、このチュートリアルで実行していることは、

入力がn次元の配列 { x = (x_1, x_2, .. , x_n) } ({ x_i }は実数)が複数個あった時 、個々の出力 { y = (y_1, y_2, .. , y_m) } ({ \sum^m_{i=0}y_i = 1})を得る写像{ F }を用意して、出力{ y }が 個々の{ x }に対する解 { z = (z_1, z_2, .. , z_m) } (あるz=1以外はz=0) に近い結果を得れるように、Fを最適化することです。

 

ここで、{ x }の各要素{ x_i } は実数と書きましたが、これは概念上の話であり、プログラムの実装上ではfloatになります。以後、集合(つまり配列)の要素は数学上は実数ですが、プログラム上はfloatであると考えて下さい。{ y }は、{ \sum^m_{j=0}y_j = 1 }となるm個の(実数の)集合です。また任意の要素{ y_j }は0以上であり、したがって、{ y_j }は0から1までの値をとることになります。0%から100%の確率的な値だと考えると分かりやすいと思います(確率分布と言います)。解{ z }は (1, 0, .. , 0) , (0, 1, .. , 0) , (0,0, .. , 1) のような1つだけが1で残りが全て0のm個の集合(=配列)です。これも、1つが100%で、残りが0%ということを示していると考えてください(この1つだけが1の集合はone hotな集合と呼ばれています。)。結果が近いかどうかの評価は、複数の入力 { x_I } が与えられた時の各々のxに対する出力 { y_I = F(x_I) } が解{ z_I } に対するしてどれだけ正解したか(=正解率)で判断します({ x_I }{ x }のI番目の要素という意味ではなく、入力集合{ X }の1つの要素であるという意味です)。

 

各集合({ x_I }) に対して、正解({ z_I })、つまり教師が与えてられている状態で、写像 { F }の最適化を行うプロセスであることから、このチュートリアルは「教師付き」学習と呼ばれるものになります。

 

ML Beginnersでは、入力 { x } に28x28ピクセルの画像(つまり、n=784次元のベクトル(=配列))を用いており、正解と出力に0から9までの数字(つまり、yおよびzはm=10次元の0から1までの実数をとるベクトル)を用いています。正解率はおよそ91%程度で、これは機械学習界隈ではあまり優秀な結果ではないようです。なお、Expert向けのチュートリアルでは、正解率は99.2%程度になります。

 

両者の何が違うかというと、写像{ F }を作りこむロジックです。写像の方法としてはBeginners/Expertsのいずれも、行列 { W }(重み) とベクトル { b }(バイアス)を用いて、m=784次元のベクトルxからn=10次元のベクトルeを得る為の、{e=WX+b } という変換をおこないますが、最適な{(W,b) }の組み合わせを選ぶまでのロジックが違います。Beginnersでは、この(W,b)の組み合わせを得る為に、 活性化関数(activation function)としてsoftmax関数を、解と比較するための定量的な尺度として交差エントロピー (cross entropy)を、尺度の最適解の探索に勾配降下法を用いています。

 

このような数式から、Wは(784x10)の行列であり、bは10次元のベクトルになります。

 

各xごとにFを更新していく(=最適化していく、つまり学習していく)プロセスは以下のステップで進めます。(BeginnersとExpertsの違いは、このステップ自体の違いにあり、選択する関数の違いなどではありません)

1) 学習前の(W,b)の組み合わせが存在する。 (Wはnxm=784x10の行列(=2次元配列)、bはm=10のベクトル(=要素10の配列))

2) xを入力として、 e = Wx + b の解を得る。(eはm=10のベクトルです)

3) 得た解 eを活性化関数を用いて、yに変換する。(ここでは、活性化関数にsoftmax関数を用いています)

4) 正しい解 z と y に対して「差」を定量化する。(ここでは交差エントロピーを用いています)

5) 一定のアルゴリズムを用いて「差」が最小化させる。(ここでは勾配降下法を用いています)

6) 差が最小化された(W,b)の組み合わせを「学習結果」として次のxに対する初期値として与える。

 

最終的に得た、(W,b)の組み合わせにより、他のデータ x からの出力 y = F(x) = softmax(Wx+b) がZと適合しているか を確認することで得た正解率が、このプロセスに対する評価となります。

 

以降、各関数の意味合いについて書きたいと思います。

入力に対する最初の変換 e= Wx + b

e=Wx+bが行おうとしていることは、あらかじめ持っている入力の次元を求める出力の次元に合わせることです。チュートリアルの例では、ピクセルの要素である28x28=784個の数値から、0から9までの数値に対する判断をする必要があるので、784個の配列(=実数集合)を10個の配列に変換します。Wは(m,n)行列であり、Wxという行列変換により、m(=784)次元の実数集合からn(=10)次元の実数集合へ変換します。その後、n次元の配列bによりバイアスをかけて、n次の実数集合である出力eを得ます。式が一次方程式の形をなすところからわかるように、これはいわゆる線形変換であり、m次元の入力からn次元の出力を得る手段は他にもありえますが、この形式を用いるのが一般的です。ニューラルネットワークでは、このような線形変換を複数回繰り返すことで、様々な変換の表現を得ることになります。

活性化関数 softmax

次にsoftmax関数についてです。まず、softmax関数の定義は あるm次元の実数のベクトル  { e = ( e_1 , e_2 , .. , e_m ) } を入力とし、同じ次元の出力を得る関数で、要素  { e_j } に対応する出力が  { softmax_j(e) = exp(e_j) / \sum^m_{k=0}exp(e_k) } となるものです。分母から見て明らかなように、 { \sum^m_{k=0}softmax_k(e)=1 }となります。つまり、総和が常に1 (=100%)になるように設計された関数と言えます。

softmaxはシグモイド関数の多変量版です。シグモイド関数は、実数 { x}に対して  { sigmoid(x) = 1 / ( 1 + exp(-ax)) }という形の関数で、グラフにすると以下のようなものになります(このグラフはa=1の時のものです)。


(Wikipediaより引用)

この関数は { \lim_{x \to \infty} sigmoid(x) = 1 } { \lim_{x \to - \infty} sigmoid(x) = 0 }、sigmoid(0)=0.5となっています。これは日本語にすると、「全ての実数を0%から100%の間に写し込む。マイナスであればあるほど0%になり、プラスであればあるほど100%になる。真ん中の0は50%」という表現になり、与えられた値を確率に変換する為の関数であると考えることができます。

つぎに、なぜsoftmaxがsigmoidの多変量版なのかということを考えたいと思います。

aは空間を横に狭める作用をもたらす程度のものなので、以後a=1として考えます。

まず、 { exp(x) } { exp(x_1) }と表現し、シグモイド関数の分母分子に { exp(x_1) }をかけることで、 { sigmoid(x_1) = exp(x_1) / ( exp(x_1) + 1 ) }となります。この関数は、xの値が0の場合、 { exp(x_1) = 1}となり、50%の確率に落ち着くことになります。

この確率空間の変量が実は2、つまりベクトル  { x = (x_1,x_2) }だったらと考えます。 { exp(x_2) } { x_2=0 }の時に1ですから、sigmoidは実は、 { x_2 = 0 }の状態と考えると { sigmoid(x_1) = exp(x_1) / ( exp(x_1) + exp(0) ) }と考えることができます。 { x_2 }を0に固定せず、実数に拡張すると、 { sigmoid(x_1) = softmax_1(x) = exp(x_1) / ( exp(x_1) + exp(x_2) ) }と解釈することができます。

この関数は、例えば { x_1 } { x_2 }が同じ値だと、0.5=50%となります。2つの変量がある際、どちらに対する定量的な尺度が同じだとすると、片側に対する可能性が50%であるという風に解釈することができます。一方で、片方 { x_1 }が片方 { x_2 }よりも大きい値だとすると、 { x_1 }に対する可能性が高くなると解釈できます。

では、次にこれを変量がn個ある状態と解釈するにはどうすればいいでしょうか。 { x_3 , x_4, .. , x_n }に対しては、 { - \infty }であるという解釈を入れるとわかりやすいと思います。3以上のiに対して、  { exp(x_i) = 0 }が成り立ちますから、

 { sigmoid(x_1) =}

 { softmax_1(x_1,0,- \infty,- \infty,..,- \infty) = }

 { exp(x_1) / ( exp(x_1) + exp(0) + exp(- \infty) + exp(- \infty) + .. + exp(- \infty)) }

とみなし、これを実数値を持つ変数と考えることで、

 { sigmoid(x_1) = softmax_1(x) = exp(x_1) / \sum^m_{k=0}exp(x_k) }

を得ることができます。

これは、n個の変量、例えばn=10として、0から9までの整数をとる正解があった際に、0と1をとる確率までは考えたが、それ以外のことはまるで考えていない(つまり、定量的には、2から9までは { - \infty }である)と考えていた状態から、それ以外(2から9までの数字のことです)を考慮に入れて拡張させたと考えると、わかりやすいと思います。

参考までに、2変量(x,y)のxに関するsoftmax関数の3次元画像はこのような形になります。

f:id:neuralnet:20160428235111j:plain

f:id:neuralnet:20160428235116j:plain

f:id:neuralnet:20160428235129j:plain

 

交差エントロピーは以下の記事に書き足しました。

交差エントロピー

勾配降下法はまた別の記事に書きたいと思います。