“high bias는 underfitting, high variance는 overfitting"은 다들 왼다. 그런데 실제 학습 결과를 보고 내 모델이 둘 중 뭔지, 그리고 뭘 해야 하는지를 말할 수 있는 사람은 훨씬 적다. 이 글은 둘 다 다룬다: 먼저 bias–variance 분해를 쓸모 있을 만큼 탄탄하게, 그다음 실제 모델의 과적합을 진단하는 실무 플레이북 — learning curve, train/validation gap, cross-validation, 그리고 함정들. 해결책을 다룬 L1/L2·dropout 글의 진단 편이다.

분해

타깃 \(y = f(x) + \varepsilon\), 노이즈 \(\mathbb{E}[\varepsilon]=0\), \(\text{Var}(\varepsilon)=\sigma^2\)라 하자. 무작위 데이터셋으로 모델 \(\hat f\)를 학습시키고, 한 점 \(x\)에서의 기대 squared error를 — 노이즈와 어떤 training set을 뽑았는지의 무작위성 둘 다에 대해 평균 내어 — 보면:

$$ \mathbb{E}\big[(y - \hat{f}(x))^2\big] = \underbrace{\big(f(x) - \mathbb{E}[\hat f(x)]\big)^2}_{\text{Bias}^2} + \underbrace{\mathbb{E}\big[(\hat f(x) - \mathbb{E}[\hat f(x)])^2\big]}_{\text{Variance}} + \underbrace{\sigma^2}_{\text{줄일 수 없는 노이즈}} $$
  • Bias² — (여러 training set에 대한) 평균 모델이 참값에서 얼마나 벗어나 있는가. 모델이 \(f\)를 표현하기엔 너무 경직돼서 나는 오차. Underfitting.
  • Variance — 모델이 training set이 바뀔 때 얼마나 출렁이는가. 모델이 데이터셋의 특정 노이즈까지 쫓을 만큼 유연해서 나는 오차. Overfitting.
  • σ² — 레이블 자체의 노이즈. 어떤 모델도 못 넘는 하한, 즉 Bayes error.

Tradeoff: 모델 복잡도를 올리면 bias는 내려가고(표현력↑) variance는 올라간다(노이즈 fit 자유↑). 총 error는 복잡도에 대해 U자 곡선 — 너무 단순하면 bias가, 너무 복잡하면 variance가 지배하고, 최적점은 그 사이다. 당신이 가진 모든 노브(모델 크기, feature, 규제 강도, 학습 시간)가 이 곡선 위 위치를 옮긴다.

핵심 멘탈 모델. Bias는 체계적 빗나감 — 매번 같은 방향으로 평균적으로 틀린다. Variance는 불안정성 — 평균적으로는 맞지만 이리저리 흔들린다. 모델은 데이터에 크게 좌우되면서도(high variance) 무편향일 수 있다. 이 둘은 서로 다른 병이고 서로 다른 처방을 요구한다 — 그래서 어느 쪽인지 진단하는 게 중요하다.

각각은 어떻게 보이는가

High bias (underfitting) High variance (overfitting)
Training error 높음 낮음 (종종 0에 가까움)
Validation error 높음, ≈ training error 높음, ≫ training error
Train–val gap 작음
데이터 더 넣기 도움 안 됨 도움 됨
증상 모델이 너무 단순 / 과도한 규제 모델이 너무 복잡 / 규제 부족

가장 정보량이 큰 단일 숫자는 training error와 validation error의 gap이다. 그 크기가 variance를, training error의 수준이 bias를 알려준다. 둘을 함께 읽어라.

실무 진단

1. Train/validation gap (여기서 시작)

모델이 학습에 쓰지 않은 validation set을 떼어 두고 비교한다:

  • Training error 높고, validation error도 비슷하게 높음 → high bias. 본 데이터조차 못 맞춘다. 데이터를 늘리거나 규제를 더해도 소용없다 — 더 강력한 모델이 필요하다.
  • Training error 낮고, validation error 훨씬 높음 → high variance. Training set은 완벽히 맞췄는데 일반화에 실패했다. 교과서적 overfitting.
  • 둘 다 낮고 가까움 → 좋은 상태. 복잡도를 더 밀어 성능을 짜낼 여지가 있는지 본다.

