참고 서적
도서명: 모두의 딥러닝 저자 : 조태호 출판 : 길벗 발매 : 2020.01.27 |
퍼셉트론
신경망을 이루는 가장 기본 단위
퍼셉트론 하나로 해결되지 않던 XOR 문제를 은닉층을 만들어 해결하였다.
인간의 뇌는 치밀하게 연결된 약 1,000억 개의 뉴런으로 이루어져 있다. 우리 몸 안에 있는 수많은 뉴런은 서로 긴밀히 연결되어 신경 말단에서부터 뇌에 이르기까지 곳곳에서 자신의 역할을 수행한다. 이처럼 복잡하고 어려운 조합의 결과가 바로 우리의 '생각'이다. 이러한 뉴런과 비슷한 매커니즘을 사용한다는 상상과 함께 출발한 연구가 바로 인공 신경망(Artificial Neural Network) 연구이다.
뉴런과 뉴런이 새로운 연결을 만들기도 하고 필요에 따라 위치를 바꾸는 것처럼, 여러 층의 퍼셉트론을 서로 연결시키고 복잡하게 조합하여 주어진 입력 값에 대한 판단을 하게 하는 것, 그것이 바로 신경망의 기본 구조이다.
신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론(perceptron)이다. 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 다음으로 넘기는 가장 작은 신경망 단위이다.
기울기 a는 퍼셉트론에서는 가중치를 의미하는 w(weight)로 표기된다. y 절편 b는 똑같이 b라고 사용한다.
하지만 y = ax + b의 b가 아니라 ‘편향, 선입견’이라는 뜻인 바이어스(bias)에서 따온 b이다.
그리고 가중합(weighted sum)이라는 용어가 처음 등장했다. 입력 값(x)과 가중치(w)의 곱을 모두 더한 다음 거기에 바이어스(b)를 더한 값을 가중합이라고 한다.
가중합의 결과를 놓고 1 또는 0을 출력해서 다음으로 보낸다. 여기서 0과 1을 판단하는 함수가 있는데, 이를 활성화 함수(activation function)라고 한다. 앞서 배웠던 시그모이드 함수가 바로 대표적인 활성화 함수입니다.
(1) 퍼셉트론 과제
퍼셉트론 과제는 다음과 같은 그래프에서 각 검은 점과 흰 점을 직선으로 어떻게 분류하는가 였다.
(2) XOR 문제
이것이 퍼셉트론의 한계를 설명할 때 등장하는 XOR(exclusive OR) 문제이다.
XOR 문제는 논리 회로에 등장하는 개념이다. 컴퓨터는 두 가지의 디지털 값, 즉 0과 1을 입력해 하나의 값을 출력하는 회로가 모여 만들어지는데, 이 회로를 ‘게이트(gate)’라고 부른다.
AND와 OR 게이트는 직선을 그어 결괏값이 1인 값(검은점)을 구별할 수 있다. 그러나 XOR의 경우 선을 그어 구분할 수 없다.
다층 퍼셉트론
바로 종이를 휘어 주는 것이 답이다. 즉, 좌표 평면 자체에 변화를 주는 것이다.
XOR 문제를 해결하기 위해서 우리는 두 개의 퍼셉트론을 한 번에 계산할 수 있어야 했다. 이를 가능하게 하려면 숨어있는 층, 즉 은닉층(hidden layer)를 만들면 된다.
입력층과 은닉층의 그래프를 집어넣어 보면 다음 그림과 같다. 은닉층이 좌표 평면을 왜곡시키는 결과를 가져온다.
은닉층을 만들어 공간을 왜곡하면 두 영역을 가로지르는 선이 직선으로 바뀐다.
(1) 다층 퍼셉트론의 설계
가운데 숨어있는 은닉층으로 퍼셉트론이 각각 자신의 가중치(w)와 바이어스(b) 값을 보내고, 이 은닉층에서 모인 값이 한번 더 시그모이드 함수를 이용해 최종 값으로 결과를 보낸다. 은닉층에 모이는 중간 정거장을 노드(node)라고 하며, 여기서는 n1과 n2로 표현하였다. n1과 n2의 값은 각각 단일 퍼셉트론의 값과 같다.
위 두 식의 결괏값이 출력층으로 보내진다. 출력층에서는 역시 시그모이드 함수를 통해 y값이 정해진다. 이 값을 식으로 표현하면 다음과 같다.
각각의 가중치(w)와 바이어스(b)의 값을 정할 차례이다. 은닉층을 포함해 가중치 6개와 바이어스 3개가 필요한데, 2차원 배열로 늘어놓으면 다음과 같이 표시할 수 있다.
이와같은 행렬에 대한 식은 다음과 같이 도식화할 수 있다.
퍼셉트론 하나로 해결되지 않던 XOR 문제를 은닉층을 만들어 해결하였다. 은닉층을 여러 개 쌓아올려 복잡한 문제를 해결하는 과정은 뉴런이 복잡한 과정을 거쳐 사고를 낳는 사람의 신경망을 닮았다. 그래서 이 방법을 '인공 신경망'이라 부르기 시작했고, 이를 간단히 줄여서 신경망이라고 통칭한다.
(2) 코딩으로 XOR문제 해결하기
n1의 값을 잘 보면 입력 값 x1, x2가 모두 1일 때 0을 출력하고 하나라도 0이 아니면 1을 출력하게 되어 있다. 이는 표 6-1에서 배운 AND 게이트의 정반대 값을 출력하는 방식이다. 이를 NAND(Negative And) 게이트라고 부른다.
그리고 n2의 값을 잘 보면 x1, x2에 대한 OR 게이트에 대한 답이다.
NAND 게이트와 OR 게이트, 이 두 가지를 내재한 각각의 퍼셉트론이 다중 레이어 안에서 각각 작동하고, 이 두 가지 값에 대해 AND 게이트를 수행한 값이 바로 우리가 구하고자 하는 Yout임을 알 수 있다.
소스코드
import numpy as np
w11 = np.array([-2, -2])
w12 = np.array([2, 2])
w2 = np.array([1, 1])
b1 = 3
b2 = -1
b3 = -1
#퍼셉트론 함수, 0과 1 중에서 값을 출력하게 한다.
def MLP(x, w, b):
y = np.sum(w * x) + b
if y <= 0:
return 0
else:
return 1
# 각 게이트의 정의에 따라 NAND 게이트, OR 게이트, AND 게이트, XOR 게이트 함수를 만듬
# NAND 게이트
def NAND(x1, x2):
return MLP(np.array([x1, x2]), w11, b1)
# OR 게이트
def OR(x1, x2):
return MLP(np.array([x1, x2]), w12, b2)
# AND 게이트
def AND(x1, x2):
return MLP(np.array([x1, x2]), w2, b3)
# XOR 게이트
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
'공부정리 > 모두의 딥러닝 (교재 정리)' 카테고리의 다른 글
[deeplearning] 신경망의 이해 - 신경망에서 딥러닝으로 (0) | 2022.05.02 |
---|---|
[deeplearning] 신경망의 이해 - 오차 역전파 (0) | 2022.04.29 |
[deeplearning] 딥러닝의 동작 원리 - 로지스틱 회귀 (0) | 2022.04.14 |
[deeplearning] 딥러닝의 동작 원리 - 경사 하강법 (0) | 2022.04.14 |
[deeplearning] 딥러닝의 동작 원리 - 선형 회귀 (0) | 2022.04.14 |