배치와 미니 배치, 확률적 경사하강법 (Batch, Mini-Batch and SGD)
이번 글에서는 batch와 mini-batch, 확률적 경사 하강법을 알아보자.
배치의 정의와 GPU (Batch)
현대 머신러닝의 비약적인 발전 배경에서 GPU는 빼놓을 수 없는 요소이다. CPU 대신 GPU(Graphic Processing Unit)를 이용한 가속 컴퓨팅이 머신러닝 기술의 발전을 불러온 것은 익히 알고 있을 것이다.
GPU가 CPU보다 유리한 점은 병렬 연산이다. CPU는 연산을 Queue에 담긴 순서대로 빠르게 처리한다. 마치 대학생이 선형대수 과제 문제를 1번 ~ 20번 순서로 푸는 것과 같다.
반면, GPU는 수만 픽셀의 그래픽 연산을 빠르게 처리하기 위해 여러 연산을 한 번에 처리하는데 특화되어 있다. 이는 비유하자면, 초등학생 20명이 각각 덧셈 문제를 푸는 것과 같다.
위 비유를 조금 더 설명해보자면 이렇다. 초등학생 100명을 모아놓고 대학교 과제 20문제를 풀라고 하면, 풀지 못하거나 아주 오랜 시간이 걸릴 것이다. 그러나 간단한 사칙연산 문제 100개를 푸는 경우라면, 대학생 1명보다 초등학생 100명이 각각 한 문제씩 푸는 것이 나을 것이다.
배치는 GPU가 한번에 처리하는 데이터의 묶음을 의미한다.
배치 경사 하강법 (Batch Gradient Descent: BGD)
배치 경사 하강법이란, 전체 학습 데이터를 하나의 배치로(배치 크기가 n) 묶어 학습시키는 경사 하강법이다.
전체 데이터에 대한 모델의 오차의 평균을 구한 다음, 이를 이용하여 미분을 통해 경사를 산출, 최적화를 진행한다.
보통 딥러닝 라이브러리에서 배치를 지정하지 않으면 이 방법을 쓰고 있다고 생각할 수 있다.
배치 경사 하강법의 특징은 아래와 같다.
- 전체 데이터를 통해 학습시키기 때문에, 가장 업데이트 횟수가 적다. (1 Epoch 당 1회 업데이트)
- 전체 데이터를 모두 한 번에 처리하기 때문에, 메모리가 가장 많이 필요하다.
- 항상 같은 데이터 (전체 데이터)에 대해 경사를 구하기 때문에, 수렴이 안정적이다. (아래 그림 참고)
수렴이 안정적인 것은 장점으로 보일 수 있지만, 단점이 있다. 이는 아래서 설명하겠다.
확률적 경사 하강법 (Stochastic Gradient Descent: SGD)
확률적 경사 하강법은 전체 데이터 중 단 하나의 데이터를 이용하여 경사 하강법을 1회 진행(배치 크기가 1)하는 방법이다.
전체 학습 데이터 중 랜덤하게 선택된 하나의 데이터로 학습을 하기 때문에 확률적 이라 부른다.
배치 경사 하강법에 비해 적은 데이터로 학습할 수 있고, 속도가 빠른 장점이 있다. 무엇보다 큰 특징은 수렴에 Shooting이 발생한다는 점이다.
각 데이터에 대한 손실값의 기울기는 약간씩 다르기 때문에, 손실값의 평균이 아닌 개별 데이터에 대해 미분을 수행하면 기울기의 방향이 매번 크게 바뀐다.
그러나 결국 학습 데이터 전체에 대해 보편적으로 좋은 값을 내는 방향으로 수렴한다. 다만, 최저점에 안착하기는 어렵다.
또한, Shooting은 최적화가 지역 최저점Local Minima에 빠질 확률을 줄여준다.
- 한 번에 하나의 데이터를 이용하므로 GPU의 병렬 처리를 그다지 잘 활용하지는 못한다.
- 1회 학습할 때 계산량이 줄어든다.
- Global Minimum에 수렴하기 어렵다.
- 노이즈가 심하다. (Shooting이 너무 심하다.)
미니 배치 확률적 경사 하강법 (Mini-Batch Stochastic Gradient Descent: MSGD)
딥러닝 라이브러리 등에서 SGD를 얘기하면 최근에는 대부분 이 방법을 의미한다.
SGD와 BGD의 절충안으로, 전체 데이터를 batch_size개씩 나눠 배치로 학습(배치 크기를 사용자가 지정)시키는 것이다.
예를 들어, 전체 데이터가 1000개인 데이터를 학습시킬 때, batch_size가 100이라면, 전체를 100개씩 총 10 묶음의 배치로 나누어 1 Epoch당 10번 경사하강법을 진행한다.
Shooting이 발생하기는 하지만, 한 배치의 손실값의 평균으로 경사하강을 진행하기 때문에, Shooting이 심하지는 않다.
- BGD보다 계산량이 적다. (Batch Size에 따라 계산량 조절 가능)
- Shooting이 적당히 발생한다. (Local Minima를 어느정도 회피할 수 있다.)
Batch Size 정하기
Batch Size는 보통 2의 n승으로 지정하는데, 본인의 GPU의 VRAM 용량에 따라 Out of memory가 발생하지 않도록 정해줘야 한다.
또한, 가능하면 학습데이터 갯수에 나누어 떨어지도록 지정하는 것이 좋은데, 마지막 남은 배치가 다른 사이즈이면 해당 배치의 데이터가 학습에 더 큰 비중을 갖게 되기 때문이다.
예를 들어, 530 개의 데이터를 100개의 배치로 나누면, 각 배치 속 데이터는 1/100 만큼의 영향력을 갖게 된다. 그러나 마지막 배치(30개)의 데이터는 1/30의 영향력을 갖게 되어 과평가되는 경향이 있다. 그렇기 때문에 보통 마지막 배치의 사이즈가 다를 경우 이는 버리는 방법을 사용한다.
정리
- 배치는 경사 하강법 1회에 사용되는 데이터의 묶음이다.
- 배치의 크기에 따라 아래와 같이 나눌 수 있다.
- (배치 크기) == (전체 학습 데이터): 배치 경사 하강법 (BGD)
- (배치 크기) == 1: 확률적 경사 하강법 (SGD)
- (배치 크기) == (사용자가 지정) 미니 배치 확률적 경사 하강법 (MSGD)
- 확률적 경사 하강법을 이용하면 아래와 같은 특징이 있다.
- 1회 학습 당 계산량이 줄어든다.
- Shooting이 발생하여 Local Minima를 회피할 수 있다.
- 최근에는 SGD라고 하면 MSGD를 의미하고, 배치라 하면 미니 배치를 의미하는 경우가 많다.
- 배치 크기는 아래 조건에 따라 정한다.
- 2의 n승이 좋다. (GPU 구조 때문에 연산이 빨라진다고 한다.)
- 본인의 VRAM 크기를 고려한다.
- 가능하면 전체 데이터 수가 나누어 떨어지도록 하고, 아니라면 마지막 배치는 버린다.
'강의 > 딥러닝 기초' 카테고리의 다른 글
데이터 일반화 vs 표준화 (Normalization and Standardization of Data) (3) | 2020.04.28 |
---|---|
Convexity와 딥러닝 (Convex Function과 Convex Set) (1) | 2020.04.13 |
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function) (8) | 2020.01.23 |
퍼셉트론(Perceptron): 덧셈과 곱셈으로 뉴런 구현하기 (3) | 2020.01.06 |
왜 지금인가? - 딥러닝의 역사 (0) | 2020.01.06 |
댓글
이 글 공유하기
다른 글
-
데이터 일반화 vs 표준화 (Normalization and Standardization of Data)
데이터 일반화 vs 표준화 (Normalization and Standardization of Data)
2020.04.28 -
Convexity와 딥러닝 (Convex Function과 Convex Set)
Convexity와 딥러닝 (Convex Function과 Convex Set)
2020.04.13 -
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function)
경사하강법과 손실 함수: 심층 신경망 학습시키기 (Gradient Descent and Loss Function)
2020.01.23 -
퍼셉트론(Perceptron): 덧셈과 곱셈으로 뉴런 구현하기
퍼셉트론(Perceptron): 덧셈과 곱셈으로 뉴런 구현하기
2020.01.06