본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
AI/Deep learning from Scratch

[머신러닝, 딥러닝] 신경망 학습 (2) - 미니 배치 학습

by parzival56 2023. 2. 12.

미니 배치 학습은 경사 하강법에서 발생하는 성능 저하 문제를 해결하기 위해서 등장한 미니 배치 경사 하강법과 유사한 원리를 가지는 학습법입니다.

 

미니 배치 경사 하강법이 등장하기 이전에도 성능 저하 문제를 해결하기 위해서 여러 방법들이 존재했습니다.

대표적으로는 배치 경사 하강법과 확률적 경사 하강법입니다. 

전자는 전체 데이터셋을 하나의 배치(batch)라고 두어 한꺼번에 처리를 하는 것을 의미합니다. 전체를 한꺼번에 처리하기 때문에 누락 없이 꽤 정확한 결과를 가져올 수 있겠지만 반면에 시간이 너무나 오래 걸린다는 단점이 있습니다.

후자는 전자의 시간 문제를 해결하기 위해 고안되었습니다. 그러나 시간이 걸리는 문제는 해결했지만 이번에는 정확도가 떨어지게 되었고, 이로 인해 등장한 것이 미니 배치 경사하강법입니다.

 

간략하게 말하자면, 전체 데이터셋을 겹치지 않는 여러 개의 배치로 나눠서 각각의 배치에서 오차를 구한 후 이를 평균을 내는 방법입니다.

 

미니 배치 학습은 위에서 나온 미니 배치 경사 하강법에서 '미니 배치'라는 개념을 이용하는데 정의는 전체 데이터셋을 미니 배치로 나누고 모델을 학습시킬 때 미니 배치 안에 있는 내용들만 학습을 시키는 것입니다.

예를 들어 전에 다뤘던 MNIST 데이터셋에는 60000장의 훈련 데이터가 있었습니다. 그럼 이 중에서 100장을 무작위로 뽑고 이 100장 만을 사용하는 것이 미니 배치 학습입니다. 

 

코드로 알아보겠습니다.

# mnist 함수 불러오기
import sys
sys.path.append('/content/mnist.py')
import numpy as np
from mnist import load_mnist

(x_train, t_train), (x_test, t_test) = \
  load_mnist(normalize=True, one_hot_label=True)

print(x_train.shape)
print(t_train.shape)

먼저 사전의 mnist 파일에서 함수를 불러오는 과정입니다. 해당 과정은 이전에도 있으니 참고바랍니다.

 

다음은 전체 데이터셋에서 우리가 원하는 만큼의 개수를 뽑아오는 과정입니다.

# 미니 배치 학습

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]

눈에 띄는 것은 일단 batch일 것입니다. 해당 코드를 첫 줄부터 보면 훈련 사이즈를 전체 데이터에서 단일 데이터가 몇 개 들어있는지를 반환합니다. 그럼 train_size는 60000이 되는 것입니다. 다음 줄로 내려가면 batch_size를 10으로 설정했습니다. batch_size는 밑으로 내려가면 의미를 찾을 수 있게 됩니다. 

넘파이의 random 안에 있는 choice라는 함수입니다. 이는 뜻 그대로 랜덤 하게 굴려서 고르겠다는 뜻입니다. 괄호 안데 들어가는 내용이 중요한데 '(전체 사이즈, 몇 개 골라낼건지)'가 됩니다.

즉, 숫자를 끼워 넣어서 하면 np.random.choice(60000, 10)이 되고, 이는 60000까지의 숫자 중 랜덤하게 10개를 뽑는 것이 됩니다.

 

그렇다면 이전에 다뤘던 손실함수를 배치용으로 구현학 위해서는 어떻게 해야 할까요?

위의 미니 배치에 사용된 코드를 조금만 변형시켜주면 됩니다.

교차 엔트로피 오차로 예를 들어보겠습니다.

def cross_entropy_error(y, t):
  if y.ndim == 1:
    t = t.reshape(1, t.size)
    y = y.reshape(1, y.size)

  batch_size = y.shape[0]
  return -np.sum(t * np.log(y + 1e-7)) / batch_size

y는 신경망의 출력, t는 정답 레이블입니다. 이 코드는 원-핫 인코딩 된 경우를 예시로 하고 있고, 조건문에 1을 넣어주었고 이에 맞춰 1인 경우에 형태를 변형해 주는 reshape를 사용합니다. 이렇게 y와 t를 모두 써준 이유는 대이터가 하니인 경우와 배치로 묶여 입력되는 경우를 모두 처리해 주기 위함입니다. 

만약 원-핫 인코딩을 하지 않는다면 나머지는 같겠지만 반환문이 달라질 것입니다.

 


이상으로 미니 배치 학습에 대한 간단한 소개였습니다. 미니 배치 같은 경우에는 현재 학습을 다룰 때 가장 보편적으로 쓰이는 방법으로 후에도 나올 내용이기도 합니다.

댓글