한양과학기술고등학교

에듀테크 프로젝트 대시보드

편향-분산 트레이드오프

편향-분산 트레이드오프 (Bias–Variance Tradeoff)

머신러닝 모델이 틀리는 이유는 크게 두 가지다. 편향(bias) 은 모델이 너무 단순해서 데이터의 진짜 패턴을 구조적으로 놓치는 오차이고, 분산(variance) 은 모델이 너무 민감해서 훈련 데이터의 잡음까지 외워버려 데이터가 조금만 바뀌어도 결과가 출렁이는 오차다. 모델을 복잡하게 만들수록 편향은 줄지만 분산은 커진다 — 이 맞바꿈(trade-off) 의 최적점을 찾는 게 핵심이다. 아래에서 다항식 차수 를 직접 올려 보며 과소적합 → 딱 맞음 → 과적합 을 눈으로 확인해 보자.

1. 차수를 올려 보자 — 과소적합에서 과적합까지

초록 점선 은 우리가 맞히려는 진짜 함수(현실에서는 알 수 없다), 흰 점 은 잡음이 섞인 훈련 데이터, 분홍 곡선 은 그 점들에 맞춘 다항식 모델이다. 차수가 낮으면 곡선이 뻣뻣해 데이터를 못 따라가고(편향↑), 차수가 높으면 점 하나하나를 지나려고 요동친다(분산↑). "데이터셋 10개 겹쳐보기" 를 켜면 훈련 데이터를 새로 뽑을 때마다 고차 곡선이 얼마나 제멋대로 바뀌는지 보인다.

진짜 함수 훈련 데이터 모델(다항식) 다른 데이터셋의 모델
…

2. 검증 오차는 왜 U자를 그릴까

각 차수마다 훈련 데이터를 40번 새로 뽑아 모델을 맞추고, 한 번도 안 본 테스트 데이터 에서의 평균 오차를 쟀다. 훈련 오차(파랑)는 차수가 올라갈수록 계속 내려간다 — 모델이 점을 더 잘 외우니까. 하지만 테스트 오차(분홍)는 내려가다가 어느 순간부터 다시 올라간다. 왼쪽 비탈은 편향이 지배하는 과소적합 구간, 오른쪽 비탈은 분산이 지배하는 과적합 구간이다. 골짜기 바닥이 최적 복잡도.

훈련 오차와 테스트 오차의 벌어진 틈(일반화 간격, generalization gap)이 곧 분산의 크기다. 차수가 클수록 이 틈이 벌어진다 = 모델이 훈련 데이터에만 특화됐다는 뜻.

3. 다트판으로 보는 편향과 분산

과녁 한복판이 정답, 화살 하나하나가 서로 다른 훈련 데이터로 학습한 모델의 예측이다. 편향 = 화살 뭉치의 중심이 과녁에서 얼마나 벗어났나. 분산 = 화살들이 서로 얼마나 흩어졌나.

4. 오차 = 편향² + 분산 + 줄일 수 없는 잡음

한 점 x 에서 기대 예측 오차를 수학적으로 쪼개면 정확히 세 조각으로 나뉜다.

E[(y − ŷ)²] = ( E[ŷ] − f(x) )² + E[ ( ŷ − E[ŷ] )² ] + σ²
편향² (평균적으로 얼마나 빗나가나)  ·  분산 (데이터마다 얼마나 출렁이나)  ·  줄일 수 없는 잡음 (데이터 자체의 무작위성)
편향² 은 모델 탓

직선으로 곡선을 맞히면 아무리 데이터를 늘려도 못 맞힌다. 모델 가정 자체의 한계.

분산은 데이터 부족 탓

표본이 적을수록, 모델이 복잡할수록 커진다. 데이터를 늘리면 줄어든다.

σ² 는 못 줄인다

측정 잡음·기록 안 된 변수 때문. 어떤 모델도 이 아래로는 못 내려간다 (베이즈 오차).

그래서 트레이드오프

복잡도를 키우면 편향²↓ 분산↑. 둘의 합이 최소인 지점을 노린다.

5. 다항식 맞추기 (최소제곱 · JavaScript)

// 차수 d 다항식을 (xs, ys)에 최소제곱으로 맞춘다 → 계수 배열 function polyFit(xs, ys, d) { const m = d + 1; const ATA = zeros(m, m), ATy = zeros(m); for (let k = 0; k < xs.length; k++) { const pw = []; let p = 1; for (let j = 0; j < m; j++) { pw.push(p); p *= xs[k]; } // 1, x, x², … for (let i = 0; i < m; i++) { ATy[i] += pw[i] * ys[k]; for (let j = 0; j < m; j++) ATA[i][j] += pw[i] * pw[j]; } } return solve(ATA, ATy); // 정규방정식 (AᵀA)c = Aᵀy 풀기 } // 훈련 오차만 보면 항상 고차가 이긴다 → 반드시 따로 뺀 데이터로 평가! const trainMSE = mse(model, trainSet); const testMSE = mse(model, heldOutSet); // 이 값이 진짜 성능
차수가 데이터 개수 − 1 에 도달하면 다항식이 모든 점을 정확히 통과해 훈련 오차가 0이 된다. 하지만 점 사이에서 미친 듯이 진동한다 — 이게 룽게 현상(Runge phenomenon), 과적합의 교과서적 예.

6. 진단과 처방

높은 편향 (과소적합)

훈련 오차도 크고 테스트 오차도 크다. 둘이 붙어 있다. → 모델을 복잡하게, 특성 추가, 규제 완화, 더 오래 학습.

높은 분산 (과적합)

훈련 오차는 작은데 테스트 오차가 훨씬 크다. 틈이 벌어져 있다. → 데이터 더 모으기, 규제(L1/L2)·드롭아웃, 특성 줄이기, 조기 종료.

교차 검증 (Cross-Validation)

데이터를 k조각으로 나눠 돌아가며 검증. 테스트셋을 한 번만 슬쩍 보는 위험 없이 복잡도·하이퍼파라미터를 공정하게 고른다.

앙상블 (Ensemble)

여러 모델의 예측을 평균내면 분산이 줄어든다(배깅·랜덤 포레스트). 약한 모델을 순차로 더하면 편향이 준다(부스팅).

규제 (Regularization)

큰 계수에 벌점을 매겨 곡선이 덜 요동치게 한다. 차수는 높게 두되 매끄러움을 강제 — 복잡도를 연속적으로 조절하는 손잡이.

더블 디센트 (요즘 이야기)

딥러닝처럼 파라미터가 데이터보다 훨씬 많아지면 테스트 오차가 U자를 지나 다시 내려가기도 한다. 고전 U자 곡선이 전부는 아니다.