꺼내먹는지식 준
Hyperparameter Tunning 본문
Hyperparameter: 사람이 지정해주어야 하는 Parameter
ex) Learning Rate 모델 크기 Optimizer etc
Hyperparameter에 의해 값이 크게 좌우 되기도 했지만, 최근에는 그 현상이 덜하다.
마지막으로 결과를 쥐어짜야 할 때 도전해볼만 하다.
아래의 그래프를 보면 모델의 성능이 의외로 Hyperparameter에 의해 차이가 난다.
1) 가장 간단한 방법 Grid Search
ex) Learning Rate 0.1 0.01 0.001
GridSearch 는 우리가 지정해 놓은 몇 개의 잠재적 parameter 후보군들의 조합 중 가장 Best 조합을 찾아준다.
한마디로, 우리가 하나하나 직접 대입해가며 loss를 확인하는 작업을 대신 해준다고 보면 쉽다.
그러나, 우리가 지정해 준 hyperparameter 후보군의 갯수만큼 비례하여 시간이 늘어나기 때문에 최적의 조합을 찾을 때까지 시간이 매우 로래 걸린다.
예제
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 150, 200, 250],
'max_depth': [None, 6, 9, 12],
'min_samples_split': [0.01, 0.05, 0.1],
'max_features': ['auto', 'sqrt'],
}
2) Random Layout
hyperparameter 값을 랜덤하게 넣어보고, 그 중 우수한 값을 보인 hyperparameter를 활용하여 모델을 생성하는 기법.
글만 보면 굉장히 비효율적인 것 같은데, 오히려 효율적이라는 주장도 있다.
*불필요한 탐색 횟수를 줄인다.
그리드 서치는 우리가 딕셔너리에 지정한 모든 값을 다 탐색해야 한다. 이는 우리가 임의로 정한 값이기에 어떤 값이 효과적인지 알 수도 없다.
랜덤 서치는 위와 같은 상황을 방지하여 난수를 넣은 후, 정해진 간격 사이에 위치한 값들에 대해서도 확률적으로 탐색이 가능하므로, 최적 hyperparameter 값을 더 빨리 찾을 수 있다. (매개변수 범위나 간격 등을 설정해야 한다.)
요새는 잘 사용 안하지만 Random Search 를 하다가 학습이 잘나오는 구간에서 grid search 하는 기법도 존재하였다.
지금은 베이지안 기법들이 주로 사용된다.
BOHB 2018
Ray
multi-node multi processing 지원 모듈
ML/DL 의 병렬 처리를 위해 개발된 모듈
기본적으로 현재희 분산병렬 ML/DL 모듈의 표준
log uniform 의 경우 log scale로 uniform 분포에서 가져오는 것,
config 는 grid search 인 것을 파악할 수 있다.
ASHAscheduler 알고리즘이 실행이 되면서 중간 중간 의미 없다 생각하는 loss 값이 안나오는 metric는 짤라내는 기법
CLIReporter 결과 출력 양식 (CLI: Command LIne)
tune.run 병렬 처리 양식으로 학습 시행
: 함수가 여러개의 cpu 로 뿌려져서 학습이 시행
train_cifar 학습을 할 때 실행할 함수
ASHAScheduler 를 잘 사용하면 효율적으로 학습이 가능하며, Bayesian Optimization 같은 알고리즘을 선택해줄 수 있다.