Perceptron
퍼셉트론
퍼셉트론은 현재 쓰이고 있는 신경망의 기원이다.
퍼셉트론은 다수의 입력을 받아서 하나의 출력을 한다.
출력을 하는 데에도 기준이 있다.
입력이 들어오는 것을 노드라고 할 때
그 노드는 출력까지 가면서 가중치가 곱해진다.
n개의 입력이 있다고 가정할 때
이 중 하나의 입력 x1 은 결과 y 까지 가면서 w1 라는 x1에 해당하는 가중치가 곱해진다.
그리고 이들의 합, 즉 x1*w1 + x2*w2 + ...
이 임계값을 넘어야 이 퍼셉트론은 1 을 출력한다.
AND 게이트
논리회로 중 기초인 AND 게이트를 퍼셉트론 알고리즘으로 구현하자.
가중치는 임의로 정하였다.
AND 연산의 진리표는 다음과 같다.
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
가중치를 편하게 0.5 이라고 하고, 임계값을 0.7 로 설정하기로 하였다.
AND 값을 얻는 함수는 이러하다.
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
if np.sum(w * x) > 0.7:
return True
else
return False
AND(0, 0)
이나 AND(1, 1)
같은 값을 넣어보면 AND 의 역할을 하는 것을 볼 수 있다.
이때 편향이라는 것이 하나 더 등장한다.
편향은 위에서 언급한 임계값에 -를 붙인 수이다.
편향의 의미는 해당 출력이 얼마나 잘 1을 출력하는가에 해당한다.
편향이 작아질 수록 1을 출력하기가 어렵다.
편향이 -20.0 이 된다면 도합이 20을 넘겨야 1을 출력할 수 있다는 뜻이 된다.
이 편향이라는 개념을 도입한 AND, OR, NAND 게이트는 다음과 같다.
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
a = np.sum(x * w) + b
if a > 0:
return True
else:
return False
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.3
a = np.sum(x * w) + b
if a > 0:
return True
else:
return False
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
a = np.sum(x * w) + b
if a > 0:
return True
else:
return False
위 셋의 공통점은 각 게이트를 x1, x2 입력에 대해 시각적으로 그렸을 때
출력이 0, 1이 되는 부분이 직선으로(선형적으로) 나뉘어진다는 점이다.
그러나 XOR 은 그렇지 않다.
XOR 은 퍼셉트론 하나로는 구현할 수가 없다.
XOR 은 AND, OR, NAND 로 구현한다.
퍼셉트론이 한 층 더 있으므로 이를 다층 퍼셉트론이라고 한다.
파이썬으로 구현한 XOR 게이트는 다음과 같다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
return AND(s1, s2)
이렇게 구현된 다층 퍼셉트론은
이후 배울 신경망의 큰 토대가 된다.