LoginSignup
5
3

More than 5 years have passed since last update.

ゼロから作る Deep Learning 2章 パーセプトロン(読書メモ)

Last updated at Posted at 2017-01-05

はじめに

この記事はなに?

勉強会用の資料兼メモ書きです。内容の妥当性については一切保証しかねるため、引用等はお控えいただくことをおすすめします.

参考リンク

2.1 パーセプトロンとは

perceptron.png

2入力のパーセプトロン(「ゼロから作る Deep Learning」P.22より)

  • 複数の信号を入力として受け取り、ひとつの信号を出力するモデル
  • 信号は 0 (流さない) or 1 (流す) の二値
  • 各入力に固有の重み $ w^1, w^2 ... $ が乗算される(e.g. $ w^1x^1 $)
  • 重みが大きいほど対象となる信号の重要性が増す
  • 入力値の総和が任意の閾値 $ \theta $ を超えると 1 を出力する(「ニューロンが発火する」)

出力を $ y $ として、上記の要素を数式で表すと以下となる.

y = \left\{
\begin{array}{ll}
0 & (w^1x^1 + w^2x^2 \leqq \theta) \\
1 & (w^1x^1 + w^2x^2 \gt \theta)
\end{array}
\right.

2.2 単純な論理回路

  • パーセプトロンを使用することで AND / NAND /OR の論理回路を表現できる
  • パーセプトロンの構造に変更を加えること無く、重みと閾値を変化させる振る舞いを変える

2.2.1 AND ゲート

P.23 「図2-2 AND ゲートの真理値表」を参照

  • 2つの入力が 1 のときだけ 1 を出力し、それ以外は 0 を出力する
  • 2つの入力値の総和が閾値 $ \theta $ を超えると出力をおこなうパーセプトロン

2.2.2.1 NAND ゲート

P.24 「図2-3 NAND ゲートの真理値表」を参照

  • NAND = Not AND = AND ゲートと逆の振る舞い
  • 両方が 1 のときだけ 0 を出力し、それ以外は 1 を出力する
  • AND ゲートを実現するパラメータの値に対して、その符号を反転させると NAND ゲートになる

2.2.2.2 OR ゲート

  • 最低でもひとつの入力が 1 であれば 1 を出力する

2.3 パーセプトロンの実装

2.3.1 簡単な実装

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

2.3.2 重みとバイアスの導入

  • 2.3.1 の AND 回路にバイアスを導入する.
  • バイアスを $ b $ として、式 2.1 の $ \theta $ を $ -b $ に置き換える.
y = \left\{
\begin{array}{ll}
0 & (w^1x^1 + w^2x^2 \leqq \theta) \\
1 & (w^1x^1 + w^2x^2 \gt \theta)
\end{array}
\right.

$$ ↓ $$

y = \left\{
\begin{array}{ll}
0 & (b + w^1x^1 + w^2x^2 \leqq 0) \\
1 & (b + w^1x^1 + w^2x^2 \gt 0)
\end{array}
\right.

インタプリタで確認してみましょう.

>>> import numpy as np
>>> x = np.array([0, 1]) # 入力
>>> w = np.array([0.5, 0.5]) # 重み
>>> b = -0.7 # バイアス
>>> w * x
>>> np.sum(w * x)
>>> np.sum(w * x) + b

2.3.3 重みとバイアスによる実装

前項を踏まえて AND / NAND / OR の各回路を実装してみましょう.

  • AND
def AND(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
  • NAND
def NAND(x1, x2):
  x = np.array([x1, x2])

  # AND と違うのは重みとバイアスだけ
  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
def OR(x1, x2):
  x = np.array([x1, x2])

  # AND と違うのはバイアスだけ
  w = np.array([0.5, 0.5])
  b = -0.2

  tmp = np.sum(w * x) + b

  if tmp <= 0:
    return 0
  else:
    return 1

バイアスと重みのちがい

  • 重み $ w^1, w^2 ... $ は入力信号の重要度をコントロールする
  • バイアスはニューロンの発火しやすさ(1 を出力する確率)を調整する

バイアスという用語には、「ゲタはき」という意味があります。これは、入力が 何もないときに(入力が 0 のときに)、出力にどれだけゲタをはかせるか(値を 上乗せするか)ということを意味します。実際、式 (2.2) の b + w1 x1 + w2 x2 の計算では、入力の x1 と x2 が 0 の場合、バイアスの値だけが出力されます。

(P.27より抜粋)

2.4 パーセプトロンの限界

  • 単層のパーセプトロンは線形な領域を分離できるが、 XOR (排他的論理和)等の非線形な領域を分離できない.

2.5 多層パーセプトロン

  • 「層を重ねる」ことで XOR を表現することができる.
  • 複数の層を重ねたパーセプトロンを多層パーセプトロン (multi-layered perceptron) と呼び、「$ n $層のパーセプトロン」などと表現する.

2.5.1 既存ゲートの組み合わせ

入力の一方が 1 でもう一方が 0 の場合に 1 を出力する XOR 回路を、既存の AND / NAND / OR を組み合わせて表現します.
もう一度各回路の振る舞いを整理します.

  • AND ... 2つの入力が 1 の場合に 1 を出力し、それ以外は 0 を出力する.
  • NAND ... 2つの入力が 1 の場合に 0 を出力し、それ以外は 1 を出力する.
  • 2つの入力の少なくとも一方が 1 の場合に 1 を出力し、それ以外は 0 を出力する.
  • XOR ... 2つの入力の一方が 1 でもう一方が 0 の場合に 1 を出力し、それ以外は 0 を出力する.

実際には以下の配線で実現できます. 初期値を $ x^1, x^2 $ とし, NAND の出力を $ s^1 $, OR の出力を $ s^2 $ とします.

xor.png
P.32 図2-11

真理値表で確認します.

xor-chart.png
P.33 図2-12 XOR ゲートの真理値表

2.5.2 XOR ゲートの実装

前項を踏まえてコードに実装してみましょう.

def XOR(x1, x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND(s1, s2)
  return y

2.6 NAND からコンピュータへ

2.7 まとめ

  • パーセプトロンは入出力を備えたアルゴリズムである。ある入力を与えた ら、決まった値が出力される。
  • パーセプトロンでは、「重み」と「バイアス」をパラメータとして設定する。
  • パーセプトロンを用いれば、AND や OR ゲートなどの論理回路を表現で きる。
  • XOR ゲートは単層のパーセプトロンでは表現できない。
  • 2 層のパーセプトロンを用いれば、XOR ゲートを表現することができる。
  • 単層のパーセプトロンは線形領域だけしか表現できないのに対して、多層 のパーセプトロンは非線形領域を表現することができる。
  • 多層のパーセプトロンは、(理論上)コンピュータを表現できる。
5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3