Skip to main content

머신러닝 모델을 디버그하는 여섯 가지 방법

머신러닝 모델을 디버그하는 방법 이 글은 AI로 번역된 기사입니다. 오역이 의심되면 댓글 섹션에 자유롭게 알려 주세요.
Created on September 15|Last edited on September 15
전통적인 소프트웨어 개발에서는 버그가 보통 프로그램의 크래시로 이어집니다. 이는 사용자에게는 성가실 뿐이지만, 개발자에게는 매우 중요합니다. 프로그램이 실패하면 개발자는 오류를 확인해 원인을 파악할 수 있기 때문입니다.

머신러닝 모델에서는 개발자가 때때로 오류를 마주치지만, 너무 자주 프로그램이 명확한 이유 없이 크래시가 나기도 합니다. 이런 문제들은 수동으로 디버깅할 수 있지만, 머신러닝 모델이 실패하는 가장 흔한 이유는 부정확한 출력 예측입니다. 더 나쁜 점은, 모델이 실패했을 때 대개 왜, 언제 실패했는지 알려주는 신호가 거의 없다는 것입니다. 상황을 더욱 복잡하게 만드는 것은 그 원인이 불량한 학습 데이터, 높은 손실 값, 또는 수렴 속도의 부족 등 여러 요인이 복합적으로 작용한 결과일 수 있다는 점입니다.



이 글에서는 이런 조용한 실패를 어떻게 디버그해 머신러닝 알고리즘의 성능에 악영향을 주지 않도록 할지 살펴보겠습니다. 아래는 다룰 내용의 간단한 개요입니다:
  1. 입력 데이터의 결함을 찾는 방법
  2. 적은 데이터로 더 많이 학습시키는 방법
  3. 학습을 위한 데이터 준비와 흔한 함정 피하기
  4. 최적의 모델 하이퍼파라미터를 찾는 방법
  5. 과적합을 줄이기 위한 학습률 스케줄링 방법
  6. Weights & Biases로 학습 진행 상황을 모니터링하는 방법
데이터 사이언스와 머신러닝 실무자로서, 머신러닝 프로젝트가 실패할 수 있는 이유가 매우 많다는 점을 인정해야 합니다. 그 대부분은 엔지니어와 데이터 사이언티스트의 역량과는 무관합니다(작동하지 않는다고 해서 당신이 잘못된 것은 아닙니다). 핵심은 공통적인 함정이나 버그를 일찍, 그리고 자주 식별할 수 있다면 시간과 비용을 모두 절약할 수 있다는 점입니다. 금융, 정부, 헬스케어처럼 높은 위험이 걸린 응용 분야에서는 이는 곧 미션 크리티컬한 과제가 됩니다.

1 - 입력 데이터의 결함을 찾는 방법

좋은 모델을 학습시키기에 우리의 데이터가 충분한지 판단할 때 고려해야 할 두 가지 측면이 있습니다:
  • 데이터가 우리가 예측하려는 것을 예측할 수 있는가?
  • 데이터가 충분한가?
우리 모델에 예측 신호가 담겨 있는지 판단하려면 이렇게 자문해 볼 수 있습니다: 사람이 이 데이터를 보고 예측할 수 있는가?
사람이 이미지나 텍스트를 이해하지 못한다면, 우리 모델도 그것을 제대로 해석하지 못할 가능성이 큽니다. 예측 신호가 충분하지 않다면, 입력을 더 많이 추가해도 모델이 좋아지지 않습니다. 오히려 과적합이 발생해 정확도가 떨어질 것입니다.


데이터에 예측 신호가 충분히 담겼다면, 이제 그 신호를 뽑아낼 모델을 학습시키기에 데이터가 충분한지도 확인해야 합니다. 다음과 같은 몇 가지 경험칙을 따를 수 있습니다:
(1) 분류 문제의 경우, 클래스당 최소 30개의 독립 표본을 확보해야 합니다
(2) 특히 구조화된 데이터 문제에서는 각 특성마다 최소 10개의 샘플을 확보해야 하며, 마지막으로
(3) 데이터셋의 크기는 모델의 파라미터 수에 직접 비례합니다. 이러한 규칙은 사용자의 특정 응용 분야에 맞게 조정할 필요가 있을 수 있습니다. 전이 학습을 활용할 수 있다면 필요한 샘플 수를 크게 줄일 수 있습니다.

2 - 더 적은 데이터로 더 많이 학습시키는 방법

