2023.08.05 - [수학 공부 기록] - [딥러닝의 수학] 4. Cost, Gradient Descent
딥러닝 시리즈의 다섯 번째 글입니다. 이 글은 고려대학교 수학과 오승상 교수님의 딥러닝 강좌를 참고자료로 하여 쓰임을 밝힙니다. 또한, 이 글의 목적은 이 강좌를 듣고 저의 개인적인 복습용으로 요약하여 작성하는 것임을 밝힙니다. 자세한 내용을 알고 싶으시다면 아래 링크를 참고해 주세요.
https://youtube.com/playlist?list=PLvbUC2Zh5oJvByu9KL82bswYT2IKf0K1M
이 글에서 다루고자 하는 것은 저번 시간에 이어서 Gradient Descent, 그중에서도 효율적인 학습을 진행하고자 고안된 Gradient Descent 방법인 Stochastic Gradient Descent(일명 SGD)입니다.
이전 시간에 효율적인 학습을 진행하기 위한 두 가지 방법을 이야기 했습니다.
그중 첫 번째는 우리가 Gradient vector를 구할 때 일부 데이터에 대해서만 Total Cost를 계산하는 방법이었습니다.
원래대로면, Gradient vector를 구할 때 모든 데이터에 대한 Total Cost를 고려하여 구합니다.
하지만 학습을 한 번 진행할 때마다 모든 데이터에 대한 오차 함수를 계산한다면 매우 오래 걸릴 뿐 아니라 컴퓨터의 메모리 또한 많이 소모하게 됩니다.
때문에 우리는 효율적으로 학습을 진행하기 위해 랜덤 하게 일부 데이터들을 그룹핑하여, 그 그룹의 Total Cost를 계산해 점을 이동시킨다고 했습니다.
Stochastic Gradient Descent는 사실 이 방법을 이야기한 것입니다.
여기서 Batch의 개념을 알아봅시다.
우리는 다음과 같은 과정을 거쳐서 학습이 진행된다는 사실을 알고 있습니다.
- 주어진 데이터를 Forward Pass를 통해 Cost value를 계산한다.
- Cost value를 기반으로, Backpropagation을 진행하여 주어진 Parameter를 업데이트한다.
이 과정에서 "주어진 데이터"에 해당하는 것이 Batch입니다.
우리는 모든 데이터에 대한 Total Cost를 구하고자 하는 것이 아닙니다.
위에서 이야기했듯이, 학습을 한번 진행할 때 모든 데이터에 대해서 Forward Pass를 진행한다면 매우 오랜 시간이 걸린다고 했습니다.
따라서, 학습을 한 번 할 때 일부 데이터만 가지고 Forward Pass를 진행해 Cost를 계산한 후, Parameter를 업데이트하고, 이후 이전에 학습한 데이터 말고 다른 데이터를 가지고 와서 Forward Pass와 Backpropagation을 진행하고,... 이 과정을 반복합니다.
즉, 여기에서 그 "일부 데이터"가 Batch가 되는 것입니다.
Batch의 크기를 Batch size라고 합니다.
또한, 일부 데이터를 사용해 학습을 하는 위의 과정에서, 전체 데이터를 한 번 순환하는데 필요한 Batch의 개수, 즉, (전체 데이터 셋의 크기) $/$ (Batch size)를 Iteration이라고 합니다.
이 Iteration을 몇 번 반복할 것인가를 Epoch이라고 합니다.(즉, 전체 Data set을 몇 번 돌릴 것인가를 Epoch라고 합니다. 반대로, Iteration은 Epoch을 $1$회 진행하는데 필요한 Batch 개수를 뜻합니다.)
딥러닝에서 학습을 진행할 때 Batch size, Iteration, Epoch과 같은 것은 사람이 직접 조정해줘야 하는 부분들입니다.
또한, 이들은 학습을 진행하는 과정에 있어서 바뀌지 않는 부분들입니다.
이러한 요인들을 기존의 Parameter를 뛰어넘은 개념, 즉 Hyper Parameter이라고 부릅니다.
이제 위에서 이야기한 Batch의 개념을 가지고 오면, Gradient Descent를 아래와 같이 $3$가지로 분류할 수 있습니다.
- Batch Gradient Descent : Batch size가 전체 데이터 셋의 크기입니다.
- Stochastic Gradient Descent : Batch size가 $1$입니다.
- Minibatch Gradient Descent : Batch size가 적당한 크기입니다.
여기서 실제로 자주 사용되는 방법은 Minibatch Gradient Descent입니다.
때문에 Minibatch Gradient Descent를 Stochastic Gradient Descent(SGD)라고 부르기도 합니다.
첫 번째로, Batch Gradient Descent에 대해 알아봅시다.
이건 위에서 이야기했듯, Batch size가 전체 데이터 셋의 크기입니다.
다시 말하자면, 이건 한 번 학습을 진행할 때(한 번 Parameter를 업데이트할 때) 사용되는 데이터의 크기가 전체 데이터 셋의 크기입니다.
즉, 한 번 Parameter를 갱신할 때마다 전체 데이터 셋을 가지고 Parameter를 갱신합니다.
이건 우리가 이전에 배웠던 그냥 일반적인 Gradient Descent입니다.
먼저, 장점이라고 하면, 학습을 진행할 때마다 항상 전체 데이터를 사용하기 때문에, 노이즈의 영향을 덜 받습니다.
또한, 만약 Cost function이 Convex 하다면 Global minimum으로 잘 다가간다는 점입니다.
단점은 앞서 언급했듯이 한 번 학습을 진행할 때마다 모든 데이터 셋을 고려하여 Forward Pass를 진행하기 때문에 "느립니다".
또한, 모든 데이터 셋을 고려하여 학습을 진행하는 것이기 때문에 이 결괏값들을 잘 저장하고 있어야겠죠?
그러면 당연히 메모리 또한 많이 소요될 것입니다.
또한, "모든 데이터 셋"이 필요하기 때문에, "실시간 학습"이 구조 상 불가능합니다.
때문에 실제로는 이 방법이 잘 쓰이지 않습니다.
수식으로 표현하면 다음과 같습니다.
$$\theta ^{t+1} = \theta ^{t} - \eta \triangledown _{\theta} C( \theta ^{t} )$$
여기서 $C( \theta ^{t} )$는 모든 데이터 셋에 대한 오차 함수의 합, 즉, Total Cost입니다.
그리고 $\theta ^{t}$는 학습을 $t$회 반복했을 때의 Parameter값입니다.
$\eta$는 학습률(Learning Rate)입니다.
원래라면 Bias도 고려해야 하지만, Parameter $\theta$에 Weight $W_1, ..., W_n$이 있다고 해봅시다.
그러면 위의 수식은 아래와 같이 쓸 수 있겠습니다.
$$\begin{bmatrix} W_1(t+1) \\ \cdots \\ W_n(t+1) \\ \end{bmatrix} = \begin{bmatrix} W_1(t) \\ \cdots \\ W_n(t) \\ \end{bmatrix} - \eta \begin{bmatrix} \frac {\partial C} {\partial W_1} \\ \cdots \\ \frac {\partial C} {\partial W_n} \\ \end{bmatrix}$$
두 번째로, Stochastic Gradient Descent에 대해 알아봅시다.
이 방법은 Batch size가 $1$입니다.
즉, 학습을 한 번 진행할 때(Parameter를 한번 갱신할 때) 사용되는 데이터는 하나의 데이터입니다.
하나의 데이터만 가지고 Forward Pass를 진행하기 때문에 빠르다는 장점이 있습니다.
또한, 실시간 학습이 가능하다는 장점이 있습니다.
하지만, 하나의 데이터 만을 가지고 Parameter를 업데이트하기 때문에, 노이즈가 큽니다.
다시 말하자면, 하나의 데이터 만을 가지고 Gradient를 계산하기 때문에, 점이 항상 최적으로 움직이는 것이 아닙니다.
이 Gradient가 모든 데이터를 대변하여 계산한 것이 아니기 때문입니다.
만약 $k$번째 데이터를 $(\mathbf{x} ^k, \mathbf{y} ^k )$이라고 한다면, 다음과 같이 수식으로 표현할 수 있습니다.
$$ \theta ^{t+1} = \theta ^{t} - \eta \triangledown _{\theta} L ^{k} ( \theta ^{t} ) $$
여기서 $L^k$은 $k$번째 데이터를 넣었을 때 나오는 오차함수입니다.
Parameter $\theta$에 Weight $W_1, ..., W_n$이 있다고 해봅시다.
그렇다면 모든 Weight $W_i$에 대해서 아래와 같은 수식으로 표현될 수 있습니다.
$$ W_i (t+1) = W_i (t) - \eta \frac {\partial L^k} {\partial W_i} $$
마지막으로, Minibatch Gradient Descent는 Batch size가 적당한 크기입니다.
이 방법은 Stochastic Gradient Descent의 장점과 Batch Gradient Descent의 장점을 모두 가지고 있습니다.
때문에 자주 사용되는 방법이고, 이 방법을 그냥 Stochastic Gradient Descent라고 부르기도 합니다.
위에서 이야기한 것처럼, 이 방법은 전체 데이터를 일정한 크기의 Batch들로 쪼개서(그룹핑을 시켜서), 그 Batch에 대해 Gradient를 구해서 Parameter를 갱신시킵니다.
중요한 점은, 이 Batch들로 분할할 때 "랜덤 하게" 분할한다는 점입니다.
예를 들어, 총 $10,000$개의 꽃 사진 데이터가 있고, 우리는 이를 기반으로 꽃 사진을 분류하는 모델을 만들고자 한다고 해봅시다.
$2,000$개는 백합, $3,000$개는 튤립, $5,000$개는 장미라고 하고 이 순서 그대로 데이터가 $100$개의 Batch들로 쪼개진다면, 처음 $20$번의 학습을 할 때는, Parameter들이 백합을 중심으로만 업데이트되기 때문에 대부분의 꽃 사진들을 백합으로 판별할 것입니다.
이후 $30$번의 학습에서는 튤립의 사진만 나오기 때문에 대부분의 꽃 사진을 튤립으로 판별할 것입니다.
이런 학습의 편향성 때문에 랜덤으로 섞어야 되는 것입니다.
수식으로 표현하자면 다음과 같습니다.
$$\theta ^{t+1} = \theta ^{t} - \eta \triangledown _{\theta} C( \theta ^{t} )$$
여기서 $C( \theta ^{t} )$는 일부 데이터 셋(Batch)의 오차함수의 합입니다.
Batch size를 $m$이라고 한다면, $C (\theta ^{t}) = L^{n_1} (\theta ^ {t}) + \cdots + L^{n_m} (\theta ^{t})$입니다.
이 방법의 단점은, Batch size는 Hyperparameter이기 때문에 우리가 직접 손 봐줘야 된다는 점입니다.
어떨 때 최적으로 학습이 되는지 상황마다 다르기 때문에 이를 잘 조절해 가며 학습을 시켜야 하고, 때에 따라서는 학습시간이 오래 걸릴 수도 있다는 점이 단점입니다.
Cost function의 Cost surface를 보며 세 가지 방법이 각각 어떤 장단점이 있는지 확인해 봅시다.
Batch Gradient Descent의 경우는 움직임의 방향이 "항상" 최적의 방향임을 알 수 있습니다.
나머지는 그러지 않은데, 이는 노이즈가 간섭한 것이라고 생각할 수 있습니다.
또한, Stochastic Gradient Descent의 경우, 자잘하게 "많이" 움직임을 확인할 수 있습니다.
Minibatch의 경우, 그 중간 지점임을 확인할 수 있습니다.
'공부 기록 > 딥러닝의 수학' 카테고리의 다른 글
[딥러닝의 수학] 4. Cost, Gradient Descent (0) | 2023.08.05 |
---|---|
[딥러닝의 수학] 3. DNN, Forward Pass (0) | 2023.07.31 |
[딥러닝의 수학] 2. Perceptron, MLP (1) | 2023.07.30 |
[딥러닝의 수학] 1. Introduction (2) | 2023.07.28 |