퍼셉트론

deep learning
공개

2025년 3월 17일

퍼셉트론이란

다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것

\[ y = \begin{cases} 0 & (w_1x_1 + w_2x_2 \leq \theta) \\ 1 & (w_1x_1 + w_2x_2 > \theta) \end{cases} \]

논리 회로

파라미터 \((w_1, w_2, θ)\)의 값을 조정하여 AND, OR, NAND 게이트를 구현할 수 있다.

머신 러닝의 목적은, 기계가 알아서 파라미터의 값을 적절히 조정하는 것이다.

퍼셉트론 구현

AND 게이트

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7 # parameter
    return (x1*w1 + x2*w2 > theta)
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
False
False
False
True

여기서 θ를 \(-b\)로 치환하고 식을 다시 정리하면 다음과 같다.

\[ y = \begin{cases} 0 & (b + w_1x_1 + w_2x_2 ≤ 0) \\ 1 & (b + w_1x_1 + w_2x_2 > 0) \end{cases} \]

이때 \(w_1\)\(w_2\)(가중치)는 각각의 입력신호가 결과에 주는 영향력을 조절하고, \(b\)(편향)은 뉴런이 얼마나 쉽게 활성화되는지를 조정한다. (가중치 합이 -b를 초과할 때만 뉴런이 활성화된다.)

이제 재구성한 식과, numpy를 이용하여 NAND와 OR 게이트를 구현해보자.

NAND 게이트

import numpy as np

def NAND(x1, x2):
  x = np.array([x1, x2])
  w = np.array([-0.5, -0.5])
  b = 0.7
  return (b + np.sum(x * w) > 0)
def OR(x1, x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.2
  return (b + np.sum(x * w) > 0)

세 게이트의 차이는 오직 파라미터의 값이다.

퍼셉트론의 한계

AND, NAND, OR 게이트는 만들 수 있지만, XOR 게이트는 만들 수 없다. 다른 게이트들과 다르게 선형적으로 구분이 안되기 때문이다.

하지만 AND NAND OR 게이트를 다음과 같이 배치하면 XOR 게이트를 만들 수 있다.

flowchart LR
    x1((x1)) --> OR
    x2((x2)) --> OR
    x1 --> NAND
    x2 --> NAND
    OR[OR 게이트] --> AND
    NAND[NAND 게이트] --> AND
    AND[AND 게이트] --> output((XOR 출력))

(mermaid로는 이렇게 그리는게 최선이다.)

이와 같이 여러 퍼셉트론을 연결한 형태를 다층 퍼센트론이라고 한다.

XOR 게이트

def XOR(x1, x2):
  s1 = OR(x1, x2)
  s2 = NAND(x1, x2)
  return AND(s1, s2)
print(XOR(0, 0))
print(XOR(0, 1))
print(XOR(1, 0))
print(XOR(1, 1))
False
True
True
False
맨 위로