[머신러닝] 옵티마이저(Optimizer)란?

     

    기계학습(Machine Learning, 머신러닝)과 딥러닝(Deep Learning)이 현재 이정도까지 수준까지 발전하기에는 수많은 사람들의 노력과 정교한 수학적 모델들이 계속 고도화되었으며 많은 사람들이 실제 프로젝트에 활용하면서 무엇이 어떤 상황에 좋고 나쁨을 피드백하거나 논문등으로 발표하기 때문일거라 생각한다.

     

    옵티마이저(Optimizer)


    머신러닝의 성능 개선법

    머신러닝, 딥러닝의 성능을 좌우하는 녀석 중에 옵티마이저(Optimizer, 최적화)가 있는데 DB를 잘아는 사람들은 옵티마이저가 최소의 Cost로 결과를 찾아주는 것으로 알고 있을 것이다. 사실 DB와 머신러닝, 딥러닝에서 말하는 옵티마이저의 궁극적인 목적은 동일할 것이다. DB에서 최소의 코스트로 결과를 찾는 개념과 신경망의 모델이 실제 결과와 예측 결과의 차이를 최소화 시키는 것은 어찌보면 동일하다.

     

    머신러닝이나 딥러닝에서 모델을 설계할 때 하이퍼 파라미터(hyper parameter)를 최적화 시켜야 좋은 성능을 보여준다. 즉, 방식은 이상이 없는데 최적화 시키지 못해서 실패한 프로젝트가 수두룩 할지도 모른다. 

     

    얼마나 진행할지 결정하는 에포크(Epoch), 내부 노드(뉴런) 수, 일정한 데이터를 버려서 오버피팅(Overfitting, 과적합)이 일어나지 않게 하는 드롭아웃(Dropout) 등등 모델을 생성할 때 수많은 파라미터를 조정하게 되는데 그 중에 가장 드라마틱하고 쉽게 바꿔주는 것이 옵티마이저이다.

     

    옵티마이저의 원리

    옵티마이저는 학습 데이터(Train data)셋을 이용하여 모델을 학습 할 때 데이터의 실제 결과와 모델이 예측한 결과를 기반으로 잘 줄일 수 있게 만들어주는 역할을 한다.

     

    네비로 옵티마이저 이해

    쉽게 생각하면 우리가 운전을 하는데 첨 들어보는 곳으로 가야 한다고 가정해보자. 막막한 이때 네비가 있어서 길을 알려주면 매우 든든할 것이고 최소한의 실패는 없을 것이다. 하지만 네비도 한가지의 길만 알려주지 않는다. 운전자의 스트레스를 줄이기 위해서 "큰 길" 위주로 알려주는 방법도 있고, 혹은 정말 최단거리로 알려주거나 가장 고속도를 기반으로 가장 빠른 길, 그리고 무료 길 위주로 알려주는 등등

     

     

    네비 자체적으로 다양한 알고리즘이 있어서 사용자는 해당 알고리즘을 선택하고 그 다음 네비가 알려주는 방식대로 운전을 한다. 즉 네비는 옵티마이저와 역할이 동일하며 네비 안에 다양한 알고리즘은 옵티마이저의 종류와 대응할 수 있을 것이다.

     

     

    등산의 하산으로 옵티마이저 이해

    사실 옵티마이저를 가장 잘 설명할 수 있는 것은 등산을 들 수 있다. 우리가 등산을 마무리 하고 이제 정상에서 하산을 해야 한다고 가정을 해보자 이때 지도도 없고 요즘 쓰는 앱도 없다고 한다면 어떻게 내려가야 가장 빠르겠는가? 아무래도 옆으로 돌아가지 않고 고도가 낮은 쪽으로 계속 이동할 것이다. 결국 내가 한발 한발 이동하는데 고도가 낮아지고 있다면 하산을 할 수 있게 되는데 이 원리가 바로 옵티마이저의 원리하고도 같다.

     

    옵티마이저의 종류

    모델을 제대로 설계하기 위해서 옵티마이저가 어떤 원리로 만들어졌는지 아니면 어떤 방식에 유리한지를 알아야 될 것이다. 모델을 만들때 CNN으로 할 지, LSTM으로 할지 정의를 하듯 옵티마이저도 프로젝트 성격에 맞게 후보군들을 정하고 내부적으로 빠르게 테스트 해보면서 후보중에 또 후보를 추리며 마지막에 남은 옵티마이저들을 최종 테스트 하여 결정을 해야 될 것이다.

     

    결론부터 설명하자면 현재 가장 많이 사용하는 옵티마이저는 Adam이다. 활성화 함수(Activation Function)로 Relu를 가장 많이 활용하는 것처럼 Adam이 빠르기도 하면서 성능도 좋고 무난하다. 하지만 다른 옵티마이저를 무조건 쓰지 말라는 법은 없다. 프로젝트와 데이터 별로 미묘하게 다른 옵티마이저가 더 좋을수도 있고 혹은 학습 속도의 문제등으로 약간의 성능을 포기할 수 있다.

     

    https://www.slideshare.net/yongho/ss-79607172

     

    아래는 가장 많이 사용하는 옵티마이저 리스트이다.

    1. 경사 하강법(Gradient Descent)
    2. 확률적 경사 하강법(Stochastic Gradient Descent, SGD)
    3. Momentum
    4. Nesterov Accelerated Gradient (NAG)
    5. Adam
    6. AdaGrad
    7. RMSProp
    8. AdaMax
    9. Nadam

     

    위 내용들을 포스팅에 다 적을 수 있을진 모르겠고 필자 역시 위 옵티마이저들을 모두 이해하고 있지 않기에 설명 자체가 틀릴 수도 있어서 조심스럽지만 최대한 논문 및 도서를 봐서 옵티마이저들을 최대한 이해해보려 노력해서 작성할 예정이다. 

     

     

     

    댓글

    Designed by JB FACTORY