이번 글에서는 본격적으로 밑바닥부터 시작하는 딥러닝1 책에 대한 리뷰를 시작합니다.
딥러닝의 가장 기초 개념이라고 할 수 있는 퍼셉트론이 무엇인지에 대해 학습합니다.
또한 AND, NAND, OR 게이트 등을 통해서 퍼셉트론의 구조와 동작 원리도 함께 배울 수 있습니다.
Chapter | Title | Main Topics |
---|---|---|
1강 | 헬로 파이썬 | 파이썬 기초 문법 소개, numpy, matplotlib |
2강 | 퍼셉트론 | AND, NAND, OR 게이트 |
3강 | 신경망 | 활성화 함수, 다차원 배열 계산, 출력층 설계, MNIST |
4강 | 신경망 학습 | 손실 함수, 경사 하강법 |
5강 | 오차역전파법 | 역전파, 활성화 함수 구현 |
6강 | 학습 관련 기술들 | 매개변수 갱신, 배치 정규화, 하이퍼파라미터 값 찾기 |
7강 | 합성곱 신경망 (CNN) | 합성곱 계층, 풀링 계층, CNN 구현 |
8강 | 딥러닝 (Deep learning) | 초기 역사, 딥러닝 활용 |
Appendix | Softmax with loss 계층의 계산 그래프 | - |
Chapter 2. 퍼셉트론
2.1 퍼셉트론이란?
- 신경망 (딥러닝)의 기원이 되는 알고리즘인 퍼셉트론
- 퍼셉트론의 구조를 배우는 것은 신경망 및 딥러닝을 배우는데 기초가 될 것
- 퍼셉트론은 다수의 신호 (흐름이 있는 것)를 입력으로 받아서 하나의 신호를 출력하는 것
- 이 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예
- 그림에서 원은 뉴런 혹은 노드라고 부름
- 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해짐
- $x_1, x_2$는 입력 신호, $y$는 출력 신호, $w_1, w_2$는 가중치
- 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력 (뉴런 활성화)
- 한계값을 임계값이라고 하고, $\theta$로 표현
- 퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치 부여
- 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용 (신호가 클수록 그만큼 중요하다는 것)
2.2 단순한 논리 회로
2.2.1 AND 게이트
- AND 게이트는 입력이 둘이고, 출력은 하나
- AND 게이트는 두 입력이 모두 1일 때만, 1을 출력하고 그 외에는 0을 출력
2.2.2 NAND 게이트와 OR 게이트
- NAND 게이트는 Not AND를 의미하고, AND 게이트의 출력을 뒤집은 것
- OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 것
2.3 퍼셉트론 구현하기
2.3.1 간단한 구현부터
1
2
3
4
5
6
7
8
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
return 0 if tmp <= theta else 1
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
1
2
3
4
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
2.3.2 가중치와 편향 도입
- 기존에 퍼셉트론 동작 원리의 식에서 $\theta$를 $-b$로 치환하면 다음의 식 확인 가능
- 여기에서 $b$를 편향 (bias)이라 하고, $w_1, w_2$는 그대로 가중치
- 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 더해서, 출력값을 결정
2.3.3 가중치와 편향 구하기
- $w_1, w_2$ (가중치)는 각 입력 신호가 결과에 주는 영향력 (중요도)을 조절하는 매개변수
- $b$ (편향)는 뉴런이 얼마나 쉽게 활성화 (결과를 1로 출력) 하느냐를 조정하는 매개변수
- $b$가 -0.1이면, 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과하면 활성화
- $b$가 -20.0이면, 각 입력 신호에 가중치를 곱한 값들이 20을 넘어야 활성화
- 이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화 되는지 결정할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
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
return 0 if tmp <= 0 else 1
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
1
2
3
4
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
1
2
3
4
5
6
7
8
9
10
11
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
return 0 if tmp <= 0 else 1
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
1
2
3
4
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
1
2
3
4
5
6
7
8
9
10
11
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
return 0 if tmp <= 0 else 1
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
1
2
3
4
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1
- 기존에 퍼셉트론 동작 원리의 식에서 $\theta$를 $-b$로 치환하면 다음의 식 확인 가능
- 여기에서 $b$를 편향 (bias)이라 하고, $w_1, w_2$는 그대로 가중치
- 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 더해서, 출력값을 결정
2.4 퍼셉트론의 한계
2.4.1 도전! XOR 게이트
- XOR 게이트는 배타적 논리합이라는 논리 회로
- $x_1, x_2$ 중에서 하나가 1일 때만 1을 출력
2.4.2 선형과 비선형
- 선형식 (직선)으로 XOR 게이트를 표현하는 것은 사실상 불가
- 하지만 비선형 (곡선)으로는 다음과 같이 표현 가능
- 즉, 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있음
2.5 다층 퍼셉트론이 출동한다면
- 단일 퍼셉트론으로는 XOR 게이트를 구현할 수 없었음
- 하지만 층을 쌓아서 올리는 다층 퍼셉트론 (Multi-layer perceptron)으로는 구현 가능
2.5.1 기존 게이트 조합하기
2.5.2 XOR 게이트 구현하기
1
2
3
4
5
6
7
8
9
def XOR(x1, x2):
s1 = OR(x1, x2)
s2 = NAND(x1, x2)
y = AND(s1, s2)
return y
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
1
2
3
4
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
- XOR 게이트는 다음과 같은 다층 구조의 네트워크
- 이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라고 함
- 0층의 두 뉴런이 입력 신호를 받아서 1층의 뉴런으로 신호를 보냄
- 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력
- 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 더 늘려서 구현
- 퍼셉트론은 층을 깊게 쌓아서 더 다양한 것들을 표현할 수 있음
2.6 NAND에서 컴퓨터까지
- NAND 게이트의 조합만으로 컴퓨터가 수행하는 일을 재현할 수 있음
2.7 정리
- 퍼셉트론은 입출력을 갖춘 알고리즘
- 퍼셉트론은 입력을 주면, 정해진 규칙에 따른 값을 출력
- 퍼셉트론은 가중치와 편향을 매개변수로 설정
- 퍼셉트론으로 AND, OR 같은 논리회로 표현 가능
- XOR 게이트는 단층 퍼셉트론 (직선)은 불가능하지만, 다층 퍼셉트론 (곡선)으로 구현 가능
출처: 밑바닥부터 시작하는 딥러닝1 책 리뷰 -> 강의 내용 정리 깃허브 링크