AutoML – Hyper Parameter Optimization

  • 참조 논문 :  링크
  • 참조 구현물 : 링크
  • Tensorflow 적용 Test : 링크
  • AutoML 참조 : http://www.automl.org/hpolib.html
  • AutoML GitHub :  https://github.com/SheffieldML/GPyOpt
  1. 개요
    최근 Google 에서 Deep Learning Engineer 부족에 대한 해결방안으로 AutoML 이라는 프로젝트를 Release 하였다.  Google 이 이번에 발표한 AutoML 은 단순히 Hyper Prameter 튜닝만을 제공하는 것이 아닌 데이터에 따른 최적의 알고리즘까지 찾아주는 역할을 한다고 한다.
    하지만 현실적으로 알고리즘 선정과 데이터에 대한 Insight 까지 AI 가 대체하기는 아직은 시기상조라고 개인적으로 생각하며, 데이터와 AI 모델에 대한 부분은 Deep Learning Engineer 에 맡겨 두는 것이 효과적이고 사람의 Insight 로 쉽게 해결이 되지 않는 다른 부분들을 자동화하는 것이 의미가 있다고 생각했다.
    현재 Deep Learning 프로젝트를 진행하면서 투입되는 Process 별 노력을 생각하여 보면 새로운 알고리즘을 논문을 통해 파악하고 코드로 재현하는 과정도 있지만, 사실 대부분의 시간은 데이터 수집, 전처리, 신경망 최적화 반복 작업에 소비하게 된다.
    본 Blog 포스트는 신경망 최적화 부분을 (Hyper Prameter 튜닝) 을 효과적으로 하는 방법을 실제 Tensorflow 프로젝트에 적용한 사례를 정리하고자 하는 목적을 가지고 작성되었다.
  2. 접근 방법
    참조한 논문은 Speeding up Automatic Hyperparameter Optimization of Deep Neural Networks by Extrapolation of Learning Curves 로 Hyper Parameter를 Ransom 하게 Search 하는 과정에서 결과가 안좋을 것으로 예상되는 Hyper Parmeter 조합에 대해서는 사전에 이를 예측하고 해당 Train 작업을 Teminate 하여 전체적인 탐색 시간을 줄이는 것에 있다.
    이를 위해서 Parametric Learning Curve Models 을 사용하는데 이러한 모델들의 목적은 Train Iteration 진행에 따른 Accuracy 변화를 예측하는 Learning Curve 모델을 제공하는데에 있다.
    예를 들어 최종결과에 대한 평가를 5000 Iter 에서 한다고 하면 500 iter 까지의 추이를 보고 5000 Iter 에서 Accuracy 가 어떻게 될지를 예상하는 형태라고 보면된다. 여기서 X 축은 정해진 Interval 에 +1 씩 증가하는 형태로 구성되며, 각각의 모델은 실제 훈련시 발생하는 1 ~ 500 (데이터 수집범위) 데이터를 가지고 아래에 명시된 11개의Parametric Learning Curve Models 모델의 Weight 값들을 훈련하고 이 모델을 사용하여 예측하고자 하는 5000 Iter 지점의 Accurcy 값을 예측한다.
    이렇게 여러가지 모델을 사용하는 이유는 어떤 모델 하나가 정확한 결과를 예측한다고 신뢰할 수 없기 때문이며, 실제 사용시에는 이렇게 훈련된 각각의 모델을 아래와 같이 합쳐서 하나의 더 강력한 식으로 만들어서 사용한다.

    fcomb(t|ξ) = X K k=1 wkfk(t|θk), 
    ξ = (w1, . . . , wK, θ1, . . . , θK, σ2 )

    이렇게 하나로 합쳐진 식에서 Weight 값을 구하기 위해 가장 단순하게 접근할 수 있는 방법은 아마도 주어진 X,Y 데이터로 Maximun Likelihood 를 만족하는Weight Value 들를 찾아버리는 것이 될 수 있겠지만, 이렇게 접근하면 모델의 불확실성을 커버할 수가 없게 된다.  결국 우리가 하고 싶은 것은 초기의 데이터를 가지고 한참 뒤의 y 값을 Bayesian 의 관점에서 MCMC 를 활용하여 예측하고 이를 바탕으로 현재 가지고 있는 최선의 Accuracy 보다 그 예측 값이 낮다면 끝까지 Train 을 진행하지 않고 미리 Termination하는 것이다. 이러한 종류의 확률적 추론을 가능하게 하기 위해서는 Prior (Bayesian : P(X|Y)P(Y|X)P(X) ) 의 사전정보 P(X) 는 주어지지 않았기 때문에 각각의 파라메터에 대해서 Set 해야하는데 간단하게 p(ξ) ∝ 1. 로 정의해 버리면 Weight 값이 음수가 되어서 특정시점 이후로 하락하는 종류의 모델이 만들어 진다던지 하는 문제가 있을 수가 있다.
    이러한 문제를 해결하기 위해서 좋은 Learning Curve 모델은 증가하는 형태의 모델이다라는 사전지식을 반영하여 Weight 값을 양수값으로 제한하고 결과적으로 아래와 같은 새로운 Prior 를 정의한다.

    p(ξ)∝ Y K k=1 p(wk)p(θk) ! p(σ 2 )1(fcomb(1|ξ)
    
    p(wk) ∝  1 if wk > 0 0 otherwise . 
     
    

    이제  E[X]=XXP(X|Y)dX 와 같이 적분을 통해서 그래서 예측하고자하는 Accuracy y^ 이 어떻게 될지 찾아야 하는데, 적분 대신에  MCMC (Markov Chain Mote Carlo) 을 사용하여 XXP(X|Y)dXi=1NP(Xi|Y)∫XXP(X|Y)dX∼∑i=1NP(Xi|Y)  를 사용하여 최종적으로 우리가 알고자하는 Y (Accuracy 를 추론한다)
    참조 :  http://enginius.tistory.com/514
    참조 : http://www.4four.us/article/2014/11/markov-chain-monte-carlo

3. 적용
이 논문의 내용은 Hyper Paremter를 어떻게 탐색하는가에 대한 것이 아닌 끝까지 Train 을 진행하지 않고 사전에 결과를 예측하여 전체적인 탐색 속도를 향상사키는 것에 있으며, 실제 적용시에는 Hyper Parameter 의 Range 를 지정하고 탐색 Matirx 를 구성하고 실제로 Train 을 반복적으로 실행하는 환경은 구성을 해야 한다.  그 후에 특정 Iter 가지 진행한 Accuracy Learning Curve 정보를 가지고 위에 설명한 데이터를 예측하여 나온 Accuracy 가 지금까지 우리가 가지고 있는 최대 Accuracy 와 비교하여 그 이하라면 중단하는 형태로 구현을 하면된다.  실제 간단한 DNN 에 적용하여 테스트해본 결과 위의 논문과 같이 모델을 구성하여 예측하는 과정이 CPU 기준으로 10분정도 소요되어 아주 작은 데이터에 대해서 테스트 시에는 크게 효용이 없을 것으로 보이며 진자 bigData 에 대해서만 의미가 있을 것 같다. 또, GPU 서버와 CPU 서버를 분리하여 예측 작업을 분리하여 처리하여 GPU 서버에서의 작업은 계속해서 진행하면 Over Head 를 줄 일 수 있을 것 같다. 또 가장 궁금한 실제 예측 모델에서 예측한 Accuracy 와 실제로 훈련을 계속 했을때의 정확도가 얼마나 오차가 있는지는 Sample 데이터로 수행을 했을때는 큰 차이가 없었다. 다만, 실무에서는 깔끔하게 Learning Curve 가 구성되지 않고 발산하면서 감소하거나, Mini Batch 등을 실행 하였을때의 Learning Curve 를 예측 할 수 있는지는 잘 모르겠다..

 

Leave a Reply

Your email address will not be published. Required fields are marked *