Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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. 閾値はその時々によって変わってくる。 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away