Skip to content

DNET_Perceptron

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

パーセプトロン

概要

ここでは正確には、人工ニューロン、単純パーセプトロンについて説明する。

  • ニューラルネットワークの起源となるアルゴリズム

  • 米国の心理学者フランク・ローゼンブラットが1958年に提案。

  • パーセプトロンは

    • 複数の信号を入力として受取り、一つの信号を出力する。
    • ここでの信号は「流す/流さない(0/1)」の二値の値
  • パーセプトロンは

    • AND, NAND, ORなどの論理回路を表現できる。

    • 「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。

    • しかし、XORは、

      • 単層パーセプトロンでは表現できない。
        単層パーセプトロンは、線形領域しか表現できないため。
      • 従って、多層パーセプトロン(MLP)を用いる。
        多層パーセプトロン(MLP)は、非線形領域を表現できるため。
    • NANDの組み合わせから、原理的にはコンピュータを作ることができる。

  • パーセプトロンの収束定理

    • 線形分離可能な問題は、データからの自動学習が可能。
    • 線形分離不可能な問題は、データからの自動学習が不可能。
    • 有限回の学習によって線形分離可能な問題が解ける。
  • パーセプトロンの学習規則は、重回帰分析などで使用した二乗誤差関数での勾配降下法
    統計解析の該当節を参照)と異なる。

動作原理

(x1) --------- w1 --------> (y)
                             ↑
(x2) --------- w2 -----------┘
 入力信号  固有の重み     出力信号
  • xは「入力信号」、yは「出力信号」を表す。

  • wは「重み」 (= 信号の流れ易さ/難さ)を表す。

  • 入力信号、出力信号の()の部分を、「ニューロン」 or 「ノード」と呼ぶ。

  • 出力は、信号の総和 (x1 w1 + x2 w2) が閾値θより大きな値の場合に出力される。

    • この閾値θを超えた場合を「ニューロンが発火する」と表現することがある。
    • wもθも発火のし易さを制御するため「重み」と呼ぶことがある。
  • パーセプトロンの動作原理はこれだけ。

  • パーセプトロンを式に表すと以下のようになる。
    ┌
    │0 ( x1 w1 + x2 w2 <= θ )
y = <
    │1 ( x1 w1 + x2 w2 > θ )
    └
  • この式は、以下のように変形できる。
    ┌
    │0 ( -θ + x1 w1 + x2 w2 <= 0 )
y = <
    │1 ( -θ + x1 w1 + x2 w2 > 0 )
    └
    ┌
    │0 ( b + x1 w1 + x2 w2 <= 0 )
y = <
    │1 ( b + x1 w1 + x2 w2 > 0 )
    └

-θ= bはバイアスと呼ばれ、w, θ同様に、「重み」と呼ぶことがある。

  • 以下の図は動作原理にバイアスを加えたもの。
    以下の総和が0を超えた場合、1を出力する。
((1))--------- b  -----------┐
                             ↓
(x1) --------- w1 --------> (y)
                             ↑
(x2) --------- w2 -----------┘
入力信号  固有の重み     出力信号
  • 式を書き換える。
a = b + x1 w1 + x2 w2

活性化関数

活性化関数についてはニューラルネットワークの該当節も参照。

  • 活性化関数 (Activation Function)
    活性化関数 = 入力信号の総和を出力信号に変換する関数である。
    特に閾値によって出力が変わる活性化関数を Step関数
    ニューラルネットワークの該当節を参照)と呼ぶ。
           ┌
           │0 ( a <= 0 )
y = h(a) = <
           │1 ( a > 0 )
           └
  • 動作原理に反映する。
((1))--------- b  -----------┐
                             ↓  h()
(x1) --------- w1 --------> ((a) ---> (y))
                             ↑
(x2) --------- w2 -----------┘
入力信号   固有の重み     出力信号

論理回路をパーセプトロンで表現

機械学習では下のパラメタ(w1, w2, θ(-b))を決める作業をコンピュータに行わせる。

ANDゲート

下記のANDゲートを満たすパーセプトロン(w1, w2, θ(-b))を作る。

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

例(ANDゲート)

  • (w1, w2, θ) = (0.5, 0.5, 0.7)
  • (w1, w2, θ) = (0.5, 0.5, 0.8)
  • (w1, w2, θ) = (1.0, 1.0, 1.0)

プロット(ANDゲート)

 │
 0  ①
 │
 │
─0──0─────
 │

NANDゲート

下記のNANDゲートを満たすパーセプトロン(w1, w2, θ(-b))を作る。

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

例(NANDゲート)

