2장부터 시작해보도록 하자.
앞의 numpy와 matplotlib의 pyplot, 논리게이트에 대한 내용은 생략한다.
퍼셉트론은 신경망의 기원이 되는 알고리즘이다.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
각 입력값마다 고유한 가중치(w)를 곱해서 그 값들의 합이 임계값(θ)을 넘어서면 1, 그렇지 못하면 0을 출력한다.
가중치가 클수록 해당값이 중요하다는 것을 의미한다.
이제 이 논리회로를 파이썬을 이용하여 AND게이트로 구현하면 다음과 같다.
def AND(x1, x2): # x1, x2는 입력값
w1, w2, theta = 0.5, 0.5, 0.7 # 입력값마다 가지는 고유한 가중치와 임계값
tmp = x1*w2 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
앞의 코드는 직관적이지만, 앞으로를 위해 다음과 같이 바꿔보자.
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 # 입력값이 (1,1)일 때만
임계값 θ를 -b로 치환하고 numpy 라이브러리를 활용한 것뿐이다.
이때 b를 '편향'이라고 한다.
나머지는 그대로이며, 가중치와 입력값을 곱한 합이 0보다 크면 1을, 작으면 0을 출력하는 알고리즘이다.
가중치는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수고, 편향은 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수다.
문맥에 따라, 둘다 가중치라고 부르기도 한다.
이제 NAND 게이트와 OR 게이트도 쉽게 구현할 수 있다.
단, 여기서 사용하는 가중치와 편향 말고도 가능한 조합은 무궁무진하다.
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # AND와는 가중치(w와 b)의 부호만 다르다!
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1 # 입력값이 (0, 0)일 때만
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # AND와는 편향(b)만 다르다!
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0 # 입력값이 (0, 0)일 때만
else:
return 1
하지만 퍼셉트론의 한계도 존재한다.
아래 그림을 살펴보면 OR 게이트는 직선으로 영역이 나뉘어짐을 알 수 있다.
이에 반해, XOR 게이트는 직선으로는 나눌 수 없다. 다음과 같이 곡선으로만 나눌 수 있다.
그림 2-8과 같은 곡선의 영역을 비선형 영역, 그림 2-6과 같은 직선의 영역을 선형 영역이라고 한다.
이를 표현하기 위해서는 층을 쌓아 '다층 퍼셉트론'을 만들어야 한다.
다층 퍼셉트론에 대해 이야기하기 전에, 먼저 XOR 게이트를 파이썬으로 구현해보자.
사실 이는 매우 간단하다. 앞에서 만든 AND, NAND, OR 게이트를 조합하면 되기 때문이다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
지금 구현한 XOR게이트를 뉴런을 이용한 퍼셉트론으로 표현하면 다음과 같다.
이런 구조가 바로 층이 여러 개인 퍼셉트론으로, 다층 퍼셉트론이라 한다.
이 퍼셉트론은 다음과 같이 동작한다.
1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.
위의 동작을 통해 단층 퍼셉트론으로 구현하지 못한 것을 층을 하나 늘려 구현할 수 있었다.
퍼셉트론을 층을 쌓아 구조를 만들면 이론적으로 컴퓨터를 만드는 것도 가능하다.
퍼셉트론은 간단한 알고리즘이지만 다음 장에서 배울 신경망의 기초가 되므로 명확히 알아야 한다.
출처 : Deep Learning from scratch(밑바닥부터 시작하는 딥러닝)
'딥러닝' 카테고리의 다른 글
[Incarnate the Algorithm] Linear Classification (2) | 2023.04.11 |
---|---|
[Incarnate the Algorithm] Linear Regression (0) | 2023.04.07 |
[Incarnate the Algorithm] Gradient Descent (0) | 2023.04.07 |
[Incarnate the Algorithm] Zero-order optimization Coordinate Search (0) | 2023.03.24 |
[Deep Learning from scratch] 3. 신경망 (0) | 2023.03.05 |