Coding Memos

try {coding} catch {questions}

パーセプトロンをちょっと一般化【ゼロ作DL_7】

二日間更新が空いてしまいました。 日々進捗出していきたいとおもいます。

今回の学習記録はパーセプトロンにバイアスを加えるという話です。

パーセプトロンアルゴリズムの各項に対する意味付け

{\displaystyle
y = 
   \left\{
    \begin{array}{l}
      0 \ \ (b + w_1x_1 + w_2x_2 \leqq 0)\\
      1 \ \ (b + w_1x_1 + w_2x_2 \gt 0)
    \end{array}
  \right.
}

上記の {b} がバイアスです。{w_n}は重み付けというものです。{x_n}は各入力でした。

  • {w_n}(重み付け)は、入力信号の重要度
  • {b}(バイアス)は、ニューロンの発火のしやすさ を表します。

{\displaystyle
y = 10x_1 + 2x_2
}

例えば、{x_1}の入力信号が10倍に高められ、{x_2}が二倍に高められるとすると、{y}値への寄与は、{x_1}の方が重要になりやすいです。

閾値をハードルだと考えると、{b}(バイアス)はこのハードルを越えるための下駄履きです。 つまり、ハードルをぴょんっとこえるためには、バイアスが大きい方が楽です。

f:id:codingmemos:20170228110448j:plain

ハードルの前に50センチほどの踏み台があったら、越えるのがラクになるかと思います。 この踏み台が、バイアスの役目ですね。

一般化とはいっても、前稿までにでてきた、閾値{\theta}を移行して{b} と改名しただけとも見えます。 (いままでは {w_1x_1 + w_2x_2 \leqq 0.7} だったのが、 {-0.7 + w_1x_1 + w_2x_2 \leqq 0})となったような感じです。)

配列で計算

今回は、通常の数式ではなく、配列のelement-wise(要素ごと)の計算をつかって算出しました。

# arraycalc.py
import numpy as np

def calc():
  x = np.array([0, 1])
  w = np.array([.5, .5])
  b = -.7
  y = np.sum(x*w) + b
  return y
>>> import arraycalc as ac
>>> ac.calc()
-0.19999999999999996

np.array() の使い方を確認できたところで、AND, NAND, OR ゲートをスクリプト化します。

# arraylogiccircuit.py

import numpy as np

def AND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([.5, .5])
  b = -.7
  tmp = np.sum(x*w) + b
  if tmp <= 0:
    return 0
  elif tmp > 0:
    return 1

def NAND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([-.5, -.5])
  b = .7
  tmp = np.sum(x*w) + b
  if tmp <= 0:
    return 0
  elif tmp > 0:
    return 1

def OR(x1, x2):
  x = np.array([x1, x2])
  w = np.array([1, 1])
  b = -.7
  tmp = np.sum(x*w) + b
  if tmp <= 0:
    return 0
  elif tmp > 0:
    return 1
>>> import arraylogiccircuit as alc

# ANDゲート
>>> alc.AND(0,0)
0
>>> alc.AND(0,1)
0
>>> alc.AND(1,0)
0
>>> alc.AND(1,1)
1

# NANDゲート
>>> alc.NAND(0,0)
1
>>> alc.NAND(0,1)
1
>>> alc.NAND(1,0)
1
>>> alc.NAND(1,1)
0

# ORゲート
>>> alc.OR(0,0)
0
>>> alc.OR(0,1)
1
>>> alc.OR(1,0)
1
>>> alc.OR(1,1)
1

これで

codingmemos.hatenablog.com

の表中の結果と同一であることが確認できました。

次稿では、XORゲートが単層パーセプトロンでは表現できず、多層パーセプトロンではそれが可能だという話を学習するようです。(本書の流れ的に)