12장 - ML 모델 디버깅과 오류 분석

🏷️ "cs229" "machine-learning" "book"

12장. ML 모델 디버깅과 오류 분석

지난 몇 주 동안 여러분은 선형 회귀, 로지스틱 회귀, SVM, 랜덤 포레스트, 신경망 등 다양한 학습 알고리즘의 작동 원리를 배웠다. 오늘은 이 모든 것을 실제 응용 문제에 효율적으로 적용하기 위한 원칙을 공유하겠다. — Andrew Ng

12-cs229-debugging.png

12.1 왜 디버깅 전략이 필요한가

머신러닝 알고리즘을 처음 구현하면 거의 언제나 제대로 작동하지 않는다. Andrew Ng는 약 1년 전 노트북에서 소프트맥스 회귀를 구현했는데 첫 시도에 바로 작동한 적이 있다고 회상한다. 그 놀라움이 1년이 지난 후에도 기억날 만큼, 학습 알고리즘이 처음부터 제대로 작동하는 일은 극히 드물다. 따라서 머신러닝 개발의 핵심 워크플로는 사실상 디버깅 워크플로다.

오랫동안 머신러닝은 "블랙 매직"이나 "부족의 지식"에 의존하는 분야였다. 30년 경력의 전문가에게 "알고리즘이 작동하지 않는다"고 물으면, 그들은 직감으로 "데이터를 더 모아라" 혹은 "은닉 유닛을 키워라"라고 조언했고, 묘하게도 그것이 맞았다. 이번 장의 목표는 그러한 직관을 체계적인 엔지니어링 프로세스로 전환하여, 여러분 스스로 올바른 판단을 내릴 수 있게 하는 것이다.

이 장의 내용은 대부분 새로운 머신러닝 연구를 개발하기 위한 최선의 접근법이 아니라, 실제로 작동하는 시스템을 구축하는 데 초점을 맞추고 있다. 연구 논문 작성이 목표라면 일부는 적용되고 일부는 적용되지 않을 수 있다.

오늘 다룰 세 가지 핵심 아이디어는 다음과 같다.

  1. 학습 알고리즘 디버깅을 위한 진단법 (편향-분산 분석, 최적화 알고리즘 vs 목적 함수 진단)
  2. 오류 분석과 절제 분석 (무엇이 작동하지 않는지, 무엇이 작동하는지 이해하기)
  3. 머신러닝 프로젝트를 시작하는 철학

12.2 동기 부여 예제: 스팸 분류기

스팸 방지 분류기를 만들고 있다고 가정하자. 스팸과 관련이 높을 것으로 판단한 100개의 단어를 특성으로 신중하게 선택하고, 정규화된 로지스틱 회귀(베이지안 로지스틱 회귀)를 구현했다.

\[J(\theta) = \text{로그 우도} - \lambda \|\theta\|^2\]

첫 번째 항은 최대 우도 항이고, 두 번째 항은 정규화 항이다. 그런데 이 분류기가 **테스트 오류 20%**를 기록한다면, 이는 스팸 필터로서 도저히 수용할 수 없는 수준이다. 다섯 통 중 한 통을 잘못 분류하는 셈이기 때문이다.

무엇을 시도할 것인가?

많은 팀은 다음 중 하나를 무작위로 선택하여 며칠에서 몇 주를 투자한다.

시도

설명

훈련 데이터 추가 수집

"빅 데이터가 항상 좋다"는 믿음

더 작은 특성 집합 사용

100개 중 불필요한 특성 제거

더 큰 특성 집합 사용

100개로는 부족하다는 판단

이메일 헤더 특성 추가

본문 외에 라우팅 정보 등 활용

경사 하강법 반복 횟수 증가

더 오래 훈련하면 나아질 수 있다

뉴턴 방법으로 전환

다른 최적화 알고리즘 시도

\(\lambda\) 값 변경

정규화 강도 조정

완전히 다른 알고리즘(SVM, 신경망) 시도

근본적인 접근법 변경

