머신러닝에서 hyperparameter search를 도와주는 optuna 라이브러리 소개
1. introduction
hyperparameter tuning을 도와주는 open source framework
파이썬을 이용하여 최적화된 hyperparameter를 자동으로 찾아줌
큰 공간을 더욱 빠르고 효과적으로 찾아주는 최신 알고리즘인 bayesian optimization을 사용?
hyperparameter search가 특별한 코드 수정없이도 쉽게 병렬화가 가능해서 대규모 탐색도 분산 머신으로 탐색할 수있는 방법을 제공
쉽게 디자인 되어 있어서 상당히 쉽게 사용가능함
2. 기본적인 사용방법
optimize하고 싶은 objective function을 정의함
trial.suggest_uniform, trial.suggest_int 등으로 탐색하고자 하는 값의 범위를 설정함
실제 search를 수행할 class를 정의함
그 class에 optimize를 호출하여 n_trials로 시도횟수를 줌
예를 들면 위 그림은 $(x-2)^{2}$을 (-10,10)에서 랜덤하게 100번 뽑으면서 bayesian optimization 방법으로 최적값을 찾아준 코드
study.best_params는 최적 parameter를 제공
3. 예시로 이해하는 optuna
objective에 tuning하고자하는 hyperparameter를 정의하고
return으로 accuracy를 줬는데 accuracy를 최적화하고자 하는 것임
accuracy는 클수록 좋으니까 direction으로 maximize를 정해줌
정의해놓은 parameter에서 n_trials=100번 랜덤하게 탐색하여 bayesian optimization으로 hyperparameter를 찾아나감
4. 탐색 결과 저장기능
storage API는 optuna의 탐색 결과를 저장하는 기능을 제공함
RDB나 REdis같은 영구적인 저장소 형태로 저장하나봄
hyperparameter 탐색은 분명 대규모이면 시간이 오래 걸려 무한정 돌리기는 힘든데
저장이 가능하다면 몇번 돌려놓고 저장해서 불러온 뒤에 이전 결과에 이어서 다시 시작함
이것을 쓰면 기존 결과를 불러와서 기존 결과부터 계속 bayesian optimization을 수행하게 해줌
그러면 효율적으로 끊어서 해도 이전 결과를 이어서 더 좋은 방식으로 hyperparameter를 찾아낼 수 있다
storage를 정의하고 create_study에 인자로 storage=storage를 준다
5. optuna visualization
1) hyperparameter importance
모델의 성능이 어떠한 hyperparameter에 크게 좌우되었는지 측정
optuna.visualization.plot_param_importances
x,y,z중에 x에 의해 성능이 크게 좌우되었다는 사실 확인가능
2) history visualization
시도 횟수에 따라 objective value가 어떻게 변하면서 best parameter는 어디인지
optuna.visualization.plot_optimization_history
3) slice visualization
개별 hyperparameter들의 변화에 따라 objective value가 어떻게 변하는지
optuna.visualization.plot_slice
4) contour visualization
여러개의 hyperparameter와 objective value 변화간의 heatmap 표현
optuna.visualization.plot_contour
objective value값이 작은 곳이 좋은 곳인데 실제로도 hyperparameter들이 작은 곳에 몰려있음
5) parallel coordinate visualization
hyperparameter 변화에 따라 objective value가 어떻게 변화했는지 선으로 전부 그려줌
optuna.visualization.plot_parallel_coordinate
'프로그래밍 > Python' 카테고리의 다른 글
ABC349 D번 복기 - log를 구하는 가장 정확한 방법 - math.log를 기피해야하는 이유 (0) | 2024.04.14 |
---|---|
functools.partial을 이용하여 기존 함수를 재활용한 새로운 함수 만들기 (0) | 2024.04.13 |
-1 의 50만 거듭제곱을 -1**(500000)으로 하면 안되는 이유 (0) | 2024.02.17 |
(매우 중요)대용량 데이터로 colab 딥러닝 학습할 때 첫번째 epoch이 매우 느리다면(colab 대용량 데이터, dataloader 병목현상) (0) | 2024.01.18 |
구글드라이브로 대용량 데이터를 다룰 때 필요한 테크닉(압축해제, 자동압축, 파일 크기 확인방법) (0) | 2024.01.14 |