Chap.03 신경망
3-0. Intro
우리는 앞 장에서 아무리 복잡한 처리도 다층 퍼셉트론을 활용한다면 구현할 수 있다고 배웠다.
하지만 우리는 그 동안 퍼셉트론을 구현할 때 가중치, 편향 값을 임의로 우리가 정해주었다.
이번장에서 배울 신경망은 적절한 가중치, 편향을 알아서 정해준다.
이러한 자동으로 학습하는 능력을 가진 신경망의 성질은 앞으로 매우 중요하다.
그러니 후딱 시작하자!!
3-1. 퍼셉트론에서 신경망

먼저 신경망이 어떻게 생겼는지 살펴 보자.
신경망은 입력층, 은닉층, 출력층으로 구성되며 은닉층은 입력층, 출력층과 달리 사람에게 보이지 않는 층을 말한다.
단순히 그림만 봤을 때는 기존 퍼셉트론과 다를 것이 없어보인다.
퍼셉트론 네트워크에서 편향 표현

기존 퍼셉트론 그림에서는 편향을 표현하지 않았지만 위의 그림에서는 편향을 표현하였다.
위의 그림에서 편향의 입력값은 항상 1이기 때문에 그림과 같이 표현하였다.
활성화 함수


위의 수식은 편향을 표기한 퍼셉트론을 수식으로 나타낸 것이다.
이전 2장에서 본 수식과는 다르게 활성화 함수 h(x)를 사용하여 표현하였다.
💡 여기서 활성화 함수란?
입력 신호의 총합을 출력신호로 변환하는 함수를 활성화 함수라고 불른다.

활성화 함수를 표현한 퍼셉트론 이미지는 다음과 같다.
3-2. 활성화 함수
활성화 함수에는 많은 종류들이 있는데 그 중 계단 함수라는 것을 살펴보자.

위의 그래프는 계단함수를 그래프로 나타낸 것이다.
💡 계단함수란?
입력이 0을 넘으면 1을 출력하고, 그 외에는 0을 출력하는 함수이다.
이제 계단 함수를 코드로 구현해보자.
def step_function(x):
return np.array(x > 0, dtype=np.int)
단 두 줄이면 계단함수를 쉽고 간단하게 구현할 수 있다.
자 이제 다른 활성화 함수인 시그모이드 함수를 살펴보자.

위에 보이는 수식은 시그모이드 함수의 수식이다. 처음 보면 어렵다고 느껴질 수 있는데 단지 그냥 함수일 뿐이다.(겁먹지 말자!)

시그모이드 함수는 위와 같은 그래프를 같는데 아직까지는 시그모이드가 어떤 역할을 하는지 잘 모르겠다.
그럼이제 코드로 구현해 보자.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
시그모이드 함수도 수식 그대로 코드를 쉽게 구현할 수 있다.
우리는 지금까지 2개의 활성화 함수를 살펴보았다. 그렇다면 이 활성화 함수들의 장 단점을 비교하며 살펴보자.
시그모이드 함수와 계단 함수 비교

두 개의 그래프를 곂쳐 그려보았다.
이 두 개의 활성화 함수의 차이점은 시그모이드 함수는 연속적인 실수값을 출력하지만, 계단 함수는 0,1만 출력한다는 점이다.
이 부분은 신경망과 퍼셉트론의 차이점을 설명하는 데 용의한데 퍼셉트론은 0 또는 1이 입력으로 주어지지만 신경망에서는 연속적인 실수값들을 입력으로 하기 때문에 신경망에서는 시그모이드 함수를 선호한다.
하지만 두 개의 활성화 함수는 입력이 커지면 1에 가까워진다는 공통점도 가지고 있다.
또한 둘다 비선형 함수라는 공통점도 가지고 있다.
💡 비선형 함수란?
문자 그대로 선형이 아닌 함수, 즉 직선 1개로는 그릴 수 없는 함수이다.
신경망에서는 선형함수 대신 비선형함수를 사용해야 한다.
그 이유는 선형함수를 사용하게 되면 신경망의 층을 아무리 깊게 해도 얇게 층을 표기한것과 똑같기 때문이다.
ReLU 함수


