머신러닝 디자인패턴

디자인 패턴 15 : 하이퍼 파라미터 튜닝

판교데싸 2022. 6. 1. 12:22

4.6 디자인 패턴 15 하이퍼 파라미터 튜닝

최적의 모델 하이퍼파라미터셋을 찾기 위해 학습 루프 자체를 최적화하는 방식
-> 트리의 최대 깊이를 5로 정하거나 활성함수를 RELU로 정하고 SVM에서의 커넬셋을 선택 등의 예시가 있습니다


4.6.1 문제

머신러닝 모델의 학습은 최적화 된 수치를 찾는 과정으로 이러한 최적화의 대상을 소위 모델 파라미터라 칭함 (하이퍼파라미터와는 조금 다른 개념)

모델 파라미터는 주로 학습데이터, 모델 아키텍처 및 기타 여러요인의 함수이므로 직접 제어할 수 없음

즉 모델 파라미터는 수동적으로 설정할 수 없고 임의의 값으로 초기화 된 후 반복적인 학습을 통해 모델에 의해 최적화 되는 것들을 의미

반면 하이퍼파라미터는 모델의 개발자가 제어할수 있는 학습률 에폭수 모델의 계층수 등과 같은 값들이 포함된 모든 파라미터를 말함


수동 조정

상당한 학습시간과 다양한 하이퍼파라미터를 수동으로 최적화 시킨다는 것은 비용이 상당히 많이 소요 됨

예를 들어 GPU를 사용하여 이미지 분류모델을 학습한다고 할 때 수동으로 조정을 한다면 하이퍼 파라미터의 값이 최적 조합에 도달 했는지 알 수 있는 방법이 없음

심지어 단 몇번의 시도로 컴퓨팅 리소스가 빠르게 소모되기도 함


그리드 검색과 조합 폭증

수동 조정보다 구조화 된 버전인 그리드 검색(grid search) 방식이 있다.

그리드 방식을 이용 할 때에는 최적화 하려는 각 하이퍼 파라미터에 대해 실험하고자 하는 가능한 값 목록을 리스트로 입력한다

예를 들어 RandomForestRegressor() 모델에서 모델의 max_depth 및 n_estimators 하이퍼파라미터에 대해 다음 값은 아래 처럼 정의한다.

grid_values={
 'max_depth' :[5,10,15],
 'n_estimators' : [100,150,200]
 }
 

이런 식으로 정의를 하면 지정된 리스트의 모든 조합을 시도 하고 해당 모델에서 최상의 평가지표를 도출한 조합을 사용하는 것이 그리드 검색의 기본 적인 개념.

아래는 구현 예시로 보스턴 주택 모델로 GridSearchCV 클래스의 인스턴스를 만들고 이미 정의한 값을 전달하는 코드입니다.

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston


X,y=load_boston(return_X_y=True)
housing_model=RandomForestRegressor()

grid_search_housing=GridSearchCV(
    housing_model,param_grid=grid_vals,scoring='max_error')
grid_search_housing.fit(X,y)

여기서 scoring 파라미터는 최적화하려는 평가지표로 이 회귀 모델의 경우, 가장낮은 오류를 발생시키는 하이퍼 파라미터조합을 사용해야한다.

최상의 조합을 찾으면 (grid_search_housing.best_params_) 다음과 같다

{'max_depth' :100 , 'n_estimators' : 150}

그리드 검색은 기본적으로 가능한 모든 값의 조합을 시도하는 무차별 대입 방식

이 방식의 문제점은 조합을 선택 할때 적용되는 논리가 없다는 것

모델의 오류가 특정 max_depth 이후에 증가한다고 가정할 때 그리드 검색 알고리즘은 바로 이전시행부터 학습하지 않았으므로

특정 임계값 이후에 max_depth 값 시행을 중지해야 한다는 것을 알 수 없음

결국 결과에 상관 없이 제공된 모든 하이퍼 파라미터를 가지고 학습을 시행 할 수 밖에 없다

하이퍼 파라미터를 제대로 조정 하려면 하이퍼파라미터의 최적 조합을 찾기 위해 이전의 시행으로부터 학습하는 확장성 있는 솔루션이 필요


사이킷런은 그리드 검색의 대안으로 RandomizedSearchCV 지원

-> 이 방식은 그리드 방식 처럼 모든 가능한 조합을 시행하는 것 대신해 무작위로 샘플링할 횟수를 결정
결국 그리드 보다 실행이 빠르지만 임의의 선택된 항목에 최적 하이퍼 파라미터 값이 포함되지 않을 가능성이 있음


4.6.2 솔루션

위의 문제점들을 보안할 만한 솔루션 - 베이지안 최적화

기본적인 컨셉은 모델을 가능한 적은 횟수로 학습 시켜 비용을 줄이는 것

