지난번엔 and,nand,or 게이트를 예시로 퍼셉트론의 개념에 대해 알아보았다.
하지만 기존 개념으로는 xor 게이트를 표현할 수 없다. 어째설까?
그것을 알아보기 전에, 먼저 이해를 돕기 위해서 and,or 게이트를 퍼셉으론으로 표현한 그래프를 보자.
| AND | OR |
|---|---|
![]() | ![]() |
그래프로 표현해보면 직선을 입력들([0,0], [0,1], [1,0], [1,1])을 나눈 영역을 출력으로 볼 수 있다.
(출력을 반대로하면 nand, nor 게이트가 된다.)
그러면 xor은 어떻게 표현할 수 있을까?
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
and,or과는 달리 단일 직선으로는 xor을 표현할 수 없다.

그럼 XOR은 어떻게 표현할 수 있을까?
아래의 두 게이트를 봐보자.
| NAND | OR |
|---|---|
![]() | ![]() |
두 게이트를 잘 보면 (1,0),(0,1)에서 출력이 1로 곂친다.
그럼 두 게이트의 출력에 대해서 다시 AND연산을 하면 XOR가 되지 않을까?
실제로도 그렇다.
| A | B | A NAND B | A OR B | (A NAND B) AND (A OR B) = A XOR B |
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 |
NAND게이트와 OR게이트에 각각 A,B입력을 주고 나온 출력들을 AND게이트에 입력으로 넣어주면 XOR 게이트가 된다.

진리표와 그래프로 XOR를 표현하는 법을 알았으니 이번엔 퍼셉트론을 통해 XOR을 표현해보자.
우선 NAND와 OR의 연산 결과를 각각 ,라고 해보자.
그리고 ,의 AND연산 결과를 라고 하면, 퍼셉트론은 아래와 같은 모양이 될 것이다.
![]() | ![]() |
|---|
(왼쪽과 오른쪽은 똑같다.)
X는 입력, W는 가중치, h는 1단계 출력, y는 최종 출력값이다.
이제 이걸 바탕으로 코드로 만들어보자.
def AND(x1, x2):
w, b = np.array([0.5, 0.5]), -0.7
return 1 if np.sum(w * np.array([x1, x2])) + b > 0 else 0
def NAND(x1, x2):
w, b = np.array([-0.5, -0.5]), 0.7
return 1 if np.sum(w * np.array([x1, x2])) + b > 0 else 0
def OR(x1, x2):
w, b = np.array([0.5, 0.5]), -0.2
return 1 if np.sum(w * np.array([x1, x2])) + b > 0 else 0
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
return AND(s1, s2)

퍼셉트론을 2단계에 걸처 사용하여, XOR 게이트까지 성공적으로 구현할 수 있게 되었다!
여기까지 잘 이해했다면 흔히 보이는 이런 이미지에 대한 부담감도 적어질 것이다.

위 이미지는 입력이 5개이고 4개의 단계를 더 거쳐 4개의 출력이 나온다는 의미로 해석할 수 있다.
이렇게 여러 단계(층)로 중첩된 퍼셉트론을 다층 퍼셉트론(MLP: Multi Layer Perceptron)라고 부른다.
우리는 XOR 예제를 통해 MLP를 익혔다!
다음엔 이를 바탕으로 신경망에 대해서 익혀보자.