원하는 결과를 얻기 위한 방법은 대표적으로 아래와 같다.
모델자체를 바꾸기
데이터를 추가하기
Hyperparameter Tuning
모델자체를 바꾸는 것이 가장 지대한 영향을 주지만 최근에는 좋은 모델이란 것이 일반화 되어 있기 때문에 데이터를 추가하는게 더 좋은 성능을 내기 쉽다. 그 다음이 Hyperparameter Tuning이 된다.
모델 스스로 학습하지 않는 값은 사람이 지정한다. (Learning Rate, 모델의 크기, optimizer 등)
하이퍼파라미터에 의해서 값이 크게 좌우 될 때도 있었지만 최근에는 큰 기대를 하지 않는편이다.
마지막 0.01이라도 성능을 높이기 위한 작업이라고 이해할 수 있다.
가장 기본적인 방법은 grid, random이 있다.
최근에는 베이지안 기반 기법들이 주도한다.(BOHB)
multi-node multi processing 지원 모듈(node:컴퓨터)
ML/DL의 병렬 처리를 위해 개발된 모듈
기본적으로 현재의 분산병렬 ML/DL 모듈의 표준
Hyperparameter Search를 위한 다양한 모듈 제공
pip install ray
data_dir = os.path.abspath("./data")
load_data(data_dir)
# search space 지정
config = {
"l1": tune.sample_from(lambda. _:2**np.random.randint(2,9)),
"l2": tune.sample_from(lambda. _:2**np.random.randint(2,9)),
# grid라는 것을 알 수 있음
"lr": tune.loguniform(1e-4, 1e-1),
"batch_size": tune.choice([2, 4, 8, 16])
}
# 학습 스케줄링 알고리즘 지정
scheduler = ASHAScheduler(
metric="loss", mode="min", max_t=max_num_epochs, grace_period=1, reduction_factor=2)
reporter = CLIReporter(
metric_columns=["loss", "accuracy", "training_iteration"])
# 결과 출력 양식
result = tune.run(
partial(train_cifar, data_dir=data_dir),
resources_per_trial={"cpu":2, "gpu":gpus_per_trial},
config=config, num_samplers=num_samplers,
scheduler=scheduler,
progress_reporter=reporter)
ray
를 사용할때는 모든 코드가 하나의 함수형태로 구성되어야 한다.