위에 보이는 수식과 그래프는 또 다른 활성화 함수인 ReLU함수의 수식과 그래프이다.
오래전부터 신경망 분야에서 시그모이드 함수를 사용했지만 최근에는 ReLU함수를 주로 사용한다.
ReLU함수의 python 코드는 아래와 같다.
def relu(x):
return np.maximum(0, x)
3-4. 3층 신경망 구현하기
이제 앞에서 배운 활성화 함수를 이용해서 3층 신경망을 구현해보자.




3층 신경망의 구현 과정은 위에 그림들과 같다.
그림들을 간단히 설명하자면 0층에서 1층으로 갈 때 가중치를 곱하고 편향을 더해 A1으로 전달되고 활성화 함수인 시그모이드 함수를 거쳐 Z1으로 전달된다. 이 후 1층에서도 똑같은 반복이 일어나고 A3로 전달된다. 이후 항등함수인 y()를 거치고 최종 전달된다.
3-5. 출력층 설계하기
우리는 최종 전달 함수인 출력층에서 항등함수를 사용해 3층 신경망을 구현하였다.
다른 방법인 소프트맥스 함수를 살펴보자.
💡 소프트맥스 함수란?
분류에서 흔히 사용되며 입력신호의 지수함수를 모든 입력신호의 지수함수의 총합으로 나눈것이다.
또한 소프트맥스 함수의 총 합은 1이다. 이 성질을 이용해 소프트맥스 함수의 출력을 '확률'로 해석할 수 있다.
소프트맥스 함수에서 각 원소의 대소 관계는 변하지않는다.


위의 수식과 그림은 소프트맥스 함수의 수식과 그림이다.
코드로 구현해 보자.
def softmax(x):
x = x - np.max(x) # 오버플로 대책
y = np.exp(x) / np.sum(np.exp(x))
return y
3-6. 손글씨 숫자 인식
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
return x_test, t_test
def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network
def predict(network, x):
w1, w2, w3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, w1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, w2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, w3) + b3
y = softmax(a3)
return y
x, t = get_data()
network = init_network()
batch_size = 100 # 배치 크기
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
앞에서 구현한 3층신경망을 토대로 mnist라는 손글씨 분류 모델 네트워크를 구현하고 정확도를 측정하는 코드이다.
여기서 3층 신경망과 다른점은 배치 사이즈를 정했다는 것이다.
💡 배치란?
하나의 묶은 입력 데이터이다.
배치처리를 하면 이미지 1장당 처리하는시간이 줄어든다.
한 마디로 여러개의 이미지를 한 번에 학습하는 것
Chapter 3. 정리
신경망에서는 활성화 함수로 시그모이드 함수와 ReLU함수 같은 매끄럽게 변화하는 함수를 이용한다.
넘파이의 다차원 배열을 잘 사용하면 신경망을 효율적으로 구현할 수 있다.
기계학습 문제는 크게 회귀와 분류로 나뉠수 있다.
출력층의 활성화함수로는 회귀에서는 주로 항등함수를, 분류에서는 주로 소프트맥스 함수를 이용한다.
분류에서는 출력층의 뉴런 수를 분류하려는 클래스 수와 같게 설정한다.
입력 데이터를 묶은 것을 배치라 하며, 추론 처리를 이 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.
출처: 사이토 고키, 『밑바닥부터 시작하는 딥러닝』, 한빛미디어(2017)
'Deep Learning > deep learning from scratch' 카테고리의 다른 글
| Chap.06 학습 관련 기술들 (0) | 2022.01.09 |
|---|---|
| Chap.05 오차역전파법 (0) | 2022.01.07 |
| Chap.04 신경망 학습 (0) | 2022.01.07 |
| Chap.02 퍼셉트론 (0) | 2022.01.05 |
| Intro. Deep learning for scratch (0) | 2022.01.05 |