가장 의견이 강한 사람이 이 중 하나를 골라 팀 전체가 매달리는 경우가 흔하다. 하지만 체계적으로 분석하지 않으면 어떤 선택이 최선인지 알 수 없다. 선택지를 나열하고 각각을 평가하는 것만으로도 이미 많은 팀보다 앞서 나갈 수 있다.


12.3 편향 vs 분산 진단

편향-분산 진단은 Andrew Ng가 거의 모든 머신러닝 프로젝트에서 사용하는 가장 강력한 도구다.

직관적 이해

데이터셋이 주어졌을 때:

학습 곡선으로 진단하기

학습 곡선(learning curve)은 가로축에 훈련 예제 수, 세로축에 오류율을 나타내는 그래프다. 여기서 두 가지 곡선을 그린다.

  1. 개발 세트(또는 테스트 세트) 오류: 훈련 예제가 많아질수록 일반적으로 감소한다.
  2. 훈련 세트 오류: 훈련 예제가 많아질수록 일반적으로 증가한다. 예제가 1개뿐이면 어떤 알고리즘이든 완벽하게 적합시킬 수 있지만, 수만 개의 예제가 있으면 모든 예제를 완벽하게 맞추기 어려워지기 때문이다.

또한 비즈니스 요구사항이나 인간 수준의 성능 등에 기반한 목표 성능 수준을 함께 표시한다.

높은 분산의 학습 곡선

높은 분산 문제가 있을 때 학습 곡선은 다음과 같은 특징을 보인다.

  1. 약한 신호: 개발 세트 오류가 훈련 예제 수가 늘어남에 따라 계속 감소하고 있다. 오른쪽으로 외삽하면 더 내려갈 것 같다. 다만 실제로 얼마나 더 내려갈지 판단하기는 어렵다.
  2. 강한 신호: 훈련 오류와 개발 세트 오류 사이에 큰 격차가 있다. 이것이 높은 분산의 가장 확실한 지표다.

학습 이론에 따르면 대부분의 경우 개발 세트 오류는 \(1/\sqrt{m}\)의 비율로 감소하며, 베이즈 오류(Bayes error)에 수렴한다. 베이즈 오류란 데이터의 본질적 모호함을 고려했을 때 달성 가능한 최선의 오류율이다. 예를 들어 흐릿한 X선 이미지에서 종양 유무를 판별하는 것처럼, 데이터 자체가 모호한 경우 오류율은 0까지 내려가지 않는다.

높은 편향의 학습 곡선

높은 편향 문제가 있을 때 학습 곡선은 다음과 같은 특징을 보인다.

  1. 훈련 오류 자체가 목표 성능에 도달하지 못한다. 알고리즘이 이미 본 예제조차 제대로 맞추지 못한다면, 모델이 데이터를 충분히 적합시키지 못하고 있는 것이다.
  2. 훈련 오류와 개발 세트 오류 사이의 격차가 작다.

이 경우, 아무리 오른쪽으로 외삽해도 (즉, 데이터를 아무리 많이 추가해도) 훈련 오류 곡선은 목표 성능까지 내려가지 않으며, 개발 세트 오류는 항상 훈련 오류보다 높으므로 역시 목표 성능에 도달할 수 없다. 데이터 추가만으로는 근본적인 해결이 불가능하다.

편향-분산에 따른 처방

시도

해결하는 문제

훈련 데이터 추가 수집

높은 분산

더 작은 특성 집합 사용

높은 분산

더 큰 특성 집합 사용

높은 편향

이메일 헤더 특성 추가

높은 편향

높은 분산 문제에서 데이터를 더 모으면 도움이 되는 이유는 직관적이다. 10차 다항식이 소수의 데이터에서 심하게 진동하더라도, 데이터가 충분히 많으면 그렇게 극단적으로 진동하기 어려워진다. 반면 특성 수를 줄이면 모델의 복잡도가 낮아져 과대적합이 완화된다.

높은 편향 문제에서는 반대로 특성을 추가하여 모델의 표현력을 높여야 한다. 직선만으로 데이터를 설명하기 어렵다면, 이차항을 추가하는 것이 해결책이 될 수 있다.

