모델 튜닝(1)

우수민·2021년 8월 9일
0

머신러닝 공부

목록 보기
7/9

매개변수 튜닝

하이퍼 파라미터 탐색 방법

  1. 수동으로 매개변수 조정

    • 매개변수를 잘 아는 상황에서 하이퍼파라미터를 수동으로 조정하면 착실하게 성능을 올릴 수 있다.
    • 그리고 매개변수를 바꿨을 때의 점수 변화로 데이터를 더 깊게 이해할 수도 있다.
    • 계산 시간은 비교적 짧은 편이지만 작업자가 튜닝하는 시간이 꽤 걸리는 것이 단점이다.
  2. 그리드 서치와 랜덤 서치

    • 그리드 서치는 각 매개변수의 후보를 정하고 이들 조합을 모두 계산하는 방법이다.
    • 랜덤 서치는 각 매개변수의 후보를 정하고 매개변수별로 랜덤하게 선택한 조합을 만든다.
    • 어느 논문에 따르면 그리드 서치보다 랜덤 서치의 효율이 더 높다고 한다.
  3. 베이즈 최적화(BO; Bayesian optimization)

    • 이전에 계산된 매개변수의 이력에 근거하여 다음에 탐색할 매개변수를 베이즈 확률로 선택하는 방법이다.
    • 랜덤 서치에서는 전혀 성능이 나오지 않았던 매개변수 주변도 탐색한다. 하지만 베이즈 최적화에서 탐색 이력을 사용함으로써 성능이 좋을 가능성이 높은 매개변수를 효육적으로 탐색하는 것을 시도한다.

      톱 클래스의 캐글러는 대부분 수동으로 매개변수를 조정한다. 하지만 숙련되지 않았다면 베이즈 최적화로 효율적인 탐색을 하고 그 결과를 살펴보며 경험을 쌓아가는 것을 권장한다.

      1. 베이스라인이 되는 매개변수로 학습
      2. 간단하게 조정하고 싶을 때는 1~3종류의 매개변수와 각각 2~5개 정보의 후보를 추려서 그리드 서치
      3. 본격적으로 매개변수 튜닝을 수행할 때는 베이즈 최적화(이 단계에서는 그리드 서치나 랜덤서치보다 베이즈 최적화를 이용하는게 효육적)

매개변수 튜닝으로 설정

  • 매개변수 튜닝을 실시할 때는 다음 사항들을 설정
    1. 베이스라인이 될 매개변수
    2. 탐색 대상이 될 매개변수와 그 범위
    3. 수동 조정할지 자동 탐색할지 여부
    4. 평가 시스템(교차 검증 등 폴드 분할 방법)

매개변수 튜닝의 포인트

  • 중요한 매개변수와 크게 중요하지 않은 매개변수가 있다. 모든 매개변수를 조정할 필요는 없으므로 중요한 매개변수부터 조정해 나가는 게 좋다.
  • 매개변수의 값을 증가시켰을 때 모델의 복잡성을 증가시키는 매개변수와 반대로 모델을 단순하게 만드는 매개변수가 있다. 이것을 이해하면 학습이 잘 진행되지 않을 때 참고가 될 수 있다.
  • 매개변수의 어느 범위를 탐색했을 때 그 상한 또는 하한 매개변수에 좋은 점수가 결과가 집중되어 있다면 범위를 넓혀 탐색하는 것이 좋다.
  • 대부분의 모델에서 학습 시의 난수 시드를 지정할 수 있다. 난수 시드를 고정하면 결과가 재현되므로 작업하기가 쉽다.

    특히 모델이 GBDT일 때는 매개변수 튜닝보다 좋은 특징을 추가하는 편이 모델 성능 개선에 더 도움이 될 수 있다. 어느 정도의 매개변수 튜닝은 특징을 평가하기 위워지므로 유효하지만, 초반부터 지나치게 주력하지 않는 편이 좋다.

  • 모델의 난수 시드와 폴드 분할의 난수 시드를 바꿨을 때의 점수 변화를 살펴봄으로써 매개변수를 바꿨을 떄의 점수 변화가 단순한 랜덤성에 의한 것인지 아니면 매개변수 변경으로 개선된 결과인지를 추측할 수 있다.

