ゼロから1までのニューラルネットワーク(Python)の実装:1

パーセプトロンアルゴリズム

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

パーセプトロンの限界について

  1. ニューラルネットワークトレーニングの本質:上記の3つの論理回路の実装プロセスを注意深く観察すると、重みパラメーターとしきい値のみが異なりますが、異なる機能が実現されていることがわかります。実際、ニューラルネットワークトレーニングの本質は継続的に行うことです。重みパラメータを最適化し、将来の学習プロセスで3
  1. パーセプトロンの制限
    ここに画像の説明を挿入

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))

  1. 各入力信号値には独自の重みがあり、これらの重みは入力信号の重要性を表します。つまり、重み値が高いほど、対応する信号値が出力値に与える影響が大きくなります↩✧

  2. 実際、生物学的ニューロンの動作メカニズムでは、ニューロンはすべての入力値に対して単に出力値を生成するのではなく、入力値が特定のしきい値に達すると応答します。著者の理解:ニューラルネットワークは生体工学の知識であり、パーセプトロンの設定も生物学的ニューロンに触発されています↩✧

  3. 著者の認識:いわゆる優れたニューラルネットワークモデルは、最適化された重みパラメーターが特定の問題に対して優れたフィッティング効果を達成できるというものです↩✧

おすすめ

転載: blog.csdn.net/m0_54510474/article/details/124013237