『ゼロから作るDeep Learning』(以下、『ゼロからDL』) 2章パーセプトロンのAND,OR,NANDは重みとバイアス値だけが異なる。
パーセプトロンとは、 複数の信号を入力として受け取り、一つの信号を出力する処理。 信号は、「流す:1」「流さない:0」の2値のみ。 今後、 ニューラルネットワークや ディープラーニングへと進む上で必要な考え方。
# cat and.py import numpy as np # 重みとバイアスを用いたANDゲート 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 print(AND(0,0), AND(0,1), AND(1,0), AND(1,1)) # cat nand.py import numpy as np # 重みとバイアスを用いたNANDゲート 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 print(NAND(0,0), NAND(0,1), NAND(1,0), NAND(1,1)) # cat or.py import numpy as np # 重みとバイアスを用いたORゲート 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 print(OR(0,0), OR(0,1), OR(1,0), OR(1,1))
実行結果 (.bashrcでalias py='python'にしてる)
py and.py 0 0 0 1 py nand.py 1 1 1 0 py or.py 0 1 1 1
ついでにNOR
# cat nor.py import numpy as np # 重みとバイアスを用いたNORゲート def NOR(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 print(NOR(0,0), NOR(0,1), NOR(1,0), NOR(1,1))
→1 0 0 0 になった。
単体のパーセプトロンには限界があり、 排他的論理和XORゲートを実装するには、 複数のゲートを組み合わせて 多層パーセプトロンにする必要がある。 結論から言えば、 NANDとORを ANDでつなぐ
# cat xor.py 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 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 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 def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y print(XOR(0,0), XOR(0,1), XOR(1,0), XOR(1,1)) #=> 0 1 1 0 排他的論理和になった