備忘録_重みとバイアス

備忘録_重みとバイアス

重みとバイアスの導入

以前使用したパーセプトロンの式からθをbに変更。bをバイアスと呼び、w1やw2を重みと呼ぶ。

     \[ y = \begin{cases} 0 & (w1x1 + w2x2 \geqq \theta) \\ 1 & (w1x1 + w2x2 < \theta) \end{cases} \]

     \[ y = \begin{cases} 0 & (b+w1x1 + w2x2\leqq 0) \\ 1 & (b+w1x1 + w2x2 > 0) \end{cases} \]

重みとバイアスによるANDゲート、NOTゲート、ORゲートの実装

重みのw1やw2は入力信号への重要度をコントロールするパラメータでバイアスは発火のしやすさ(出力信号が1を出力する度合い)を調整するパラメータとして機能する。バイアスという用語には「ゲタはき」という意味がある。これは、入力が何もないときに(入力が0のときに)、出力にどれだけゲタをはかせるか(値を上乗せするか)ということを意味する。AND、NAND、ORは同じ構造のパーセプトロンであり、違いは重みとバイアスの値だけである。

Perceptron.py
import numpy as np


class Perceptron:

    def AND(self, x1, x2):  # ANDゲート
        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(self, x1, x2):  # NANDゲート
        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(self, x1, x2):  # ORゲート
        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


p = Perceptron()
print("p.AND(0, 0) ⇒ " + str(p.AND(0, 0)))
print("p.AND(1, 0) ⇒ " + str(p.AND(1, 0)))
print("p.AND(0, 1) ⇒ " + str(p.AND(0, 1)))
print("p.AND(1, 1) ⇒ " + str(p.AND(1, 1)))
print("----------------")
print("p.NAND(0, 0) ⇒ " + str(p.NAND(0, 0)))
print("p.NAND(1, 0) ⇒ " + str(p.NAND(1, 0)))
print("p.NAND(0, 1) ⇒ " + str(p.NAND(0, 1)))
print("p.NAND(1, 1) ⇒ " + str(p.NAND(1, 1)))
print("----------------")
print("p.OR(0, 0) ⇒ " + str(p.OR(0, 0)))
print("p.OR(1, 0) ⇒ " + str(p.OR(1, 0)))
print("p.OR(0, 1) ⇒ " + str(p.OR(0, 1)))
print("p.OR(1, 1) ⇒ " + str(p.OR(1, 1)))
print("----------------")

実行結果
p.AND(0, 0) ⇒ 0
p.AND(1, 0) ⇒ 0
p.AND(0, 1) ⇒ 0
p.AND(1, 1) ⇒ 1
----------------
p.NAND(0, 0) ⇒ 1
p.NAND(1, 0) ⇒ 1
p.NAND(0, 1) ⇒ 1
p.NAND(1, 1) ⇒ 0
----------------
p.OR(0, 0) ⇒ 0
p.OR(1, 0) ⇒ 1
p.OR(0, 1) ⇒ 1
p.OR(1, 1) ⇒ 1
----------------