Info) 아래 포스팅은 LGAimers에서 제공하는 AI 전문가 과정 중 이화여자대학교 강제원 교수님의 [지도학습(분류/회귀)] 강의에 대한 요약과 생각들을 정리한 것입니다. 정리된 내용들은 강의를 토대로 작성되었으나 수강자인 저의 이해도에 따라 일부 틀린 부분이 있을 수 있다는 점 알려드립니다. 잘못된 점이 발견될 시에는 즉각 수정하도록 하겠습니다. 또한, 강의의 모든 내용을 정리하기는 어렵기 때문에 인상깊었던 내용을 중심으로 정리하였습니다. 따라서, 설명의 맥락이 끊길 수도 있다는 점 양해 부탁드립니다. 

0. Introduction

이번 part3에서는 지난 시간에 알아본 gradient descent에 대해 더 심도있게 내용을 알아보았습니다. gradient descent에서 발생할 수 있는 문제들을 해결하기 위한 다양한 변형들을 살펴보았는데 일부는 알고 있는 방법들이었지만 처음 들어본 최적화 기법들도 꽤 있었습니다. 이번 차시를 공부하면서 학계에 계신 수많은 machine learning 연구자 분들께 경외감을 느낄 수 있었습니다. 각 알고리즘들이 가지는 한계를 해결하는 방법들이 전혀 복잡한 접근법이 아닌데도 도무지 저로서는 생각하지 못할 아이디어들이었습니다. gradient descent 말고도 다른 machine learning 알고리즘들을 공부하다보면 발상을 뒤집는 접근법에 감탄을 금치 못할 때가 많습니다. 세상에 참으로 숨겨진 고수들이 많은 것 같아 괜시리 주눅드는 것 같습니다. 

1. Batch Gradient Descent vs Stochastic Gradient Descent (SGD)

gradient descent algorithm은 임의의 파라미터 theta에서 시작하여 loss function을 최소화할 때까지 theta를 계속 업데이트해 나가는 것입니다. 이때 theta를 업데이트하는 방식은 모든 데이터에 대한 오차 평균을 구하고 learning rate를 곱하여 새로운 theta를 구하게 됩니다. 이런식으로 theta를 업데이트 할 때 전체 데이터를 고려하게 되는 것을  batch gradient descent라고 합니다. batch gradient descent 방식은 몇가지 단점이 있습니다. 바로 한번 업데이트 시에 모든 데이터 샘플을 다 고려하여 계산해야 하기 때문에 계산 과부화가 걸릴 수 있다는 것입니다. 데이터 샘플의 수가 증가하게 되면 계산량이 증가하여 computational load가 생기게 되는 것이지요. 

따라서, 이러한 단점을 해소하여 조금 더 빠르게 iteration을 돌며 최적의 파라미터를 업데이트 해나가기 위해 한 샘플에 대한 오차만 계산하여 파라미터를 갱신하는 방법이 등장하였습니다. 우리말로 확률적 경사하강법이라고 불리는 stochastic gradient descent는 임의의 샘플 하나를 골라 이에 대한 오차를 계산하여 경사하강법을 진행하게 됩니다. 아래 식은 gradient descent의 각 파라미터 갱신을 표현한 것입니다. 여기서 m은 업데이트 시에 사용하는 데이터 샘플 개수 의미합니다. 가령, 우리가 가지고 있는 총 데이터 개수를 N이라고 하면 batch gradient descent에서의 m은 N이라고 할 수 있습니다. 반면, stochastic gradient descent에서의 m은 극단적으로 1로 설정하여 계산한 것이라고 볼 수 있습니다. 

출처: 강제원 교수님 강의자료

이처럼 stochastic gradient descent 방식은 계산량이 줄어들어 빠르게 수렴할 수 있다는 장점이 있지만 데이터 샘플 하나씩만 가지고 업데이트를 진행하기 때문에 만약 데이터 샘플에 noise가 존재하게 되면 완만하게 수렴하지 못하고 이리저리 왔다갔다하며 수렴하게 됩니다. 조금은 비효율적인 경로를 거치며 최소점을 탐색하게 되는 것입니다. 아래 그림이 이를 잘 보여주고 있습니다. 

출처: https://blog.superannotate.com/guide-to-gradient-descent-algorithms/

2. Some ideas to avoid local minimum

이전 차시 수업에서 gradient descent algorithm은 지역해(local optimum)에 빠질 수 있는 한계가 존재한다고 배웠습니다. 특히 error surface가 복잡할 경우, 초기 파라미터 값 theta가 어디서 부터 시작하느냐에 따라 global optimum으로 수렴되지 못하고 saddle point나 local minimum에서 학습이 멈출 수 있게 됩니다. 이를 해결한 momentum 방법을 시작으로 이후에도 지속적으로 시간을 단축하고 올바른 방향으로 향하여 효율적인 최적화할 수 있는 다양한 optimization 방법들이 등장하였습니다. 아래에서 몇가지 살펴보도록 하겠습니다. 

2.1 Momentum