베이즈 최적화에서의 매개변수 탐색

  1. hyperopt
  • TPE(tree-structured parzen estimator) 알고리즘 활용
  • 다음과 같이 설정함으로써 매개변수를 자동으로 탐색하고, 탐색한 매개변수와 그때의 평가지표에 따른 점수를 출력할 수 있다.
    • 최소화하고 싶은 평가지표를 설정
      : 모델의 성능을 가장 높이는 매개변수를 찾으려면, 매개변수를 인수로 삼고 모델을 그 매개변수로 계산했을 때의 평가지표 점수를 반환하는 함수를 작성하고 이를 설정한다. 모델 성능과 같이 높을수록 좋은 평가지표는 양성과 음성을 반전시키는 식의 작업을 거쳐 더 낮을 쪽을 좋은 평가지표로 설정해야 한다.
    • 탐색할 매개변수의 범위 정의
      : 탐색할 매개변수의 범위를 사전분포로서 정의한다. 사전분포는 복수의 후보중에 선택하거나, 균등분포로 하거나, 로그의 값이 균등분포를 따르는 것으로 정의할 수 있다.
    • 탐색 횟수 지정
      :탐색한는 매개변수의 수나 범위에 따라 다르지만 25회 정도의 탐색에서 나름 타당한 매개변수가 발견되기 시작하며 100회 정도면 충분한 탐색이 이루어진다.
# hp.choice에서는 복수의 선택사항에서 고르기
# hp.uniform에서는 하한상한을 지정한 동일분포로부터 추출. 인수는 하한상한
# hp.quniform에서는 하한상한을 지정한 균등분포 중 일정 간격마다의 점으로부터 추출. 인수는 하한상한간격
# hp.loguniform에서는 하한상한을 지정한 로그을 취한 값이 균등분포를 따르는 분포로부터 추출. 인수는 하한상한의 로그를 취한 값

# 만약 moduleNotFoundError 발생시 hyperopt 설치 후 진행
# 2021/04/27 hyperopt 설치 확인 : 0.2.5
# pip install hyperopt
from hyperopt import hp

space = {
    'activation': hp.choice('activation', ['prelu', 'relu']),
    'dropout': hp.uniform('dropout', 0, 0.2),
    'units': hp.quniform('units', 32, 256, 32),
    'learning_rate': hp.loguniform('learning_rate', np.log(0.00001), np.log(0.01)),
}
  • Hyperopt 라이브러리를 사용한 매개변수 탐색
    1. 튜닝하려는 매개변수를 인수로 취하여 최소화하려는 평가지표의 점수를 반환하는 함수를 작성. 그 함수에서는 모델을 인수의 매개변수로 학습시켜 검증 데이터에 대해 예측하고 평가지표의 점수를 계산하는 처리를 함
    2. Hpyeropt 라이브러리의 fmin함수에 1에서 작성한 함수, 탐색할 매개변수 공간, 탐색 횟수 등을 지정하여 탐색
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from sklearn.metrics import log_loss


def score(params):
    # 매개변수를 주었을 때, 최소화하는 평가지표를 지정
    # 구체적으로는 모델에 매개변수를 지정하여 학습예측하는 경우의 점수를 반환

    # max_depth의 형을 정수형으로 수정
    params['max_depth'] = int(params['max_depth'])

    # Model 클래스를 정의하는 것으로 함
    # Model 클래스는 fit으로 학습하고 predict로 예측값의 확률을 출력
    model = Model(params)
    model.fit(tr_x, tr_y, va_x, va_y)
    va_pred = model.predict(va_x)
    score = log_loss(va_y, va_pred)
    print(f'params: {params}, logloss: {score:.4f}')

    # 정보를 기록
    history.append((params, score))

    return {'loss': score, 'status': STATUS_OK}

# 탐색할 매개변수의 공간을 지정
space = {
    'min_child_weight': hp.quniform('min_child_weight', 1, 5, 1),
    'max_depth': hp.quniform('max_depth', 3, 9, 1),
    'gamma': hp.quniform('gamma', 0, 0.4, 0.1),
}

# hyperopt에 의한 매개변수 탐색 실행
max_evals = 10
trials = Trials()
history = []
fmin(score, space, algo=tpe.suggest, trials=trials, max_evals=max_evals)

# 기록한 정보에서 매개변수와 점수를 출력
# (trials에서도 정보를 취득할 수 있지만 매개변수의 취득이 다소 어려움)
history = sorted(history, key=lambda tpl: tpl[1])
best = history[0]
print(f'best params:{best[0]}, score:{best[1]:.4f}')

실제로 베이즈 최적화를 해보면 다음과 같은 문제로 튜닝하지 못할 때가 존재한다.
1. 계산 시간이 오래 걸리는 실행 : 에폭 수의 상한을 크게 잡지 않도록 하거나 콜백에 의해 일정 시간 내에 학습이 종료되지 않으면 종료시키는 방법을 고려
2. 매개변수 간 의존성 : 매개변수가 모델 성능에 미치는 영향은 각 매개변수에 독립적이지 않으면서 서로 어느 정도의 의존성은 가진다. 이때는 의존 관계를 매개변수 공간에 명시적으로 정의하거나, 그게 어렵다면 시행횟수를 늘리는 방법을고려할 수 있다.
3. 평가의 랜덤성에 따른 편차 : 평가의 편차가 크면 효과적으로 탐색할 수 없다. 하나의 폴드가 아닌 교차 검증에 따른 평균값으로 평가하거나 시행 횟수를 늘리는 방법을 고려할 수 있다.

  1. optuna
  • API가 사용하기 편리해지고 효율적으로 튜닝할 수 있다.
    • Define-by-Run 방식의 API : 모델을 구축할 때 하이퍼파라미터가 취할 수 있는 범위를 정의하고, 계산할 때 하이퍼파라미터 공간이 정해지는 구조
    • 학습 곡선을 이용한 시행의 가지치기 : 계산 도중 학습 곡선을 보고 그 매개변수가 가망이 없다고 판단했을 때 계산을 중간하기에 효율적
    • 병렬 분산 최적화

