티스토리 뷰

반응형

개인적으로 정말 알고 싶었던 부분.

막연하게 모델을 모델링하다 보니, 하이퍼 파라미터를 최적화하는 게 가장 노가다였다..

 

하이퍼 파라미터는 사용자가 직접 설정해야 하는 값.

 

요리를 한다고 가정하면, 향신료와 온도를 전부 최적으로 설정해야한다.

 

좋은 성능을 내려면 어떤 하이퍼 파라미터가 어떤 값을 가지면 좋을지를 찾는 작업을 거쳐야 한다.

 

그리드 서치, 랜덤 서치, 베이지안 최적화 세 가지가 있다.

 

그리드 서치

하이퍼파라미터를 모두 순회하며 가장 좋은 성능을 내는 값을 찾는다.

시간이 오래 걸린다는 단점

 

랜덤 서치 

무작위로 탐색해 가장 좋은 성능을 내는 값을 찾는 기법.

무작위라는 한계 떄문에 그리드서치나 베이지안 최적화에 비해 사용 빈도가 떨어진다.

 

사이킷런의 RandomizedSearchCV(  ) 메서드로 수행한다.

 

베이지안 최적화

 

하이퍼파라미터 튜닝의 핵심.

 

사전 정보를 바탕으로 최적 하이퍼파라미터 값을 확률적으로 추정하며 탐색하는 기법

 

bayes_opt라는 패키지로 베이지안 최적화를 구현한다.

 

1. 하이퍼 파라미터 탐색 범위 설정 : 최적 값을 찾고 싶은 하이퍼파라미터 범위를 설정

2. 평가지표 계산 함수(성능 평가 함수) 정의 : 탐색하려는 하이퍼파라미터를 인수로 받아 평가지표 값을 계산해주는 함수 정의

3. BayesioanOptimization 객체 생성 : bayes_opt 패키지의 BayesionOoptimization 객체 생성.

객체 생성 시 '평가지표 계산 함수'와 '하이퍼 파라미터 탐색 범위' 입력

4. 베이지안 최적화 수행 : BayesionOoptimization 객체의 maximize() 메서드를 호출한다.

 

평가지표 값이 가장 좋았을 때의 하이퍼파라미터 값을 최적 하이퍼 파라미터로 간주한다.

 

1) 하이퍼 파라미터 탐색 범위 설정

 

하이퍼 파라미터 = x와 y, 탐색 범위는 딕셔너리 형태

https://www.kaggle.com/werooring/ch5-bayesian-optimization

# 하이퍼파라미터 범위(딕셔너리 형태)
param_bounds = {'x': (-1, 5), 
                'y': (0, 4)}

 

딕셔너리의 키에 하이퍼 파라미터 이름을, 값에 하이퍼 파라미터 범위(튜플 형태)를 지정한다.

-1~5 사이 탐색

 

2) 평가지표 계산 함수 정의

베이지만 최적화는 평가 지표 계산 함수로 구한 평가점수를 최대화 하는 방향으로 하이퍼파라미터를 탐색한다.

실제 최적은 아닐 수 있지만, 최적일 가능성이 높은 하이퍼파라미터

 

임의로 만든 평가지표 계산 함수

def eval_function(x, y):
    return -x ** 2 - (y - 2) ** 2 + 10

 

 

3) 베이지안 최적화 객체 생성

BayesianOptimization(  )으로 베이지안 최적화 객체 생성.

f에 최대화하려는 계산 함수

pbounds에 하이퍼 파라미터 범위

random_state를 설정해 시드값을 고정하면 다음번에 실행할 때도 동일한 결과를 얻을 수 있다.

from bayes_opt import BayesianOptimization

# 베이지안 최적화 객체 생성
optimizer = BayesianOptimization(f=eval_function,
                                 pbounds=param_bounds,
                                  random_state=0)

 

4) 최적화 수행

최적화는 간단히 maximize() 메서드로 수행한다.

가장 중요한 파라미터는 init_points와 n_iter

 

  • init_points : 랜덤 탐색을 수행할 스텝 횟수. 랜덤 탐색은 탐색 공간을 다양화함으로써 최적화에 도움을 줄 수 있습니다.
  • n_iter : 베이지안 최적화를 수행할 스텝 횟수. 스텝 횟수가 많을수록 최적 값을 찾을 가능성이 높습니다.
# 베이지안 최적화 수행
optimizer.maximize(init_points=2, n_iter=10)
| iter | target | x | y |
-------------------------------------------------
| 1 | 4.002 | 2.293 | 2.861 |
| 2 | 3.121 | 2.617 | 2.18 |
| 3 | 3.832 | 2.327 | 2.869 |
| 4 | 4.596 | 2.171 | 2.832 |
| 5 | -6.227 | 3.989 | 2.559 |
| 6 | 9.467 | 0.3521 | 1.361 |
| 7 | 7.389 | -1.0 | 3.269 |
| 8 | 5.0 | -1.0 | 0.0 |
| 9 | 3.841 | 1.469 | 0.0 |
| 10 | 8.966 | -1.0 | 1.817 |
| 11 | 9.737 | 0.181 | 2.48 |
| 12 | 5.784 | 0.4647 | 4.0 |
=================================================

 

총 스탭 횟수는 init_points(2)와 n_iter(10)을 합친 횟수.

 

베이지안 최적화로 찾은 최적 하이퍼 파라미터는 x=0.181, y=2.48

이 값은 베이지안 최적화 객체의 max에 저장된다.

# 평가점수가 최대일 때 타깃, x, y값 출력
optimizer.max
{'target': 9.737113614981094,
 'params': {'x': 0.18055072150995197, 'y': 2.4798831336702114}}

 

 

출처 :머신러닝 딥러닝 문제해결 전략

https://wikidocs.net/book/13313

반응형