etc/구글 머신러닝 부트캠프

[DSL] Improving Deep Neural Networks Week 2 : Optimization Algorithms

uyt8989 2022. 7. 2. 18:09

2번째 강의의 Week 2. 이제 슬슬 Neural Network를 더 빨리 학습시킬 수 있는 최적화 알고리즘에 대해 배우기 시작한다. 강의 목차를 봤을 때 다양한 최적화 기법에 대해 배울 것 같다.

 

1. Mini-batch Gradient Descent

우선, 이 기법을 설명하기 전에 용어 정리부터 하자. Mini-batch란 주어진 학습 데이터를 일정 크기로 나누는 것을 의미한다. 그림처럼 학습 데이터가 오백만 개일 경우엔 mini-batch 하나 당 데이터를 1000개씩 포함해서, 총 5000개의 mini-batch로 나눌 수 있다. mini-batch 번호는 중괄호를 사용해서 표시한다. 

그럼 왜 mini-batch를 사용하느냐? 만약 batch의 크기가 오백만 개의 데이터인 경우에는, 한 batch를 처리하는 데에 시간이 엄청 오래 걸릴 것이다. 데이터를 메모리에 올려놓는 것도 부담스러울 수 있다. 그래서 그것보다 더 작은 단위로 데이터를 나눠서 처리함으로써 학습 속도를 높일 수 있다. 여기서 epoch라는 용어가 등장한다. Epoch는 전체 학습용 데이터가 NN을 통과하는 횟수를 세는 단위다. 1 epoch라고 하면 전체 데이터가 1번씩 NN을 통과한 셈이다. 

 

Mini-batch Gradient Descent에서는 한 mini-batch가 NN을 통과할 때마다 가중치를 업데이트한다. 그 과정은 이전에 수행했던 과정이랑 똑같다. Forward propagation으로 각 레이어에서의 Z와 A를 계산하고, cost 계산하고, back propagation으로 gradient를 구한 다음에 매개변수들을 업데이트한다. 이 단위가 이전에는 whole data set이었고, 이제는 mini-batch로 진행될 뿐이다. 한 mini-batch가 끝날 때마다 갱신이 이뤄지기 때문에 1 epoch 당 가중치 갱신이 여러 번 일어날 수 있다. 위의 예제에서는 mini-batch가 5000개이므로 1 epoch당 가중치 갱신이 5000번씩 이뤄진다.

 

이 mini-batch의 크기에 따라서 알고리즘의 이름이 조금씩 다르다. 지금까지 해왔던 것처럼 모든 데이터를 통째로 처리하는 알고리즘은 Batch Gradient Descent(BGD)이다. 반대로 mini-batch 크기를 1로 잡는 경우엔 Stochastic Gradient Descent(SGD)라는 이름을 갖는다. 1 epoch 당 가중치 갱신이 전자는 한 번, 후자는 오백만 번씩 발생한다.

 

둘은 모두 장단이 있다. BGD 같은 경우엔 가중치를 안정적으로 학습할 수 있고 global optima에 수렴한다. 하지만, 한번 계산할 때 비용이 많이 든다는 단점이 있다. 반면에, SGD 같은 경우엔 상당히 불안정하게 학습이 진행되고 평균적으로 global optimum에 다가가긴 하지만 계속 진동하기 때문에 수렴하지 못한다. 그 이유는 재수 없이 1번 batch보다 2번 batch가 더 어려운 데이터 셋 일 수도 있기 때문이다. 이를 shooting이라고 표현하고, learning rate를 감소시켜서 어느 정도 해결할 수 있다. 

그래서 어떤 방법을 사용하는 것이 제일 좋을까? 학습 데이터 셋이 작은 경우엔 그냥 BGD로 하고, 그렇지 못한 경우엔 SGD보다는 batch가 큰 mini-batch gradient descent 알고리즘을 사용해서 학습을 진행하는 게 가장 효율적이다. 이때 batch 크기는 보통 2의 제곱수로 한다. 컴퓨터 과학 분야에서 2의 제곱수는 역시 국룰이다. 

 

2. Gradient Descent with Momentum

Gradient descent 과정에서 발생하는 shooting을 막기 위해서 여러 알고리즘이 개발됐다. 강의에서는 우선 경사 하강법에 모멘텀을 도입한 알고리즘을 설명한다. 이를 이해하기 위해선 지수 가중 이동 평균부터 알아야 한다. 이번 학기에 수강한 계량경제학 막바지에 시계열 데이터를 다루는 법에 대해서 배우면서 이동 평균에 대해서 잠깐 배운 게 도움이 됐다. 확실히 경제학 중에서도 계량은 머신 러닝 분야랑 공통점이 많은 것 같다. 

 

이동 평균의 핵심은 예전 값을 생각해서 평균을 구한다는 점이다. 물론 평균이 이전 값을 생각하는 것은 당연하지만, 전체 기간의 평균이 아니라 일정 기간의 평균을 구한다. 그리고 beta 값에 따라서 얼마나 이전의 값까지 고려하느냐가 달라진다. 만약, beta가 0.9라면 이동 평균은 10기 사이의 평균을 계산한다고 생각하면 된다. 1/(1-beta)라는 식이 강의에서 등장하기는 했지만, 이를 어떻게 도출하는지에 대해서는 설명이 부족하다. 대신 강의에서 등장한 그림이 확 와닿아서 나도 따라 그려봤다. 이동 평균은 오른쪽의 그래프에 빨간 점선으로 이어진 애들을 곱해서 더한다고 생각하면 된다. beta 값에 따라서 지수 함수의 모양이 달라지고, 함수 모양에 따라서 몇 기 전까지의 값이 이동 평균에 영향을 미치는지가 달라질 것이다. 이후에 가장 도움이 될만한 직관은 beta 값이 클수록 이동 평균이 현재 값에 덜 예민해진다는 점이다.

