위 글은 [모두의 딥러닝 (개정 2판)] 을 바탕으로 학습하여 작성한 글입니다.
인공 신경망
인간의 뇌는 뉴런과 뉴런 사이에 시냅스라는 연결 부위로 이루어진 구조를 가지고 있습니다.
전위가 임계 값을 넘으면 다음 뉴런으로 신호를 전달하고 임계 값에 미치지 못하면 아무 변화가 일어나지 않는 것입니다.
이는 이전 포스트에서 학습한 로지스틱 회귀와 닮았다고 볼 수 있습니다.
입력 값을 넣고 활성화 함수에 의해 일정한 수준을 넘으면 참을, 그렇지 않으면 거짓을 보내는 회로인 것입니다.
뉴런과 비슷한 매커니즘을 사용하여 인공적으로 생각하는 무엇인가를 만들기 위해 시작한 연구가 인공 신경망 연구입니다.
신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론입니다.
기본 용어 정의 (가중치, 가중합, 바이어스, 활성화 함수)
퍼셉트론에서 사용하는 용어는 기존의 수학에서 사용하는 용어와 사뭇 다릅니다.
기존의 수식에서
$$y=ax+b$$
$$-> y=wx+b$$로 바꾸어 표기합니다.
기울기 a는 퍼셉트론에서 weight(가중치)를 의미하는 w로 표기 합니다.
y절편인 b는 표기는 그대로이나 용어는 bias라 합니다.
입력 값과 가중치의 곱을 모두 더한 다음 거기에 바이어스를 더한 값을 가중합이라고 합니다.
마지막에 가중합의 결과를 놓고 출력 값을 도출하는 함수가 필요한데 그러한 함수를 활성화 함수라 합니다.
대표적으로 저번 포스트에서 배운 시그모이드 함수가 있습니다.
더 많은 활성화 함수는 추후에 배우도록 하겠습니다.
퍼셉트론의 문제
퍼셉트론은 XOR 문제를 가지고 있습니다.
XOR는 논리 회로에 등장하는 개념으로 이는 다음과 같은 문제를 드러냅니다.
AND와 OR 연산자는 직선을 그어 결과 값이 1인 값과 0인 값으로 구분지을 수 있습니다.
그러나 XOR 연산자는 그렇지 못한 것을 확인할 수 있습니다.
이를 해결하기 위해 다층 퍼셉트론의 개념이 등장합니다.
다층 퍼셉트론
1차원 평면에서 논리 회로를 표현하는 경우 XOR 논리 회로에 참과 거짓을 구별하는 것은 불가능합니다.
이를 해결하기 위해 좌표평면 자체에 변화를 주어 2차원 공간에서 생각해봅니다.
두 개의 퍼셉트론(다층)을 한 번에 계산한다면 이를 해결할 수 있습니다.
두 개의 퍼셉트론을 만든다는 것은 은닉층을 추가한다는 것을 의미합니다.
은닉층을 만들어 공간을 왜곡해 두 영역을 가로지르는 직선을 찾습니다.
다층 퍼셉트론의 설계
다층 퍼셉트론의 기본 구조를 도식으로 나타내면 다음과 같습니다.
가운데 숨어있는 은닉층으로 퍼셉트론이 각각 자신의 가중치(w)와 바이어스(b) 값을 보내고, 이 은닉층에서 모인 값이 한 번 더 시그모이드 함수를 이용해 최종 값으로 결과를 보냅니다.
은닉층에 모이는 중간 정거장을 노드라고 하며, 여기서 n1과 n2를 나타냅니다.
n1과 n2의 값은 다음과 같습니다.
$$ n_1 = \sigma (x_1w_{11}+x_2w_{21}+b_1) $$
$$ n_2 = \sigma (x_1w_{12}+x_2w_{22}+b_1) $$
위 두 식의 결괏값이 출력층으로 보내집니다. 출력층에서도 시그모이드 함수를 통해 y값이 정해집니다.
$$ y_{out}=\sigma (n_1w_{31}+n_2w_{32}+b_3) $$
파이썬을 이용한 XOR 문제 해결하기
XOR 문제 해결을 만족하는 가중치와 바이어스를 구해 대입합니다.
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
다음과 같이 퍼셉트론 함수를 정의해줍니다.
# 퍼셉트론
# 매개 변수로 입력값, 가중치, 바이어스를 넣어줌.
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값을 번갈아 대입해 가며 최종 값을 출력합니다.
# 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
이러한 코드를 통해 원하는 XOR 문제를 해결한 정답이 도출되었습니다.
퍼셉트론 하나로 해결되지 않던 문제를 해결한 것입니다.
은닉층을 여러 개 쌓아올려 복잡한 문제를 해결하는 과정은 뉴런이 복잡한 과정을 거쳐 사고하는 사람의 신경망과 닮았습니다.
그래서 이러한 방법을 인공 신경망이라 부릅니다.
'Deep Learning' 카테고리의 다른 글
[모두의 딥러닝] CNN (0) | 2022.02.23 |
---|---|
[모두의 딥러닝] 신경망과 딥러닝 (0) | 2022.02.21 |
[모두의 딥러닝] 로지스틱 회귀(Logistic Regression) (0) | 2022.02.21 |
[모두의 딥러닝] 경사하강법(Gradient Descent) (0) | 2022.02.21 |
[모두의 딥러닝] 선형 회귀 (Linear Regression) (0) | 2022.02.14 |