Amazon Web Services 한국 블로그

Amazon SageMaker 자동 모델 튜닝을 활용한 ResNet 모델 훈련하기

Amazon SageMaker에서 우리가 사용하는 기계 학습 모델의 하이퍼파라미터(Hyper-Parameter) 값을 자동으로 튜닝하여 보다 정확한 예측을 생성하는 기능이 최근에 출시되었습니다. 하이퍼파라미터는 모델 훈련 중에 알고리즘의 동작을 설명하는 사용자 정의 설정입니다. 예를 들어, 의사 결정 트리의 규모, 세그먼트에서 원하는 클러스터의 수 또는 데이터를 반복할 때 인공신경망 가중치의 증분 업데이트 단위 등이 포함됩니다.

하이퍼파라미터 값은 최종 정확도 및 성능에 엄청난 영향을 미치므로 기계 학습 모델에 적합한 하이퍼파라미터 값을 선택하는 것이 중요합니다. 그러나, 하이퍼파라미터 값을 설정하는 프로세스는 쉽지 않고, 여러번 수동으로 작업을 해야 합니다. 특히, 일부 알고리즘에는 조정이 가능한 서로 다른 하이퍼파라미터가 많습니다. 일부 값은 다른 하이퍼파라미터보다 값을 선택하기가 더 까다롭습니다. 대부분의 경우, 모델의 적합성과 하이퍼파라미터 값은 비선형 관계에 있기때문입니다.

하이퍼파라미터 값을 선택할 때는 다양한 전략을 사용할 수 있습니다.  예를 들어, 모델 개발자가 가진 도메인 지식, 추론, 직관 또는 수동 실험을 사용합니다. 어떤 분들은 무차별 대입 검색을 사용합니다. 또는, 우수한 성능의 하이퍼파라미터 값을 예측하는 메타 모델을 구축합니다. 이 접근 방식에 대한 자세한 내용은 Shahriari et al. (2016)을 참조하십시오. 어떤 방법을 사용하든 하이퍼파라미터 값을 선택할 때는 새로운 기계 학습 문제 해결에 집중할 수 있도록 하는 전문 기술 세트가 필요합니다.

Amazon SageMaker의 자동 모델 튜닝을 사용하면 이 작업이 훨씬 쉬워집니다. 이 기능은 Gaussian Process 회귀를 사용하여 적합성을 개선하는 데 가장 효과적인 하이퍼파라미터를 예측합니다. 또한, Bayesian 최적화를 사용하여 하이퍼파라미터 공간을 탐색하고 적절한 경우 특정 하이퍼파라미터 값을 활용하는 작업을 균형 있게 수행합니다. 중요한 점은 자동 모델 튜닝을 Amazon SageMaker의 기본 제공 알고리즘, 사전 구축된 딥 러닝 프레임워크 및 사용자가 보유한 알고리즘 컨테이너와 함께 사용할 수 있다는 것입니다.

이 블로그 게시물에서는 Amazon SageMaker 안에서 하이퍼파라미터 튜닝을 수행하는 방법을 소개하고, 자동 모델 튜닝과 임의 검색이라는 두 가지 방법을 비교합니다. 어리석게 들릴 수 있지만, 하이퍼파라미터 값을 임의로 선택하는 것이 첨단 방법을 사용하는 것보다 나을 때가 종종 있으며 최종 적합성 및 여기에 도달하는 데 필요한 작업 수를 설정하는 데 유용한 기준으로 활용될 수 있습니다.

문제 개요

이 게시물에서는 전반적인 접근 방식을 안내합니다. 자세한 내용과 모든 단계별 안내는 해당하는 예제 노트를 참조하십시오.