실용적 조언: 빠르고 간단하게 시작하라

새로운 응용 문제에 도전할 때 Andrew Ng가 권장하는 접근법은 다음과 같다.

  1. 빠르고 간단한(quick and dirty) 구현으로 시작한다. 예를 들어 로지스틱 회귀처럼 단순한 알고리즘을 먼저 돌려본다.
  2. 편향-분산 분석을 수행하여 무엇이 잘못되었는지 파악한다.
  3. 분석 결과에 따라 다음 단계를 결정한다. 더 복잡한 알고리즘으로 갈 것인지, 데이터를 추가할 것인지 등을 판단한다.

예외는 해당 도메인에 풍부한 경험이 있는 경우다. 예를 들어 음성 인식 분야에서 오래 일해왔다면 필요한 데이터 규모에 대한 감각이 있으므로, 처음부터 복잡한 시스템을 구축할 수 있다. 하지만 완전히 새로운 문제라면 빠른 구현 후 진단하는 접근법이 훨씬 효율적이다.


12.4 최적화 알고리즘 vs 목적 함수 진단

편향-분산 외에 또 하나의 중요한 진단은, 문제가 최적화 알고리즘에 있는지 아니면 목적 함수 자체에 있는지를 구분하는 것이다.

동기 부여 예제: 로지스틱 회귀 vs SVM

로지스틱 회귀를 튜닝하여 다음과 같은 결과를 얻었다고 하자.

알고리즘

스팸 이메일 오류

비스팸 이메일 오류

로지스틱 회귀

2%

2%

SVM (선형 커널)

10%

0.01%

스팸 이메일에서 2% 오류는 수용할 만하지만, 비스팸 이메일에서 2% 오류는 중요한 이메일 50통 중 1통을 잃는 것이므로 수용하기 어렵다. 반면 SVM은 비스팸 오류가 0.01%로 매우 낮다. 그런데 로지스틱 회귀가 계산 효율이 더 좋고 업데이트가 쉬워서 로지스틱 회귀를 배포하고 싶다면, 어떻게 해야 할까?

두 가지 가설

실제로 관심 있는 것은 가중 정확도 \(A(\theta)\)이다. 비스팸 이메일에 더 높은 가중치를 부여하여, 비스팸을 올바르게 분류하는 것을 더 중시하는 지표다.

\[A(\theta) = \sum_{i} w_i \cdot \mathbf{1}[h_\theta(x^{(i)}) = y^{(i)}]\]

그런데 로지스틱 회귀는 \(A(\theta)\)가 아니라 \(J(\theta)\)를 최적화한다.

\[J(\theta) = \text{로그 우도} - \lambda \|\theta\|^2\]

따라서 문제의 원인으로 두 가지 가설이 가능하다.

  1. 최적화 알고리즘 문제: 경사 상승법이 \(J(\theta)\)를 제대로 최대화하지 못하고 있다. \(J(\theta)\)를 제대로 최대화하기만 하면 좋은 결과를 얻을 수 있을 텐데, 알고리즘이 수렴하지 못하고 있다.
  2. 목적 함수 문제: \(J(\theta)\)가 잘못된 함수다. \(J(\theta)\)를 최대화해봐야 \(A(\theta)\)와 너무 달라서, 실제로 원하는 성능을 얻을 수 없다.

"왜 \(A(\theta)\)를 직접 최대화하지 않는가?"라고 물을 수 있다. \(A(\theta)\)에는 지시 함수(indicator function)가 포함되어 있어 미분 불가능하며, 직접 최대화하는 것은 NP-hard 문제다.

진단 방법

\(\theta_{\text{SVM}}\)을 SVM이 학습한 매개변수, \(\theta_{\text{BLR}}\)을 베이지안 로지스틱 회귀가 학습한 매개변수라 하자. 다음 값을 비교한다.

\[J(\theta_{\text{SVM}}) \quad \text{vs} \quad J(\theta_{\text{BLR}})\]

