コンテンツ
パーセプトロンアルゴリズム
1957年に、ニューラルネットワークの起源アルゴリズムであるアメリカの学者FrankRsenblattによって提案されました。
コンセプト
複数の入力信号を受信し、1つの信号(0または1)を出力します
これは、3つの入力信号を受け入れるパーセプトロンの例です。
入力信号がニューロンによって受信される前に、それぞれの重み1が乗算され、次にニューロンによって処理され(ここでの処理は入力ニューロンの重み付き合計です)、ニューロンの疑似出力値を取得します。準出力値が特定のしきい値よりも大きい場合、ニューロンは1を出力し、ニューロンがアクティブ化されていることを示します2
上記のプロセスを数式で次のように表現します。
上記の数式から、しきい値は実際にニューロンがアクティブ化される容易さを表し、実際の出力値finalは入力と線形関係にあることがわかります。したがって、上記の数式は次のように書くこともできます。
パーセプトロンを使用した単純な論理回路の実装
私たちはおそらくパーセプトロンの理論を知っていますが、実際の問題を解決するためにそれをどのように使用できますか?
ANDゲート
特徴:
入力がすべて1の場合、出力1、それ以外の場合は出力0
真理値表
ANDゲートは、2つの入力と1つの出力を持つゲート回路です。入力信号と出力信号の関係は、次の真理値表を参照しています。
x1 | x2 | 最後の |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
パーセプトロンの実装
def AND(x1,x2):
w1,w2,theta=0.5,0.5,0.7
tmp=w1*x1+w2*x2
if tmp<=theta:
return 0
else:
return 1
改善:
上記のアルゴリズムから、出力tmpを計算するときに、重みと入力値を乗算する式を計算する必要があることがわかります。入力値が多い場合、この式は非常に冗長になります。この問題では、numpy配列操作を導入します。
def AND(x1,x2):
x=np.array([x1,x2]) # 引入numpy数组
w=np.arry([0.5,0.5]) # 引入numpy数组
b=-0.7
tmp=np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
NANDゲート
特徴
両方の入力が1の場合は0を出力し、それ以外の場合は1を出力します。
真理値表
x1 | x2 | 最後の |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
パーセプトロンの実装
def NAND(x1,x2):
x=np.array([x1,x2])
w=np.arry([-0.5,-0.5])
b=0.7
tmp=np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
ORゲート
特徴
1つの出力信号が1である限り、出力1、それ以外の場合は出力0
真理値表
x1 | x2 | 最後の |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
パーセプトロンの実装
def OR(x1,x2):
x=np.array([x1,x2])
w=np.arry([0.5,0.5])
b=-0.2
tmp=np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
パーセプトロンの限界について
- ニューラルネットワークトレーニングの本質:上記の3つの論理回路の実装プロセスを注意深く観察すると、重みパラメーターとしきい値のみが異なりますが、異なる機能が実現されていることがわかります。実際、ニューラルネットワークトレーニングの本質は継続的に行うことです。重みパラメータを最適化し、将来の学習プロセスで3
- パーセプトロンの制限:
ANDゲート、NANDゲート、ORゲートはすべて、線形関数によって2つのスペースに分割でき、一方は0を出力し、もう一方は1を出力します。
ただし、XORゲートは直線で分割できません。2空間は曲線を使用することによってのみ2つの空間に分割できます。直線で分割された空間は線形空間と呼ばれ、曲線で分割された空間は非線形空間と呼ばれます。
XORゲート
単一のパーセプトロンはXORゲートを表すことはできませんが、複数のパーセプトロンをスタックすることで表すことができます
パーセプトロンの実装
多層パーセプトロンにXORゲートを実装するには、さまざまな方法があります。著者はここで1つ紹介します。x1、x2入力はNANDゲートとORゲートの入力として使用され、NANDゲートとORゲートの出力は入力として使用されます。 ANDゲートの
コード
def XOR(x1,x2):
return AND(NAND(x1,x2),OR(x1,x2))