여기서 사용하는 데이터 세트는 일반 컴퓨터 비전 벤치마크인 CIFAR-10 이미지 데이터 세트입니다. 이 데이터 세트는 10개 클래스에 고르게 분산된 60K 32×32픽셀 색상 이미지(50K 훈련, 10K 테스트)로 구성됩니다. 크기가 작기 때문에 빠르게 다운로드하고 단일 인스턴스에서 훈련할 수 있습니다. 그러나 이 작업은 접근 방식에 따라 차이가 확연히 드러날 정도로 어렵습니다.

우리는 Amazon SageMaker – MXNet 컨테이너를 사용하여 ResNet-34 나선형 이미지 분류 인공신경망을 훈련할 것입니다. 네트워크 가중치는 확률적 기울기 강하를 사용하여 찾습니다. 단일 ml.p3.8xlarge 인스턴스에서 모든 작업 실행에 대해 epochs를 50으로 고정하고 미니 배치 크기를 1,024로 고정합니다. 목표는 홀드아웃 분류 정확성이 하이퍼파라미터 튜닝을 통해 얼마나 개선될 수 있는지 보고 각 튜닝 방법의 성능을 확인하는 것입니다.

참고로 이 예제를 처음부터 끝까지 실행하려면 약 400 USD의 비용이 발생합니다.  (유의하시기 바랍니다.)

모델 훈련

처음에는 간단하게 기본 하이퍼파라미터 값을 사용하여 모델을 한 번 훈련합니다. SGD(확률적 기울기 강하)를 사용하여 CNN(나선형 인공신경망)을 훈련합니다. SGD는 훈련 손실을 개선하는 방향으로 네트워크 가중치를 변경하여 훈련 손실을 최소화하는 반복적인 방법입니다. SGD는 이 방향으로 가중치를 조금씩 업데이트하고 반복합니다. 여기서 중요한 하이퍼파라미터는 다음 세 가지입니다.

  • learning_rate: 가중치에 적용하는 업데이트의 크기를 제어합니다.
  • momentum: 이전 업데이트의 방향에서 도출된 정보를 사용하여 현재 업데이트에 필요한 정보를 제공합니다. 기본값인 0은 가중치 업데이트에 현재 배치의 정보만 사용됨을 의미합니다.
  • wd: 가중치가 너무 커질 경우 벌점을 적용합니다. 기본값인 0은 벌점이 없음을 의미합니다.

Amazon SageMaker에서 훈련 작업을 시작하려면 MXNet 추정기를 생성하고 다음과 같은 정보를 전달해야 합니다.

  • 훈련 스크립트(cifar10.py은 모델 정의 및 훈련에 사용되는 표준 MXNet Gluon 코드임)
  • IAM 역할
  • 하드웨어 설정
  • 하이퍼파라미터(MXNet에서 SGD의 기본값)
from sagemaker.mxnet import MXNet

m = MXNet('cifar10.py', 
          role=role, 
          train_instance_count=1, 
          train_instance_type='ml.p3.8xlarge',
          hyperparameters={'batch_size': 1024, 
                           'epochs': 50, 
                           'learning_rate': 0.01, 
                           'momentum': 0.,
                           'wd': 0.})
m.fit('s3://sagemaker-<region>-<account>/data/DEMO-gluon-cifar10')

이 훈련 작업의 로그를 보면 기본 하이퍼파라미터 값을 사용할 경우 검증 데이터 세트에서 얻을 수 있는 정확도는 약 53%에 불과하다는 것을 알 수 있습니다. CIFAR-10은 어려울 수 있지만 절반보다는 높은 수준으로 정확도를 개선해야 합니다.

임의 검색

