퍼셉트론 (Perceptron)
프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 제안한 초기 형태의 인공 신경망 알고리즘으로 여러 입력으로부터 하나의 출력을 내보낸다. 인공 신경망이라는 점에서 알 수 있지만, 퍼셉트론은 뇌를 구성하는 신경세포인 뉴런의 동작과 유사한데, 뉴런은 가지돌기에서 신호를 받아들이고, 이 신호가 일정치 이상의 크기를 가지면 축삭돌기를 통해서 신호를 전달한다.
간단하게 입력이 2개인 퍼셉트론을 방향 그래프로 보면 다음과 같다.
$ x_1, x_2 $ 의 입력 신호가 존재하고, $ y $ 의 출력신호가 존재한다. $ w_1, w_2 $ 는 가중치(weight)를 뜻한다. 입력 신호가 뉴런(여기서는 $ y $)에 보내질 때는 각각 고유한 가중치가 곱해지고, 이렇게 곱해진 값을 모두 더한 총합이 정해진 한계를 넘어설 때만 $1$을 출력한다. 즉 뉴런이 활성화된다. 그 한계를 임계값이라 하고 일반적으로 $ \theta $ 라 표기한다. 즉 수식으로 나타내면 아래와 같다.
$$ y = \begin{cases} 0 & (w_1 x_1 + w_2 x_1 \leq \theta) \\ 1 & (w_1 x_1 + w_2 x_1 > \theta) \end{cases} $$
다시 생각해본다면 각 입력이 노드를 활성화하는 데에 얼마나 영향을 주는가는 가중치에 달려있다. 즉 입력 중 중요한 입력에 대한 가중치가 크고, 덜 중요한 입력에 대한 가중치가 작다.
단순 논리회로
AND, NAND, OR 게이트를 말한다. AND는 입력이 모두 $ 1 $ 일 때만 출력이 $ 1 $ 인 게이트이고, NAND는 입력이 모두 $ 1 $ 일 때만 출력이 $ 0 $ 인 게이트이며, OR는 입력 중 하나라도 $ 1 $ 이 있으면 출력이 $ 1 $ 인 게이트이다.
이를 퍼셉트론으로 구현하면 구조가 모두 같다는 특징이 있다. 즉 같은 구조에서 매개변수인 가중치와 임계값의 차이만으로 AND, NAND, OR 게이트를 구현할 수 있다.
AND 게이트를 구현하면 다음과 같다.
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
그런데 이렇게 구현하면 직관적으로 알기 쉽지만, 편향(bias)를 도입하기 위해 위에서 수식으로 나타낸 퍼셉트론을 아래와 같이 수정해보자.
$$ y = \begin{cases} 0 & (b+ w_1 x_1 + w_2 x_1 \leq 0) \\ 1 & (b+w_1 x_1 + w_2 x_1 > 0) \end{cases} $$
$ theta $ 를 $ b $ 로 치환하고 넘겨주어 편향으로 나타냈다. 의미는 같다. 이를 고려하고, 넘파이까지 도입하면 퍼셉트론을 이용한 논리 게이트를 아래와 같이 나타낼 수 있다.
- 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
else:
return 1
- NAND 게이트
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
else:
return 1
- OR 게이트
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
else:
return 1
그런데 이렇게 단층으로 퍼셉트론을 구현하며 생각해보면 XOR 게이트는 단층으로는 구현하지 못한다. XOR은 입력의 한쪽이 $ 1 $ 인 경우에만 $ 1 $ 을 출력한다. 이를 좌표평면으로 보면 아래와 같은 상황에서 세모와 동그라미를 직선 하나로 분리해야 하는 상황이기 때문이다. 물론 직선이 아니라면, 즉 비선형이라면 가능하긴 하다.
다층 퍼셉트론 (Multi-Layer Perceptron)
다층 퍼셉트론은 퍼셉트론이 여러 층 있는 것이다.
위처럼 방향 그래프를 통해 나타낸 다층 퍼셉트론을 보면 입력층인 $0$층에서 $1$층을 거쳐 출력층인 $2$층으로 흐른다. 이를 활용하면 XOR 게이트를 구현할 수 있다.
- XOR 게이트
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
이처럼 층을 여러개 사용하면 다양한 논리 게이트를 만들 수 있고, 더 확장하면 컴퓨터까지도 만들 수 있다.