def AND(x1, x2):
= 0.5, 0.5, 0.7 # parameter
w1, w2, theta return (x1*w1 + x2*w2 > theta)
퍼셉트론
퍼셉트론이란
다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것
\[ 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 게이트
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):
= np.array([x1, x2])
x = np.array([-0.5, -0.5])
w = 0.7
b return (b + np.sum(x * w) > 0)
def OR(x1, x2):
= np.array([x1, x2])
x = np.array([0.5, 0.5])
w = -0.2
b 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):
= OR(x1, x2)
s1 = NAND(x1, x2)
s2 return AND(s1, s2)
print(XOR(0, 0))
print(XOR(0, 1))
print(XOR(1, 0))
print(XOR(1, 1))
False
True
True
False