GBDT의 매개변수의 튜닝

  1. eta : 학습률 -> 작게 설정한다고 성능이 떨어지는 일은 거의 없지만, 시간이 오래 걸림. 처음에는 0.1 정도의 약간 큰값으로 두었다가 추후에 0.01~0.05 정도로 줄인다.

  2. num_round : 작성할 결정 트리의 개수 -> 1,000이나 10,000 등 충분한 값으로 두었다가 조기 종료에서 자동 종료되도록 설정되는게 좋음.(조기 종료를 관찰하는 라운드수 (early_stopping_rounds)는 50정도가 좋다.)

  3. max_depth : 결정 트리의 깊이(모델 복잡도 조정)

  4. min_child_weight : 잎의 분기에 필요한 잎을 구성하는 데이터수(정확히는 데이터 수가 아닌, 목적함수로의 이차 미분값이 사용)(모델 복잡도 조정)

  5. gamma : 결정 트리를 분기시키기 위해 최소한으로 줄여야 하는 목적함수의 값(모델 복잡도 조정)

  6. colsample_bytree : 결정 트리별로 특징으로 사용할 열을 샘플링하는 비율(랜덤성 추가하여 과적합 억제)

  7. subsample : 결정 트리별로 학습 데이터의 행을 샘플링하는 비율(랜덤성 추가하여 과적합 억제)

  8. alpha : 결정 트리의 잎의 가중치에 대한 L1 정규화 강도(모델 복잡도 조정)

  9. lambda : 결정 트리의 잎의 가중치에 대한 L2 정규화 강도(모델 복잡도 조정)

max_depth가 가장 중요하고 subsample, colsample_bytree, min_child_weight도 중요하다는 의견이 많다. 한편 gamma, alpha, lambda는 개인 취향에 따라 우선도가 달라진다.

++ 기타 교재 내용

신경망의 매개변수와 튜닝

  • 다층 퍼셉트론의 조정 대상은 신경망의 구성이나 최적화 등이다.
  1. 네트워크 구성

    • 입력 계층과 출력 계층은 입력 데이터의 차원 수나 문제에 따라 결정되므로 조정의 여지가 거의 없다.
    1. 은닉 계층의 활성화 함수 : 기본함수는 ReLU이지만 PReLU도 자주 쓰인다. 또 LeakyReLU라는 선택지도 있다.
    2. 은닉 계층의 층수
    3. 각 층의 유닛 수, 드롭아웃 비율
    4. 배치 정규화 계층의 유무
  2. 옵티마이저 선택

    • 옵티마이저는 신경망의 가중치응 어떻게 학습할지에 관한 최적화 알고리즘이다.
    • 간단한 SGD와, 학습률을 적절하게 바꾸는 Adam등을 실험하면 좋다. 어느 옵티마이저든 학습률은 중요한 매개변수가 될 수 있다.
  3. 기타

    • 배치 크기
    • 가중치 감소 등 정규화 기법을 도입하거나 옵티마이저의 학습률 이외의 매개변수를 조정
  • 학습률을 먼저 조정하고 어느 정도 학습이 잘 진행된 후에 다른 매개변수를 조정하는 것이 좋다. 학습률이 지나치게 높으면 목적함수가 발산되고, 지나치게 낮으면 학습 진행에 많은 시간이 걸려 아무리 기다려도 학습이 진행되지 않는다.

++ 기타 교재 내용

선형 모델의 매개변수와 튜닝

  • 선형 모델은 정규화 매개변수가 튜닝 대상이다.
  • 튜닝 대상의 매개변수가 적고 계산도 비교적 빠르므로 10배씩 조정한 간격(0.1, 0.01, 0.001, ...)으로 취할 수 있는 범위를 조사할 수 있다.
  • 라소 회귀, 리지 회귀 : alpha가 정규화의 세기를 나타내는 매개변수이다.
  • 엘라스틱넷 회귀 : alpha가 정규화의 세기를 나타내는 매개변수이다. l1_ratio가 L1 정규화와 L2 정규화의 비율을 나타내는 매개변수이다.
  • 로지스틱 회귀 : c가 정규화의 세기의 역수를 나타내는 매개변수이다.

참고 : 데이터가 뛰어노는 AI 놀이터, 캐글

profile
데이터 분석하고 있습니다

0개의 댓글