簡単なパーセプトロンの論理回路プログラムの実装。pythonで書いてみた。

はじめに

O'Reillyさんの素晴らしい本「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」を勉強し、大体理解できたので、自分用のまとめ。

Anaconda(python, numpy, matplotlib)の基本的な事、機械学習の基本的な仕組みは学んでいる前提。

※不定期で何記事かに分けて投稿。

(単純)パーセプトロンとは?

  • 教師あり学習のアルゴリズムの一つ。
  • ディープラーニング(GOAL)につながる基本的なアルゴリズム。
  • 複数の信号(刺激)を入力として受け取り、なんらかの処理をした後、一つの信号を出力。
  • 人工ニューロンを2層に重ねた構造。
  • 望みの出力となるように、重みを調整することができる。
    • 人間の脳でいうと、重み=興味。興味(重み)が高いほど、記憶に残りやすくなる。
  • 神経細胞と同じ仕組みを人工的に再現したもの。

artificial_neuron.png
実際のプログラムでは①はx1、②はx2、 ③はx3。 それぞれをニューロンといい、この段階(層)を入力層という。(中心の丸を出力層。)
①の重みはw1、②の重みはw2、③の重みはw3。となる。
(wは、weight=重量の略)

処理の流れとしては、
1. 刺激を受けた入力層が各ニューロンと各重みをかけて出力層へ渡す。
2. 結果を受けた出力層はそれぞれの要素(各ニューロンの結果)の総和を割り出し、閾値1を超えているか確認。
3. 閾値1を超えていた場合、1を返し、閾値以下だった場合、0を返す。(output)

パーセプトロンは、複数ある入力信号(刺激)のそれぞれに固有の重み(興味)を持つ。
この重みは、各信号(刺激)の重要度をコントロールする要素として働く。
つまり、重みが大きいほど、その信号の重要度が高くなる。(記憶に残りやすくなる)。

簡単なパーセプトロンの実装

論理回路のAND、NAND、ORをpythonで実装。
※XORは記事が長くなりそうなので、次回の記事で実装(matplotlibも次回使用)。

ANDゲートの実装

ANDゲートの説明

  • 2つの入力を受け取る
  • 入力値がふたつとも1の場合のみ1を返す。それ以外は0を返す。

上記の条件を満たすパーセプトロンの重み・閾値の実装は無限にある。
例としては、
(w1, w2, theta) = (0.5, 0.5, 0.7)
や、
(1.0, 1.0, 1.0)
がある。
※theta = 閾値

上記(0.5, 0.5, 0.7)について、例えば、入力であるx1, x2にそれぞれ、1と1を入力。
重みとかけて足す。(x1 × w1) + (x2 × w2)
この計算の結果である「1」と閾値(theta)である0.7を比較。
今回は、結果が閾値を超えたので、1を返す。
といった処理になる。

ね?ANDゲートを実現するための重みと閾値のパターンは無限にあるでしょ?

ANDゲート
# 引数に、入力信号
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

バイアスの追加。

バイアスとは?

  • プログラムや通常の説明では「b」と表される。
  • 入力信号と重みをかけたものの総和に足されるもの。
    • ((x1 × w1) + (x2 × w2)) + b

この結果が閾値を超えれば、1を返す。といった感じ。

バイアスのメリット

  • 発火のしやすさのコントロールができる。

例えば、bが0.1であれば、入力信号の重み付きをかけたものの和が0.1を上回るだけで、ニューロンが発火する。(容易すぎ。)
ただ、bを20.0に設定すれば、ニューロンの発火は容易ではなくなる。

ANDゲート(バイアス追加ver)
def bias_AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    # np.sum() ...引数の総和を返す。
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

NANDゲートの実装

NANDゲートの説明

  • Not AND...ANDの出力を逆にしたものを返す。
  • (w1, w2, theta) = (-0.5, -0.5, -0.7)で実現してみる。
  • ANDゲートのすべてのパラメータの符号を反転させるだけでNANDゲートに変換が可能。
    • つまり、NANDゲートのパラメータも無限に存在する。
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

ORゲートの実装

ORゲートの説明

  • 入力信号がひとつでも1であれば、1を返す。
  • (w1, w2, theta) = (0.5, 0.5, -0.2)で実現してみる。
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

まとめ

パーセプトロンの構造は同じで、パラメータ(重みとバイアス)を変更するのみで、AND、NAND、ORの変更が可能。


  1. 閾値はその時々によって変わってくる。 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.