기계학습 문제는 훈련 데이터를 사용해 학습한다. 더 구체적으로 말하면 훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아낸다.
이렇게 하려면 모든 훈련 데이터에 대한 손실 함수를 구해야 한다. 극단적으로 훈련 데이터가 1억개라면, 손실함수의 연산을 1억번 해야한다는 것이다.
지금까지는 데이터 하나에 대한 손실 함수만 생각해봤으니, 이제 훈련 데이터 모두에 대한 손실 함수의 합을 구하는 방법을 생각해보자.
예를 들어 교차 엔트로피 오차는 아래의 식처럼 된다.
이 때 데이터가 N개라면, t_nk 는 n 번째 데이터의 k번째 값을 의미한다. ( y_nk는 신경망의 출력, t_nk는 정답 레이블 이다).
수식이 좀 복잡해 보이지만, 데이터 하나에 대한 손실 함수를 단순히 N개의 데이터로 확장했을 뿐이다. 다만 마지막에 N으로 나누어 정ㄱ화했을 뿐이다.
N으로 나눔으로써 평균 손실 함수를 구하는 것이다.
한 가지 예를 들어, 학습할 데이터가 60,000개 라고 생각해보자. 그래서 모든 데이터를 대상으로 손실 함수의 값을 구하려면 시간이 좀 걸린다.
더 나아가 빅데이터 수준이 되면 그 수는 수백만에서 수천만도 넘어가는 거대한 값이 되기도 한다.
이런 경우 데이터 일부를 추려 전체의 ‘근사치’로 이용한다. 신경망 학습에서도 훈련 데이로부터 일부만 골라 학습을 수행한다.
이 일부를 “ mini-batch “ 라고 한다. 가령 60,000장의 훈련 ㅔㄷ이터 중에서 100장을 무작위로 뽑아 그 100장만을 사요안ㄴ 것이다.
이러한 학습 방법을 미니배치 학습 이라고 한다.
미니배치 학습을 통해, 훈련 데이터에서 지정한 수의 데이터를 무작위로 골라 내는 코드를 작성해보자.
데이터셋은 MNIST를 사용했다.
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_test) = \
load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape)
print(t_train.shape)
(60000, 784)
(60000, 10)
위에 코드에서 MNIST 데이터를 읽은 결과, 훈련 데이터는 60,000개이고, 입력 데이터는 784열이다.
또 정답 레이블은 10줄짜리 데이터 이다.
이 훈련 데이테에서 무작위로 10개만 빼내는 것을 예제로 작성해보았다.
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_test) = \
load_mnist(normalize=True, one_hot_label=True)
train_size = x_train.shape[0]
batch_size = 10
for i in range(10):
batch_mask = np.random.choice(train_size, batch_size)
print("랜덤 추출 : " , batch_mask)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
랜덤 추출 : [11718 38734 29460 539 1752 57056 32267 28465 38734 149]
랜덤 추출 : [42251 28834 30894 46370 10350 16959 43893 18085 33548 57386]
랜덤 추출 : [35777 51669 31463 52295 45013 12276 50189 48994 38193 3719]
랜덤 추출 : [29501 16446 36004 30436 8633 24590 9271 56172 42980 46968]
랜덤 추출 : [26656 24535 13207 47445 10640 10559 17505 17792 7628 23751]
랜덤 추출 : [18101 47076 15444 35358 11611 27825 5887 7187 10064 33366]
랜덤 추출 : [43364 9767 26194 5651 33965 23098 29607 37593 41360 21014]
랜덤 추출 : [33818 31914 13031 57029 3029 15093 49297 52823 36352 10020]
랜덤 추출 : [56469 36663 982 2039 40573 20188 26960 21721 48107 15700]
랜덤 추출 : [14558 20321 5270 21295 15514 36408 20984 30617 30568 21280]
이제 무작위로 선택한 이 인덱스를 사용해 미니배치를 뽑아내기만 하면 된다. 손실 함수도 이 미니배치로 계산한다.
NOTE_
텔레비전 시청률도 모든 세대의 텔레비전이 아니라 선택된 일부 기구의 텔레비전만을 대상으로 구한다. 예를 들어 경기 지방에서 무작위로 선정한 1,000가구를 대상으로 시청률을 계측한 다음,
경기 지방 전체의 시청률로 근사하는 것이다. 이 시청률 이야기와 마찬가지로 미니배치의 손실 함수도 일부 표본 데이터로 전체를 비슷하게 계측한다.
즉, 전체 훈련 데이터의 대표로서 무작위로 선택한 작은 덩어리 ( 미니 배치 ) 를 사용하는 것이다.
'머신러닝, 딥러닝' 카테고리의 다른 글
수치 미분 ( numerical differentiation ) (0) | 2020.01.20 |
---|---|
왜 손실함수를 사용하는가? (0) | 2020.01.20 |
교차 엔트로피 오차 ( Cross Entropy Error, CEE ) (0) | 2020.01.20 |
tensorflow CNN (합성곱) 에서의 conv2d (0) | 2020.01.20 |
손실 함수와 평균 제곱 오차 ( MSE ) (1) | 2020.01.19 |