見出し画像

pythonで機械学習:パーセプトロンについて

パーセプトロンは昔、アメリカの研究者によって、考案されたアルゴリズムの一種です。このアルゴリズムはディープラーニングの起源となるアルゴリズムであるため、機会学習について、勉強する上で知っておいたほうが良いということです。

アルゴリズムとは、数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。 「問題」はその「解」を持っているが、アルゴリズムは正しくその解を得るための具体的手順および根拠を与える。

パーセプトロンは出力しない(0)、出力する(1)の2つしかなく、下記の図で表すと入力信号から出力信号へ伝達される際の伝達の重みによって、そのどちらかが選択される。

キャプチャ

パーセプトロンの論理回路

AND、NAND、ORの論理回路にて考える

キャプチャ

ANDは入力信号がどちらとも1の場合、出力は1になる。

NANDはその逆。どちらとも1以外は1

ORはどちらかが1であれば、出力は1になる。

pythonにてパーセプトロンの実装

AND

import numpy as np

def AND(x1, x2):
   x = np.array([x1, x2]) #入力信号
   w = np.array([0.5, 0.5]) #伝達
   b = -0.7 #バイアス
   
   tmp = np.sum(x*w) + b
   
   if tmp <= 0:
       return 0
   
   else:
       return 1
   
#AND(0, 0) ➡ 0
#AND(1, 0) ➡ 0
#AND(0, 1) ➡ 0
#AND(1, 1) ➡ 1

出力信号は、以下の式に当てはめられ、上記のコードは、これが0よりも大きければ、1となるような形である。

『バイアス + 入力信号1*伝達(重み) + 入力信号2*伝達(重み)』


NAND

import numpy as np
def NAND(x1, x2):
   x = np.array([x1, x2]) #入力信号
   w = np.array([-0.5, -0.5]) #伝達
   b = 0.7 #バイアス
   
   tmp = np.sum(x*w) + b
   
   if tmp <= 0:
       return 0
   
   else:
       return 1
   
#NAND(0, 0) ➡ 1
#NAND(1, 0) ➡ 1
#NAND(0, 1) ➡ 1
#NAND(1, 1) ➡ 0


OR


import numpy as np
def OR(x1, x2):
   x = np.array([x1, x2]) #入力信号
   w = np.array([0.5, 0.5]) #伝達
   b = -0.2 #バイアス
   
   tmp = np.sum(x*w) + b
   
   if tmp <= 0:
       return 0
   
   else:
       return 1
   
#OR(0, 0) ➡ 0
#OR(1, 0) ➡ 1
#OR(0, 1) ➡ 1
#OR(1, 1) ➡ 1

多層パーセプトロンXORゲート

これまで学んだAND、NAND、ORの他に実はXORというものもあります。

XORゲートは排他的論理和とも呼ばれる論理回路です。入力信号のどちらかが1であれば、1を出力するようなもの。ただし、どちらも1であれば、0となる。簡単に表現することが難しい。

キャプチャ

XORゲートはANDやNAND、ORと同じように1層だけで表現できるようなものではないため、NAND➡OR➡ANDを組み合わせることによって、表現することができます。そのため、多層パーセプトロンとも呼ばれています。

キャプチャ

pythonにて多層パーセプトロンの実装

import numpy as np
def AND(x1, x2):
  x = np.array([x1, x2]) #入力信号
  w = np.array([0.5, 0.5]) #伝達
  b = -0.7 #バイアス
  
  tmp = np.sum(x*w) + b
  
  if tmp <= 0:
      return 0
  
  else:
      return 1

def NAND(x1, x2):
  x = np.array([x1, x2]) #入力信号
  w = np.array([-0.5, -0.5]) #伝達
  b = 0.7 #バイアス
  
  tmp = np.sum(x*w) + b
  
  if tmp <= 0:
      return 0
  
  else:
      return 1

def OR(x1, x2):
   x = np.array([x1, x2]) #入力信号
   w = np.array([0.5, 0.5]) #伝達
   b = -0.2 #バイアス
   
   tmp = np.sum(x*w) + b
   
   if tmp <= 0:
       return 0
   
   else:
       return 1
   
   
   
def XOR(x1, x2):
   s1 = NAND(x1, x2)
   s2 = OR(x1, x2)
   y = AND(s1, s2)
   return y
   
#XOR(0, 0) ➡ 0
#XOR(1, 0) ➡ 1
#XOR(0, 1) ➡ 1
#XOR(1, 1) ➡ 0

さきほど書いたAND、NAND、ORの関数を使って、XORを表現します。


過去記事


この記事が気に入ったらサポートをしてみませんか?