로지스틱 회귀가 최대화하려는 비용 함수 \(J\)에 SVM의 매개변수와 로지스틱 회귀의 매개변수를 각각 대입하여 어느 쪽이 더 큰지 확인하는 것이다.

경우 1: \(J(\theta_{\text{SVM}}) > J(\theta_{\text{BLR}})\)

이미 알고 있는 사실: SVM이 \(A(\theta)\) 기준으로 더 좋은 성능을 낸다.

이 경우가 의미하는 바: SVM이 찾은 매개변수가 \(J(\theta)\) 값도 더 높다. 그런데 베이지안 로지스틱 회귀는 \(J(\theta)\)를 최대화하라고 시켰는데, SVM보다 낮은 \(J\) 값을 달성했다. 따라서 \(\theta_{\text{BLR}}\)\(J\)를 제대로 최대화하지 못하고 있으며, 문제는 최적화 알고리즘에 있다.

처방: 경사 상승법의 반복 횟수를 늘리거나, 뉴턴 방법으로 전환하는 등 최적화 알고리즘을 개선한다.

경우 2: \(J(\theta_{\text{SVM}}) \leq J(\theta_{\text{BLR}})\)

이 경우가 의미하는 바: 로지스틱 회귀는 \(J(\theta)\) 최대화를 SVM보다 잘 해냈다. 하지만 \(A(\theta)\) 기준으로는 SVM이 더 우수하다. 이 두 사실을 결합하면, \(J(\theta)\)를 최대화하는 것이 \(A(\theta)\)를 높이는 것과 대응하지 않음을 알 수 있다. 문제는 목적 함수 \(J(\theta)\) 자체에 있다.

처방: \(\lambda\) 값을 변경하거나, SVM 목적 함수로 전환하거나, 완전히 새로운 비용 함수를 설계하는 등 최적화 목적 함수를 변경한다.

각 시도가 해결하는 문제 유형

시도

해결 대상

경사 하강법 반복 횟수 증가

최적화 알고리즘

뉴턴 방법으로 전환

최적화 알고리즘

\(\lambda\) 값 변경

최적화 목적 함수 (편향-분산 조절의 의미도 있음)

SVM으로 전환

최적화 목적 함수


12.5 복합 예제: 자율 비행 헬리콥터

이 개념들을 종합하는 보다 복잡한 예제를 살펴보자. Andrew Ng의 연구실에서 실제로 수행한 자율 비행 헬리콥터 프로젝트다.

시스템 구축 단계

  1. 헬리콥터 시뮬레이터 구축: 비디오 게임과 유사한 시뮬레이션 환경을 만든다. 시뮬레이션에서는 충돌해도 비용이 들지 않지만, 실제 헬리콥터 충돌은 위험하고 비용이 크다.
  2. 비용 함수 선택: 헬리콥터가 목표 위치 \(x_{\text{desired}}\)에 있어야 하는데 실제로 \(x\) 위치에 있다면, 제곱 오차 \(J(\theta) = \|x - x_{\text{desired}}\|^2\)으로 페널티를 부여한다.
  3. 강화 학습 알고리즘 실행: \(J(\theta)\)를 최소화하는 매개변수 \(\theta_{\text{RL}}\)을 학습한다.

그런데 결과로 얻은 제어기가 인간 조종사보다 훨씬 나쁜 성능을 보인다면, 어떻게 해야 할까?

세 가지 선택지

각 단계에 대응하여 세 가지를 개선할 수 있다.

  1. 시뮬레이터 개선: 헬리콥터 주변의 공기 흐름은 매우 복잡하여, 항공우주 전문가들조차 완전히 설명하지 못하는 세부 사항이 있다. 시뮬레이터를 개선할 여지는 사실상 무한하다.
  2. 비용 함수 수정: 헬리콥터는 꼬리 로터가 공기를 한쪽으로 불어내기 때문에, 제자리 비행 시 실제로는 약간 기울어진 상태가 최적이다. 따라서 단순 제곱 오차가 최선이 아닐 수 있다.
  3. 강화 학습 알고리즘 개선: 알고리즘이 \(J(\theta)\)를 제대로 최소화하지 못하고 있을 수 있다.