stochastic gradient descent 방식이 기존의 gradient descent 보다는 빠르지만 그래도 여전히 느리고 비효율적인 경로 탐색을 할 수 도 있기 때문에 이를 보완하기 위한 momentum 방식이 등장합니다. momentum은 '관성'을 통해 이동 방향과 속도를 조절하는 방식으로 현재 위치한 지점에서 gradient값이 0이 되더라도 과거의 gradient가 업데이트 되어오던 방향과 속도를 기억하고 반영해 계속 학습이 진행될 수 있도록 하게 됩니다. momentum은 지수적으로 가중치가 더해지는 방식을 적용하며 아래 식과 같이 표현됩니다. g(기울기/gradient)가 t(시간)에 따라 누적되는 모습을 보이고 있는데 g에 곱해지는 rho값(가중치)은 0과 1사이의 값이기 때문에 지수승이 될수록 점점 더 작아지게 됩니다. 따라서, 먼 과거의 gradient 값일수록 더 작아지며 영향을 덜 미치게 됩니다. 여튼, 현재의 이동방향에 과거의 momentum값들을 반영하게 되므로서 혹여나 gradient값이 0이 되더라도 계속 학습을 이어갈 수 있게 됩니다. 

출처: 강제원 교수님 강의자료

2.2 Nesterov Momentum

nesterov momentum 방식은 기존의 momentum 방식과는 다른 순서로 gradient값을 계산하게 됩니다. 일반적인 momentum 방식에서는 현재의 gradient값에서 '관성' 즉 과거의 momentum을 계산하는 방식이라면 nestrov momentrum에서는 '관성' momentum값으로 먼저 이동후에 그 곳에서 gradient값을 반영하게 됩니다. 즉, 현재의 gradient값과 지난 momentum의 적용 순서를 서로 달리한 차이라고 할 수 있습니다. 이렇게 순서를 달리한 nesterov momentum 방식을 'lookahead gradient'라고도 하며 기존의 momentum 방식보다 더 빠르고 성능이 우수하다고 알려져 있습니다. 아래 링크를 통해 들어가시면 지금까지 수많은 머신러닝/딥러닝 책들을 번역해 오신 박해선 저자님께서 일반적인 momentum과 nesterov momentum에 대해 자세히 비교하여 설명한 글을 읽을 수 있습니다. 정말 상세하게 정리되어 있기 때문에 많은 참고가 될 것입니다. 

https://tensorflow.blog/2017/03/22/momentum-nesterov-momentum/

 

Momentum & Nesterov momentum

경사하강법gradient descent 최적화 알고리즘의 한 종류인 모멘텀momentum과 네스테로프 모멘텀nesterov momentum 방식은 여러 신경망 모델에서 널리 사용되고 있습니다. 비교적 이 두가지 알고리즘은 직관

tensorflow.blog

2.3 AdaGrad

앞서 살펴본 momentum에 대한 2가지 algorithm은 학습을 할 때의 탐색 방향을 조절하는 방식입니다. 가능한 이상한 길로 새지 않고 효율적인 경로를 따라 최적의 포인트를 찾아가기 위한 것이 주된 목적입니다.  그에 반해 이제부터 살펴볼 algorithm들은 learning rate를 조절하여 학습 속도를 최적화하는 방식이라고 할 수 있습니다.

그 중 첫번째는 Adaptive Gradient라고 부르는 Adagrad algorithm입니다. adaptive라는 말에서 유추할 수 있듯이 adagrad는 학습이 진행됨에 따라 learning rate를 적응적으로 조절하여 학습의 효율을 높이는 방법입니다. 지금까지 갱신 및 학습이 많이 되어 누적된 gradient 값이 크다면 learning rate를 낮추어 학습의 속도를 줄이게 됩니다. 반대로 학습이 많이 진행되지 않아 누적된 gradient 값이 작다면 learning rate를 높여 학습 속도를 높이게 됩니다. 즉, 현재까지의 학습 현황을 반영하여 이후의 학습을 진행하는 적응적인 방식이라고 할 수 있습니다. 아래 식은 adagrad에서 어떻게 learning rate를 조절하는지 보여주고 있습니다. 누적된 g의 제곱값이 분모로 들어가 delta theta를 조절하는 것을 확인할 수 있습니다.

출처: 강제원 교수님 강의자료

2.4 RMSProp

adagrad 방식은 g값이 계속 누적됨에 따라 learning rate가 작아지게 되는데 이 때문에 학습이 진행되지 않는 단점이 있습니다. 이를 개선한 RMSProp 방법이 등장하였는데 rmsprop은 가중치를 주어 learning rate가 극단적으로 0으로 수렴하는 것을 방지해줄 수 있습니다. 위 그림 왼쪽을 보게 되면 rmsprop은 adagrad에서 r과 g의 제곱에 각각 weighted decay에 해당하는 rho와 (1-rho)를 곱한 것밖에 차이가 없지만 이렇게 함으로서 학습속도를 적절히 조절할 수 있게 됩니다.  

2.5 Adam

Adam optimizer는 RMSProp와 Momentum을 혼합한 방식으로 momentum에서 계산된 첫번째 moment와 RMSProp에서 계산된 두번째 moment를 편향 보정하여 파라미터를 업데이트하는데 활용하는 것입니다.  

이상으로 part3를 마치도록 하겠습니다. 위에서 살펴본 optimization 기법들 외에도 수많은 변형들이 있는데 나중에 기회가 되면 열심히 공부해서 정리해보도록 하겠습니다.

출처: LGAimers / https://www.lgaimers.ai/

+ Recent posts