1_パーセプトロン [ゼロから始めるDeepLearningを読む]プラス

lecture
スポンサーリンク

パーセプトロンとは

パーセプトロンは、ローゼンブラットが1957年に考案したアルゴリズムです。パーセプトロンはニューラルネットワークの起源とも言われています。

パーセプトロンは複数の信号を受け取って一つの信号を出力するのが特徴です。

信号の仕組みは、ある情報を流すか流さないかで流すを1、流さない0の2値で表します。
この仕組みは前回学習した論理演算で実現できます。
Pythonを使ってANDゲート、ORゲート、NANDゲート、XORゲートなどの論理ゲートを作ることができます。

ここで論理演算に重み(w)とバイアス(\(\theta\))を使ったものが、パーセプトロンです。

単純パーセプトロンの式

パラメータ\(w\)と\(\theta\)を論理回路で求める

$$y = \begin{cases} \phantom{-} 0& \text{if } (w_1x_1+w_2x_2 \leq \theta) \\
\phantom{-} 1&\text{if } (w_1x_1+w_2x_2 > \theta) \end{cases}$$

早速PythonでパーセプトロンでANDゲートを実現してみます。
次のグラフからANDゲートで線形分離できることがわかります。
パーセプトロンの概念で重要なことは線形分離できると言うことです。

パーセプトロンをPythonで表現

ANDゲート

def AND(x1,x2):
  w1, w2, b = 0.5, 0.5, -0.7
  tmp = x1*w1 + x2*w2 + b
  if tmp <= 0:
    return 0
  else:
    return 1

print(AND(0, 0))  #0
print(AND(1, 0))  #0
print(AND(0, 1))  #0
print(AND(1, 1))  #1

NANDゲート

def NAND(x1,x2):
  w1, w2, b = -0.5, -0.5, 0.7
  tmp = x1*w1 + x2*w2 + b
  if tmp <= 0:
    return 0
  else:
    return 1

print(NAND(0, 0))  # 1
print(NAND(1, 0))  # 1
print(NAND(0, 1))  # 1
print(NAND(1, 1))  # 0

線形分離はANDゲートだけではなく、NANDゲート、ORゲートでも可能です。

ORゲート

def OR(x1,x2):
  w1, w2, b = 0.5, 0.5, -0.2
  tmp = x1*w1 + x2*w2 + b
  if tmp <= 0:
    return 0
  else:
    return 1

print(OR(0, 0))  # 0
print(OR(1, 0))  # 1
print(OR(0, 1))  # 1
print(OR(1, 1))  # 1

XORゲート

ただし、XORゲートは線形分離できません。

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

print(XOR(0, 0))  # 0
print(XOR(1, 0))  # 1
print(XOR(0, 1))  # 1
print(XOR(1, 1))  # 0

XORゲートは線形分離できませんが、層を重ねることで分離することが可能です。
この発想が、ニューラルネットワークの始まりです。

class Perceptronを作成して結果を確認

これはおまけです。便利に使ってみましょう。(実用にはならないでしょうが。。)

class Perceptron:
  def __init__(self, w1, w2, b):
    self.w1 = w1
    self.w2 = w2
    self.b = b
  def logical(self, x1, x2):
    tmp = x1*self.w1 + x2*self.w2 + self.b
    if tmp <= 0:
      return 0
    else:
      return 1
AND = Perceptron(0.5, 0.5, -0.7)

print(AND.logical(0, 0))  # 0
print(AND.logical(1, 0))  # 0
print(AND.logical(0, 1))  # 0
print(AND.logical(1, 1))  # 1

NAND = Perceptron(-0.5, -0.5, 0.7)
print(NAND.logical(0, 0))  # 1
print(NAND.logical(1, 0))  # 1
print(NAND.logical(0, 1))  # 1
print(NAND.logical(1, 1))  # 0

OR = Perceptron(0.5, 0.5, -0.2)
print(OR.logical(0, 0))  # 0
print(OR.logical(1, 0))  # 1
print(OR.logical(0, 1))  # 1
print(OR.logical(1, 1))  # 1

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

print(XOR(0, 0))  # 0
print(XOR(1, 0))  # 1
print(XOR(0, 1))  # 1
print(XOR(1, 1))  # 0
タイトルとURLをコピーしました