이 세 가지 중 어느 것이든 박사 논문 하나를 쓸 수 있는 주제다. 핵심 질문은 어디에 시간을 투자해야 가장 효과적인가이다.

체계적 디버깅 프로세스

다음 세 가지 전제를 세운다.

  1. 시뮬레이터가 정확하다.
  2. 강화 학습 알고리즘이 \(J(\theta)\)를 올바르게 최소화한다.
  3. \(J(\theta)\)가 좋은 비용 함수다.

세 가지가 모두 참이라면, 학습된 매개변수는 실제 헬리콥터에서도 잘 비행해야 한다. 하지만 실제로는 잘 비행하지 못하므로, 적어도 하나는 거짓이다. 이를 소프트웨어 디버깅에 비유하면, 큰 프로그램이 충돌할 때 문제를 특정 컴포넌트로 격리하여 집중적으로 디버깅하는 것과 같다.

진단 1: 시뮬레이션 성능 확인

학습된 제어기가 시뮬레이션에서는 잘 비행하지만 실제에서는 그렇지 않다면, 시뮬레이터가 현실을 충분히 반영하지 못하고 있다는 강력한 증거다. 시뮬레이터 개선에 시간을 투자해야 한다.

시뮬레이션에서 나쁘지만 현실에서 좋은 경우는 극히 드물다. 다만, 시뮬레이터에 과도한 노이즈를 추가한 경우에는 발생할 수 있다. 학습 알고리즘의 강건성을 높이기 위해 시뮬레이터에 일부러 노이즈를 추가하는 관행이 있는데, 이 노이즈가 과도하면 시뮬레이션 성능이 현실보다 나빠질 수 있으며, 이때는 노이즈를 줄여야 한다.

진단 2: 인간 성능과 비용 함수 비교

인간 조종사의 비행을 비용 함수 \(J(\theta)\)로 평가하고, 강화 학습 알고리즘의 결과와 비교한다.

\[J(\theta_{\text{human}}) \quad \text{vs} \quad J(\theta_{\text{RL}})\]

경우 1: \(J(\theta_{\text{human}}) < J(\theta_{\text{RL}})\)

인간이 더 낮은 제곱 오차를 달성했다. 이는 더 좋은 \(\theta\) 값이 존재한다는 증거이며(인간의 비행이 그 증거), 강화 학습 알고리즘이 이를 찾지 못한 것이다. 문제는 강화 학습 알고리즘에 있다.

경우 2: \(J(\theta_{\text{human}}) \geq J(\theta_{\text{RL}})\)

강화 학습 알고리즘이 \(J(\theta)\) 기준으로는 인간보다 잘했다. 하지만 실제 비행은 인간이 더 낫다. 이는 \(J(\theta)\)를 최소화하는 것이 좋은 비행에 대응하지 않음을 의미한다. 문제는 비용 함수에 있다.

반복적 디버깅 사이클

실제 헬리콥터 프로젝트에서는 이 진단을 반복적으로 수행했다. 한 주는 "시뮬레이터에 문제가 있다"는 결론을 내리고 시뮬레이터를 개선하고, 몇 주 후 다시 진단하면 "이제 시뮬레이터는 충분하지만 강화 학습 알고리즘에 문제가 있다"는 결론이 나온다. 이를 개선한 후에는 "비용 함수에 문제가 있다"는 결론이 나올 수 있다. 가장 심각한 병목 지점은 이전 문제를 해결할 때마다 이동한다.

Andrew Ng의 전 박사과정 학생 Adam Coates는 이 디버깅 과정을 통해 좋은 비용 함수를 찾는 것 자체가 매우 어렵다는 사실을 깨달았다. 헬리콥터가 고속으로 비행하다가 뱅크 턴을 할 때, "정확한 뱅크 턴"을 수학적으로 어떻게 정의할 것인가? 그는 결국 좋은 비용 함수를 정의하는 방법에 관한 연구 논문을 작성했고, 이 논문은 ICML에서 최우수 응용 논문상을 받았다. 이 연구를 수행한 이유 역시 진단을 통해 비용 함수 개선이 가치 있는 문제임을 확인했기 때문이다.


