Skip to main content

최적의 모델을 선택하기 위한 하이퍼파라미터 스윕 실행

스윕을 사용해 하이퍼파라미터 공간을 탐색하고 최적 모델 찾기 이 문서는 AI 번역본입니다. 오역이 의심되는 부분이 있으면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
하이퍼파라미터는 머신러닝 모델의 성능을 좌우하는 핵심 요소입니다. 이 글에서는 하이퍼파라미터 공간을 탐색하여 최적의 모델을 찾는 방법에 대해 이야기합니다. 스윕 Weights & Biases에서.
일부 사람들은 파라미터와 하이퍼파라미터를 혼용해서 사용합니다. 시작하기 전에, 두 개념의 차이를 명확히 짚고 넘어가겠습니다:
  • 파라미터는 개발자가 명시적으로 지정하지 않습니다. 대신 머신러닝 모델이 추정하고 학습합니다. 신경망에서 가장 미세한 수준의 파라미터는 가중치와 바이어스입니다.
  • 하이퍼파라미터는 개발자가 명시적으로 지정합니다. 신경망에서 하이퍼파라미터의 예로는 에폭 수, 배치 크기, 레이어 수, 각 레이어의 노드 수 등이 있습니다.

병렬 좌표 플롯: 고정된 하이퍼파라미터 집합에서 다수의 실행 성능 시각화

머신러닝 모델의 성능 대부분은 하이퍼파라미터에 의해 좌우됩니다. 예를 들어, 데이터셋이 큰데도 에폭 수를 적게 설정해 신경망을 학습하면 데이터에 언더피팅될 가능성이 큽니다. 그러면 다음과 같은 질문을 던지게 됩니다:
  • 이상적인 에폭 수는 얼마여야 할까요?
  • 배치 크기는 얼마로 설정해야 할까요?
  • 네트워크에는 몇 개의 레이어를 두어야 할까요?
  • 한 레이어에는 노드를 몇 개 두어야 할까요?
이 모든 질문은 결국 다음으로 이어집니다. 주어진 데이터셋에 어떤 모델 아키텍처를 사용해야 할까요?
Google 연구진은 이 문제를 그들의 기념비적 연구에서 다룹니다 신경 아키텍처 검색 (NAS)이지만, 한 가지 뚜렷한 문제가 있습니다. NAS는 확장성이 떨어집니다. NAS는 계산 비용이 매우 크고, 많은 조직은 이를 지원할 만큼의 자원 여유가 없습니다.
그러나 이를 우회할 방법들이 있습니다:
  • 이상적인 값에 충분히 가까운 에포크 수를 지정하세요.
  • 에포크 수를 달리하여 여러 신경망을 학습한 뒤 결론을 도출하세요
첫 번째 방법은 상당한 의도적 연습이 필요하며, 기대한 결과는 물론 정확한 결과조차도 항상 보장하지 않습니다. 그래서 오늘날에는 두 번째 방법이 널리 사용됩니다. 머신러닝 문헌에서는 최적의 모델을 선택하기 위해 다양한 하이퍼파라미터 값을 실험하는 과정을 하이퍼파라미터 튜닝이라고 합니다. 다음은 하이퍼파라미터 튜닝에서 매우 널리 사용되는 방법들입니다:
  • 그리드 서치
  • 랜덤 서치
  • 베이지안 최적화
  • 하이퍼밴드
이제 하이퍼파라미터 스윕으로 넘어가 보겠습니다. 이는 주어진 데이터셋에 대해 올바른 모델을 효율적으로 선택하는 방법입니다. Weights & Biases (wandb).

하이퍼파라미터 스윕이란 무엇인가요?