대신 이동 평균은 초기 값에서 오류가 발생할 수 있다. beta가 0.9인 예시를 이어서 들자면, 이동 평균은 10 기간의 평균을 계산한다. 하지만, 데이터의 초반, 즉 아직 10기가 지나지 않았을 때에는 이동 평균은 상당히 낮은 값으로 도출된다. 그림의 노란색 박스 안의 보라색 그래프가 이 문제를 나타낸다. 원래는 초록색 선까지 올라와야 하는데, 초반에서는 훨씬 작은 값으로 도출되고, 시간이 지날수록 초록색 선에 수렴하는 모습을 보인다. 강의에서는 아직 이동 평균이 워밍업 되지 않았다는 표현을 사용한다. 따라서, 이를 보정해주기 위해서 bias correction이라는 테크닉을 사용한다. beta는 1보다 작은 값이고 t가 커질수록 분모는 1에 가까워지기 때문에, 아직 t가 크지 않은 경우에 값을 보정해주는 용도로 사용한다. 

 

그래서 모멘텀을 도입한다는 게 무슨 의미일까? 그냥 gradient descent를 적용하면 잦은 진동이 발생할 수 있다. 진동을 줄이기 위해서는 learning rate를 감소시켜야 하고, 이는 학습 속도를 느리게 만든다. 그래서 가중치가 오른쪽으로 진행해야 되는데 자꾸 의미 없이 위아래로 흔들린다면, 이동 평균을 도입하여 위아래로 흔들리는 진동을 0에 수렴하도록 만들고, 오른쪽으로 더욱 빠르게 진행할 수 있도록 만들어주는 방법이 gradient descent with momentum이다.

그래서 이 방법을 학습에 적용한 방법은 다음과 같다. 학습을 시작하기 전에 V를 초기화하고, gradient를 구할 때마다 새로운 이동 평균 V를 구한다. 그리고 이 값을 사용해서 가중치를 갱신한다. 이렇게 하면 학습에 도움이 안 되는 방향으로 진동하는 것을 감소시키고, 유의미한 결과만 남길 수 있다. 여기서 아까 말한 bias correction이라는 테크닉을 쓸 수 있는데, 보통 beta를 0.9로 사용하면 10번만 반복해도 정상적인 값을 얻을 수 있기 때문에 잘 사용하지는 않는다.

어떤 그릇 안에서 공이 벽면을 타고 굴러 떨어지는 경우에 beta는 마찰력, V는 속도, gradient는 가속이라는 예시가 직관적으로 이해하기 좋았던 것 같다.

 

3. RMSprop(Root Mean Square prop)

이 방법은 gradient 값의 상대적인 차이를 활용해서 학습 속도를 높이는 방법이라고 이해했다. 강의에서는 db 값이 dW 값보다 상대적으로 큰 상황을 예시로 들었다. 때문에 학습 과정에서 b 방향으로 진동하게 되는데, 이를 S 값을 구해서 감소시킨다. 이전의 beta와 다른 beta이므로 아래 첨자에 2를 붙여줬다. 그리고 분모에 epsilon을 더 하는 이유는, S 값이 너무 작아지면 계산 값이 너무 커질 수 있으므로 10의 -8승 정도의 값을 더해준다.

 

4. Adam(Adaptive moment estimation) Optimization Algorithm

위의 두 방법을 합친 방법으로 Adam optimzation algorithm이라는 것이 있다. 위에서 구한 두 가지 모멘트를 한 번에 사용하면 된다. 여기선 보통 bias correction도 포함한다. bias correction을 적용한 모멘트 값은 위 첨자를 붙여줬다. 보통 beta1은 0.9, beta2는 0.999, epsilon은 10의 -8승으로 고정해놓고 alpha 값만 튜닝한다. 

0.0

 

5. Learning Rate Decay

위에서 말했다시피, SGD 알고리즘은 opitma를 향하는 경향성이 있지만 계속 진동하게 된다. 그래서 학습이 진행됨에 따라서 학습률을 감소시켜서 진동의 폭을 줄이는 방법도 있다. alpha 값을 줄이는 방법은 여러 가지가 있다. 

 

5. The Problem of local optima

마지막으로 학습을 진행하면서 global optima를 찾지 못하고 좋지 못한 local optima에 빠지면 어떡하지에 대한 내용이다. 결론부터 말하자면 신경망이 크고 차원이 깊은 경우에는 이런 문제가 잘 발생하지 않는다. 대신 plateaus라는 기울기가 0에 가까운 부분이 오래 지속되는 문제가 발생할 수 있다. 이 부분을 빠르게 탈출하기 위해서 위에서 설명한 여러 가지 최적화 기법을 도입할 수 있다.

 

이전 주차에서 배웠던 내용은 dW, db 값을 만드는 부분에서 새로운 방법을 도입했다면, 이번엔 이미 구한 dW, db를 어떻게 사용해서 가중치를 갱신할 건지에 대한 내용을 배웠다. 분량 자체는 꽤 많았지만, 내용이 그렇게 어렵지는 않았던 것 같다. 대신 머신 러닝이라는 분야를 잘 모르다 보니 이런 기법들이 수학적으로 증명이 됐는지 아니면 그냥 실증적으로 받아들여진 부분인지에 대한 궁금증이 남는다. 앞으로 경험을 쌓다 보면 알 수 있겠지.

 

* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.