近年盛んに利用されている技術として ディープラーニングや機械学習があります。
そこでディープラーニングの根幹となったニューラルネットワーク、パーセプトロンについて調べました。
Contents
ニューラルネットワーク
ニューラルネットワークとは動物や人間の脳の神経回路のネットワーク構造を模擬した並列分散型の情報処理システムのことです。
動物の神経回路
脳の神経回路は、多くの神経細胞(ニューロン)がシナプスと呼ばれる電気的な結合部を介して結合しています。脳はこのニューロンの中を電気的な信号が伝播することによって情報が伝達されます。
ニューロンはシナプスを介して他のニューロンから信号を受け取ります。そして受け取った信号が閾値を超えている時、他のニューロンへ信号を伝達(発火)します。
パーセプトロン
この脳の生理学の成果をもとに脳細胞の神経回路を単純化・模擬したものがニューラルネットワークです。
1945年、このニューラルネットワークを利用することによって論理関数の計算が可能なことが示したのが、マッカロックとピッツです。
その後1958年にローゼンブラットによって、学習する神経回路モデルのパーセプトロンが提案されました。
ニューラルネットワークにはニューロンの結合方法によっていくつか種類があります。その中で特に入力から出力まですべて順方向に結合しているものを階層構造ニューラルネットワークとよび、その一種としてパーセプトロンがあります。
単純パーセプトロン
単純パーセプトロンはローゼンブラットが用いたパーセプトロンのモデルで、その後改良改良された多層パーセプトロンとと比較して呼ばれます。
オリジナルの単純パーセプトロンの構造はつぎのように示されます。単純パーセプトロンは入力層(S層)、重み(A層)、出力層(S層)から構成されています。しかしながらS層を扱わずA層とR層のみで構成されたパーセプトロンとして使うことがあります。
では実際に単純パーセプトロンはどのように働くのか、簡単な例を作成してみます。
単純パーセプトロンの実装
では実際に非常に簡単な単純パーセプトロンを実装したいと思います。
実装にはPythonを使用しました。
実装モデル
実装のモデルには次のような2入力、1出力のものを使用します。
- x1, x2 : 入力
- w1, w2 : 重み – 入力の重要度を示す。
- θ : 閾値またはバイアス – ニューロンの発火のしやすさを示す。
- y : 出力
この単純パーセプトロンの動作は非常に単純で次の式で表されます。
つまり入力と重みの積の合計が閾値よりも大きいと1を、そうでないなら0を出力します。
AND回路の実装
初めに簡単な例として論理回路のAND回路を単純パーセプトロンで表現したいと思います。
AND回路は次のような真理値表を持ちます。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
先のほどパーセプトロンモデルにx1.x2を入力しTable.1のように出力する重みw1とw2、閾値θは次のような条件となります。
今回は閾値θ = 1.0、w1 = 1.0、w2 =1.0 としました。
ではこれをコード示すと次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import numpy as np #AND関数の定義 def AND(x1,x2): theta = 1.0 x = np.array([x1,x2]) w = np.array([1.0,1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 #AND関数の実行 print("AND(0,0) = {0}".format(AND(0,0))) print("AND(0,1) = {0}".format(AND(0,1))) print("AND(1,0) = {0}".format(AND(1,0))) print("AND(1,1) = {0}".format(AND(1,1))) |
実行結果は次のようになります。
1 2 3 4 5 |
#実行結果 AND(0,0) = 0 AND(0,1) = 0 AND(1,0) = 0 AND(1,1) = 1 |
NAND回路の実装
同様にNAND回路も実装します。
NAND回路の真理値表は次の通りです。
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
パーセプトロンは重みとバイアスを変更することによって様々な計算を表現することができるので、AND回路とNAND回路の違いは重みとバイアスの値だけです。
今回はθ = 1.5、w1 = -1.0、w2 = -1.0としました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np def NAND(x1,x2): theta = -1.5 x = np.array([x1,x2]) w = np.array([-1.0,-1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 print("NAND(0,0) = {0}".format(NAND(0,0))) print("NAND(0,1) = {0}".format(NAND(0,1))) print("NAND(1,0) = {0}".format(NAND(1,0))) print("NAND(1,1) = {0}".format(NAND(1,1))) |
実行結果です。
1 2 3 4 |
NAND(0,0) = 1 NAND(0,1) = 1 NAND(1,0) = 1 NAND(1,1) = 0 |
OR回路の実装
同様にOR回路も実装します。
OR回路の真理値表は次の通りです。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
今回はθ = 1.5、w1 = -1.0、w2 = -1.0としました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np def OR(x1,x2): theta = 0.5 x = np.array([x1,x2]) w = np.array([1.0,1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 print("OR(0,0) = {0}".format(OR(0,0))) print("OR(0,1) = {0}".format(OR(0,1))) print("OR(1,0) = {0}".format(OR(1,0))) print("OR(1,1) = {0}".format(OR(1,1))) |
実行結果です。
1 2 3 4 |
OR(0,0) = 0 OR(0,1) = 1 OR(1,0) = 1 OR(1,1) = 1 |
単純パーセプトロンの限界
XOR回路
つぎにXOR回路について考えたいと思います。
XOR回路は次のような真理値表を持ちます。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
しかしこのXOR回路を今回使用した単純パーセプトロンモデルでは表現することはできません。
線形分離可能
単純パーセプトロンの重要な特性として、パーセプトロンは線形分離可能なものしか表現することができません。
線形分離可能とは次のようなものをいいます。これはAND回路の働きを平面で表したものです。
このように平面上の点の集合を1本の直線で分離できるものしかパーセプトロンでは扱えません。
一方XORを平面上で表すと次のようになり、線形分離不可能なことがわかります。
このような問題を扱うにはより高度な多層パーセプトロンを扱う必要があります。
線形分離について詳しくは次の記事を参照してください。
まとめ
- ニューラルネットワーク・パーセプトロンは脳の神経回路を模して作られた計算モデル
- 単純パーセプトロンは入力・重み・バイアス・出力からモデルを構成する。
- 単純パーセプトロンを使用することでAND・NAND・ORなどの論理回路を表現することができる
- 単純パーセプトロンは線形分離可能な問題しか扱えない
- 線形分離不可能な問題は多層パーセプトロンを使用する必要がある。
関連記事