(ANDゲートのパラメタの符号を反転すればOK)

  • (w1, w2, θ) = (-0.5, -0.5, -0.7)
  • (w1, w2, θ) = (-0.5, -0.5, -0.8)
  • (w1, w2, θ) = (-1.0, -1.0, -1.0)

プロット(NANDゲート)

 │
 ①  0
 │
 │
─①──①─────
 │

ORゲート

下記のORゲートを満たすパーセプトロン(w1, w2, θ(-b))を作る。

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

例(ORゲート)

  • (w1, w2, θ) = (0.5, 0.5, 0.3)
  • (w1, w2, θ) = (0.5, 0.5, 0.4)
  • (w1, w2, θ) = (1.0, 1.0, 0.9)

プロット(ORゲート)

 │
 ①  ①
 │
 │
─0──①─────
 │

XORゲート

下記のXORゲートを満たす1層のパーセプトロンを作ることはできない。

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

プロット(XORゲート)

理由は、以下の縦軸x1、横軸x2のプロットは、
非線形領域のため、閾値の直線を引けないため。

 │
 ①  0
 │
 │
─0──①─────
 │

多層のパーセプトロン

しかし、前述のANDNANDORのゲートを
組み合わせた多層のパーセプトロンであればXORゲートを作ることができる。

例えば、

  • s1 = NAND ゲート(x1, x2)
  • s2 = OR ゲート(x1, x2)
  • y = AND ゲート(s1, s2)

を使用すると、

x1, x2 が第0層、s1, s2 が第1層、y が第2層に対応する。

x1 x2 s1 s2 y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

と多層(2層)パーセプトロンとしてXORゲートを作ることができる。

(x1) ──NAND──→ (s1)─AND┐
  └── OR ───↑┐       ↓
                ││       (y)
  ┌───NAND──┘↓       ↑
(x2) ── OR ──→ (s2)─AND┘

論理回路をパーセプトロンで実装

簡単な実装

ここから、VSCodeでPythonファイルに書いた。

ANDゲート(簡単な実装)

"""This is a test program."""
def and_method(x_1, x_2):
    """This is a test program."""
    w_1, w_2, theta = 0.5, 0.5, 0.7
    tmp = x_1 * w_1 + x_2 * w_2
    if tmp <= theta:
        return 0
    else:
        return 1

print(and_method(0, 0))
print(and_method(1, 0))
print(and_method(0, 1))
print(and_method(1, 1))

NANDゲート(簡単な実装)

w, θを以下のようにする。

w_1, w_2, theta = -0.5, -0.5, -0.7

ORゲート(簡単な実装)

w, θを以下のようにする。

w_1, w_2, theta = 0.5, 0.5, 0.3

バイアスを用いた実装

簡単な実装バイアスとベクトルを用いて書き直す。

ANDゲート(バイアスを用いた実装)

"""This is a test program."""

import numpy as np

def and_method(x_1, x_2):
    """This is a test program."""
    x = np.array([x_1, x_2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = b + np.sum(x*w)
    if tmp <= 0:
        return 0
    else:
        return 1

print(and_method(0, 0))
print(and_method(1, 0))
print(and_method(0, 1))
print(and_method(1, 1))

NANDゲート(バイアスを用いた実装)

w, bを以下のようにする。

w = np.array([-0.5, -0.5])
b = 0.7

ORゲート(バイアスを用いた実装)

w, bを以下のようにする。

w = np.array([0.5, 0.5])
b = -0.3

XORゲート(バイアスを用いた実装)

多層パーセプトロン(MLP)として以下のように実装できる。

"""This is a test program."""

import numpy as np

def and_method(x_1, x_2):
    """This is a test program."""
    x = np.array([x_1, x_2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = b + np.sum(x*w)
    if tmp <= 0:
        return 0
    else:
        return 1

def nand_method(x_1, x_2):
    """This is a test program."""
    x = np.array([x_1, x_2])
    w = np.array([-0.5, -0.5])
    b = 0.7
    tmp = b + np.sum(x*w)
    if tmp <= 0:
        return 0
    else:
        return 1

def or_method(x_1, x_2):
    """This is a test program."""
    x = np.array([x_1, x_2])
    w = np.array([0.5, 0.5])
    b = -0.3
    tmp = b + np.sum(x*w)
    if tmp <= 0:
        return 0
    else:
        return 1

def xor_method(x_1, x_2):
    """This is a test program."""
    s_1 = nand_method(x_1, x_2)
    s_2 = or_method(x_1, x_2)
    return and_method(s_1, s_2)

print(xor_method(0, 0))
print(xor_method(1, 0))
print(xor_method(0, 1))
print(xor_method(1, 1))

参考


Tags: 移行, 人工知能, 深層学習, パーセプトロン, ニューラルネットワーク, 論理回路

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally