[딥러닝 홀로서기] Lec11. How to Parameterize DL Code

YJ·2024년 10월 15일
0

딥러닝 홀로서기

목록 보기
11/24
post-thumbnail

이 블로그글은 2019년 조재영(Kevin Jo), 김승수(SeungSu Kim)님의 딥러닝 홀로서기 세미나를 수강하고 작성한 글임을 밝힙니다.

💡 도움이 되셨다면 ♡와 팔로우 부탁드려요! 미리 감사합니다.

딥러닝 코드 Parameterize하기

Parametrization이란?

seed = 123
np.random.seed(seed)
torch.manual_seed(seed)

# Arguments setup
args = parser.parse_args("")

##### SIZE #####
args.vocab_size = 41
args.in_dim = 59
args.out_dim = 256
args.molevc_dim = 512

##### MODEL #####
args.num_layers = 6
args.use_attn = True
args.n_attn_heads = 8
args.use_bn = True
args.sc_type = 'sc'
args.emb_train = True
args.train_loop = True
args.train_mr = True
args.train_tpsa = True

##### HYPERPARAMETERS #####
args.optim = 'ADAM'
args.lr = 0.001
args.l2_coef = 0.001
args.dp_rate = 0.1

##### EXP #####
args.epoch = 100
args.batch_size = 512
args.test_batch_size = 512
args.save_every = 100
args.validate_every = 100
args.log_every = 20

##### DEVICE #####
args.device = 'cuda' if torch.cuda.is_available() else 'cpu'

##### LOGGING #####
args.log_path = 'runs'
args.model_name = 'exp_test3'

→ 하이퍼파라미터는 무수히 많이 존재한다.

  • Parametrization은 머신러닝 모델에서 하이퍼파라미터를 포함한 다양한 변수들을 따로 한 곳에 모아 설정하는 것을 의미한다.

💡 parserargs에 대해 알아보자

왜 Parameterization을 해야하는가?

  • 다양한 변수를 한 곳에서 관리하기 위함
  • 모델 안에서 하이퍼파라미터를 선언하는 상황을 막기 위함
    • 잘못하면 실험을 안하고 건너뛰는 상황이 생김
  • 재사용성
  • 가독성
  • 다양한 실험의 결과를 위해 하이퍼파리머틀 자동으로 튜닝해주는 optimizer에게 맞기기 위함

Hyperparameter란?

  • 하이퍼파라미터(hyperparameter)란 머신러닝 모델의 학습 과정에서 사용자가 직접 설정해야 하는 변수이다.
  • 모델이 데이터를 통해 학습하는 파라미터와는 달리, 하이퍼파라미터는 학습 과정 자체에 영향을 미치는 값이다.
  • 모델의 성능을 조정하는 데 중요한 역할을 합니다.

예시

모델을 결정하는 하이퍼파라미터

seed = 123
np.random.seed(seed)
torch.manual_seed(seed)

# Arguments setup
args = parser.parse_args("")

##### SIZE #####
args.vocab_size = 41
args.in_dim = 59
args.out_dim = 256
args.molevc_dim = 512

##### MODEL #####
args.num_layers = 6
args.use_attn = True
args.n_attn_heads = 8
args.use_bn = True
args.sc_type = 'sc'
args.emb_train = True
args.train_loop = True
args.train_mr = True
args.train_tpsa = True
  • seed: 난수 생성의 초기값을 설정한다. 동일한 시드를 사용하면 매번 같은 난수를 생성할 수 있어, 재현성을 보장한다.
  • args.num_layers: 모델의 층 수를 설정한다.
  • args.vocab_size: 어휘의 크기를 설정한다. 모델이 다룰 수 있는 단어의 수를 나타낸다.
  • args.in_dim: 입력 차원을 설정한다. 모델에 입력되는 데이터의 차원 수를 정의한다.
  • args.out_dim: 출력 차원을 설정한다. 모델의 출력 결과 차원 수를 정의한다.
  • args.num_layers: 모델의 층 수를 설정한다.
  • args.use_attn: 주의(attention) 메커니즘 사용 여부를 설정한다.
  • args.n_attn_heads: 다중 주의 헤드의 수를 설정한다.
  • args.use_bn: 배치 정규화(batch normalization) 사용 여부를 설정한다.
  • args.sc_type: 특정 종류의 손실 함수 또는 모델 유형을 설정한다. 'sc'는 특정 의미를 갖는 값으로 사용된다.
  • args.emb_train: 임베딩 학습 여부를 설정한다.
  • args.train_loop: 훈련 루프 실행 여부를 설정한다.
  • args.train_mr: 특정 모델 훈련 여부를 설정한다.
  • args.train_tpsa: 또 다른 특정 모델 훈련 여부를 설정한다.

옵티마이저를 결정하는 하이퍼파라미터

##### HYPERPARAMETERS #####
args.optim = 'ADAM'
args.lr = 0.001
args.l2_coef = 0.001
args.dp_rate = 0.1
  • args.optim: 사용될 최적화 알고리즘을 설정한다.
  • args.lr: 학습률(learning rate)을 설정한다. 모델의 가중치를 업데이트할 때 얼마나 큰 폭으로 조정할지를 결정한다.
  • args.l2_coef: L2 정규화 계수를 설정한다. 모델의 복잡도를 줄이기 위해 가중치에 대한 패널티를 부여하는 데 사용된다.
  • args.dp_rate: 드롭아웃 비율(dropout rate)을 설정한다. 신경망의 과적합을 방지하기 위해 각 층에서 임의로 노드를 제외하는 비율이다.

학습과 평가를 담당하는 하이퍼파라미터

##### EXP #####
args.epoch = 100
args.batch_size = 512
args.test_batch_size = 512
args.save_every = 100
args.validate_every = 100
args.log_every = 20
  • args.epoch: 전체 데이터셋을 몇 번 학습할지를 설정한다. 100이면 전체 데이터를 100번 반복해 훈련한다.
  • args.batch_size: 훈련 시 한 번에 처리할 데이터 샘플 수를 설정한다. 512이면 512개씩 데이터를 처리한다.
  • args.test_batch_size: 테스트 시 한 번에 처리할 데이터 샘플 수를 설정한다.
  • args.save_every: 모델을 몇 에포크마다 저장할지를 설정한다. 100이면 100 에포크마다 모델을 저장한다.
  • `args.validate_every:` 검증을 몇 에포크마다 수행할지를 설정한다.
  • args.log_every: 로그를 몇 스텝마다 기록할지를 설정한다.

디바이스를 결정하는 하이퍼파라미터

##### DEVICE #####
args.device = 'cuda' if torch.cuda.is_available() else 'cpu'
  • args.device: 모델이 실행될 디바이스를 설정한다. GPU를 사용할 수 있으면 'cuda'로 설정하고, 그렇지 않으면 'cpu'로 설정한다.

실험 결과 관리를 위한 파라미터

##### LOGGING #####
args.log_path = 'runs'
args.model_name = 'exp_test3'
  • args.log_path: 훈련 과정의 로그를 저장할 경로를 설정한다.
  • args.model_name: 저장할 모델의 이름을 설정한다. 나중에 이 이름으로 모델 파일을 저장하거나 불러올 수 있다.

Argparse

  • argparse는 명령줄 인자를 쉽게 처리할 수 있도록 돕는 파이썬 라이브러리다. 사용자는 다양한 옵션과 인자를 정의할 수 있으며, 이를 통해 프로그램 실행 시 입력된 값을 쉽게 가져와 사용할 수 있다.
  • argparse를 사용하면 코드를 보다 직관적이고 사용자 친화적으로 만들 수 있다.
  • argparse의 경우 딕셔너리 같은 객체로 사용가능하다.

→ 딕셔너리로 사용하는 것 보다 argparse를 사용하면 .으로 멤버변수에 접근 가능하다.

import argparse
parser = argparse.ArgumentParser()
args = parser.parse_args("")

print(args)
args.batch_size = 100
print(args)
print(args.batch_size)

args.in_dim = 256
print(args)
print(args.in_dim)
print(args)
args.in_dim = 128
print(args.in_dim)

출력결과:

Namespace()
Namespace(batch_size=100)
100
Namespace(batch_size=100, in_dim=256)
256
Namespace(batch_size=100, in_dim=256)
128

이후에 experiment라는 함수를 정의하여 args를 인자로 전달하면, 이 함수 내에서 모델 학습의 모든 과정을 args 변수에서 가져온 값으로 실행할 수 있다.

💡 vars() 함수는 객체의 __dict__ 속성을 반환하여 해당 객체의 멤버 변수와 그 값을 딕셔너리 형태로 반환한다.

d = vars(args)
print(d)
print(type(d))

실행결과:

{'batch_size': 100, 'in_dim': 128}
<class 'dict'>

Experiment 함수

  • 다음의 기능을 하는 함수를 생성할 수 있다.
    • 모델 생성
    • Loss function 생성
    • Optimizer 생성
    • 학습과 결과 요약
    • 평가 및 결과 요약

정리

  • 하이퍼파리미터의 실제 값이 코드 내부에 있지 않게 하자.
  • argparse를 사용하여 하이퍼파라미터를 쉽게 관리
profile
제 글이 유익하셨다면 ♡와 팔로우로 응원 부탁드립니다.

0개의 댓글

관련 채용 정보