パーセプトロンについてまとめてみる

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者:斎藤 康毅
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)
 

 

こちらの本を最近読みました。

その中のパーセプトロンについて理解が進んだので

ブログに残したいと思います。

 

 

 

パーセプトロンとは?

 

ニューラルネットワークのもとにもなっているアルゴリズムです。

複数の信号を入力として受け取り、一つの信号を出力する形をとります。

 

f:id:cacapon:20210518105039p:plain

 

パーセプトロンは入力、出力ともに0か1になるようです。

 

重みについてはその入力の重要度を表します。

例えば重みが0.6の入力の場合、

入力があればその値は0.6となります。

 

そして、複数の入力の合計が限界値を超えた場合、

出力が1として扱われるようです。

(本書内ではニューロンが発火するという表現をしていました。)

 

 

この辺りは読んだだけでは上手く理解できなかったcacaponなのですが、

例を見たほうが理解しやすいと思うので、

pythonで作成した論理ゲートで説明しようと思います。

 

pythonで作成したパーセプトロンに基づいた論理ゲート

まずは、ANDゲートから。

 

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は

重みと限界値を変えるだけで作ることができます。

実際に見てみましょう。

  

パーセプトロンで作ったORゲート

 

パーセプトロンで作ったNANDゲート

 

変更しているのは重みと限界値のみです。

この特徴を知った時、おおっとなった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の実装を見てみましょう。

パーセプトロンで作ったXORゲート

 

共通部分はperceptron関数にまとめてありますが、

他の関数は前に紹介したものと同様の動作になります。

 

XORの関数を見て頂くと分かるかと思いますが、

中身はOR()とNAND()で得た結果を、

更に変数としてAND()に渡す、という事を行っています。

 

今回の例ではシンプルで分かりやすい論理ゲートで説明しましたが、

他のものも作れるようです。

 

本文中に触れていましたが、コンピュータも理論上は

パーセプトロンで作ることができるそうですよ。

 

この先の話

 

パーセプトロンの大まかな理解が出来た後は、

ニューラルネットワークの理解に入っていきます。

 

パーセプトロンニューラルネットワークの違いは、

中で使っている計算式の違いだけのようです。

 

今回使った計算式は

1: x1w1 + x2w2 >= Θ 

0: x1w1 + x2w2 < Θ

ですが、これだと0と1しか表せませんでした。

 

ニューラルネットワークでは

シグモイド関数やらReLUといった、

0,1以外の結果が返される関数を使うようですが、

この0,1以外の数値を使えるようになる

というのがポイントらしいです。

 

ただ、この辺りはまだ理解できていないので、

また理解が進まったらブログに残そうかなと思います。

 

それではまた。