베이지안 최적화는 뒤쪽 작동원리에서 개념에 대해 자세하게 다뤄져 있습니다.

솔루션 부분에서는 keras-tuner 라이브러리를 사용하여 베이지안 최적화를 구현하는 방법을 소개

  1. keras- tuner 를 사용하려면 hp라는 하이퍼파라미터 인수를 포함시킬 함수 내부 모델 정의
  2. 이후 하이퍼파라미터의 이름,자료형,검색할범위 각 시행에서 값을 얼마나 증가시킬지 등 모든 함수에 hp 를 사용

먼저 신경망 첫번째 은닉층에 있는 뉴런의 수를조정하고자 한다면

keras.layers,Dense(hp.int('frist_hidden',32,256,step=32),activation='relu')

first_hidden 은 하이퍼파라미터의 이름, 32는 최솟값 , 256은 최댓값, 32는 증분에 해당

Mnist 분류모델을 만들때 keras tuner에 전달하는 전체함수는 다음과 같다

def build_model(hp):
    model = keras.Sequential([
      keras.layers.Flatten(input_shape=(28, 28)),
      keras.layers.Dense(hp.Int('first_hidden', 128, 256, step=32), activation='relu'),
      keras.layers.Dense(hp.Int('second_hidden', 16, 128, step=32), activation='relu'),
      keras.layers.Dense(10, activation='softmax')
    ])

    model.compile(
      optimizer=tf.keras.optimizers.Adam(
        hp.Float('learning_rate', .005, .01, sampling='log')),
      loss='sparse_categorical_crossentropy', 
      metrics=['accuracy'])
  
    return model
    

해당 모델을 베이지안 최적화로 라이브러리를 인스턴스화 하고 검증 정확도를 최적화한다.

tuner = kt.BayesianOptimization(
    build_model,
    objective='val_accuracy',
    max_trials=30
)

작업이 실행 됨에 따라 각 시행에 대해 선택된 3개의 하이퍼 파라미터 값을 볼 수 있고 작업이 완료되면 최상의 결과를 가져온

하이퍼 파라미터 조합을 확인 할수 있다


4.6.3 작동 원리

  • 머신러닝 모델과 하이퍼파라미터 검색 프로세스 모두 최적화 문제라고 볼 수 있으므로, 학습 데이터에서 모델이 학습하듯이 주어진 값 범위 내에서 최적의 하이퍼파라미터 조합을 찾는 방법을 학습하는 접근 방식을 사용해볼 수도 있음
    • 하이퍼파라미터 튜닝은 안쪽 루프가 일반적인 모델 학습으로 구성된 바깥쪽의 최적화 루프라고 볼 수 있음 
    • 가능한 하이퍼파라미터 공간에서 하나의 모델을 선택하는 것이 일반적이지만, 하이퍼파라미터 프레임워크를 사용하여 앙상블 영할을 할 수 있는 여러 모델을 생성할 수도 있음

비선형 최적화

  • 하이퍼파라미터는 모델 아키텍쳐 관련(계층 수, 계층당 뉴런 수) / 모델 학습 관련(에폭 수, 학습률, 배치 크기 등) 그룹으로 나눌 수 있는데, 이런 하이퍼파라미터 전체에 대해 모델 함수를 미분할 수 있는 것은 아님
  • 따라서 하이퍼파라미터의 최적화 문제는 비선형 최적화 방법을 사용해야 하며, 이 경우 측정 지표의 선택 폭이 넓어지므로 사업적 목적 등에 따라 다양한 지표를 사용할 수 있음

베이지안 최적화 (참조 포스팅)

  • 베이지안 최적화는 블랙박스 함수를 최적화하는 기법으로, 새로운 하이퍼파라미터 조합을 시도할 때마다 모델을 학습하는 대신에 훨씬 적은 비용으로 실행할 수 있는, 모델을 모사한 새로운 함수(대리 함수, surrogate model)를 정의함
    • 대리 함수의 입력은 하이파파라미터 값이고 출력은 최적화 지표
    • 대리 함수를 생성하는 방식은 가우시안 프로세스 또는 트리 구조 파젠 추정기 등이 있음
  • 이렇게 생성된 대리 함수를 통해 최적의 값을 선택해서 추천하는 함수는 acquisition function이라고 하며, 이 두 프로세스(대리 함수 생성 -> 최적의 값 선택)를 반복해서 최적의 값을 찾아나가는 방식이 베이지안 최적화
  • 그리드 검색과 비교할 때, 베이지안 최적화는 각 시행마다 하이퍼파라미터를 선택하며 오랜 컴퓨팅 시간을 소비하지만, 목적 함수를 실행하는 것보다는 대리 함수를 실행하는 것이 훨씬 학습 비용이 적으므로 자주 사용됨
반응형
반응형