12.6 오류 분석 (Error Analysis)

편향-분산 분석과 최적화 진단 외에, 오류 분석은 학습 알고리즘에서 무엇이 작동하지 않는지를 파악하는 또 다른 강력한 도구다.

파이프라인 기반 시스템

실제 머신러닝 응용에서는 단일 알고리즘이 아닌, 여러 컴포넌트가 연결된 파이프라인을 구축하는 경우가 많다. 연구 논문에서는 "수십억 개의 문장으로 훈련한 순수 종단간(end-to-end) 기계 번역 시스템"을 보고하지만, 실제로 데이터가 충분하지 않은 많은 응용에서는 훨씬 복잡한 파이프라인이 필요하다.

빅 데이터의 가치는 실재하지만, 다소 과대 포장된 측면이 있다. 소규모 데이터셋으로도 훌륭한 결과를 얻을 수 있으며, 100개 정도의 훈련 예제만으로 좋은 결과를 내는 경우도 많다. 다만 소규모 데이터에서는 파이프라인의 통찰력 있는 설계가 더 중요해진다.

예제: 얼굴 인식 보안 시스템

문 앞에 다가오는 사람을 인식하여 출입을 허가하는 보안 시스템을 구축한다고 하자. 파이프라인은 다음과 같다.

카메라 이미지 → 배경 제거 → 얼굴 검출 → 눈 분할 → 코 분할 → 입 분할 → 로지스틱 회귀 → 라벨

오류 분석 절차

시스템의 전체 정확도가 85%라고 하자. 어떤 컴포넌트를 개선해야 가장 큰 효과를 얻을 수 있을까?

방법: 개발 세트에서 각 컴포넌트의 출력을 하나씩 **완벽한 정답(ground truth)**으로 대체하고, 전체 시스템의 정확도 변화를 관찰한다.

완벽하게 만든 컴포넌트

전체 정확도

개선폭

없음 (기준선)

85.0%

배경 제거

85.1%

+0.1%

얼굴 검출

91.0%

+5.9%

눈 분할

95.0%

+4.0%

코 분할

96.0%

+1.0%

입 분할

97.0%

+1.0%

로지스틱 회귀

100.0%

+3.0%

이 분석에서 얻을 수 있는 통찰:

Andrew Ng는 이 유형의 문제에서 실제로 배경 제거에 관한 박사 논문을 쓴 사람을 알고 있다. 기술적으로는 혁신적인 훌륭한 연구였지만, 얼굴 인식 시스템의 성능 향상이라는 관점에서는 바늘을 움직이지 못했다. 논문 출판이 목표라면 괜찮지만, 더 나은 시스템을 만드는 것이 목표라면 어떤 컴포넌트에 시간을 투자할지 신중하게 결정해야 한다.

팀이 충분히 크다면 얼굴 검출과 눈 분할 개선을 병렬로 진행할 수 있다. 핵심은 이 분석이 상대적 우선순위에 대한 감각을 제공한다는 것이다.

누적 방식 vs 개별 방식

위 분석은 누적 방식(왼쪽에서 오른쪽으로 하나씩 완벽하게 만들어 나감)으로 수행했다. 대안으로 개별 방식(하나를 완벽하게 만들고, 원래대로 되돌리고, 다음 것을 완벽하게 만듦)도 가능하다. 두 방식이 다른 결론을 줄 수 있다면, 양쪽 모두 수행하는 것이 좋다.

오류 분석은 엄밀한 수학적 규칙이 아니다. 공식을 넣으면 "얼굴 검출을 개선하라"라는 답이 나오는 것이 아니라, 각 컴포넌트 개선의 난이도에 대한 판단과 결합하여 의사결정을 내려야 한다.

이상 현상에 주의하라