많은 상황에서 우리는 단순히 데이터가 부족합니다. 이 경우 가장 좋은 선택지 중 하나는 데이터를 증강하는 것입니다. 한 단계 더 나아가, 오토인코더나 적대적 생성 네트워크 같은 생성 모델을 사용해 직접 데이터를 생성할 수도 있습니다.
마찬가지로, 인터넷에서 공개된 외부 데이터를 찾아 활용할 수 있습니다. 비록 애초에 우리의 목적을 위해 수집된 데이터가 아니더라도, 재라벨링하거나 전이 학습에 사용할 수 있습니다. 예를 들어, 다른 과제를 위한 대규모 데이터셋으로 모델을 먼저 학습한 뒤, 그 모델을 우리 과제의 기반으로 활용할 수 있습니다. 이와 유사하게, 다른 사람이 다른 과제를 위해 학습해 둔 모델을 찾아 우리 과제에 맞게 재활용할 수도 있습니다.


대부분의 경우 데이터의 양보다 질이 더 중요하다는 점을 기억해야 합니다. 규모는 작더라도 고품질의 데이터셋을 갖추고, 단순한 모델로 학습을 시작하는 것이 학습 초기에 데이터 문제를 발견하는 최선의 방법입니다. 많은 데이터 과학자들이 저지르는 실수는, 큰 데이터셋을 확보하는 데 시간과 비용을 들인 뒤에야 프로젝트에 적합하지 않은 유형의 데이터를 모았다는 사실을 뒤늦게 깨닫는 것입니다.

3 - 학습을 위한 데이터 준비와 흔한 함정 피하기

학습을 위해 데이터 특성을 전처리하는 일반적인 방법은 세 가지가 있습니다:
  • 표준화 모든 데이터의 평균을 0, 표준편차를 1로 맞춥니다. 이는 특징을 스케일링하는 가장 일반적인 방법입니다. 데이터에 이상치가 포함되어 있다고 의심될 때는 특히 더 유용합니다.
  • 최솟값–최댓값 재스케일링 모든 데이터에서 최솟값을 빼고 값의 범위로 나누어, 값을 0에서 1 사이로 스케일링합니다.
  • 평균 정규화 데이터의 평균을 0으로 맞추고 값의 범위를 (-1)에서 1 사이로 유지하도록 합니다. 평균을 빼고 데이터의 범위로 나눕니다.



특징을 어떻게 준비하든, 스케일링 계수와 평균, 표준편차는 반드시 테스트 세트가 아니라 학습 세트에서만 계산해야 합니다. 전체 데이터셋을 대상으로 이러한 값을 계산하면 정보가 노출되어, 알고리즘이 테스트 세트에서 실제 운영 환경보다 더 잘 작동하는 것처럼 보일 수 있습니다.

4 - 최적의 모델 하이퍼파라미터를 찾는 방법

신경망 모델의 하이퍼파라미터를 수동으로 튜닝하는 일은 매우 번거로울 수 있습니다. 하이퍼파라미터 튜닝에는 보편적으로 통용되는 과학적 규칙이 존재하지 않기 때문입니다. 그래서 많은 데이터 과학자들이 경사 기반이 아닌 최적화 알고리즘을 활용한 자동 하이퍼파라미터 검색으로 전환하고 있습니다.
Weights & Biases로 모델의 최적 하이퍼파라미터를 찾는 방법을 알아보기 위해, 다음을 살펴보겠습니다. Mask R-CNN 컴퓨터 비전 모델의 이 예시. 의미론적 분할 작업에 Mask R-CNN을 구현하기 위해, Connor와 Trent 모델의 동작을 좌우하는 다양한 하이퍼파라미터를 조정하다: 학습률, 그래디언트 클리핑 정규화, 모멘텀, 가중치 감쇠, 스케일 비율, 다양한 손실 함수의 가중치… 이들은 서로 다른 하이퍼파라미터로 모델을 학습시켰을 때 이미지의 의미론적 분할이 어떻게 진행되었는지 알고 싶었고, 그래서 이를 통합했습니다 ImageCallback() 클래스 wandb와 동기화하기 위해서입니다. 더 나아가, 그들은 파라미터 스윕을 실행하는 스크립트를 포함했습니다 서로 다른 하이퍼파라미터나 동일 하이퍼파라미터의 다양한 값에 맞게 조정하여 사용할 수 있습니다.



그들의 결과는 다음에서 확인할 수 있습니다 wandb 실행 페이지대체로 그라디언트 클리핑 임계값을 높게 설정하고 학습률을 높게 두면 모델 정확도가 향상되는 경향이 있으며, 반복 횟수가 늘어날수록 검증 손실이 빠르게 감소합니다.

5 - 과적합을 줄이기 위한 학습률 스케줄링 방법

