성냥 6개로 정삼각형 4개를 만들 수 있을까?
2차원 평면에서는 이 문제를 해결할 수 없다. 차원을 달리하여 정사면체를 만들면 문제는 쉽게 해결된다.
XOR 문제도 평면을 휘어주면 해결할 수 있다...!

XOR문제도 두 개의 퍼셉트론을 한 번에 계산할 수 있다면 해결이 가능하다.
이를 위해 숨어있는 층인 은닉층(hidden layer)을 만든다. 은닉층은 좌표 평면을 왜곡시키는 결과를 가져온다.
multilayer perceptron
node(노드) : 은닉층에 모이는 중간 정거장, ,
이 두 식의 결과값이 출력층으로 보내진다
가중치()와 바이어스()는 2차원 배열로 표시할 수 있다

XOR 게이트는 NAND 게이트와 OR 게이트 두 가지를 내재한
각각의 퍼셉트론이 다중 레이어 안에서 작동 → 이 두 가지 값에 대해 AND 게이트를 수행한 값이 이 된다
import numpy as np
w11 = np.array([-2, -2]) #가중치 1열
w12 = np.array([2, 2]) #가중치 2열
w2 = np.array([1, 1])
b1=3
b2=-1
b3=-1
#perceptron
def MLP(x, w, b):
y=np.sum(w * x) + b
if y<=0:
return 0
else:
return 1
#NAND GATE
def NAND(x1, x2):
return MLP(np.array([x1, x2]), w11, b1)
#OR GATE
def OR(x1, x2):
return MLP(np.array([x1, x2]), w12, b2)
#AND GATE
def AND(x1, x2):
return MLP(np.array([x1, x2]), w2, b3)
#XOR GATE
def XOR(x1, x2):
return AND(NAND(x1, x2), OR(x1, x2))
#x1, x2 값을 번갈아 대입하며 최종값 출력
if __name__ == '__main__':
for x in [(0,0), (1,0),(0,1), (1,1)]:
y = XOR(x[0], x[1])
print("입력 값: " + str(x) + "출력 값: " + str(y))
#결과
입력 값: (0, 0)출력 값: 0
입력 값: (1, 0)출력 값: 1
입력 값: (0, 1)출력 값: 1
입력 값: (1, 1)출력 값: 0
은닉층을 여러 개 쌓아올려 문제를 해결하는 과정은 뉴런이 해나가는 일과 닮았다
그래서 이 방법을 인공 신경망 이라 부르며, 간단히 줄여서 신경망이라고 한다