Bayesian Optimization 개요: 딥러닝 모델의 효과적인 hyperparameter 탐색 방법론 (1)
지난 <Learning Transferable Architectures for Scalable Image Recognition 리뷰> 글의 서두에서 ‘AutoML’이라는 주제에 대해 간단히 소개해 드린 적이 있습니다. AutoML을 한 문장으로 표현하자면 ‘Machine Learning으로 설계하는 Machine Learning’이라고 하였으며, 현재 3가지 방향으로 연구가 진행된다고 하였습니다.
- Automated Feature Learning
- Architecture Search
- Hyperparameter Optimization
본 글에서는, 위 연구 방향들 중 3번째 항목인 ‘Hyperparameter Optimization’에 대해 소개해 드리고, 딥러닝 분야에서의 Hyperparameter Optimization을 위한 주요 방법론들에 대한 대략적인 설명과 더불어, ‘학습’의 관점에서 최적의 hyperparameter를 탐색하기 위한 방법 중 하나인 ‘Bayesian Optimization’에 대하여 안내해 드리고자 합니다.
- 주의: 본 글은 아래와 같은 분들을 대상으로 합니다.
- 딥러닝 알고리즘의 기본 구동 원리 및 정규화(regularization) 등의 테크닉에 대한 기초적인 내용들을 이해하고 계신 분들
- Python 언어 및 TensorFlow의 기본적인 사용법을 알고 계신 분들
- 본 글의 목적은, 독자 여러분들로 하여금 Bayesian Optimization에 대한 깊은 이해를 유도하는 것이 아니라, Bayesian Optimization에 대한 기초적인 이해만을 가지고 이를 딥러닝 모델의 Hyperparameter Optimization에 원활하게 적용할 수 있도록 하는 것입니다. 이에 따라 본 글에서는 Bayesian Optimization의 대략적인 원리를 설명하는 단계에서 딥러닝 외적인 수학적 내용들에 대한 언급은 가급적 피하고자 하였으나, 최소한의 설명을 위해 수학적 내용이 약간은 등장할 수 있음을 양지해 주시길 바랍니다.
- 본 글의 2편에서는, Bayesian Optimization을 위한 Python 라이브러리 중 하나인 bayesian-optimization을 소개해 드리고, 실제로 이를 사용하여 이미지 Classification을 위한 딥러닝 모델의 주요 hyperparameter들의 최적값을 찾는 과정을 안내해 드릴 것입니다. 본 1편의 내용을 잘 이해하실 수 있다면, 2편에서의 과정을 무리 없이 수행하실 수 있을 것이라고 기대합니다.
서론
Hyperparameter Optimization이란, 학습을 수행하기 위해 사전에 설정해야 하는 값인 hyperparameter(하이퍼파라미터)의 최적값을 탐색하는 문제를 지칭합니다. 여기에서 hyperparameter의 최적값이란, 학습이 완료된 러닝 모델의 일반화 성능을 최고 수준으로 발휘하도록 하는 hyperparameter 값을 의미합니다.
딥러닝 모델을 학습하는 상황을 예로 들면, 학습률(learning rate), 미니배치 크기(minibatch size), L2 정규화 계수(L2 regularization coefficient) 등이 대표적인 hyperparameter라고 할 수 있습니다. 물론 앞서 소개한 것들은 엄밀히 말하면 학습 알고리즘 또는 정규화(regularization)와 관련된 hyperparameter들이며, 경우에 따라서는 딥러닝 모델의 구조를 결정하는 요소들(e.g. 층 수, 컨볼루션 필터 크기 등)도 hyperparameter로 간주하여 탐색의 대상으로 추가될 수 있습니다.
Manual Search
딥러닝 모델을 한 번 이상 학습해 보신 분들이라면, 틀림없이 이러한 주요 hyperparameter들의 값을 결정하는 데 있어 많은 시행착오를 겪으셨던 경험이 있을 것입니다. 예를 들어 AlexNet 모델에 대한 구현을 완료했다고 하면, 보통은 원본 AlexNet 논문에서 소개된 hyperparameter를 그대로 가져와 학습에 적용하는 것으로 작업을 시작하는 경우가 대부분입니다. 하지만 대부분의 상황에서, 원본 AlexNet 논문에서 사용했던 데이터셋과 내가 사용하고자 하는 데이터셋이 서로 다르기 때문에, 원 논문에서 소개된 hyperparameter 값이 여러분들이 해결하고자 하는 문제에 한 방에 완벽하게 적용되는 경우는 잘 없습니다.
이러한 상황을 직면했을 시, 보통은 여러분들의 직관 또는 대중적으로 알려진 노하우 등에 의존하여, 다음으로 시도할 후보 hyperparameter 값을 선정하고, 이들을 사용하여 학습을 수행한 후 검증 데이터셋(validation set)에 대하여 측정한 성능 결과를 기록합니다. 이러한 과정을 몇 차례 거듭한 후, 맨 마지막 시점까지의 시도들 중 검증 데이터셋에 대하여 가장 높은 성능을 발휘했던 hyperparameter 값들을 선정, 최종 제출용 딥러닝 모델을 학습하는 방식을 채택해 왔을 것입니다. 이와 같이 최적 hyperparameter 값을 탐색하는 방법을 Manual Search라고도 합니다.
Manual Search는 Hyperparameter Optimization을 위한 가장 직관적인 방법이긴 하나, 몇 가지 문제가 있습니다. 첫째로, ‘최적의’ hyperparameter를 찾을 때의 과정이, 다소 운(?)에 좌우된다는 점입니다. 그 예로, 여러분이 딥러닝 모델의 최적 학습률을 찾기 위해 Manual Search를 수행하는 과정을 묘사해 보도록 하겠습니다. 높은 확률로, 이 과정에는 시간 제한이 존재하며, 여러분들은 아래와 같이 생각하면서 대단히 조급해 하고 계실 가능성이 높습니다:
딥러닝 모델로 빨리 성능 뽑아야 하는데, 교수님 or 직장 상사는 계속 재촉하고, 시간은 없고.. 큰일났다 ㅠㅠ
학습률에 대한 Manual Search 과정에서의 불운한 결과 예시
여러분이 제한된 시간 안에
그러나 실제로 ‘학습률에 따른 (미지의) 일반화 성능 함수’가 그 바로 하단과 같았다면 어떨까요? 실제로는
Manual Search의 두 번째 문제는, 한 번에 여러 종류의 hyperparameter들을 동시에 탐색하고자 할 시, 문제가 더욱 복잡해진다는 것입니다. 이를 가장 잘 보여줄 수 있는 예로 학습률-L2 정규화 계수 간의 관계가 있습니다.
상기 손실 함수(loss function) 식에서 두 번째 항에 해당하는 것이 L2 정규화 항인데, 여기의 L2 정규화 계수인 λ의 값을 변화시키면 (딥러닝 모델의 전체 파라미터
이와 같이 여러 종류의 hyperparameter들 중에는 서로 간의 상호 영향 관계를 나타내는 것들도 존재하기 때문에, 둘 이상의 hyperparameter들에 대한 탐색을 한 번에 진행할 시, 단일 hyperparameter 각각에 대하여 기존의 직관을 적용하기가 매우 어려워집니다.
Grid Search vs. Random Search
Manual Search에 비해, Grid Search와 Random Search는 상대적으로 체계적인 방식으로 Hyperparameter Optimization을 수행하는 방법에 해당합니다.
Grid Search는 탐색의 대상이 되는 특정 구간 내의 후보 hyperparameter 값들을 일정한 간격을 두고 선정하여, 이들 각각에 대하여 측정한 성능 결과를 기록한 뒤, 가장 높은 성능을 발휘했던 hyperparameter 값을 선정하는 방법입니다. 전체 탐색 대상 구간을 어떻게 설정할지, 간격의 길이는 어떻게 설정할지 등을 결정하는 데 있어 여전히 사람의 손이 필요하나, 앞선 Manual Search와 비교하면 좀 더 균등하고 전역적인 탐색이 가능하다는 장점이 있습니다. 반면 탐색 대상 hyperparameter의 개수를 한 번에 여러 종류로 가져갈수록, 전체 탐색 시간이 기하급수적으로 증가한다는 단점이 있습니다.
학습률에 대한 Grid Search 과정 예시
반면 Random Search는 Grid Search와 큰 맥락은 유사하나, 탐색 대상 구간 내의 후보 hyperparameter 값들을 랜덤 샘플링(sampling)을 통해 선정한다는 점이 다릅니다. Random Search는 Grid Search에 비해 불필요한 반복 수행 횟수를 대폭 줄이면서, 동시에 정해진 간격(grid) 사이에 위치한 값들에 대해서도 확률적으로 탐색이 가능하므로, 최적 hyperparameter 값을 더 빨리 찾을 수 있는 것으로 알려져 있습니다.
학습률에 대한 Random Search 과정 예시
(구간
그럼에도 불구하고, Random Search도 ‘여전히 약간의 불필요한 탐색을 반복하는 것 같다’는 느낌을 지우기 어려우실 것이라고 생각합니다. 왜냐하면 Grid Search와 Random Search 모두, 바로 다음 번 시도할 후보 hyperparameter 값을 선정하는 과정에서, 이전까지의 조사 과정에서 얻어진 hyperparameter 값들의 성능 결과에 대한 ‘사전 지식’이 전혀 반영되어 있지 않기 때문입니다(반면 Manual Search 과정에서는 사전 지식이 매 차례마다 여러분들의 은연 중에 반영된 바 있습니다).
Grid Search 결과와 Random Search 결과 비교 예시
[Bergstra and Bengio(2012)]
매 회 새로운 hyperparameter 값에 대한 조사를 수행할 시 ‘사전 지식’을 충분히 반영하면서, 동시에 전체적인 탐색 과정을 체계적으로 수행할 수 있는 방법론으로, Bayesian Optimization을 들 수 있습니다.
Bayesian Optimization
Bayesian Optimization은 본래, 어느 입력값
Bayesian Optimization에는 두 가지 필수 요소가 존재합니다. 먼저 Surrogate Model은, 현재까지 조사된 입력값-함숫값 점들
Bayesian Optimization 알고리즘의 의사 코드(pseudo-code)
Surrogate Model
현재까지 조사된 입력값-함숫값 점들
Gaussian Processes(GP)
GP는 (어느 특정 변수에 대한 확률 분포를 표현하는) 보통의 확률 모델과는 다르게, 모종의 함수들에 대한 확률 분포를 나타내기 위한 확률 모델이며, 그 구성 요소들 간의 결합 분포(joint distribution)가 가우시안 분포(Gaussian distribution)를 따른다는 특징이 있습니다. GP는 평균 함수 μ와 공분산 함수 k를 사용하여 함수들에 대한 확률 분포를 표현합니다.
GP를 제대로 이해하고 사용하려면 베이지안 확률론(Bayesian probability)에 대한 기본적인 이해와 더불어, 복잡해 보이는 확률적/선형대수적 수식을 이해할 수 있어야 합니다. 본 글에서는 이들에 대한 더 이상의 자세한 설명은 생략하며, GP의 동작 특징과 더불어 GP가 Hyperparameter Optimization을 위해 어떻게 사용될 수 있는지에 대해서만 초점을 맞추어 설명하고자 합니다.
현재까지 조사된 입력값-함숫값 점들
GP를 사용한 Bayesian Optimization 진행 과정 예시
(검은색 점선: 실제 목적 함수, 검은색 실선: 추정된 평균 함수,
파란색 음영: 추정된 표준편차, 검은색 점: 현재까지 조사된 입력값-함숫값 점,
하단의 녹색 실선: Acquisition Function) [Brochu et al.(2010)]
위 그림에서 가로축을 입력값
위 그림에서
GP 외의 Surrogate Models
GP 외에도, 현재까지 조사된 입력값-함숫값 점들을 바탕으로 목적 함수 추정에 있어서의 ‘불확실성’을 커버할 수 있는 모델은 Surrogate Model로써 활용이 가능합니다. GP 외에 많이 사용되는 Surrogate model로는 Tree-structured Parzen Estimators(TPE), Deep Neural Networks 등이 있습니다.
GP와 동일한 맥락에서, 이들 Surrogate Model들에 대한 깊은 이해가 없더라도, Bayesian Optimization의 큰 맥락을 이해하고 있다면 이와 관련된 라이브러리를 사용하여 Bayesian Optimization을 충분히 수행할 수 있습니다.
Acquisition Function
Surrogate Model이 목적 함수에 대하여 확률적으로 추정한 현재까지의 결과를 바탕으로, 바로 다음 번에 함숫값을 조사할 입력값 후보
GP를 사용한 Bayesian Optimization 진행 과정 중 t=2일 때의 상황
일단 현재까지 조사된
이번에는 관점을 달리하여 생각해 보겠습니다. 현재까지 조사된 두 점 사이에 위치하였으면서 표준편차(=불확실성)
Exploration 전략과 exploitation 전략 모두, 최적 입력값
Expected Improvement(EI)
Expected Improvement(이하 EI) 함수는 이러한 exploration 전략 및 exploitation 전략 모두를 내재적으로 일정 수준 포함하도록 설계된 것으로, Acquisition Function으로 가장 많이 사용됩니다. EI는 현재까지 추정된 목적 함수를 바탕으로, 어느 후보 입력값 x에 대하여 ‘현재까지 조사된 점들의 함숫값
GP 사용 시, ‘최대 함숫값 f(x+)보다 더 큰 함숫값을 도출할 확률(PI)’에 대한 시각화 예시
(세로 방향 점선: 입력값 x1, x2, x3에서의 함숫값 f(x1), f(x2), f(x3) 각각에 대한 확률 분포,
초록색 음영: f(x3)의 확률 분포 상에서, 그 값이 f(x+)보다 큰 영역)
[Brochu et al.(2010)]
위 그림에서 현재까지 조사된 점들의 함숫값 중 최대 함숫값
한편,
이렇게 입력값
참고용으로, GP를 사용할 시의 EI의 계산식을 정리하여 표현하면 (긴 유도 과정을 거쳐) 아래와 같이 나옵니다. 아래 식에서
앞서 GP를 사용한 목적 함수 추정 과정의
GP를 사용한 Bayesian Optimization 진행 과정 중 t=4일 때의 상황
실제로 현재까지 조사된 점들 중 최대 함숫값을 가지는 점
EI 외의 Acquisition Functions
EI보다 이른 시기에 먼저 제안되었으면서, EI의 고려 대상들 중 ‘현재까지 조사된 점들의 함숫값 중 최대 함숫값보다 더 큰 함숫값을 도출할 확률’만을 반영한 Acquisition Function을 Probability of Improvement(PI)라고 합니다. 그 외에도 많이 사용되는 Acquisition Function으로는 Upper Confidence Bound(UCB), Entropy Search(ES) 등이 있습니다.
딥러닝 모델의 hyperparameter 탐색을 위한 Bayesian Optimization 수행 과정
지금까지 Bayesian Optimization의 필수 요소 및 이들의 기본적인 작동 방식을 파악해 보았습니다. 이제 실제로 딥러닝 모델의 hyperparameter를 탐색할 시 Bayesian Optimization이 적용되는 시나리오에 대하여 좀 더 구체적으로 가시화하여 보여 드리도록 하겠습니다. 설명의 편의를 위해, 여기에서는 학습률(learning rate) 하나만을 탐색 대상 hyperparameter로 놓고 서술하였습니다.
학습률에 대한 Bayesian Optimization(GP, EI) 과정 예시
(구간 [0.01,0.09]에서 최초 3개(n=3), 총 11개(N=11)의 점에 대한 반복 조사 결과;
상단: 목적 함수 f(x)에 대한 GP의 확률적 추정 결과, 하단: 확률적 추정 결과에 대한 EI 함수 계산 결과;
bayesian-optimization 라이브러리 사용, random_seed=1)
- 입력값, 목적 함수 및 그 외 설정값들을 정의합니다.
- 입력값
: 학습률 - 목적 함수
: 설정한 학습률을 적용하여 학습한 딥러닝 모델의 검증 데이터셋에 대한 성능 결과 수치(e.g. 정확도) - 입력값
의 탐색 대상 구간: . - 맨 처음에 조사할 입력값-함숫값 점들의 갯수:
- 맨 마지막 차례까지 조사할 입력값-함숫값 점들의 최대 갯수:
- 입력값
- 설정한 탐색 대상 구간
내에서 처음선택한 개의 입력값들을 랜덤하게 샘플링하여 선택합니다. - 선택한
개의 입력값 을 각각 학습률 값으로 설정하여 딥러닝 모델을 학습한 뒤, 검증 데이터셋을 사용하여 학습이 완료된 모델의 성능 결과 수치를 계산합니다. 이들을 각각 함숫값 으로 간주합니다. n개의 입력값들을 랜덤하게 샘플링하여 선택합니다. - 입력값-함숫값 점들의 모음
에 대하여 Surrogate Model로 확률적 추정을 수행합니다. - 조사된 입력값-함숫값 점들이 총
개에 도달할 때까지, 아래의 과정을 에 대하여 반복적으로 수행합니다.- 기존 입력값-함숫값 점들의 모음
에 대한 Surrogate Model의 확률적 추정 결과를 바탕으로, 입력값 구간 내에서의 EI의 값을 계산하고, 그 값이 가장 큰 점을 다음 입력값 후보 로 선정합니다. - 다음 입력값 후보
을 학습률 값으로 설정하여 딥러닝 모델을 학습한 뒤, 검증 데이터셋을 사용하여 학습이 완료된 모델의 성능 결과 수치를 계산하고 이를 값으로 간주합니다. - 새로운 점
을 기존 입력값-함숫값 점들의 모음에 추가하고, 갱신된 점들의 모음에 대하여 Surrogate Model로 확률적 추정을 다시 수행합니다.
- 기존 입력값-함숫값 점들의 모음
- 총
개의 입력값-함숫값 점들에 대하여 확률적으로 추정된 목적 함수 결과물을 바탕으로, 평균 함수 을 최대로 만드는 최적해 를 최종 선택합니다. 추후 해당 값을 학습률로 사용하여 딥러닝 모델을 학습하면, 일반화 성능이 극대화된 모델을 얻을 수 있습니다.
결론
딥러닝에서의 Hyperparameter Optimization이란, 딥러닝 모델의 학습을 수행하기 위해 사전에 설정해야 하는 값인 hyperparameter(하이퍼파라미터)의 최적값을 탐색하는 문제를 지칭합니다. 딥러닝 모델 학습 시의 대표적인 hyperparameter들로는 학습률(learning rate), 미니배치 크기(minibatch size), L2 정규화 계수(L2 regularization coefficient) 등이 있습니다.
Hyperparameter Optimization을 위한 가장 단순하고 직관적인 방법으로, 매 회차에 시도할 후보 hyperparameter 값을 주관적으로 선정하고, 이를 사용하여 학습을 수행한 후 검증 데이터셋에 대하여 측정한 성능 결과를 기록하는 과정을 반복하는 Manual Search가 흔히 사용됩니다. 이 방법은 최적 hyperparameter를 찾는 과정 상에서 은연 중에 발생하는 실험자의 편견으로 인해, 실제로도 최적인 hyperparamter 값을 찾기가 상대적으로 어렵다는 등의 단점이 있습니다. 이러한 Manual Search의 단점을 보완해줄 수 있는 체계적인 방법으로 Grid Search와 Random Search 등이 있으나, 이들 또한 hyperparameter 조사 과정에서 얻은 ‘사전 지식’을 전혀 반영하지 못한다는 한계가 존재합니다.
Bayesian Optimization은, 매 회 새로운 hyperparameter 값에 대한 조사를 수행할 시 ‘사전 지식’을 충분히 반영하면서, 동시에 전체적인 탐색 과정을 좀 더 체계적으로 수행하기 위해 고려해볼 수 있는 Hyperparameter Optimization 방법론입니다. Bayesian Optimization의 두 구성 요소 중 하나인 Surrogate Model은, 현재까지 조사된 입력값-함숫값 점들을 바탕으로, 어느 미지의 목적 함수에 대한 확률적인 추정을 수행하는 모델을 지칭하며, Gaussian Process(GP)가 대표적입니다. 한편 또 다른 하나인 Acquisition Function은, 목적 함수에 대한 현재까지의 확률적 추정 결과를 바탕으로, ‘최적 입력값을 찾는 데 있어 가장 유용할 만한’ 다음 입력값 후보를 추천해 주는 함수를 지칭하며, Expected Improvement(EI)가 대표적입니다.
Bayesian Optimization의 입력값으로 ‘최적값을 탐색할 hyperparameter’를, 목적 함수의 함숫값으로 ‘특정 hyperparameter 값을 적용하여 학습한 딥러닝 모델의 검증 데이터셋에 대한 성능 결과 수치’를 적용하면, 딥러닝 모델의 Hyperparameter Optimization을 위해 Bayesian Optimization을 활용해볼 수 있습니다.
*다음 편에서는 지금까지의 이해를 바탕으로, 실제 Bayesian Optimization을 위한 Python 라이브러리인 bayesian-optimization을 사용하여 간단한 예시 함수의 최적해를 탐색하는 과정을 먼저 소개하고, 실제 딥러닝 모델의 최적 hyperparameter를 탐색하는 과정을 여러분들께 안내해 드리고자 합니다.
References
- Shahriari et al., Taking the human out of the loop: A review of bayesian optimization.
- Brochu et al., A tutorial on Bayesian optimization of expensive cost functions, with application to active user modeling and hierarchical reinforcement learning.
- Bengio et al., Practical recommendations for gradient-based training of deep architectures.
- Goodfellow et al., Deep learning.
- Bergstra and Bengio, Random search for hyper-parameter optimization.
- Fernando Nogueira, bayesian-optimization: A Python implementation of global optimization with gaussian processes.
- Hunting Optima, Expected Improvement for Bayesian Optimization: A Derivation.