## secter 2 パーセプトロン ### chapter 2.1 パーセプトロンとは まず、パーセプトロンとはアルゴリズムの一種です。 詳しくは、複数の信号を入力として受け取り、一つの信号を出力するアルゴリズムとなっています。 パーセプトロンの動作原理を数式で表すとこうなります。 $$ \begin{equation} y = \begin{cases} 0, & w_1x_1 + w_2x_2\le \theta \\ 1, & w_1x_1+w_2x_2>\theta \end{cases} \end{equation} $$ wが重み(バイアス)を表しており、yが出力信号で、xが入力信号を表しております。 また、ここでのθは、送られてきた信号の総和の限界値としています。 パーセプトロンは、複数ある入力信号のそれぞれに固有の重みを持ちます。 そして、その重みは、各信号の重要性をコントロールする要素として働きます。 つまり、重みが大きければ大きいほど、その重みに対応する信号の重要性が高くなるのです。 ### chapter 2.2 単純な論理回路 #### 2.2.1 ANDゲート | x_1|x_2 | y| | ------ | ----------- | -------| | 0| 0| 0| | 1| 0| 0| | 0| 1| 0| | 1| 1| 1| このような、真理値表がある。 このような、2つの入力が1のときだけ1を出力し、それ以外は0を出力するようなものを**ANDゲート**と言います。 #### 2.2.2 NANDゲートとORゲート まずは、NANDゲートから。 NANDゲートの、NANDとは、Not ANDを表しており、ANDゲートと逆の振る舞いをします。 真理値表では、以下のようになります。 | x_1|x_2 | y| | ------ | ----------- | -------| | 0| 0| 1| | 1| 0| 1| | 0| 1| 1| | 1| 1| 0| このような、2つの入力が1のときだけ0を出力し、それ以外は1を出力するようなものを**NANDゲート**と言います。 続いては、ORゲートを紹介していきます。 早速真理値表から、 | x_1|x_2 | y| | ------ | ----------- | -------| | 0| 0| 0| | 1| 0| 1| | 0| 1| 1| | 1| 1| 1| このような、2つの入力のうちどちらか一方でも1のときに1を出力し、それ以外は0を出力するようなものを**ORゲート**と言います。 ここまで、3つの論理回路を紹介してきましたが、 重要な点は、**パーセプトロンの構造は、AND、NAND、ORゲートの全てで同じであるということ。** 実際この三つで違っている点は、パラメータ(重み)の値だけでした。 つまり、パラメータを変化させることによって、自在に変化させることが可能だということです。 ### chapter 2.3 パーセプトロンの実装 #### 2.3.1 簡単な実装 早速ANDゲートを実装していきます。 ```python= def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1*w1+x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 print(AND(0,0)) #0 print(AND(1,0)) #0 print(AND(0,1)) #0 print(AND(1,1)) #1 ``` #### 2.3.2 重みとバイアスの導入 パーセプトロンの動作原理の数式はこのようなものでした。 $$ \begin{equation} y = \begin{cases} 0, & w_1x_1 + w_2x_2\le \theta \\ 1, & w_1x_1+w_2x_2>\theta \end{cases} \end{equation} $$ こちらを、こうします。 bをバイアス、wを重みとしています。 $$ \begin{equation} y = \begin{cases} 0, & b+w_1x_1 + w_2x_2\le 0 \\ 1, & b+w_1x_1+w_2x_2>0 \end{cases} \end{equation} $$ ### 2.3.3 重みとバイアスの実装 ここでのバイアスとは、重みとは違う働きをすることに注意していきたい。 具体的には、w1,w2は入力信号への重要度をコントロールするパラメータとして機能するが、バイアスの方は、イベントの発火のしやすさを調整するパラメータとして機能します。 NANDゲートの実装をします。 ```python= def NAND(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) b = 0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 ``` ORゲートの実装の方はこちらになります。 ```python= def OR(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.2 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 ``` ### chapter 2.4 パーセプトロンの限界 #### 2.4.1 XORゲート XORゲートは、排他的論理和とも呼ばれている論理回路です。 早速真理値表から、 | x_1|x_2 | y| | ------ | ----------- | -------| | 0| 0| 0| | 1| 0| 1| | 0| 1| 1| | 1| 1| 0|