【DeepLeaning】 パーセプトロン 実装

Deep Learning とは何なのか・・・まったく知らない状態から挑戦してみたいと思います!

パーセプトロン X ANDゲート

def AND_gate(x1, x2):
    w1, w2, b = 1, 1, 0  # 重みとバイアスの初期化
    y = x1*w1 + x2*w2 + b  # 入力と重みの総和にバイアスを加える
    if y > 1:  # 総和が1以上の場合は1を出力
        return 1
    else:  # 総和が1未満の場合は0を出力
        return 0
print(AND_gate(0, 0))  # 0
print(AND_gate(0, 1))  # 0
print(AND_gate(1, 0))  # 0
print(AND_gate(1, 1))  # 1

バイアスとは?

ニューラルネットワークにおいて「バイアス(bias)」は、各ニューロンの入力に加算される定数値です。
バイアスはネットワークが学習するパラメーターの一つで、各ニューロンがどの程度活性化するかを決定するために使用されます。

バイアスは各ニューロンの重みと同様にランダムに初期化されます。そして、ネットワークが学習するときにバイアスも重みと同様に更新されます。
バイアスはニューラルネットワークの表現力を向上させることができます。

ゲタはき、とかカサマシという言葉がしっくりきますね。

バイアスって必要?

バイアスがない場合入力値がすべてゼロの場合にニューロンが活性化することはありません。
しかし、バイアスを導入することで、ニューロンが常に一定の出力を生成できるようになります。
これにより、ニューラルネットワークがより柔軟な関数を学習することができます。

重みとバイアスの関係

重みはパズルのピースに例えることができます。
パズルのピースは、全体像を形作るために重要な要素であり異なる形や色を持つ複数のピースが一緒になってパズルを完成させます。
ニューラルネットワークにおいても同様に重みは異なる入力に対する重要性を表しそれらの重みが一緒になってニューロンの出力を計算します。

バイアスはパズルの箱に例えることができます。
パズルの箱は、全体像を見るために必要な視点を提供しピースを正しい位置に配置するための基準となります。
ニューラルネットワークにおいても同様にバイアスはニューロンがどの程度活性化するかを制御するための基準を提供しニューロンが正しい出力を生成するための基準となります。

重みとバイアスはそれぞれ異なる要素を表し一緒になってニューラルネットワークの出力を形成するために必要です。
重みは入力の重要性を表しバイアスは出力の基準を提供します。

NAND, ORゲート

ANDゲートと対して変わっていません。

def NAND_gate(x1, x2):
    w1, w2, b = -1, -1, 0  # 重みとバイアスの初期化
    y = x1*w1 + x2*w2 + b  # 入力と重みの総和にバイアスを加える
    if y > -1:  # 総和が-1以上の場合は0を出力
        return 0
    else:  # 総和が-1未満の場合は1を出力
        return 1
print(NAND_gate(0, 0))  # 1
print(NAND_gate(0, 1))  # 1
print(NAND_gate(1, 0))  # 1
print(NAND_gate(1, 1))  # 0

こちらはORゲートです。

NANDゲートとは、重みが変わっただけですね。。。

def OR_gate(x1, x2):
    w1, w2, b = 1, 1, -0.5  # 重みとバイアスの初期化
    y = x1*w1 + x2*w2 + b  # 入力と重みの総和にバイアスを加える
    if y > 0:  # 総和が0以上の場合は1を出力
        return 1
    else:  # 総和が0未満の場合は0を出力
        return 0
print(OR_gate(0, 0))  # 0
print(OR_gate(0, 1))  # 1
print(OR_gate(1, 0))  # 1
print(OR_gate(1, 1))  # 1

AND, NAND, ORゲートともに、実装的にはほとんど違いはありませんね。