본문 바로가기

Deep Learning/Learning Algorithms

Gradient Based Learning Algorithm (1)

딥러닝에서 Learning Algorithm은 굉장히 중요한 요소입니다. Learning Algorithm은 Optimization(최적화) problem에 가장 큰 영향을 미치는 요소이기 때문에, 각 Learning Algorithm별 특징과 동작원리 장단점을 알아두어야 할 필요가 있는데요, Learning Algorithm에는 batch GD, SGD, Momentum SGD, AdaGrad, RMSprop, Adam 등이 있습니다. Ian Goodfellow의 Deep Learning, 오일석님의 Machine Learning과, 여러 논문, 기술 블로그들을 참고하여 Learning Algorithm들을 공부해보았고, 3번에 걸쳐 정리할 예정입니다. 혹시 잘못된 부분이 있다면 피드백 주시면 감사하겠습니다. 



1. Batch Gradient Descent(Batch GD)


먼저 가장 기본이되는 Batch Gradient Descent입니다. Batch가 붙은 이유는 학습데이터에 대해서 한꺼번에 gradient 값을 구하여 weight 파라메터를 갱신해주기 때문입니다. 알고리즘은 다음과 같습니다. 




- 모든 모델들은 학습시키기 위해서는 Learning rate와 weight, bias파라메터들이 초기 설정되어있어야하며, 

   Batch GD의 경우 epoch 또한 설정되어있어야 합니다.


1. 설정된 값들을 기반으로 해서, 학습데이터 셋에 있는 모든 데이터 샘플들에 대하여 gradient 값을 계산합니다. 

2. 그 후 계산된 값들의 평균 값   을 구합니다.


3.계산된 평균 gradient 값을 기반으로 weight, bias 파라메터를 업데이트 해줌으로써 한번의 epoch가 끝나게 됩니다. 




Batch GD은 학습 알고리즘이 모든 데이터 셋에 대한 기울기를 계산하고 파라메터들을 업데이트 하기 때문에, 설정한 epoch 수만큼 동작을 반복시켜서 Loss 값을 확인하고, 설정 값에 도달하기 전에 Loss값이 원하는 수준에 도달했다면 학습을 중단하면 됩니다. 


Batch GD는 알고리즘이 굉장히 단순하고, Optimum solution으로써 Global 혹은 local minimum에 도달할 가능성이 높아 좋아보이지만, 실제로는 잘 사용되지 않습니다. 


여러가지 이유가 있겠지만, 가장 큰 이유는 Batch GD는 1번 epoch돌때 발생하는 계산량이 너무 많습니다. 실세계에서는 굉장히 Big 한 데이터를 가지고 모델을 학습시킵니다. ILSVRC 대회 같은 경우 제공하는 데이터셋의 크기가 138GB 용량에 몇 백만장의 사진으로 이루어져있기 때문에, Batch GD로 모델을 학습시키게 되면 1번 epoch에 수백만 번의 gradient계산이 발생하게 되죠. 시간과 자원의 소모가 너무 크게 발생합니다. 


두번째 이유는 모든 데이터셋을 계속 꾸준하게 재 학습시키는 것이기 때문에 적은 데이터로 너무 많은 epoch동안 학습시키게 될 경우, Overfit이 발생할 수 있습니다. 따라서, 다음에 설명할 Stochastic Gradient Descent 방식이 많이 사용됩니다.

 


2. Stochastic Gradient Descent(SGD)


Stochastic Gradient Descent는 1개의 sample을 stochastic(확률적으로)하게 추출하여 weight, bias 파라메터를 업데이트하는 방식과 설정한 batch 크기 값만큼 stochastic하게 샘플들을 추출하여 weight, bias 파라메터를 업데이트하는 방식 두 가지가 있습니다. 먼저 1개의 sample에 대한 알고리즘 먼저 설명하도록 하겠습니다.




- 먼저, batch GD와 마찬가지로, learning rate와 weight, bias 파라메터의 초기값이 설정되어있어야 하고, 추가로 error의 임계값 k를 설정합니다. 


1. 설정된 값들을 기반으로 학습데이터 셋에서 샘플 1개를 확률적으로 골라서 feed forward시킵니다.

2. 선택된 샘플의 loss값을 기반으로 gradient  를 계산합니다.


3. 계산된 gradient값을 기반으로 weight, bias 파라메터를 업데이트 해줍니다. 


4. 업데이트 된 파라메터를 활용하여 test error를 구합니다.


5. 계산된 test error가 설정한 임계값 k 보다 크면, 1번으로 가서 다시 반복문을 수행하고, 작거나 같으면 반복문을 빠져나옵니다.



1개의 sample만으로 파라메터를 업데이트 하는 SGD는 online algorithm과 유사합니다. 전체 데이터가 아닌 일부 sample을 사용하여 gradient를 계산하게 될때, 데이터가 sequential하게 들어가는 것이 아니라 무작위로 아무거나 들어가기 때문에, gradient가 noisy한 것들이 계산이 된다고 표현을 하는데, sample 수가 작아질 수록 noisy함이 심해집니다. 즉 1개의 sample로 파라메터를 업데이트할때 gradient의 noisy함이 가장 심하다고 할 수 있겠죠. 


학습에 따른 SGD의 fluctuation(변동성)을 그래프화 시킨 사진입니다.

'An overview of gradient descent optimization algorithms,Sebastian ruder'



이 gradient의 noisy함은 Batch GD에서 보여지는 true gradient와는 차이가 있지만, local max, minima가 많은 경우에 모델의 학습 방향을 이리저리 획획 움직이도록 하여, local minima 로부터 빠져나와 optimal하게 가도록 하는데 도움을 줍니다. 획획 움직이는 정도는 sample 수가 낮을 수록 심해지기 때문에, 너무 급격하게 움직이지는 것이 아니면서, local minima에서 빠져나오는데 도움을 주는 정도의 noisy함을 보이는 gradient로 설정을 하는게 좋습니다. 다시말해서 균형이 잡히도록 sample수를 설정하는 것이 좋은데 이를 minibatch Stochastic Gradient Descent 방식이라고 합니다. 이부분은 뒤에서 다시 설명드리도록 하겠습니다. 


SGD의 장점은 local minima에서 빠져나올 수 있는 것 외에 계산량이 낮아지는 것에 있습니다. Batch GD에 비해 상당히 큰 이점인데, SGD는 모든 sample들을 계산하는 것이 아니라 일부 sample들에 대해서 계산을 하는데, 특히나 single sample SGD는 1개의 sample에 대해서 계산하고 업데이트를 하기 때문에, Batch GD에 비해 한 epoch에 걸리는 계산량이 훨씬 적어 빨리 끝남에 따라서 같은 시간동안 훨씬 많은 epoch횟수를 돌 수 있습니다. 


또 다른 장점은 vectorization이 훨씬 효율적인 것인데, 기존의 Batch GD로 수행할 경우 RAM에서 학습데이터의 양을 감당하지 못하고 학습이 멈춰버리게되는 경우가 발생합니다. 그런데 single sample SGD의 경우 계산하는데 사용하는 데이터는 1개이고, 계산량 또한 Batch GD에 비하여 적기 때문에, RAM이 적당히 큰 용량이라면 문제가 발생하여 학습이 멈춰버리게 될 경우는 극히 희박합니다. 


하지만, single sample SGD는 언급했듯이 너무 gradient가 noisy하기 때문에, minibatch SGD를 많이 사용합니다. 



3. minibatch Stochastic Gradient Descent(minibatch SGD) 


minibatch Stochastic Gradient Descent는 설정한 minibatch 크기만큼의 sample 수들을 stochastic(확률적으로; uniformly한 확률)하게 추출하여 각 sample들의 gradient를 계산한 후, 계산된 gradient들의 평균값을 기반으로 weight, bias 파라메터들을 업데이트 하는 알고리즘 입니다.  


- 먼저, SGD와 마찬가지로, learning rate와 weight, bias 파라메터의 초기값과 error의 임계값 k가 설정되어있어야 하고, 추가로 minibatch의 크기 m을 설정합니다. 


1. 학습데이터 셋에서 m개의 샘플을 확률적으로 추출해냅니다. 


2. m개의 샘플들에 대한 gradient값을 계산하고, 최종적으로 gradient값들의 평균 값을 계산합니다.


3. 계산된 gradient값들의 평균을 기반으로 weight, bias 파라메터들을 업데이트합니다,


4. 업데이트된 파라메터들을 기반으로 test error를 계산합니다. 


5. 계산된 test error가 설정한 임계값 k 보다 크면, 1번으로 가서 다시 반복문을 수행하고, 작거나 같으면 반복문을 빠져나옵니다.



m개의 샘플을 uniformly한 stochastic 방식으로 추출하여 샘플들의 gradient값을 평균내어 파라메터를 업데이트하는 minibatch SGD방식은 위에서 언급하였듯이, gradient의 noisy함을 활용하여 모델을 학습시키는 방식입니다. minibatch를 local minima에서 빠져나올 정도의 크기로 작게 그리고, global minima를 지나쳐버리지 않을 정도로 큰 값으로 설정하였을때, 2.SGD 에서 언급된 균형잡힌 minibatch size라고 합니다. 


Batch GD 방식은, cost function의 true gradient가 점점 작아지다가 0에 도달함에 따라서 고정된 learning rate를 사용해도 되지만, SGD방식은 모델이 minimum에 도달하여도, noise함이 사라지지 않을 수 있기 때문에, 학습 횟수가 진행됨에 따라서 learning rate의 값에 변화를 주어야 합니다. 


이때 필요한 조건은 다음과 같습니다. 




Deep learning 교재 8장 3절에서는 이 두 조건을 통해서 k번째 learning rate의 값을 다음과 같은 decay기법을 통해 얻을 수 있다고 설명하며, 


  


위 수식에 따라서 learning rate는 위의 수식에 따라 tau횟수만큼 선형적으로 감소되다가 tau 값을 넘어서면서 일정한 값을 갖게 된다고 설명하고 있습니다. 


즉, 초기에 Tau의 값을 설정하고 k가 1에서부터 학습이 1회 증가할때마다 1씩 증가하면서,  에서 의 비중이 점점 감소하고,  의 비중이 점점 증가하게 되는 것이죠. alpha값은 k가 Tau값이 되는 시점에서  이 됨에 따라 의 비중이 0이되면서,  의 값이 곧 의 값이 되기 때문에, k가 Tau값을 넘어서는 시점 이후로는 으로 값을 고정시키면서 일정한 값을 갖게 되는 것이죠.



Learning rate는 보통은 시행착오에 의하여 이값 저값을 설정해보면서 조정을 하게 되지만, 목적함수를 시간에 기반한 함수로 그리는 학습곡선을 모니터링 하면서 선택하는 것이 불필요한 시행착오를 줄이게 될 수 있습니다. 따라서 Learning rate의 초기설정이 상당히 중요한데 그 중에서 가장 신중해야 할 것이   값입니다. 값이 너무 크면, 학습곡선이 과격한 진동을 보이면서 cost function의 값이 증가하게 됩니다. 반대로 너무 작으면, local minima에 빠져서 학습이 특정지점에 걸려서 빠져나오지 못하게 됩니다. 그래서 보통은 Learning rate의 값을 0.01에서 0.001사이의 값으로 정하여 몇회정도 학습을 시키면서 결과를 지켜보고 재조정을 하는 것 같더라구요.(모든 경우가 아니라 일부 연구자분들의 실험들만을 보고 참고한 것입니다!!) Learning rate가 최적의 값으로 초기 설정이 된다면, 100회 남짓한 학습회수에서 최상의 성능을 보인다고 Deep learning 책에 기술되어있는데, 이거는 아마 데이터의 상황과 모델에 따라 크게 달라질 수 있지 않을까 생각이 드네요.


지금까지 Batch GD와 2가지의 SGD방식에 대하여 공부한 내용을 정리해보았습니다. 혹시 잘못된 부분이 있다면 댓글 피드백 부탁드립니다.


감사합니다.






'Deep Learning > Learning Algorithms' 카테고리의 다른 글

Gradient Based Learning Algorithm (2)  (2) 2018.05.01