본문 바로가기
AI/딥러닝

[최적화] Optuna , Yaml에서 Model 생성

by 채채씨 2021. 11. 25.
728x90
반응형

 

Optuna

Optuna 특징 및 과정

  • 특징
    • SOTA 알고리즘 구현
    • 병렬화 용이
    • Conditional parameter 구성 용이
  • search 과정
    • Optuna Study 인스턴스 생성 : blackbox optimizer역할 및 전체 trial관리
    • Study에 최적화할 목적함수(objective) 및 시도 횟수(n_trials), 조건 등 부여
    • Optimize!

  • 전체 흐름
    • search_model : 모델을 sampling하여 config 반환
    • search_hyperparam : 하이퍼파라미터를 sampling하여 config 반환
    • train_model : 위의 config들을 가지고 model 학습 후, 학습된 모델 반환
    • evaluate : 위의 학습된 모델을 가지고 evaluate하여 score 반환
    • study.optimize : 위의 score를 가지고 TPE알고리즘을 통해 또 다른 sampling할 모델 및 하이퍼파라미터를 탐색하여 새로운 config를 설정할 수 있도록 정보를 넘겨줌 (Blackbox optimizer)

 

AutoML 파이프라인

 

구현 (파이프라인에 끼워맞춤)

 

위의 그림은 AutoML파이프라인에 끼워맞추어 코드를 분리한 것이고, 실제로는 아래와 같이 objective함수 안에서 study.optimize외의 모든 것이 구현된다.

 

구현 (실제)

 


 

sample_model

 

먼저 Optuna과정 중 모델을 샘플하는(sample_model) 파트를 상세하게 보자.

 

Architecture Model

  • Motivation
아래 그림과 같이, 모델을 테이블로 표현 가능하다면,
특정 data structure에 block들을 넣어서 모델을 조립할 수 있지 않을까?
block들을 임의로 쌓아서 모델을 새로 생성할 수 있지 않을까? 

테이블로 표현된 모델들

 

  • [1단계] 테이블 → Yaml

yaml파일에 모델 구조 설계

 

  • [2단계] Yaml → Model
<전체 과정>
1. yaml파일을 Model클래스에 넣어 인스턴스 객체를 만든다.
2. Model클래스 내 ModelParser클래스가 있다.
3. ModelParser클래스는 yaml파일을 load한 후 config들을 할당하고 _parse_model()을 통해 모델을 생성한다.

 

 

<모델 생성 과정>
1. input_channel = 3을 받으면, 3이 backbone에 전달되고 backbone이 할당된다. (module weight의 shape결정에 input_channel필요)
2. backbone은 [repeat, module, module argument(output_channel, kenel_size, stide)]들로 조립된다.
3. config들이 ModelGenerator에 들어가서 각각의 모듈 Generator를 통해 pytorch모듈을 생성한 후에 리스트(layers)에 append한다.

 

모델 생성 과정

 

<모델 생성 코드>
1. backbone내 module을 for문으로 돌면서 해당 module의 Generator에 args와 width_multiple같은 config를 넣어 인스턴스 객체를 만든다.
2. 인스턴스 객체에 repeat을 설정한 후 module을 생성한다.
3. layers에 생성한 module을 append한다.
4. 현재 module의 output_channel은 다음 module의 input_channel이 되므로 해당 코드를 추가한다.
5. for문을 모두 돌고나면 layers를 nn.Sequential로 묶은 후 모델을 반환한다.

 


Architecture Config

 

1. Categorical config

  • suggest_categorical 함수 사용
  • name에 parameter 설정
  • choices에 목록 설정

 

2. Continuous config

  • suggest_float 함수 사용
  • name에 parameter 설정
  • low와 high에 하한과 상한 설정

 

3. Integer config

  • suggest_int 함수 사용
  • name에 parameter 설정
  • low와 high에 하한과 상한 설정

 

4. Conditional config()

  • 1, 2, 3번에서 설정한 parameter에 내에서 조건을 걸고 싶을 때, if문 사용
    • ex) Adam 전용 parameter 따로 sample가능

 


 

Custum Search Space

 

Learning Transferable Architectures for Scalable Image Recognition 논문

  • Neural Architecture Search(NAS) 논문
  • 모듈 Block(micro)들의 조합과 구성(macro) 모두를 탐색하지 않고, 모듈 Block만을 탐색하는 것에 초점
    • 성능은 좋지만 computational cost가 높음
  • 모듈 Block들로 생성되는 네트워크 구조(macro)는 고정
    • 모듈 Block은 기존에 있는 좋은 것들 사용하되, macro한 구조는 아래 이미지 차용

 

즉, Conv와 같은 모듈들을 가져다 쓰되, 아래 그림과 같은 구조(macro)만 가져가자는 게 주요 골자

 


 

[reference]

728x90
반응형

댓글