본문 바로가기
ML & DL/밑바닥부터 시작하는 딥러닝

[파이썬 딥러닝] 신경망 학습

by Glory_Choi 2023. 3. 16.
반응형

학습

학습이란?

훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 뜻한다.

 

훈련 데이터와 시험 데이터

기계 학습 문제는 데이터를 훈련 데이터(train data)와 시험 데이터(test data)로 나눠 학습과 실험을 수행하는 것이 일반적입니다.

우선 훈련 데이터만 사용하여 학습하면서 최적의 매개변수를 찾습니다. 그런 다음 시험 데이터를 사용하여 앞서 훈련한 모델의 실력을 평가하는 것입니다.

 

훈련 데이터와 시험 데이터를 나누는 이유는 우리가 원하는 모델은 범용적으로 사용할 수 있는 모델이기 때문입니다. 이 범용 능력을 제대로 평가하기 위해 훈련 데이터와 시험 데이터를 분리하는 것이죠.

범용 능력은 아직 보지 못한 데이터로도 문제를 올바르게 풀어내는 능력입니다. 이 범용 능력을 획득하는 것이 기계학습의 최종 목표입니다.

 

한 데이터셋에만 지나치게 최적화된 상태를 오버피팅이라고 합니다. 오버피팅 피하기는 기계학습의 중요한 과제이기도 합니다.

 

손실 함수

오차 제곱합

오차제곱합은 가장 많이 사용되는 손실 함수입니다. 수식으로는 다음과 같습니다.

위 식에서 y는 신경망의 출력(신경망이 추정한 값), t는 정답 레이블(실제 정답), k는 데이터의 차원 수를 나타냅니다. 이 오차제곱합을 파이썬으로 구현하면 다음과 같습니다.

import numpy as np

def sum_squares_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

print(sum_squares_error(np.array(y), np.array(t)))

y=[0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

print(sum_squares_error(np.array(y), np.array(t)))
[출력]
0.09750000000000003
0.5975

 

교차 엔트로피 오차

위 식에서 log는 밑이 e인 자연로그입니다. y는 신경망의 출력, t는 정답 레이블입니다. 또 t는 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0입니다.(원 - 핫 인코딩). 그래서 실질적으로 정답일 때의 추정의 자연로그를 계산하는 식이 됩니다.

import numpy as np
def cross_entropy_error(y, t):
    delta = 1e-7
    return -np.sum(t *np.log(y + delta))
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

print(cross_entropy_error(np.array(y), np.array(t)))

y=[0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

print(cross_entropy_error(np.array(y), np.array(t)))
[결과]
0.510825457099338
2.302584092994546

 

미니배치 학습

MNIST 데이터셋은 훈련 데이터가 6만개였습니다. 그래서 모든 데이터를 대상으로 손실 함수의 합을 구하려면 시간이 좀 걸립니다. 더 나아가 빅데이터 수준이 되면 그 수는 수백만에서 수천만도 넘는 거대한 값이 되기도 합니다. 더 나아가 빅데이터 수준이 되면 그 수는 수백만에서 수천만도 넘는 거대한 값이 되기도 합니다. 이 많은 데이터를 대상으로 일일이 손실 함수를 구하는 일은 현실적이지 않습니다.

때문에 이런 경우 데이터 일부를 추려 전체의 '근사치'로 이용할 수 있습니다. 신경망 학습에서도 훈련 데이터로부터 일부만 골라 학습을 수행합니다. 이 일부를 미니배치라고 하죠. 가령 6만장의 훈련 데이터 중에서 100장을 무작위로 뽑아 그 100장만 사용하여 학습하는 것입니다. 이러한 학습 방법을 미니배치 학습이라고 합니다.

 

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist

(x_train, t_train), (x_test, t_tset) = load_mnist(normalize=True, one_hot_label=True)

print(x_train.shape)
print(x_test.shape)
[출력]
(60000, 784)
(10000, 784)
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]

 

반응형