퍼셉트론
단층 퍼셉트론
퍼셉트론은 1957년 Frank Rosenblatt가 고안한 초기 신경망 알고리즘입니다.
기본적으로 사진 속 원은 노드 또는 뉴런이라 부르며, (이 글에서는 노드로 통일)
x1, x2는 인풋
y는 아웃풋
w1, w2는 각각의 x1, x2 에 대한 가중치를 의미하는 표기입니다.
여기서 가중치란 어떤 인풋을 더 중요하게 생각하는지에 대한 조절 값이라고 볼 수 있습니다.
그리고 이러한 노드들은 인풋이 일정 값을 넘거나 넘지 못하면 0 또는 1을 출력합니다.
이것을 일반적으로 임계값에 대한 노드의 활성화 여부라고 표현합니다.
위 사진의 퍼셉트론 함수를 식으로 표현하면, 아래와 같습니다.
예를 들어서 아래와 같이 코드를 보겠습니다.
1
2
3
4
5
6
7
8
# 임계값이(theta) 0.7인 단층 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
위 코드는 입력 값들(x1
, x2
)과 그에 곱해지는 가중치들(w1
, w2
)의 곱의 합이 이 임계값(theta
)을 초과하면 출력 1
(True)을 반환하고, 그렇지 않으면 출력 0
(False)을 반환하는 기준점으로 작동합니다.
그리고 이 함수는 정확히 AND 연산자처럼 동작합니다.
더 나아가서 여기에 편향 값이 존재하는 경우가 있습니다.
편향 값이 존재할 경우 식은 아래와 같이 변경되는데요.
식을 보면 알 수 있겠지만 편향은 노드가 얼마나 쉽게 활성화되는지를 조절하는 값 입니다.
방금 AND 함수에 편향을 적용하면 코드는 아래와 같이 변경됩니다.
1
2
3
4
5
6
7
8
9
def NEW_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
elif tmp > 0:
return 1
이렇게 될 경우 (x1w1 + x2w2) + b 를 한 값이 0을 초과할 경우 노드가 활성화 됩니다.
편향 값이 커질 수록 당연히 노드는 더 낮은 인풋과 가중치에도 활성화 되겠죠?
그렇다면 이런 방식으로 모든 논리게이트 함수를 만들 수 있을까요?
정답은 아닙니다.
이유는 다음과 같습니다.
위 그래프를 보면 AND 논리 게이트를 그래프로 표현한 것인데요.
출력값에 대해 선형 분리가 가능한 것을 볼 수 있습니다.
그러나 XOR의 경우는 이것이 불가능합니다.
직선을 어떻게 배치하더라도 완벽히 구분하기는 불가능 하죠.
그렇기 때문에 우리는 이것을 비선형 분리를 통해 해결해야 하는데요.
말 그대로 곡선을 통해서 적절히 구분하는 것입니다.
다층 퍼셉트론
다층 퍼셉트론의 경우 단층 퍼셉트론 사이에 은닉층을 넣어 중간과정을 추가하는 것을 의미합니다.
이런 방식을 통해 XOR 논리 게이트를 아래와 같이 구현할 수 있습니다.
0레이어, 1레이어, 2레이어로 구성되 있으며, 이것은 2층 퍼셉트론으로 부릅니다. (문서에 따라 3층이라고 부르는 경우도 있습니다.)
해당 2층 퍼셉트론의 경우 XOR을 아래 그림과 같이 비선형 분리합니다.
이러한 다층 퍼셉트론을 이용하면 간단하게는 계산기에서 컴퓨터까지도 만들 수 있다고 합니다.
(더 놀라운 사실은 NAND 게이트만으로도 만들 수 있다고 하네요.)
오늘은 퍼셉트론에 대해서 알아보았습니다.
다음에는 이러한 퍼셉트론에서 나아가서 신경망에 대해서 포스팅해 보도록 하겠습니다.
앞으로도 꾸준히 학습 진척도에 따라 포스팅 할 예정이니 관심 있으시면 읽어주세요. :D