만약 특정 컴포넌트를 완벽하게 만들었는데 오히려 정확도가 떨어지는 현상이 발생하면, 이를 무시하지 말아야 한다. 소프트웨어 디버깅에서 마우스를 특정 버튼 위로 옮길 때 무관한 픽셀 색상이 바뀌는 현상을 발견했을 때, "사용자는 모를 것이다"라고 무시하는 것과 원인을 파악하는 것의 차이다. 항상 원인을 파악해야 한다.


12.7 절제 분석 (Ablative Analysis)

오류 분석이 현재 성능과 완벽한 성능 사이의 격차를 설명하는 반면, 절제 분석은 현재 성능과 훨씬 나쁜 성능 사이의 격차를 설명한다.

예제: 스팸 분류기의 특성 기여도

로지스틱 회귀에 여러 정교한 특성을 추가하여 우수한 스팸 분류기를 구축했다고 하자.

모든 특성을 사용한 정확도가 99%이고, 기본 로지스틱 회귀(이 특성들 없이)의 정확도가 94%라 하자.

절제 분석 절차

컴포넌트를 하나씩 제거하여 성능이 얼마나 저하되는지 관찰한다.

제거한 특성

정확도

하락폭

없음 (기준선)

99.0%

철자 교정 제거

98.5%

-0.5%

발신 호스트 특성 제거

98.3%

-0.2%

이메일 헤더 특성 제거

98.0%

-0.3%

텍스트 파서 제거

94.0%

-4.0%

전부 제거

94.0%

이 분석에서 가장 큰 성능 하락은 텍스트 파서 제거 시 발생했다 (4% 하락). 이로부터 다음과 같은 통찰을 얻을 수 있다.

오류 분석과 마찬가지로, 누적 방식과 개별 방식(하나를 제거하고 다시 넣고, 다른 하나를 제거)을 모두 시도할 수 있으며, 제거 순서에 체계적인 규칙은 없다.


12.8 프로젝트 시작 전략 요약

새로운 머신러닝 프로젝트를 시작할 때 Andrew Ng가 권장하는 워크플로를 정리하면 다음과 같다.

  1. 빠르고 간단한 구현으로 시작한다 (예: 로지스틱 회귀).
  2. 편향-분산 분석을 수행한다: 학습 곡선을 그려 훈련 오류와 개발 세트 오류의 관계를 파악한다.
  3. 높은 분산이면 데이터 추가나 특성 축소를, 높은 편향이면 특성 추가나 더 복잡한 모델을 시도한다.
  4. 최적화 알고리즘 vs 목적 함수 진단을 수행한다: 다른 알고리즘의 결과와 비교하여 문제의 원인을 격리한다.
  5. 파이프라인 시스템이라면 오류 분석으로 각 컴포넌트의 기여도를 파악한다.
  6. 시스템이 성숙해지면 절제 분석으로 각 특성/컴포넌트의 가치를 정량화한다.
  7. 진단 결과에 따라 다음 작업의 우선순위를 정하고, 문제를 해결한 후 다시 진단한다. 병목 지점은 이전 문제 해결 후 이동할 수 있다.

핵심 정리

개념

핵심

편향-분산 진단

학습 곡선에서 훈련 오류와 개발 세트 오류의 격차를 분석. 큰 격차 = 높은 분산, 격차 작지만 성능 미달 = 높은 편향

높은 분산 처방

데이터 추가, 특성 축소, 정규화 강화

높은 편향 처방

특성 추가, 더 복잡한 모델 사용, 정규화 완화

최적화 알고리즘 vs 목적 함수

다른 알고리즘의 \(J(\theta)\) 값과 비교하여 문제의 원인을 격리

오류 분석

파이프라인의 각 컴포넌트를 완벽한 정답으로 대체하여 개선 여지 정량화 (현재 → 완벽)

절제 분석

컴포넌트를 하나씩 제거하여 기여도 정량화 (현재 → 기본선)

빠른 구현 우선

새로운 문제에는 단순한 알고리즘으로 시작하고, 진단 후 개선 방향을 결정

반복적 디버깅

진단 → 수정 → 재진단의 순환. 병목 지점은 이전 문제 해결 후 이동함


이전 장: 11장 - 역전파와 신경망 개선 다음 장: 13장 - EM 알고리즘