(4강) 작은 모델, 좋은 파라미터 찾기: AutoML 실습

newbie·2021년 11월 23일

강의 소개

이번 시간에는 AutoML 을 직접 구현해보겠습니다.
AutoML을 하기 위해서 모델을 쉽게 만들 수 있어야겠죠. yaml 파일에서 모델을 만드는 법을 학습 합니다.
모델을 쉽게 만들 수 있게 되었으면 Optuna를 사용하여 자동으로 모델을 찾는 법을 학습 합니다.

Further Reading


1. Overview

1.1 Review

  • AutoML : 기준 성능을 잘 만족하는 적절한 모델, 파라미터 탐색
    • configuration으로 학습
    • objective fn 계산
    • surrogate fn & acqusition fn 업데이트
    • acqusition fn output 중 가장 큰 λ 탐색 이후 첫 과정에서 부터 다시 학습

1.2 Objective

  • 충분히 좋은 configuration 찾기
  • 이번 내용에선 search space를 적게 잡는 것에 focuing

2. 코드: Sample 파트

2.1 이론과 코드의 연결

  • Optuna API 활용
    • SOTA 알고리즘 구현, 병렬화 용이, COnditional 파라미터 구성 용이
  • 과정 overview
    • Optuna Study 생성(blackbox optimizer 및 관리 담당)
    • Study에 최적화 할 목적함수 및 시도 횟수, 조건 등 지정
    • Optimize
if __name__=="__main__":
    study = optuna.create_study(directions="maximize")
    study.optimize(objective, n_trials=500)
    print(f"Best trial {study.best_trial}")

  • 실제 구현 코드

2.2 Architecture config

  • 우선 sample_model(trial) 이해하기
    • 다양한 backbone 모델이 있는데, 해당 모델들의 stage를 table로 표현이 가능
    • 그렇다면, table로 표현된 모델을 configuation 혹은 notation file로 표현하여, block들을 쌓아서 모델을 생성 가능하다고 판단을 함
    • 그 결과, 아래와 같이 resnet50을 yaml file로 다음과 같이 표현이 가능

Prerequisite : Optuna search space[1]

1. Categorical

  • suggest_categorical(name,choices) : suggest a value for the categorical parameter.
activation = trial.suggest_categorical(
    name="m2/activation",
    choices=["ReLU","ReLU6""Hardswish"]
    )

2. Continuous

  • suggest_float(name,low,high,*,step=None, log=False) : suggest a value for the floating point parameter.
activation = trial.suggest_float(
    name="learning_rate",
    low=1e-5,
    high=1e-3
    )

3. Integer

  • suggest_int(name,low,high,*,step=1, log=False) : suggest a value for the integer parameter.
activation = trial.suggest_int(
    name="epochs",
    low=10,
    high=30,
    step=10
    )

4. Contional(★★)

#Sample optimizer
optimizer = trial.suggest_categorical(
    name="optimizer",
    choices=["Adam","SGD""Adagrad","AdamW"]
    )

#Optimizer args are conditional!
if optimizer=="Adam":
    #More aggressive lr
    lr = trial.suggest_float(name="lr", low=1e-5, high=1e-3)
    #Adam only Params
    beta1 = trial.suggest_float(name="beta1", low=0.8, high=0.95)
    beta2 = trial.suggest_float(name="beta2", low=0.9, high=0.9999)
elif optimizer=="SGD":
    #Conservative lr
    lr = trial.suggest_float(name="lr", low=1e-6, high=1e-4)
    #SGD only Params
    momentum = trial.suggest_float(name="momentum", low=0.0, high=0.95)

Custom search space 구성하기: 예시

  • Learning Transferable Architectures for Scalable Image Recognition 논문
  • Research Topic 중 하나인 Neural Architecture Search(NAS) 논문
  • 모듈 block들의 조합 및 구성(macro)을 탐색하는 것이 아닌, 모듈 block(micro)을 탐색하는 것에 초점(주요 연구 방향)
    • 성능은 좋지만, 아직 높은 computational cost
  • 네트워크 구조는 고정되지만, 모듈 block 자체를 탐색

2.3 Hyperparam config

  • 고정할 변수와 조정할 변수를 나눠서 판단
def sample_hyperparam(trial) -> Dict[str, Any]:
    """Sample hyperparam from user-specified search space
    
    Returns:
        Dict[str, Any]: sampled hyperparam configs
    """

    epochs = trial.suggest_int(name="epochs", low=10, high=30, step=10)
    batch_size = trial.suggest_categorical(name="batch_size", [16,32,64])
    lr = trial.suggest_float(name="lr", low=1e-5, high=1e-3)
    #Sample optimizer
    optimizer = trial.suggest_categorical(
        name="optimizer",
        choices=["Adam","SGD""Adagrad","AdamW"]
        )
    #Optimizer args are conditional!
    if optimizer=="Adam":
        #More aggressive lr
        lr = trial.suggest_float(name="lr", low=1e-5, high=1e-3)
        #Adam only Params
        beta1 = trial.suggest_float(name="beta1", low=0.8, high=0.95)
        beta2 = trial.suggest_float(name="beta2", low=0.9, high=0.9999)
    elif optimizer=="SGD":
        #Conservative lr
        lr = trial.suggest_float(name="lr", low=1e-6, high=1e-4)
        #SGD only Params
        momentum = trial.suggest_float(name="momentum", low=0.0, high=0.95)

3. 코드: Parse 파트

profile
DL, NLP Engineer to be....

0개의 댓글