절차가 간단한 데 비해 놀라울 정도로 우수한 성능을 제공하는 하이퍼파라미터 튜닝 방법 중 하나는 독립적인 훈련 작업 세트에 세트 범위 내의 다양한 임의 하이퍼파라미터 값을 시도해 보는 것입니다. 여기에서는 random_tuner.py 도우미 스크립트를 생성해 이 작업을 수행합니다. 소스 코드에서 세부 정보를 검토해도 되지만 본질적으로는 다음을 제공해야 합니다.

  • 작업 이름과 하이퍼파라미터 목록이 지정된 MXNet 모델을 훈련하는 함수. 여러 작업을 한 번에 훈련할 수 있도록 waitfit() 호출에서 false로 설정됩니다.
    def fit_random(job_name, hyperparameters):
        m = MXNet('cifar10.py', 
                  role=role, 
                  train_instance_count=1, 
                  train_instance_type='ml.p3.8xlarge',
                  hyperparameters=hyperparameters)
        m.fit(inputs, wait=False, job_name=job_name)
    
  • 세 가지 유형(ContinuousParameter, IntegerParameter 또는 CategoricalParameter) 중 하나로 튜닝할 하이퍼파라미터를 정의하고 적절한 최소 및 최대 범위 또는 가능한 값 목록을 제공하는 하이퍼파라미터 사전.
    import random_tuner as rt
    
    hyperparameters = {'batch_size': 1024,
                       'epochs': 50,
                       'learning_rate': rt.ContinuousParameter(0.001, 0.5),
                       'momentum': rt.ContinuousParameter(0., 0.99),
                       'wd': rt.ContinuousParameter(0., 0.001)}
    

다음으로 임의 검색을 시작할 수 있습니다. 훈련 작업의 총 수를 120으로 정의하고 최대 8개 작업을 동시에 실행하도록 정의합니다. 이론적으로는 120개 작업 모두를 성능 저하 없이 한 번에 실행할 수 있습니다. 그러나 이만큼 많은 작업을 한 번에 시작할 경우 몇 가지 위험이 있습니다. 코드를 한 번에 성공적으로 테스트한다 하더라도 다양한 하이퍼파라미터 값에 의해 시스템 리소스가 소진되거나 다른 이유로 치명적인 오류가 발생할 수 있습니다. 하이퍼파라미터 공간의 대부분에서 이러한 문제가 발생할 경우 많은 수의 실패한 작업에 대한 요금을 지불해야 할 수 있습니다. 8개 작업을 실행하는 것도 용감한 일이지만 작업을 추적하고 필요한 경우 도중에 검색을 중지할 수 있습니다.

jobs = rt.random_search(fit_random,
                        hyperparameters,
                        max_jobs=120,
                        max_parallel_jobs=8)

최고 성능 및 최저 성능을 보인 작업을 요약하면 정확도에 큰 차이가 있다는 것을 알 수 있습니다. 처음에 모르고 학습 속도를 0.5, 가속도를 0.15, 가중치 감소를 0.0004로 설정했다면 겨우 20%를 웃도는 정확도를 얻었을 것입니다(이미지 클래스의 정확도를 10%로 임의 추정). 하지만 다수의 성공적인 하이퍼파라미터 값 조합을 찾았고 피크 검증 정확도는 73.7%에 달했습니다.


자동 모델 튜닝

이제 Amazon SageMaker의 자동 모델 튜닝을 임의 검색과 비교해 보도록 하겠습니다. Amazon SageMaker Python SDK에서 기본 제공되는 튜너 기능을 사용합니다. 새로운 MXNet 추정기를 정의합니다(사전 정의된 batch_sizeepochs를 지정하고, 튜닝하려는 하이퍼파라미터는 그대로 유지).

mt = MXNet('cifar10.py', 
           role=role, 
           train_instance_count=1, 
           train_instance_type='ml.p3.8xlarge',
           hyperparameters={'batch_size': 1024, 
                            'epochs': 50})

다음으로 튜닝할 하이퍼파라미터의 범위를 정의합니다.

from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter

hyperparameter_ranges = {'learning_rate': ContinuousParameter(0.001, 0.5),
                         'momentum': ContinuousParameter(0., 0.99),
                         'wd': ContinuousParameter(0., 0.001)}