하이퍼파라미터 스윕은 특정 데이터셋에 대해 머신러닝 모델의 성능을 최적으로 만드는 하이퍼파라미터 값 조합을 자동으로, 그리고 효율적으로 찾는 방법을 제공합니다.
하이퍼파라미터 검색은 간단한 작업이 아닙니다. 머신러닝 모델의 모든 하이퍼파라미터가 튜닝의 우선순위 면에서 동일하게 중요하지 않기 때문입니다. 조시 토빈, 그의 심층 신경망 문제 해결 프레젠테이션에서 그는 일반적인 신경망의 하이퍼파라미터와 그 우선순위를 보기 좋게 정리했습니다:

신경망 아키텍처의 일반적인 하이퍼파라미터 - 원문
하이퍼파라미터 스윕은 검색 과정을 매우 정교하게 구성하여 다음을 가능하게 합니다:
  • 다음을 사용하여 하이퍼파라미터 검색 설정하기 선언형 구성
  • 그리드 검색, 랜덤 검색, 베이즈 최적화 등을 포함한 다양한 하이퍼파라미터 튜닝 방법을 실험해 보세요 하이퍼밴드

Weights & Biases를 사용한 하이퍼파라미터 스윕 실행

Weights & Biases는 하이퍼파라미터 스윕을 매우 쉽게 실행할 수 있게 해줍니다. 시작하려면 모델 학습 스크립트(곧 자세히 설명)와 데이터셋이 필요합니다. 이를 사용할 수 있습니다 Colab 노트북 코드를 직접 다루지 않고 따라가고 싶다면 그렇게 해도 됩니다. 보다 적극적으로 참여하고 싶다면 wandb를 설정하세요. 아직 설정하지 않았다면 반드시 확인하세요. 이것 완료합니다. 또한 사용할 것입니다 텐서플로 2.0, 특히 상위 수준의 Keras API.
시작해 보겠습니다. 먼저 FashionMNIST Keras에 함께 제공되는 데이터셋.
데이터셋을 로드합니다
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) =
fashion_mnist.load_data()
# Scale the pixel values of the images
train_images = train_images / 255.0
test_images = test_images / 255.0
# Select the hyperparameters you want to tune. This is specified like the
following:
sweep_config = {
'method': 'grid',
'parameters': {
'layers': {
'values': [32, 64, 96, 128, 256]
}
}
}