가장 중요한 하이퍼파라미터 중 하나는 최적화하기 어려운 학습률입니다. 학습률이 너무 작으면 학습이 느려지고, 너무 크면 모델이 과적합되기 쉽습니다.
적절한 학습률을 찾을 때는 일반적인 하이퍼파라미터 탐색 기법이 최선의 선택이 아닙니다. 학습률의 경우, 서로 다른 학습률에 대한 손실을 시각화하는 선형 탐색(line search)을 수행하는 편이 손실 함수의 거동을 이해하는 데 더 유리합니다. 선형 탐색을 할 때는 학습률을 지수적으로 증가시키는 것이 좋습니다. 일반적으로 매우 큰 학습률보다 더 작은 학습률 구간이 더 중요합니다.


초기에는 모델이 최적 해에서 멀리 떨어져 있을 수 있으므로 가능한 한 빠르게 이동하고자 합니다. 그러나 최소 손실에 가까워질수록 과도하게 넘어가는 것을 피하기 위해 더 천천히 이동해야 합니다. 널리 쓰이는 방법은 학습률을 시간에 따라 서서히 낮추는 방식(어닐링)으로, 비교적 높은 학습률로 시작한 뒤 학습이 진행되면서 점진적으로 학습률을 낮추는 것을 권장합니다. 그 직관은 초기 파라미터에서 충분히 괜찮은 파라미터 값의 범위로 빠르게 이동한 다음, 그 범위 안에서 더 정교하게 탐색하려는 것입니다.손실 함수의 더 깊지만 더 좁은 영역.” 가장 널리 사용되는 학습률 어닐링 방식은 스텝 감쇠로, 정해진 학습 에폭 수마다 학습률을 일정 비율만큼 낮추는 방법입니다. 더 일반적으로는, 미리 정한 규칙에 따라 학습 중에 학습률을 갱신하는 학습률 스케줄을 정의해야 합니다.


6 - Weights & Biases로 학습 진행 상황 모니터링하는 방법

모델을 디버깅할 때 중요한 부분은 모델 학습에 많은 시간을 쏟기 전에 문제가 발생했음을 알아차리는 것입니다. Weights & Biases는 머신러닝 실험을 시각화하고 추적할 수 있는 매끄러운 방법을 제공합니다. 자세한 내용은 다음에서 설명하듯이 이 GitHub 저장소, 학습 실행을 검색·비교·시각화하고, 실행과 함께 시스템 사용 지표를 분석하며, 과거 결과를 복제하는 등 다양한 작업을 수행할 수 있습니다.
wandb를 설치한 뒤에는 학습 스크립트에 다음 코드를 포함하기만 하면 됩니다.
import wandb
# Your custom arguments defined here
args = ...
wandb.init(config=args, project="my-project")
wandb.config["more"] = "custom"
def training_loop():
while True:
# Do some machine learning
epoch, loss, val_loss = ...
# Framework agnostic / custom metrics
wandb.log({"epoch": epoch, "loss": loss, "val_loss": val_loss})

또는 우리는 TensorBoard와 연동하기 한 줄로:
wandb.init(sync_tensorboard=True)


TensorBoard는 브라우저에서 모델을 쉽게 모니터링할 수 있게 해 주는 TensorFlow 확장 도구입니다. 모델의 진행 과정을 확인할 수 있는 인터페이스를 제공하기 위해, TensorBoard는 디버깅에 유용한 몇 가지 옵션도 제공합니다. 예를 들어, 학습 중에 모델의 가중치와 그래디언트 분포를 관찰할 수 있습니다. 모델을 깊이 파고들고 싶다면, TensorBoard는 시각적 디버거를 제공합니다. 이 디버거에서는 TensorFlow 모델의 실행을 단계별로 따라가며 내부의 모든 값을 검사할 수 있습니다. 이는 변분 오토인코더처럼 복잡한 모델을 다루면서 왜 복잡한 구성 요소가 실패하는지 이해하려고 할 때 특히 유용합니다.


결론

이제 실제 머신러닝 프로젝트를 수행하는 데 도움이 되는 도구가 상당히 많이 갖춰졌습니다. 배포 전에 모델이 제대로 작동하는지 확인하는 것은 매우 중요하며, 이를 소홀히 하면 큰 비용이 들 수 있습니다. 이 글이 모델을 견고하고 일반화 가능하며 디버깅하기 쉽게 만드는 실용적인 기법들을 익히는 데 도움이 되길 바랍니다.





이 기사는 AI 번역본입니다. 잘못 번역된 부분이 있으면 댓글로 알려 주세요. 원문 보고서는 아래 링크에서 확인하실 수 있습니다: 원문 보고서 보기