“높다”·“낮다"를 구체화하려면 training error를 줄일 수 없는 오차의 대리값(human-level 성능, 강한 baseline, 알려진 Bayes error)과 비교한다. Andrew Ng의 프레이밍이다:

$$ \underbrace{\text{avoidable bias}}_{\text{train err} - \text{Bayes err}} \quad\text{vs.}\quad \underbrace{\text{variance}}_{\text{val err} - \text{train err}} $$

둘 중 더 큰 gap이 먼저 칠 문제다. Train 8% / val 10%인 모델은 사람이 1%면 bias 문제이고, 사람이 7.5%면 variance 문제다. 같은 숫자, 정반대 진단 — 그래서 절대 기준(Bayes 대리값)이 필요하다.

2. Learning curve (error vs training-set 크기)

데이터의 커지는 부분집합(예: 10%, 20%, …, 100%)으로 학습시키며 training error와 validation error를 sample 수에 대해 그린다. 모양이 진단이다:

  • High bias: 데이터를 늘릴수록 training error가 높은 값으로 상승(큰 집합은 완벽히 맞추기 어렵다), validation error가 그쪽으로 하강해 둘이 가깝게 수렴 — 단 높은 error에서. 곡선이 이미 평평해졌으니 신호는: 데이터를 더 넣어도 소용없다. 더 큰 모델이나 나은 feature가 필요하다.
  • High variance: training error는 낮게 유지, validation error는 훨씬 높고, gap이 크지만 데이터가 늘수록 좁혀지는 중. 신호: 데이터가 아직 도움이 된다 — validation 곡선이 하강 추세다. 데이터를 모으거나 augment하거나 규제하라.

Learning curve가 최고의 도구인 이유는 “데이터를 더 넣으면 도움이 될까?“와 “더 나은 모델이 도움이 될까?“를 분리해주기 때문이다 — train/val gap만으로는 완전히 답할 수 없는 질문이다.

3. Validation (complexity) curve

데이터를 고정하고 capacity를 조절하는 하나의 하이퍼파라미터를 훑는다 — 다항식 차수, tree depth, layer/unit 수, 또는 규제 강도 \(\lambda\). Train·validation error를 그에 대해 그린다:

  • Training error는 복잡도가 오를수록 단조 감소.
  • Validation error는 U자 — 내려가다 바닥을 치고, overfitting이 시작되며 다시 오른다.
  • Validation U의 바닥이 당신의 동작점이다. 오른쪽은 전부 overfitting, 왼쪽은 전부 underfitting.

규제라면 \(\lambda\)를 훑는 게 이 U를 직접 그린다 — 작은 \(\lambda\) = high variance(오른쪽), 큰 \(\lambda\) = high bias(왼쪽).

4. Cross-validation (추정을 믿을 수 있게)

단일 validation split 자체가 노이즈 낀 추정이다 — 작거나 운 나쁜 split이면 모델이 아니라 split을 진단하게 된다. k-fold cross-validation은 validation fold를 \(k\)개 조각 전체로 돌려가며 평균 내어 일반화 오차를 더 낮은 분산으로 추정하고, 덤으로 fold 간 표준편차를 준다. 이 퍼짐 자체가 진단이다: fold마다 점수가 크게 다르면 high variance(또는 데이터 부족, 또는 leaky/이질적 split)의 신호다.

CV 방식을 데이터에 맞춰라:

  • Stratified k-fold (분류): 각 fold에 class 비율 보존.
  • Group k-fold: 행이 뭉쳐 있을 때(같은 환자·유저·문서가 여러 행) — 같은 그룹이 train과 validation에 동시에 들어가지 않게. 안 그러면 leak.
  • Time-series split (시계열): 항상 과거로 학습하고 미래로 validation. 여기서 무작위 shuffle은 미래를 학습에 흘려 환상적인 점수를 준다.

5. 학습 중 loss curve (반복 학습 모델)

Gradient descent로 학습하는 것이라면 train·validation loss를 epoch에 대해 그린다. Overfitting 신호는 분명하다: training loss는 계속 내려가는데 validation loss가 바닥을 찍고 다시 오르기 시작한다. Validation 곡선의 바닥이 early-stopping 지점이고 — “val loss를 지켜보다 오르면 멈춰라"는 그 자체로 가장 싼 규제 중 하나다.

처방 — 어느 쪽인지 알고 나면