여기서 method는 사용하려는 하이퍼파라미터 튜닝 방법이며, parameters는 튜닝할 하이퍼파라미터를 담은 딕셔너리입니다.
# 다음으로, 다음 명령을 실행하여 이 스윕을 초기화합니다:
sweep_id = wandb.sweep(sweep_config)
이 명령을 실행하면 브라우저에서 확인하고 스윕 실행을 추적할 수 있는 스윕 링크가 표시됩니다.
스윕을 초기화했다면 이제 에이전트가 필요합니다. 에이전트는 스윕 구성과 연결해 사용할 수 있는 모델 학습 스크립트입니다. 간단한 학습 스크립트를 정의해 보겠습니다:
def train():
# Initialize wandb with a sample project name
wandb.init(project="hyperparameter-sweeps-partI")
(X_train, y_train) = train_images, train_labels
(X_test, y_test) = test_images, test_labels
# Specify the hyperparameter to be tuned along with
# an initial value
configs = {
'layers': 128
}
# Specify the other hyperparameters to the configuration
config = wandb.config
config.epochs = 5
# Define the model
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(wandb.config.layers, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
# Compile the model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Train the model
model.fit(X_train, y_train, epochs=config.epochs,
validation_data=(X_test, y_test),
callbacks=[WandbCallback(data_type="image", labels=labels)])
다음을 호출하는 것은 매우 중요합니다 wandb.init() 훈련 스크립트의 시작 부분에서 호출해야 합니다. 그렇지 않으면 하이퍼파라미터 스윕의 각 실행이 지정된 출력값을 여러분의 로그로 기록할 수 없습니다. wandb 대시보드.
보시다시피 우리는 얕은 완전연결 신경망을 학습하려고 합니다. 이 네트워크는 5 에포크 동안 학습하도록 설정되어 있으며, Adam 옵티마이저 (최소화하도록 설정된 스파스 카테고리 크로스엔트로피 손실(클래스 레이블이 정수인 경우). 이 방법은 다음을 기반으로 합니다 예시.
모델 학습 스크립트를 준비했다면, 이제 에이전트로 실행하여 하이퍼파라미터 스윕을 시작할 수 있습니다.
wandb.agent(sweep_id, function=train)
이제 끝입니다! 노트북에서 다음과 같은 화면이 보일 거예요:



위에서 설명한 세 번째 단계에서 얻은 스윕 URL을 클릭하면, 여러 가지 흥미로운 내용을 확인할 수 있습니다.
먼저, 서로 다른 실행(예: 레이어 구성이 다른 네트워크의 성능)을 모두 요약해 보여주는 대시보드가 다음과 같이 표시됩니다:

각 실행에는 고유한 ID가 있습니다(왼쪽).
  • 이제 왼쪽에서 아무 실행이나 클릭하면, 해당 실행의 네트워크 성능을 개별적으로 확인할 수 있습니다:


각 실행에는 네트워크 성능 세부정보와 함께 다음 항목들도 제공됩니다:
  • 네트워크 아키텍처
  • .h5 형식으로 직렬화한 네트워크 버전
  • 대역폭 사용량, CPU/GPU 사용량, 메모리 사용량
원하는 실행을 클릭하기만 하면, 화면에서 다음 버튼들을 사용할 수 있습니다
왼쪽:

스윕에서 최적의 모델을 고를 때는 검증 손실과 학습 손실 사이의 균형에 집중합니다. 즉, 학습 손실 대비 검증 손실이 계속 감소한 실행(run)을 찾습니다. 아래 표가 이 과정을 진행하는 데 큰 도움이 됩니다.

Weights & Biases 프로젝트 페이지에서 (여기에 예시)에서 'option+space'를 눌러 실행 테이블을 확장하고 모든 결과를 비교할 수 있습니다. 여기에서 검증 정확도(또는 검증 손실) 기준으로 정렬해 가장 성능이 좋은 모델을 찾으세요. 또한 평행 좌표 플롯을 추가해 스윕 결과를 탐색할 수도 있습니다.



평행 좌표 차트 추가 방법


1단계: 프로젝트 페이지에서 ‘Add visualization’을 클릭하세요.



2단계: 평행 좌표 플롯을 선택하세요.




3단계: 시각화할 차원(하이퍼파라미터)을 선택하세요. 이상적으로는 마지막 열을 최적화 대상 지표(예: 검증 손실)로 설정하는 것이 좋습니다.


4단계: 완성! 평행 좌표 플롯이 생성되었습니다!


예를 들어 이 플롯에서는 학습률이 낮고 합성곱 레이어의 채널 수가 많을수록 검증 정확도가 더 좋아지는 것을 확인할 수 있습니다. 평행 좌표 플롯은 하이퍼파라미터 값과 최적화 지표를 비교하면서 추세를 빠르게 파악하는 데 매우 유용합니다. 이를 통해 하이퍼파라미터 공간을 좁혀 더 빠르게 더 높은 정확도에 도달할 수 있습니다.

최적의 모델을 선택하는 방법을 더 알고 싶다면 다음 글들을 확인하세요:

결론

이제 스윕 사용법을 이해하셨으니, 여러 하이퍼파라미터를 함께 사용하는 스윕을 시도해 보세요. 이 튜토리얼에서는 layers 하이퍼파라미터만 튜닝했지만, batch_size, epochs, optimizer 등도 함께 튜닝해 볼 수 있습니다.
이 튜토리얼을 재미있게 읽으셨길 바랍니다. 다음 편에서는 더 발전된 하이퍼파라미터 스윕과 실전에 유용한 활용 팁을 깊이 있게 다룰 예정이니 기대해 주세요.

이 글은 AI로 번역된 기사입니다. 오역이 있을 수 있으니 댓글로 알려 주세요. 원문 보고서는 다음 링크에서 확인하실 수 있습니다: 원문 보고서 보기