Deeplearning ch02 and_gate.py

Chapter 02

第1章はnumpyのざっとした説明とmatplotlibの使い方の説明でしたが、第2章よりDeep Learning (深層学習に向けて初歩的なアルゴリズムパーセプトロンとAND、NAND、OR、XORゲートのプログラム内容の紹介をします。(第3章にニューロラルネットワークの説明があります。)

パーセプトロンとはパーセプトロン(perceptron)は、心理学者・計算機科学者のフランク・ローゼンブラットが1957年に考案し、1958年に論文を発表した、人工ニューロンニューラルネットワークの一種。(Wikipediaより)複数の入力信号を処理して、一つ出力を行うアルゴリズムです。ここで言う「処理」とは信号を流す(1)か流さない(0)かを決める処理となります。

パーセブトロンのアルゴリズムを式で表すと以下のようになります。
{y=\begin{eqnarray}\begin{cases}0\ (\omega_1x_1 + \omega_2x_2 \leqq\theta) \\1\ (\omega_1x_1 + \omega_2x_2 >\theta)\end{cases}\end{eqnarray}}
yは出力信号、x_1,x_2は入力信号、\omega_1,\omega_2は重み、\theta閾値(しきいち)を表します。入力信号に重みを掛けたものの総和が閾値を超えると出力信号1が出力されます。

import numpy as np

def AND(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

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

⇒ 重み\omega_1,\omega_2が0.5、\theta閾値が0.7のAND関数を定義します。入力信号x_1,x_2がそれぞれ(1,1)だとすると、{y=\begin{eqnarray}\ (1*0.5 + 1*0.5) - 0.7\ = 0.3>0.0\end{eqnarray}}となり出力信号1が出力されます。入力信号x_1,x_2がそれぞれ(0,0)とすると{y=-0.7\leqq\theta}、(1,0)とすると{y=-0.3\leqq\theta}となり、出力信号は全て0です。

入力信号が0,1である理由は、パーセプトロンの組み合わせにより、複雑な関数であってもパーセプトロンで表現できるという利点を前提としており、パーセプトロンからの出力(0,1)が次のパーセプトロンに入力されると想定しているためです。