Change before you have to.

androidアプリ開発、iosアプリ開発、rails、deep learning .etc.を使った社会実験。

無性に機械学習がしたくてdeep learningをアプリに実装してみた話②

前回は脳とニューラルネットの関係性について述べました。

 

今回はもう少し踏み込んだアルゴリズムの話をしようと思います。

 

そもそもニューラルネットワーク

脳の構造を模倣した構造である一方で、

れっきとした数理統計モデルの一種で、数学バリバリ使います。

特に学習する際のバックプロパゲーションに関しては

微分偏微分の知識が前提になっています。

けど、さんすう嫌いの方でも読めるように式を飛ばしても読めるよう工夫して書こうと思います。

 

ニューラルネットは大きく推測行動(feed-forward)と学習(learning)の2つのアクションがあります。

 

【推測行動】

視覚システムに限って言うと、人の脳が眼球内にある光受容体の視細胞から電磁波(光)を電気信号に変換し、脳内の特定のニューロンを刺激して頻繁に発火させながら信号を伝播し、最後に小脳、海馬や大脳辺縁系等の特定のニューロンを刺激して今見ている対象物を認識するように、

ニューラルネットも入力となる信号Iに対して脳内で処理し、判断するための出力ニューロンを定義してあげます。


まず、入力層は入力信号をそのまま出力し、

{ \displaystyle input_i}と表現することにします。

 

そうすると 中間層については

{ \displaystyle hidden_{p,q} = f(\small\sum_{q'=0}^{q'_{max}} hidden_{p-1,q'} * W_{q,q'}^{p,p-1} })

 となります。

 

但し、

{ \displaystyle hidden_{p,q}}はp列q番目の中間層ニューロンの出力値

