좋은 batch size 고르기


원문 Stackoverflow: Tradeoff batch size vs. number of iterations to train a neural entwork를 번역하고 정리한 글입니다.

  • batch size가 𝑎일 때 학습에 필요한 step 수 𝑏
  • vs. batch size가 𝑐일 때 학습에 필요한 step 수 𝑑

𝑎𝑏 = 𝑐𝑑 를 만족하는 batch size와 step수를 찾을 수 있을까? 어떻게 하면 가장 적절한 batch size와 steps수를 구할 수 있을까?

Insights

On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima

  • 실제 학습 과정에 있어서 더 큰 batch size를 골랐을 때 다양한 데이터에 “일반화”함에 있어서 모델의 성능이 눈에 띄게 하락하는 것이 확인되었다.
    • (2016) 큰 batch size가 주어진 상황에서의 일반화 성능이 하락하는 이유를 정확히 설명하기 위한 시도는 여러 방면에서 이루어졌지만, 이 현상의 정확한 이유는 아직까지 알려지지 않았다.
  • 우리는 이 현상에 대한 이유를 큰 batch size 일수록 함수가 sharp minimizer에 수렴하기 쉽기 때문이라고 설명한다.

convergence trajectory

TL;DR: 너무 큰 batch size는 모델의 정확도를 낮춘다

학습의 과정에는 두 가지 “속도”가 있다. 하나는 연산 속도이고, 하나는 알고리즘의 수렴 속도이다.
연산속도는 쉽게 말해 하드웨어에서 산술적인 연산을 실행하는 데에 드는 속도이다. 이 속도는 대게 batch size가 크면 클수록 빠르다. 선형대수 library들이 vector와 matrix 연산에 vectorization 방법을 통해 memory를 더 사용하는 비용을 치루는 대신 필요한 연산의 수를 효과적으로 줄이기 때문이다.

vectorization

하지만 또 다른 “속도” 였던 알고리즘의 수렴 속도를 살펴본다면, 결과는 조금 다르다.
우선 알고리즘이 수렴하는 게 무슨 뜻일까? 예를 들자면 우리가 알고리즘에게 기대하는 검증 데이터셋에서의 (높은) 정확도를 달성하거나, (낮은) 에러율을 달성하면 된다. 만약에 우리가 전체 데이터를 학습에 사용한다면 매 epoch이 끝날 때 알고리즘은 데이터에 대해 지역적이거나 전체적인 최솟값을 찾아낼 것이다. 하지만 우리가 사용하는 stochastic한 경사하강법은 절대로 minimum에 머무르지 않는다. 계속해서 어떤 지점의 위 아래로 요동친다. 하지만 요동친다는 점은 별로 유효하지 않다. 어찌됐건 최저점과 가깝기 때문이다. 그렇게 골라진 파라미터들을 우리는 “괜찮다”고 본다.

여기서 주목해야 할 점이 있다. 작은 batch size를 사용할수록 큰 batch size를 사용할 때보다 error에 있어서 더 많은 noise(oscillation)가 발생하는데, 직관적으로는 이 noise가 나쁜 것처럼 보일 수 있지만, 알고리즘은 이 noise를 겪음으로서 피하고자 하는 지역적인 minimum을 뛰어넘을 기회를 끊임없이 만들어내기 때문에 그 끝에는 사실 더 좋은 결과를 보여주게 된다.

그렇기 때문에 만약 우리가 작은 batch size를 사용했을 때 큰 batch size를 사용했을 때보다 더 나은 결과를 얻을 수 있다면, 그것이 우리가 “원하지 않았던” error의 noise 덕분이라고 하면, 우리는 “만족할 수 있는” 모델의 학습에 사용하는 전체적인 소요시간을 직접 설정할 수 있게된다.

왜 딥러닝에서는 gradient를 한 번 계산하기 위해 모든 학습 데이터를쓰지 않는거죠?

속도 때문에 그렇다 - Matthew Lai, Research Engineer @ Google DeepMind

모델에 높은 learning rate 값을 부여한다고 하여 학습이 정말 그만큼 빨리 끝나는 것이 아니다.
모델이 만에 하나 이론적으로 완벽한 gradient를 갖고 있다고 치더라도, 학습의 과정은 여전히 “지역적인 추측”이기 때문에 여러 번에 걸쳐 이 추측을 수정하는 것이 여전히 중요하다.
만에 하나 당신이 500만 개의 학습 데이터를 가지고 있다고 하더라도, 500만 개의 데이터 중 1000개의 데이터에서 얻는 gradient값은 모든 학습 데이터에서 얻을 수 있는 gradient와 아주 크게 다르지 않다.
계산 속도가 선형적이라고 가정할 때 1000개의 데이터에서 gradient를 한 번 계산하는 것은 500만 개 데이터에개 gradient를 한 번 계산하는 데에 드는 시간보다 5000배 빠르다.
현실에서 이 결과는 정말 큰 차이로 나타난다. 학습 과정에 있어서는 cost function의 결과가 요동치기 때문에 다소 잡음이 낀 것처럼 보일 수 있지만, 가장 큰 장점은 속도다.

Ian Goodfellow

learning rate의 값은 주로 cost function이 얼마나 굴곡져 있는 가에 따라 제한된다. 우리는 쉽게 경사하강법이 cost function에 대한 “선형적인 추측”이라고 생각하고, 그렇기 때문에 대략적인 cost에 의해서 계속해서 더 낮은 지점으로 내려갈 수 있다고 생각한다. 하지만 cost function이 선형적이지 않다면 (굴곡이 많다면) 이 추측은 더욱 더 어려워진다. 그렇기 때문에 더 작은 step씩 나아가는 것이 안전하다. numerical computation

minibatch에 m개의 데이터를 넣을 때 O(m)만큼의 연산량과 O(m)만큼의 메모리가 사용되었을 때 gradient에서 줄어드는 불확실성의 양은 O(sqrt(m))에 불과하다. 그렇기 때문에 minibatch에 더 많은 데이터를 넣는 것에는 정말 미미한 수준의 차이만을 남긴다.

더 읽어보기

How AI Training Scales
An Empirical Model of Large-Batch Training
Train longer, generalize better: closing the generalization gap in large batch training of neural networks
Batch Size in Deep Learning