2. 人工で再現するには

前回、人のニューラルネットワークは神経細胞が沢山つながっていて、1つの細胞が出力するかどうかはその細胞への入力があるレベルを超えたかどうかで決めると話しました。そんな細胞がたくさんあることで人間ができているのならば何とか再現して人間を作れそうですよね。別に人間の作り方を書きたいわけではないですが、そう考えるとワクワクします。
では早速、ニューラルネットワークを人工的に作るやり方を見ていきましょう。

モデル

人工ニューラルネットワークを考える上で、神経細胞をこんな風にモデル化してみます。
newralmodel2

左側のx1,x2,x3が入力で、それが中央のθ(シータ)が書いてある丸に集まります。これが1つの神経細胞です。そして出力が右側から出ています。
θというのは前回出てきた「入力がこのレベルを超えたら出力する」の”このレベル”のことです。入力の合計がシータを超えたら出力するわけです。この値のことを閾値(しきいち)といいます。
入力x1,x2と細胞の間にw1,w2というのが書いてありますが。これはそれぞれの重みです。
すごく単純に考えれば場合は x1 + x2 + x3 がθを超えたかどうかで出力すればよいのですが、「この細胞からの入力は大事」「この細胞からの入力はどうでもよい」といったことをしたいので重みを用意しています。このwはこのように使います。

input = w_1x_1+w_2x_2+w_3x_3

つまり、重みが0だとどんなに大きな入力xが来ても無視されるし、重みが大きいと、小さな入力でも重要視されます。入力がNこあったとすると、重みを考えた入力の合計(=細胞内電位)は以下のようになります。

input = {\displaystyle \sum_{i=1}^{N}} w_{i}x_{i}

 

出力は決定的か確率的か

入力に重み付けをするところまでは分かりました。あとは、出力するかどうかはこんなふうにすれば良さそうです
出力する = 入力(細胞内電位)が閾値を超えた
出力しない = 入力(細胞内電位) が閾値を超えてない
プログラム(C言語)的に書くとこのようになります。

if(入力の合計 > 閾値){
 // 出力する
}else{
 //出力しない
}

このように「入力が決まったら出力が1つに決まる」ことを決定的であるという言い方をします。
つまり、閾値が100だとして、入力の合計が90なら絶対出力しないし、101なら絶対出力します。これが決定的だということです。

これを神経細胞の代わりに使ってたくさん用意してつないでいってもいいのですが、ここで問題が。細胞を観察すると入力に何も入れていないのに、たまに自発的に(=自分から)出力することがあるそうです。「あ〜暇だな〜ちょっと出してみるか」とでも言わんばかりに出力してきます。
入力してないわけですから、閾値を超えてないですよね。今までの話と合いません。つじつまを合わせるために、どうやら神経細胞は決定的ではなく確率的に動くと考えたほうが良さそうです。

確率的というのは「入力により出力の確率だけが変わる」ということです。つまり、入力を大きくすると出力する確率が上がるのです。だから、入力が大きいからといって絶対出力するってことではないということです。
宝くじに似てます。たくさん買えばそれだけ1等の確率が上がります。逆に、買ったのが1枚だとしても当たるかもしれない。それでも、数が多ければ確率は上がっていきます。
細胞もそうならば、入力がなくても出力したっておかしくありません。
細胞の入力で出力の確率が決まるんだとして進めましょう。

では、問題はどんな風に確率が決まるかです。似たような関数はないものでしょうか。動きは分かっています。入力が弱かったら確率が限りなく0になって、強かったら限りなく100%に近づく。で、閾値のあたりで出力の確率がグンと上がる、そんな関数はなんでしょう。

シグモイド関数

ちょうどいい関数があります。シグモイド関数です。シグモイド関数は

sigmoid(x) = \frac{1}{1+{e}^{-\alpha x}}

このような形をしています。αが1だとして、グラフはこのようになります。
400px-SigmoidFunction
出典:wikibooks

xがマイナスに向かうと限りなく0となり、プラスに向かうと限りなく1(=100%)となります。また、0が閾値になっていて、0を境に変化します。
このグラフはαが1のときのものですが、αを変えるとこのように変わります。
sigmoic_half1
出典: beigebag.com

αが大きくなるほど0付近で大きく変化するようになります。αはゲインと呼ばれています。
ちなみに最初に出てきた決定的な動作というのを同じようにグラフにすると
400px-HardLimitFunction

このようなグラフになります。確率は決定的なので0%か、100%しかなく、閾値を境に切り替わります。確率的であるシグモイド関数も、αを大きくしていくといつかはこのような動きををするようになることから、決定的な動作というのは確率的な動作の一部であると考えられます。

さて、欲しかった関数としてはシグモイド関数がちょうどよさそうなので、これを使って考えていきましょう。
入力は上の方に書きましたので、これとシグモイド関数を使うと、ある入力で出力するかどうかの確率は

sigmoid\left({\displaystyle \sum_{i=1}^{N}} w_{i}x_{i} - \theta \right)

となります。シグモイド関数のxに入力の合計-θが入っただけです。θは閾値ですね。

注意しなければいけないのは、グラフを見る限りアナログ的ですが、細胞の出力は相変わらず0か1しか無いということです。シグモイド関数はあくまで入力がいくつの時に、出力が1になる確率がどのぐらいあるかを決めているだけで、その入力があった時に本当に出力が1になるかどうかは不明なのです。

何故シグモイド関数なのか

シグモイド関数以外にも同じような形になる関数はあるのに、何故シグモイド関数を使うのでしょうか。
実は後のほうでニューラルネットワークの学習方法というのをやるのですが、その時にこの確率を決める関数を微分する必要が出てきます。
シグモイド関数は微分しても形がほぼ変わらないのです。微分する前の値を微分した後にも使うことができるので計算が高速化出来るのです。

今日のまとめ

  • 実際の細胞は入力がなくても出力することがある。つまり入力は出力するかどうかの確率を変えているだけと考えられる
  • その確率を決める関数としてはシグモイド関数がちょうど良さそう