밑바닥부터 시작하는 딥러닝을 바탕으로 제작하였습니다.
2-1. 퍼셉트론이란?
■ 퍼셉트론이란?
이 책에서 퍼셉트론은 '인공 뉴런'을 의미하며 이는 다수의 입력 신호를 입력으로 받아 하나의 출력 신호(1 또는 0)를 출력하는 알고리즘을 의미합니다.
이 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예를 보여줍니다.
위 그림은 위와 같은 식으로 표현할 수 있습니다. x1와 x2에 각각 고유한 가중치 값을 곱해 더하면 신호의 합을 의미합니다. 그 값이 어떠한 한계, 즉 임계값보다 크다면 1, 작거나 같으면 0이라는 값을 y에 전달됩니다.
2-2. 단순한 논리 회로
■ AND 게이트
AND 게이트는 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력합니다.
이 AND 게이트를 퍼셉트론으로 표현하기 위해서 가중치와 임계값을 잘 설정해야 합니다.
예를 들어 가중치를 (1.0, 1.0)으로 설정하고 임계값을 1.0으로 설정한다면 올바르게 AND 게이트를 퍼셉트론으로 표현할 수 있습니다. 즉 x1,x2 모두 1일 때 가중 신호의 총합이 임계값보다 크면 성립합니다.
■ NAND 게이트와 OR 게이트
NAND 게이트란 Not AND 게이트를 의미합니다. 즉 AND 게이트의 반대로 출력됩니다.
NAND 게이트 진리표를 보면 AND와는 반대로 x1과 x2의 값이 전부 1이라면 0을 출력하는 것을 볼 수 있습니다.
NAND 게이트를 퍼셉트론으로 표현하는 방법의 예를 보면
가중치를 (-0.5, -0.5)로 설정을 하고 임계값을 -0.7로 설정하면 올바르게 NAND 게이트를 퍼셉트론으로 표현할 수 있습니다. 즉 AND 게이트를 구현하는 모든 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 성립합니다.
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로입니다.
OR 게이트 진리표를 보면 입력이 모두 0인 경우를 제외하면 출력이 전부 1인 것을 볼 수 있습니다.
OR 게이트를 퍼셉트론으로 표현하는 방법의 예를 보면
가중치를 (1.0, 1.0)으로 설정하고 임계값을 0.5로 설정하면 올바르게 OR 게이트를 퍼셉트론으로 표현할 수 있습니다.
2.3. 퍼셉트론 구현하기
■ 가중치와 편향 도입
위에 식은 원래 존재하던 식에서 임계값을 -b로 치환한 결과입니다. 여기서 b를 편향이라 합니다. 이제 이를 토대로 AND 게이트를 만들어보면
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
실행결과
이와 같이 올바르게 AND 게이트가 구현된 것을 볼 수 있습니다.
OR 게이트를 구현해보면
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
실행결과
이와 같이 올바르게 OR 게이트가 구현된 것을 볼 수 있습니다.
이번에는 마지막으로 NAND 게이틀 구현해보면
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
실행결과
이와 같이 올바르게 NAND 게이트가 구현된 것을 볼 수 있습니다.
즉 올바른 가중치와 편향을 설정해준다면 올바르게 논리 회로를 구현할 수 있습니다.
2.4. 퍼셉트론의 한계
■ XOR 게이트
XOR 게이트는 배타적 논리합이라는 논리 회로입니다. 진리표를 보면 x1, x2 중 한쪽이 1일 때만 1을 출력하는 것을 볼 수 있습니다. 이는 지금까지 본 퍼셉트론으로는 구현할
수 없습니다. 그 이유는 아래에 그림을 보면 알 수 있습니다.
XOR 게이트는 직선 하나로 영역을 나눌 수 없습니다. 즉, XOR 게이트는 입출력 관계가 선형이 아닌 비선형 관계이기 때문에 지금까지 본 퍼셉트론(단층 퍼셉트론)으로는 구현이 불가능합니다.
2.5. 다층 퍼셉트론
■ 다층 퍼셉트론이란?
말 그대로 층이 여러 개의 퍼셉트론을 의미합니다. 다층 퍼셉트론을 이용한다면 XOR 게이트를 구현할 수 있습니다.
일단 기존에 우리가 사용한 NAND, OR, AND 게이트를 이용해 XOR 게이트를 만들어보면
이와 같이 만들 수 있습니다. 이를 토대로 다층 퍼셉트론을 이용한 XOR 게이트를 구현해보겠습니다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
실행결과
이와 같이 XOR 게이트를 기존에 존재하던 게이트들을 이용해 다층 퍼셉트론으로 구현할 수 있습니다.
우리는 단층 퍼셉트론을 이용해 직선형 영역만 표현할 수 있고, 다층 퍼셉트론을 사용하면 비선형 영역도 표현할 수 있습니다. 이러한 다층 퍼셉트론을 이용하면 이론상 컴퓨터가 수행하는 처리도 모두 표현할 수 있습니다.
'Deep Learning(강의 및 책) > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
6. 학습 관련 기술들 (0) | 2022.02.15 |
---|---|
5. 오차역전파법 (0) | 2022.02.14 |
4. 신경망 학습 (0) | 2022.02.07 |
3. 신경망 (0) | 2022.02.07 |
1. 파이썬(Python) 기초 (0) | 2022.02.06 |