머신러닝/딥러닝 공부

모델이 학습하는 방법 (3) - 확률적 경사하강법(Stochastic Gradient Descent, SGD)와 미니배치 경사하강법(mini-batch Gradient Descent) 본문

AI 공부/Machine Learning

모델이 학습하는 방법 (3) - 확률적 경사하강법(Stochastic Gradient Descent, SGD)와 미니배치 경사하강법(mini-batch Gradient Descent)

호사린가마데라닌 2021. 10. 13. 15:54

 

이전 포스팅에서는 경사하강법(GD)가 가지는 문제들에 살펴보았습니다. 경사하강법의 기울기를 이용한 방법 때문에 근복적으로 생기는 문제들을 완화하기 위해 여러 가지 다른 옵티마이저들이 고안되었습니다. 그중에서 이번 포스팅에서는 확률적 경사하강법(Stochastic Gradient Descent, SGD)미니배치 경사하강법(mini-batch Gradient Descent)에 대해 정리해보겠습니다. 

 

 

그전에 배치(batch)와 에포크(epoch), 반복(iteration)에 대해 알아보겠습니다.

 

 

- 배치(batch)란 머신러닝의 모델에서 모델의 가중치들을 한 번 업데이트시킬 때  사용하는 데이터들의 집합입니다. 

- 배치 사이즈(batch size)는 말 그대로 배치의 크기, 즉 모델의 가중치들을 한 번 업데이트 시킬 때 사용하는 데이터의 개수를 의미합니다. 

- 에포크(epoch)란 모델이 전체 데이터를 모두 사용하여 학습을 한 횟수를 의미합니다. 

- 반복(iteration)이란  1 epoch에 필요한 batch의 갯수입니다 .

 

 

즉, 2500의 dataset을 크기가 100인 dataset 25개로 나누어 학습을 진행할 때, batch size가 100인 batch 25개가 생성되어 1 epoch당 25번의 iteration이 생깁니다.

 

 

앞서 살펴봤었던 경사하강법(Gradient Descent)은 한 번의 가중치 업데이트에 모든 데이터를 사용하므로 배치 사이즈가 전체 데이터 개수라고 할 수 있습니다. 이 때문에 경사하강법은 배치 경사하강법(Batch Gradient Descent, BGD)라고 불리기도 합니다. 

 

 

1) 확률적 경사하강법(SGD)

 

경사하강법은 모든 데이터를 사용하여 기울기를 계산하고, 가중치들을 업데이트합니다. 이 방법은 손실 함수의 최솟값에 안정적으로 수렴할 수 있게 해 준다는 장점이 있지만, 모든 데이터를 사용하기 때문에 데이터가 많아지면 연산량이 매우 많고 메모리를 소비가 심하며 학습시간이 증가하여 결국 모델의 성능을 하락시키는 치명적인 단점이 있습니다.

 

 

이 단점을 해결하기 위해 나온 아이디어가 바로 확률적 경사하강법(이하 SGD)입니다. SGD는 이름에서 유추할 수 있듯이 확률적으로(랜덤하게) 데이터를 뽑아 한 번의 반복당 한 개의 데이터를 사용하여 가중치들을 업데이트하는 방법입니다. 즉 배치의 크기가 1입니다. 전체 데이터를 사용하는 경사하강법과 달리 SGD는 연산량이 비교적 매우 적어 손실 함수의 최적값에 빠른 수렴 속도를 보이고 메모리 소비량이 적습니다. 하지만 경사하강법과 달리 한 번의 반복에 한 번의 데이터만 사용하기 때문에 최적값에 수렴하지 않을 가능성이 있어 수렴 안정성이 낮고, 진폭이 매우 큽니다. 또한 연산량이 적어 GPU의 자원을 모두 활용하지 못한다는 단점이 있습니다. 

 

BGD(좌) 와 SGD(우)의 수렴방향

 

 

이러한 BGD와 SGD의 절충안이 바로 미니배치 경사하강법입니다. 

 

 

2) 미니배치 경사하강법(mini-batch Gradient Descent, MSGD)

 

 

미니배치 경사하강법은 배치의 크기를 사용자가 정하여 사용하는 방법입니다. 정해진 배치의 크기만큼씩 데이터를 여러 묶음으로 나누어 각 묶음에 대하여 경사하강법을 적용합니다.

 

 

이 방법은 BGD보다는 연산량이 적고, SGD보다 안정적으로 수렴한다는 장점을 가지고 있습니다. 

mini-batch GD의 수렴방향

 

 

예를 들어 1000개의 데이터를 이용하여 모델을 100번 반복하여 학습시킬 때, 각각의 방법에 대해 다음과 같이 정리할 수 있습니다.

 

optimizer batch개수 batch size GD  / epoch iteration / epoch
BGD 1 1000 1 1
SGD 1 1 1 1
MSGD1 10 100 10 10
MSGD2 5 200 5 5

 

 

 

BGD에 비해 높은 연산 속도와 SGD에 비해 높은 안정성 때문에 두 옵티마이저보다 자주 사용되는 옵티마이저입니다. 미니배치 경사하강법을 MSGD라고도 하는데 결국 SGD도 MSGD에서 배치사이즈를 1로 지정한 방식이기 때문에 MSGD를 줄여서 SGD라고 부르기도 합니다.

 

 

머신러닝에서 'SGD를 이용한다'라고 하면 대부분 '미니배치 경사하강법을 사용한다'라고 이해하시면 될 것 같습니다. 

Comments