진단이 쓸모 있는 건 두 문제의 처방이 정반대이기 때문이다. 잘못 적용하면 악화된다(예: underfit 모델에 규제 추가).

Bias 줄이기 (underfitting 해결) Variance 줄이기 (overfitting 해결)
더 크고 표현력 있는 모델 더 많은 training 데이터
feature 추가, 풍부한 표현 Data augmentation
더 오래 학습, learning-rate 하한 낮추기 규제 (L1/L2), dropout
규제 \(\lambda\) 낮추기 규제 \(\lambda\) 높이기
더 나은 architecture 더 단순한 모델, feature 줄이기
Early stopping
Ensembling / bagging

\(\lambda\) 행의 대칭을 보라: 같은 노브를 진단에 따라 정반대로 돌린다. 이것이 먼저 진단하는 이유 전부다.

진단을 속이는 함정

위 방법들은 validation 숫자가 실제로 일반화를 반영할 때만 작동한다. 조용히 그러지 못하게 만드는 것들:

  • Data leakage. Split 전에 전처리(scaling, imputation, feature selection, target encoding)를 전체 데이터로 fit하면 validation 정보가 학습에 새어든다 → 낙관적으로 낮은 validation error, 그리고 production에서의 참사. 모든 transform을 CV 루프 안에서, training fold로만 fit하라.
  • Target leakage. 레이블을 인코딩하는(또는 결과 이후에만 얻는) feature는 거의 완벽한 validation 점수와 쓸모없는 production 성능을 준다. 결과가 너무 좋으면 leaked feature부터 찾아라.
  • Test set으로 튜닝. 어떤 set을 보고 고른 모든 하이퍼파라미터는 그 set을 낙관적으로 만든다. 마지막에 딱 한 번 만지는 test set을 따로 두고, 튜닝은 전부 validation/CV로.
  • Validation set이 너무 작음. 200개짜리 val set은 노이즈 낀 정확도(±몇 %)를 준다 — sampling noise에 반응하는 걸 수도 있다. CV나 더 큰 holdout을 써라.
  • Distribution shift / non-iid. Validation이 training과 iid로 뽑혔지만 production은 아니라면(새 기간, 새 유저, 새 지역), 좋은 val 점수도 과거 분포에 overfit한 것이다. 배포와 닮은 데이터로 validation하라.
  • Double descent (현대의 단서). 심하게 overparameterized된 모델에서는 test error가 내려가고, 올라가고(고전 U), interpolation threshold를 지나 다시 내려간다. “큰 모델은 항상 overfit"이라는 직관이 이 영역에선 깨진다 — 아주 큰 neural net은 training을 완벽히 맞추고도 잘 일반화하는 경우가 많다. 진단 도구들은 여전히 작동하지만, 단조 “복잡도↑ ⟹ variance↑” 서사엔 별표가 필요하다.

최소 워크플로

  1. Test set을 떼어 둔다. 맨 끝까지 건드리지 마라.
  2. 올바른 방식(stratified / group / time-series)으로 training/validation split(또는 k-fold CV)을 만든다.
  3. train error, val error, Bayes-error 대리값을 비교 → bias vs variance 판단.
  4. 애매하면 learning curve를 그린다 → 데이터가 더 도움이 되나?
  5. 표에서 맞는 처방을 적용한다. 반복 학습 모델이면 val-loss curve를 보며 early-stop.
  6. 다시 진단. 반복. 마지막에 test set으로 한 번 평가해 정직한 일반화 성능을 보고한다.

요약

  1. Bias는 체계적 오차(underfitting, train·val error 둘 다 높음), variance는 불안정성(overfitting, train error는 낮지만 train–val gap이 큼). 총 error = bias² + variance + 줄일 수 없는 노이즈이고, 복잡도가 U자 곡선을 따라 둘을 맞바꾼다.
  2. Train/val gap + 절대 기준(Bayes/human error)으로 진단하라: avoidable bias = train − Bayes, variance = val − train, 더 큰 쪽을 친다. Learning curve(데이터가 도움이 되나?), validation curve(U의 바닥이 어디?), cross-validation(추정이 안정적인가?)으로 확인한다.
  3. 두 문제는 정반대 처방을 가지므로 치료 전에 진단이 와야 한다 — 그리고 이 전부는 leakage를 피하고, 건드리지 않은 test set을 두고, 배포와 닮은 데이터로 validation했을 때만 유효하다.