마지막으로 목표 지표를 정의하고 Amazon CloudWatch Logs의 훈련 작업 로그에서 지표를 가져오는 데 필요한 정규식을 제공합니다.

objective_metric_name = 'Validation-accuracy'
metric_definitions = [{'Name': 'Validation-accuracy',
                       'Regex': 'validation: accuracy=([0-9\\.]+)'}]

이러한 항목을 HyperparameterTuner 클래스에 전달하고 이 클래스에서 .fit()를 실행합니다. 그러면 30개의 훈련 작업이 한 번에 2개씩 제출되고 Amazon SageMaker가 백그라운드에서 오케스트레이션 및 실행을 수행합니다. 여기서는 전체 훈련 작업에 임의 검색과 동일한 15x 속도를 사용하여 작업을 동시에 실행했습니다. 그렇다면 두 방법의 완료 시간이 거의 같아야 합니다. 자동 모델 튜닝은 이전 작업의 실행 성능을 사용하여 이후 하이퍼파라미터 값에 정보를 제공하므로 한 번에 실행하는 작업의 수를 줄이면 실제로 모델 적합성이 개선될 수 있습니다.

from sagemaker.tuner import HyperparameterTuner

tuner = HyperparameterTuner(mt,
                            objective_metric_name,
                            hyperparameter_ranges,
                            metric_definitions,
                            max_jobs=30,
                            max_parallel_jobs=2)

tuner.fit('s3://sagemaker-<region>-<account>/data/DEMO-gluon-cifar10')

결과를 보면 전체 훈련 작업의 1/4에서 Amazon SageMaker 자동 모델 튜닝이 임의 검색보다 정확도가 더 높은 모델(74%)을 생성한 것을 알 수 있습니다. 후속 실행에서는 두 방법의 전반적인 최고 정확도가 조금 달라질 수 있지만 이 평가에서 “더 높은 정확도와 더 적은 실행 수”라는 전반적인 메시지는 달라지지 않았습니다.


마무리

이 블로그 게시물은 하이퍼파라미터 튜닝의 중요성을 보여줍니다. 사용자는 이 기술을 사용하여 전반적인 모델 성능을 개선할 수 있습니다. 또한 Amazon SageMaker의 자동 모델 튜닝 같은 효율적인 방법을 튜닝에 사용할 수 있습니다.

다양한 방법으로 이 게시물에서 살펴본 결과를 기반으로 구축하거나 결과를 확장할 수 있습니다. AWS는 사용이 간단하고 기존 예제와 일치하는 인공신경망 코드를 제공하기 위해 노력합니다.  그러나 ResNet의 이후 버전으로 이동하거나 다른 아키텍처를 시도할 경우 정확도가 더욱 개선될 수 있습니다.  또한 그리드 검색 같은 다른 튜닝 방법을 테스트할 수 있습니다. 그리드 검색은 개념화가 쉽고 하이퍼파라미터 공간에 대한 직관을 제공한다는 점에서 중요한 기술이지만 임의 검색보다 효과가 없을 수 있습니다(Bergstra 및 Bengio, 2012). 추가 하이퍼파라미터의 튜닝을 시도할 수도 있고, 첫 번째 하이퍼파라미터 튜닝을 사용하여 범위를 좁힌 두 번째 튜닝에 필요한 정보를 제공할 수도 있습니다. Amazon SageMaker의 자동 모델 튜닝은 기본 제공 알고리즘, 딥 러닝 프레임워크 및 사용자가 보유한 기존 Amazon SageMaker 컨테이너 알고리즘에서 작동하므로 훈련 중인 모든 모델에 바로 적용해 볼 수 있습니다.

Amazon SageMaker의 자동 모델 튜닝에 대한 자세한 내용은 이 게시물의 해당하는 Jupyter 노트북, 기타 예제 노트설명서를 참조하십시오.

이 글은 AWS Machine Learning 블로그의 Amazon SageMaker automatic model tuning produces better models, faster의 한국어 번역입니다.