기본 중에 기본. 모델학습을 처음 시도할 때 'tiny dataset으로 해보는 거고 사용자가 적절히 정해주는 건데 내가 적절히 해주면 얘도 눈치껏 알아먹겠지' 이런 식으로 접근했던 게 일주일치 고생으로 돌아왔다 하하하. 역시 기본기가 탄탄해야 한다. 렛츠고.
전체 데이터 5000개를 batch_size 250, mini batch 20(간혹 어떤 모델에서는 steps of epoch이렇게 표현하는데 개인적으로 이 표현이 더 와닿는다), epoch 300으로 학습을 한다고 할 때 모델이 어떻게 학습하는지 알아보자.
5000개 데이터 중에서 250개씩 20개의 mini batch를 만들어 놓는다. 모델이 1번 mini batch부터 20번 mini batch까지 한 번씩 쓱보면 1 epoch. 이때 parameter 업데이트는 mini batch 단위로 일어난다. 업데이트 단위는 iteration이라고 부른다.
[ 1 epoch 5000 ]
[batch size 250], [batch size 250], [batch size 250], ...[batch size 250]
[ mini batch 1 ] [ mini batch 2 ] [ mini batch 3 ] [ mini batch 20]
[ iteration 1 ] [ iteration 2 ] [ iteration 3 ] [ iteration 20 ]
그래서 batch size에 의해 mini batch가 정해진다.
mini batch = data size batch size
웬만하면 위 식을 맞춰주는 게 좋다. 안 그러면 학습이 아예 안 된다. 만약 batch size가 조금 남거나 모자라면 남는 데이터는 과감하게 학습 데이터에서 빼는 게 좋다. batch size를 높일수록 gpu자원을 많이 차지하지만 학습시간을 단축하면서 성능도 보장받을 수 있어서 gpu가 가진 최대 자원을 이용하는 수를 정한다. gpu는 2거듭제곱으로 데이터를 활용하기 때문에 batch size는 32, 64, 128처럼 2의 거듭제곱수가 효율이 좋다.
사실 프로젝트 하면서 공부했다가 최근에 최적화 기법을 정리하는데 햇깔려서 다시 정리해둔다. 일반적으로 최적화하는데 경사하강법을 쓰는데 이 때 batch size에 따라 경사하강법의 종류가 달라진다.
if batch_size == data_size:
optimizer = batch_gradient_descent()
elif batch_size == 1:
optimizer = stochestic_gradient_descent()
elif batch_size > 1 or batch_size < data_size:
optimizer = mini_batch_gradient_descent()
각각의 경사하강법의 특성과 장단점은 다음에 알아보도록 하자.