無性に機械学習がしたくてdeep learningをアプリに実装してみた話②
前回は脳とニューラルネットの関係性について述べました。
今回はもう少し踏み込んだアルゴリズムの話をしようと思います。
そもそもニューラルネットワークは
脳の構造を模倣した構造である一方で、
れっきとした数理統計モデルの一種で、数学バリバリ使います。
特に学習する際のバックプロパゲーションに関しては
けど、さんすう嫌いの方でも読めるように式を飛ばしても読めるよう工夫して書こうと思います。
ニューラルネットは大きく推測行動(feed-forward)と学習(learning)の2つのアクションがあります。
【推測行動】
視覚システムに限って言うと、人の脳が眼球内にある光受容体の視細胞から電磁波(光)を電気信号に変換し、脳内の特定のニューロンを刺激して頻繁に発火させながら信号を伝播し、最後に小脳、海馬や大脳辺縁系等の特定のニューロンを刺激して今見ている対象物を認識するように、
ニューラルネットも入力となる信号Iに対して脳内で処理し、判断するための出力ニューロンを定義してあげます。
まず、入力層は入力信号をそのまま出力し、
と表現することにします。
そうすると 中間層については
となります。
但し、
はp列q番目の中間層ニューロンの出力値
はp-1列q'番目ニューロンからp列q番目ニューロンへの接続加重
関数fはであり、一般にシグモイド関数と呼ばれ、関数の形状から明らかですが原点を通過して右肩上がりの曲線を描き、aが大きくなる程その傾きがスティープ化します。
のちにバックプロパゲーションを説明する部分で出てきますが、シグモイド関数は微分可能であること以上に、微分すると自分自体の式が現れるという特徴が重要です。
ちなみに同様の性質を持つ関数として
という双曲線関数も使用することができます。
要は入力信号をシャンパン、ニューロンをグラスに例えると
ニューラルネットワークは大小様々なグラスが積み重なったシャンパングラスのようなもので、
上からシャンパンを注ぐと、各グラスはその容積を満たすまではこぼさないのですが、
グラスの容積を超えるとシャンパンは下層のグラスに伝っていきます。
一般にパラメータaの大きくなる程ニューロンが活性化し易くなるので、学習スピードに影響しますが、チューニングを誤ると過学習や学習失敗(評価関数の発散)が起こり得ます。
ちなみにp=0の時、
であり、は入力ニューロンiから最低位層の中間層ニューロンqへの接続加重です。
出力層について
となります。
input→hidden→outputと順々に信号が伝播しますが、
接続加重Wは最初は「ランダム」なので、最初はデタラメな出力を吐き出します。
【評価と学習行動】
そうして、ある一定期間注がれた後の
最下層の注がれているグラス(出力層のニューロン)の組み合わせが
最適になるように「評価」して各グラスの容量を変えていく作業が「学習」になります。
一般に出力層から中間層を経由して入力層へと接続荷重を更新していくので、バックプロパゲーション(backpropagation)、もしくは日本語で逆誤差伝播法と呼ばれます。
※簡単のため、今回は出力層と一番最後の中間層の間の学習のみ説明します。
まず評価は出力値の認識がどれだけ正しいかという情報を数字に変換します。
今回は答えを教えないで学習するので、
出力ニューロンの出した回答(認識)が正解ならば報酬を、
不正解ならば罰(panishment)を与えるようにします。
通常、脳内ではシナプスが発火すればするほどシナプス(あるニューロンの軸索から別のニューロンの樹状突起へ結合されている部分)が強くなり、信号を通しやすくします(Hebb則)。
※厳密にはHebbs則とは細胞Aの軸索が細胞Bを発火させるのに十分近くにあり、繰り返しあるいは絶え間なくその発火に参加するとき、いくつかの成長過程あるいは代謝変化が一方あるいは両方の細胞に起こり、細胞Bを発火させる細胞の1つとして細胞Aの効率が増加する、ことを言います。
ニューラルネットワークではこのようなシナプス結合のように、
ニューロンとニューロンを結合する結合荷重を用意して、
正しい結果が得られれば結合荷重を強くすることで信号が伝わりやすくなるようにすることでHebb則擬きを実現しています。
先ほど正しい出力が得られれば報酬を、誤った出力ならば罰を、
という話だったので、こうした報酬と罰をそれぞれ+cδと−δ(ただし、)としてその報酬額をEと置くと、
Eは各結合荷重に対して連続な上への凸関数になる(微分可能なシグモイド関数を使っているメリット!)ので、例えばj番目の中間層ニューロンからk番目の出力ニューロンへの結合荷重の更新は全微分を使うと
であり、Eは出力ニューロンoutput、出力ニューロンの入力値u、結合荷重wの変微分形式で表現してあげると
であり、右辺は各々
だから、結局
となります。
こうして、j番目中間層ニューロンからk番目出力層ニューロンへの接続荷重は何度も何度もこの値を加えていくことで正しい出力が得られることになります。
tex形式で書くのが辛いので今日はここまで。
次回は今回の中間層-出力層間の学習結果をベースにして、複数中間層間の接続荷重の計算、入力層から中間層への接続荷重の計算(今回より若干複雑になります)をして、
実際の学習をobjective-cでコーディングした上で、3層構造ニューラルネット(パーセプトロンと呼びます)の問題点を説明した後、
いよいよdeep learningのためのrestricted boltzmann machine、auto-encoding、deep boltzmann machineを行っていきます。
参考
ヘッブの法則(ヘッブのほうそく)は、脳のシナプス可塑性についての法則である。ヘッブ則、ヘブ則とも呼ばれる。心理学者のドナルド・ヘッブによって提唱された。ニューロン間の接合部であるシナプスにおいて、シナプス前ニューロンの繰り返し発火によってシナプス後ニューロンに発火が起こると、そのシナプスの伝達効率が増強される。また逆に、発火が長期間起こらないと、そのシナプスの伝達効率は減退するというもの。(出典:ヘッブの法則 - Wikipedia)
シグモイド関数の説明中にある、閾値を超えるような信号強度が入ってきた場合に発火するような単純な仕組みではありませんので、そういう点は実際の脳の構造と異なり注意が必要ですね。