パーセプトロンについてまとめてみる
こちらの本を最近読みました。
その中のパーセプトロンについて理解が進んだので
ブログに残したいと思います。
パーセプトロンとは?
ニューラルネットワークのもとにもなっているアルゴリズムです。
複数の信号を入力として受け取り、一つの信号を出力する形をとります。
パーセプトロンは入力、出力ともに0か1になるようです。
重みについてはその入力の重要度を表します。
例えば重みが0.6の入力の場合、
入力があればその値は0.6となります。
そして、複数の入力の合計が限界値を超えた場合、
出力が1として扱われるようです。
(本書内ではニューロンが発火するという表現をしていました。)
この辺りは読んだだけでは上手く理解できなかったcacaponなのですが、
例を見たほうが理解しやすいと思うので、
pythonで作成した論理ゲートで説明しようと思います。
pythonで作成したパーセプトロンに基づいた論理ゲート
まずは、ANDゲートから。
この関数はX1,X2として二つの入力を受け取ります。
コードを簡略化しているので0or1以外も受け付けてしまいますが、
引数は0か1しか受け付けないものとして考えて頂ければ幸いです。
重みはどちらの入力に対しても0.5で
限界値を表すΘ(theta)は0.7としています。
ですので想定される計算結果としては
X1,X2ともに0 -> tmp=0
X1,X2どちらか1 -> tmp=0.5
X1,X2ともに1 -> tmp=1
となり、
限界値Θを超えるためには
二つ入力があった場合のみ返り値が1を返す
ようにしてあるのです。
この動作はANDゲートと同じ動きになるのは、
ANDの真理値を知っている方なら分かるかと思います。
いかがでしたでしょうか?
パーセプトロンの動きは何となくでも伝わったのなら幸いです。
重みと限界値を変えて機能を変える
ところで、ANDゲート用にパーセプトロンで作ったわけですが、
他の論理回路も作れるのでしょうか?
実は、NANDとORは
重みと限界値を変えるだけで作ることができます。
実際に見てみましょう。
変更しているのは重みと限界値のみです。
この特徴を知った時、おおっとなったcacaponなのでした。
この考えはほかの関数を作る時に参考になりそうですね。
複数のパーセプトロンを繋げて複雑な機能を作る
因みに、XORゲートは重み、限界値の変更だけでは作ることが出来ません。
どのように作るのでしょうか?
答えとしては別の論理ゲートをくっつけることで作ることができます。
実はパーセプトロンは何層もつなぎ合わせることで
複雑な機能を持たせることができるのです。
では、実際にXORゲートで見てみましょう。
XORの真理値は下記の通りになります。
[X1,X2 | Y]
0,0 | 0
0,1 | 1
1,0 | 1
1,1 | 0
片側だけ1になっているときだけ出力が1になるゲートがXORになります。
この形は、ORゲート(0,1,1,1)とNANDゲート(1,1,1,0)をANDゲートで
繋げることで実現することができます。
では、pythonの実装を見てみましょう。
共通部分はperceptron関数にまとめてありますが、
他の関数は前に紹介したものと同様の動作になります。
XORの関数を見て頂くと分かるかと思いますが、
中身はOR()とNAND()で得た結果を、
更に変数としてAND()に渡す、という事を行っています。
今回の例ではシンプルで分かりやすい論理ゲートで説明しましたが、
他のものも作れるようです。
本文中に触れていましたが、コンピュータも理論上は
パーセプトロンで作ることができるそうですよ。
この先の話
パーセプトロンの大まかな理解が出来た後は、
ニューラルネットワークの理解に入っていきます。
パーセプトロンとニューラルネットワークの違いは、
中で使っている計算式の違いだけのようです。
今回使った計算式は
1: x1w1 + x2w2 >= Θ
0: x1w1 + x2w2 < Θ
ですが、これだと0と1しか表せませんでした。
シグモイド関数やらReLUといった、
0,1以外の結果が返される関数を使うようですが、
この0,1以外の数値を使えるようになる
というのがポイントらしいです。
ただ、この辺りはまだ理解できていないので、
また理解が進まったらブログに残そうかなと思います。
それではまた。