[DeepLearning from Scratch] Perceptron

hwjung·2022년 5월 24일
0

퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘
퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일

퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력
퍼셉트론 신호는 실제 전류와 달리 '흐른다/안 흐른다(1이나 0)'의 두 가지 값을 사용

입력으로 2개의 신호를 받은 퍼셉트론의 예
x1x_1x2x_2는 입력 신호
y는 출력 신호
w1w_1w2w_2는 가중치

  1. 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용
  2. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻함
그림의 원은 뉴런 혹은 노드

입력 신호가 뉴런에 보내질 때 각각 고유한 가중치를 곱하여 전송
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력(1이 출력되는 것을 뉴런이 활성화한다라고 표현)
정해진 한계를 임계값이라 하며, θ\theta 기호로 표시

단순한 논리 회로

AND 게이트

두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력
AND 게이트를 퍼셉트론으로 표현하기 위해서, w1w_1, w2w_2, θ\theta 값을 정해야 함

(w1w_1, w2w_2, θ\theta)를
(0.5, 0.5, 0.7)
(0.5, 0.5, 0.8)일 때 모두 AND 게이트 조건을 만족

NAND 게이트와 OR 게이트

NAND는 AND 게이트의 출력을 뒤집은 것

NAND 게이트를 표현하려면, 예를 들어
(w1w_1, w2w_2, θ\theta) = (-0.5, -0.5, -0.7) 조합 사용

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로

퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 동일
세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값 뿐

퍼센트론 구현하기

x1과 x2를 인수로 받는 AND 함수 구현
매개변수 w1w_1, w2w_2, θ\theta는 함수 안에서 초기화
가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고, 그 외에는 0을 반환

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
    
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))

0
0
0
1

가중치와 편향 도입

기존 식에서 θ\theta를 -b로 치환하면 퍼셉트론의 동작이 다음 식처럼 변경

여기서 b를 편향
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력

import numpy as np
x = np.array([0, 1])
w = np.array([0.5, 0.5])
b = -0.7

w * x
array([0. , 0.5])

np.sum(w * x)
0.5

np.sum(w * x) + b
-0.19999999999999996

가중치와 편향 구현하기

-θ\theta를 편향 b로 치환
편향은 가중치 w1w_1, w2w_2와 기능이 다르다는 사실에 주의
w1w_1, w2w_2는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
예를 들어, b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화
이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정

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
  elif:
    return 1

NAND 게이트와 OR 게이트 구현

def NAND(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
  elif:
    return 1
    
 def OR(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = 0.2
  tmp = np.sum(w * x) + b
  if tmp <= 0:
    return 0
  elif:
    return 1

퍼센트론의 한계

XOR 게이트

XOR 게이트는 배타적 논리합
x1x_1x2x_2 중 한쪽이 1일 때만 1을 출력

AND와 OR 게이트는 퍼셉트론으로 구현이 되지만 XOR 게이트는 구현 불가
예를 들어, OR 게이트는 (b, x1x_1, x2x_2) = (-0.5, 1.0, 1.0)일 때 진리표를 만족하는데 이 때 퍼셉트론은 아래 식으로 표현

y={0(0.5+x1+x20)1(0.5+x1+x2>0)y = \begin{cases} 0 (-0.5 + x_1 + x_2 \leq 0) \\ 1 (-0.5 + x_1 + x_2 \gt 0) \end{cases}

퍼셉트론은 직선으로 나뉜 두 영역을 생성
직선으로 나뉜 한쪽 영역은 1을 출력, 다른 한쪽은 0을 출력
아래 그림의 직선은 네 점을 제대로 나누고 있음

선형과 비선형

XOR 게이트의 경우 직선 하나로 네 점을 나눌 수 없음
하지만 '직선'이라는 제약을 없앤다면 가능

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계

  1. 곡선의 영역을 비선형 영역
  2. 직선의 영역을 선형 영역

다층 퍼셉트론이 출동한다면

퍼셉트론으로는 XOR 게이트를 표현할 수 없지만, 다층 퍼셉트론을 이용하여 XOR 표현 가능

단층 퍼셉트론으로는 XOR 게이트를 표현할 수 없다
단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다

x1x2x_1과 x_2는 NAND와 OR 게이트의 입력
NAND와 OR의 출력이 AND 게이트의 입력

XOR 게이트 구현하기

AND, NAND, OR를 사용하여 XOR 게이트를 파이썬으로 구현

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

print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))
profile
VMware에서 Senior Technical Support Engineer로 일하고 있습니다.

0개의 댓글