{ \displaystyle W_{q,q'}^{p,p-1}}はp-1列q'番目ニューロンからp列q番目ニューロンへの接続加重

 関数fは{\displaystyle f(x)=\frac1{1+e^{-ax}}}であり、一般にシグモイド関数と呼ばれ、関数の形状から明らかですが原点を通過して右肩上がりの曲線を描き、aが大きくなる程その傾きがスティープ化します。

のちにバックプロパゲーションを説明する部分で出てきますが、シグモイド関数微分可能であること以上に、微分すると自分自体の式が現れるという特徴が重要です。 

{\displaystyle \frac{\partial f(x)}{\partial x}=\frac{\partial }{\partial x} \frac{1}{1+e^{-ax}}=\frac{e^{-ax}}{(1+e^{-ax})^2}=f(x)(1-f(x)) }

ちなみに同様の性質を持つ関数として

{\displaystyle tanh(ax)=\frac{1-e^{-2ax}}{1+e^{-2ax}}}

という双曲線関数も使用することができます。

 

要は入力信号をシャンパン、ニューロンをグラスに例えると

ニューラルネットワークは大小様々なグラスが積み重なったシャンパングラスのようなもので、

上からシャンパンを注ぐと、各グラスはその容積を満たすまではこぼさないのですが、

グラスの容積を超えるとシャンパンは下層のグラスに伝っていきます。

 

 

 

一般にパラメータaの大きくなる程ニューロンが活性化し易くなるので、学習スピードに影響しますが、チューニングを誤ると過学習や学習失敗(評価関数の発散)が起こり得ます。

 

ちなみにp=0の時、

{ \displaystyle hidden_{0,q} = f(\small\sum_{i=0}^{i_{max}} input_i * W_{q,i}^{0})}
であり、{ \displaystyle W_{q,i}^{0} }は入力ニューロンiから最低位層の中間層ニューロンqへの接続加重です。

 

出力層について

{ \displaystyle output_k = f( \small\sum_{q=0}^{q_{max}} hidden_{p_{max},q} * W_{k,q})}

 となります。

 

input→hidden→outputと順々に信号が伝播しますが、

接続加重Wは最初は「ランダム」なので、最初はデタラメな出力を吐き出します。

 

 

【評価と学習行動】

 そうして、ある一定期間注がれた後の

最下層の注がれているグラス(出力層のニューロン)の組み合わせが

最適になるように「評価」して各グラスの容量を変えていく作業が「学習」になります。

一般に出力層から中間層を経由して入力層へと接続荷重を更新していくので、バックプロパゲーション(backpropagation)、もしくは日本語で逆誤差伝播法と呼ばれます。

 ※簡単のため、今回は出力層と一番最後の中間層の間の学習のみ説明します。

 

 まず評価は出力値の認識がどれだけ正しいかという情報を数字に変換します。

 

今回は答えを教えないで学習するので、

出力ニューロンの出した回答(認識)が正解ならば報酬を、

不正解ならば罰(panishment)を与えるようにします。

 

 

通常、脳内ではシナプスが発火すればするほどシナプス(あるニューロンの軸索から別のニューロン樹状突起へ結合されている部分)が強くなり、信号を通しやすくします(Hebb則)。

※厳密にはHebbs則とは細胞Aの軸索が細胞Bを発火させるのに十分近くにあり、繰り返しあるいは絶え間なくその発火に参加するとき、いくつかの成長過程あるいは代謝変化が一方あるいは両方の細胞に起こり、細胞Bを発火させる細胞の1つとして細胞Aの効率が増加する、ことを言います。

 

ニューラルネットワークではこのようなシナプス結合のように、
ニューロンニューロンを結合する結合荷重を用意して、
正しい結果が得られれば結合荷重を強くすることで信号が伝わりやすくなるようにすることでHebb則擬きを実現しています。

 

 

先ほど正しい出力が得られれば報酬を、誤った出力ならば罰を、

という話だったので、こうした報酬と罰をそれぞれ+cδと−δ(ただし、{ \displaystyle c \in R})としてその報酬額をEと置くと、

Eは各結合荷重に対して連続な上への凸関数になる(微分可能なシグモイド関数を使っているメリット!)ので、例えばj番目の中間層ニューロンからk番目の出力ニューロンへの結合荷重の更新{ \displaystyle ΔW_{j,k}}は全微分を使うと

{ \displaystyle ΔW_{k,j} = \frac{\partial E}{\partial W_{j,k}} ΔE }

であり、Eは出力ニューロンoutput、出力ニューロンの入力値u、結合荷重wの変微分形式で表現してあげると

{ \displaystyle ΔW_{k,j} = \frac{\partial E}{\partial W_{j,k}} ΔE }

   { \displaystyle  = \frac{\partial E}{\partial output_{k}} \frac{\partial output_{k}}{\partial u_{k}} \frac{\partial u_{k}}{\partial W_{j,k}}ΔE }

であり、右辺は各々

{ \displaystyle \frac{\partial output_{k}}{\partial u_{k}} = \frac{\partial }{\partial u_k} \frac{1}{1+ e^{-au_k} } =  \frac{-ae^{-au_k}}{1+e^{-au_k}} = a \cdot (1-output_k) \cdot output_k }

 { \displaystyle \frac{\partial u_{k}}{\partial W_{j,k}} = \frac{\partial }{\partial W_{j,k}} \sum_{j'=0}^{max_j} hidden_{j'} \cdot W_{j',k} }

だから、結局

 

{ \displaystyle ΔW_{j,k} = -δ \cdot output_k \cdot (1-output_k) \cdot hidden_j \cdot δ}

 

となります。

 

 

こうして、j番目中間層ニューロンからk番目出力層ニューロンへの接続荷重は何度も何度もこの値を加えていくことで正しい出力が得られることになります。

 

tex形式で書くのが辛いので今日はここまで。

 

次回は今回の中間層-出力層間の学習結果をベースにして、複数中間層間の接続荷重の計算、入力層から中間層への接続荷重の計算(今回より若干複雑になります)をして、

実際の学習をobjective-cでコーディングした上で、3層構造ニューラルネットパーセプトロンと呼びます)の問題点を説明した後、

いよいよdeep learningのためのrestricted boltzmann machine、auto-encoding、deep boltzmann machineを行っていきます。

 

 

 

参考 

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

 

シグモイド関数の説明中にある、閾値を超えるような信号強度が入ってきた場合に発火するような単純な仕組みではありませんので、そういう点は実際の脳の構造と異なり注意が必要ですね。