과적합과 편향-분산 절충¶
훈련자료를 외워버린 모형은 표본 안에서는 완벽하지만 새 관측에서는 형편없다. 과적합이라 불리는 이 현상이 정칙화의 핵심 동기다. 구체적인 벌점을 도입하기 전에, 과적합이 왜 일어나며 편향을 더하는 것이 어떻게 예측을 개선할 수 있는지 정확히 이해할 틀이 필요하다.
훈련오차와 검정오차¶
훈련자료 \(\{(x_i, y_i)\}_{i=1}^n\)에 적합한 회귀모형 \(\hat{f}\)를 생각하자. 두 가지 오차를 정의한다.
훈련오차는 모형을 적합하는 데 쓴 자료에서의 평균 손실이다.
검정오차(일반화 오차)는 새로운 독립 관측 \((x_0, y_0)\)에서의 기대 손실이다.
모형 복잡도가 커지면 훈련오차는 단조감소한다. 관측된 자료에 맞출 자유도가 늘어나기 때문이다. 반면 검정오차는 특징적인 U자 곡선을 그린다. 모형이 진짜 신호를 포착하는 동안 감소하다가, 잡음을 맞추기 시작하면 증가한다.
\(\text{Err}_{\text{test}} - \text{Err}_{\text{train}}\)의 격차는 모형 복잡도와 함께 커진다. 정칙화는 모형을 제약하여 이 격차를 통제하고 검정오차를 최솟값 근처에 유지한다.
편향-분산 분해¶
고정된 입력 \(x_0\)에서의 검정오차는 근본적인 분해를 갖는다. 참 자료생성과정을 \(y = f(x) + \varepsilon\)이라 하고 \(\varepsilon\)의 평균은 0, 분산은 \(\sigma^2\)이라 하자. 아래 기댓값은 크기 \(n\)인 훈련집합 전체에 대한 것이다.
각 항의 해석은 분명하다.
- 편향의 제곱은 평균적인 예측이 참값에서 얼마나 떨어져 있는지를 잰다. 너무 단순한 모형(굽은 관계에 직선을 맞추는 등)은 편향이 크다.
- 분산은 훈련집합이 바뀔 때 예측이 얼마나 요동치는지를 잰다. 표본크기에 비해 모수가 너무 많은 모형은 분산이 크다.
- 환원불가 오차 \(\sigma^2\)은 어떤 모형도 없앨 수 없는 잡음의 바닥이다.
절충
편향과 분산은 반대 방향으로 당긴다. 단순한 모형은 편향이 크고 분산이 작다. 복잡한 모형은 편향이 작고 분산이 크다. 최적의 복잡도는 어느 한 항이 아니라 둘의 합을 최소화한다.
선형회귀에서의 과적합¶
설명변수 \(p\)개와 관측 \(n\)개인 선형회귀에서 OLS 추정량 \(\hat{\boldsymbol{\beta}}_{\text{OLS}} = (\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top\mathbf{y}\)의 편향-분산 성질은 잘 알려져 있다.
OLS의 편향은 0이지만(불편이다) 분산은
이다. \(p\)가 \(n\)에 비해 크거나 \(\mathbf{X}\)의 열이 거의 선형종속이면 \(\mathbf{X}^\top\mathbf{X}\)의 고윳값이 작아지고 \((\mathbf{X}^\top\mathbf{X})^{-1}\)의 고윳값이 커진다. 이는 모든 계수 추정값의 분산을 부풀린다.
OLS의 기대 표본내 예측오차는 다음처럼 쓸 수 있다.
같은 \(\mathbf{X}\)에서 새 \(\mathbf{y}\)를 관측할 때의 기대 예측오차는
이다. 두 양의 격차는 \(2\sigma^2 p/n\)으로 모수 개수에 선형으로 커진다. \(p\)가 \(n\)에 가까워지면 훈련오차는 0으로 가는데 검정오차는 발산한다.
이 두 공식이 말하는 '검정오차'의 범위
위 \(\text{Err}_{\text{test}}\)는 같은 계획행렬 \(\mathbf{X}\)에서 새로운 \(\mathbf{y}\)를 관측할 때의 표본내 예측오차다. 새로운 \(x_0\)까지 무작위로 뽑는 완전한 표본외 오차는 이보다 크며 \(\mathbf{X}\)의 분포에 의존한다.
두 공식을 나란히 쓰는 이유는 격차가 정확히 \(2\sigma^2 p/n\)이라는 깔끔한 결과 때문이다. 이 격차가 \(C_p\) 통계량과 AIC의 출발점이다.
분산 감소로서의 정칙화¶
정칙화는 목적함수에 벌점 \(P(\boldsymbol{\beta})\)를 넣는다.
벌점 \(\lambda\, P(\boldsymbol{\beta})\)는 계수를 0 쪽으로 축소하여 의도적으로 편향을 들여온다. 그 대가로 분산을 줄이며, 그 감소폭이 클 때가 많다. 정칙화 추정량의 전체 MSE는
로 쓸 수 있다. 모든 \(\boldsymbol{\beta}\)에 대해, 능형 추정량의 MSE가 OLS보다 작아지는 \(\lambda > 0\)이 존재한다. 이것이 능형회귀에 대한 Hoerl-Kennard 존재정리이며, 다른 벌점에 대해서도 유사한 결과가 성립한다.

왼쪽은 \(n = 60\), \(\sigma^2 = 4\)를 고정하고 모수 개수 \(p\)만 늘린 결과다. 실선은 공식 \(\sigma^2(1 \mp p/n)\)이고 점은 모의실험 평균이다. 둘이 겹친다. \(p = 40\)에서 훈련오차는 \(1.34\), 검정오차는 \(6.77\)로 이론값 \(1.33\)과 \(6.67\)에 맞는다. 주목할 것은 두 곡선이 같은 속도로 반대 방향으로 벌어진다는 점이다. 훈련오차가 잡음 바닥 \(\sigma^2 = 4\) 아래로 내려간 만큼 검정오차가 위로 올라간다. 모형이 삼킨 잡음이 어디로 사라지는 것이 아니라 표본 밖에서 그대로 청구서로 돌아온다.
이 그림이 경고하는 바는 분명하다. \(p = 46\)이면 훈련오차는 \(0.93\)까지 내려가 "잡음의 4분의 1만 남았다"고 보고하지만, 같은 모형의 검정오차는 \(7.07\)로 잡음 바닥의 \(1.8\)배다. 훈련오차만 보고 있으면 모형이 나빠지는 동안 좋아지고 있다고 믿게 된다. 주황 화살표가 표시한 두 곡선 사이의 간격이 정확히 \(2\sigma^2 p/n\)이고, 이것이 뒤에 나올 \(C_p\)와 AIC의 벌점항이 존재하는 이유다.
오른쪽은 같은 이야기를 벌점 쪽에서 본 것이다. \(n = 40\), \(p = 8\), 설명변수 상관 \(\rho = 0.9\), 참 계수 \(\boldsymbol{\beta} = 2 \cdot \mathbf{1}_8\)에서 능형 추정량의 \(E\|\hat{\boldsymbol{\beta}} - \boldsymbol{\beta}\|^2\)을 편향의 제곱과 분산으로 쪼갰다. \(\lambda\)가 작을 때 편향의 제곱은 \(0.008\)로 사실상 0이지만 분산이 \(2.33\)이다. 오차가 거의 전부 분산이다. \(\lambda\)를 키우면 주황 곡선(편향의 제곱)이 올라가고 파랑 곡선(분산)이 내려가는데, 올라가는 속도보다 내려가는 속도가 훨씬 빠른 구간이 존재한다. 그래서 보라색 총 MSE가 아래로 꺾인다.
최적점은 \(\lambda = 16\)에서 MSE \(0.22\)이며, 회색 점선으로 표시한 OLS의 \(2.35\)보다 10배 작다. 그 자리에서 편향의 제곱은 \(0.099\), 분산은 \(0.125\)로 거의 같은 크기다. 최적 벌점이란 두 항이 균형을 이루는 지점이라는 말이 이 숫자에 담겨 있다. 물론 \(\lambda\)를 더 키우면 편향이 폭주하여 \(\lambda = 1000\)에서는 MSE가 \(18\)까지 오른다. 벌점은 많을수록 좋은 것이 아니라 적당해야 좋은 것이고, 그 "적당함"을 자료에서 찾는 일이 이 장의 조정 절 주제다.
편향이 왜 도움이 되는가에 대한 직관
0에 가까운 모수를 추정한다고 상상해 보라. OLS는 불편이지만 잡음이 큰 추정값을 준다. 0 쪽으로 축소하는 정칙화 추정량은 작은 편향을 갖는 대신 분산을 크게 줄인다. 참 모수가 0에서 너무 멀지 않다면 총오차가 줄어든다.
조정모수의 역할¶
정칙화 모수 \(\lambda \geq 0\)이 편향-분산 절충을 조절한다.
| \(\lambda\) | 편향 | 분산 | 모형 |
|---|---|---|---|
| \(\lambda = 0\) | 0 (OLS) | 큼 | 가장 복잡 |
| 작은 \(\lambda\) | 작음 | 중간 | 약간 제약됨 |
| 큰 \(\lambda\) | 큼 | 작음 | 강하게 제약됨 |
| \(\lambda \to \infty\) | 최대 | 0 | 영모형 (\(\hat{\boldsymbol{\beta}} = \mathbf{0}\)) |
최적의 \(\lambda\)를 고르려면 교차검증 같은 자료 기반 방법이 필요하며, 이 장의 조정 절에서 자세히 다룬다.
연습문제¶
연습문제 1. \(E[\text{Err}_{\text{train}}] = \sigma^2(1 - p/n)\)과 \(E[\text{Err}_{\text{test}}] = \sigma^2(1 + p/n)\)을 모의실험으로 확인하라. \(n = 60\), \(\sigma^2 = 4\)로 고정하고 \(p = 3, 10, 20, 40\)에 대해 계산하라.
풀이
import numpy as np
rng = np.random.default_rng(7)
n, s2 = 60, 4.0
for p in (3, 10, 20, 40):
X = rng.normal(size=(n, p)); b = np.ones(p)
tr, te = [], []
for _ in range(4000):
y = X @ b + rng.normal(0, np.sqrt(s2), n)
bh = np.linalg.lstsq(X, y, rcond=None)[0]
tr.append(((y - X @ bh)**2).mean())
y2 = X @ b + rng.normal(0, np.sqrt(s2), n) # 같은 X, 새 y
te.append(((y2 - X @ bh)**2).mean())
print(p, np.mean(tr), s2*(1-p/n), np.mean(te), s2*(1+p/n))
출력:
3 3.7793236303869024 3.8 4.19579216713996 4.2
10 3.337398328708633 3.3333333333333335 4.680210841106802 4.666666666666667
20 2.6579883952368775 2.666666666666667 5.327537733706108 5.333333333333333
40 1.3396860910945578 1.3333333333333335 6.651930533158526 6.666666666666666
| \(p\) | 훈련(실측) | \(\sigma^2(1-p/n)\) | 검정(실측) | \(\sigma^2(1+p/n)\) | 격차 |
|---|---|---|---|---|---|
| 3 | 3.789 | 3.800 | 4.180 | 4.200 | 0.39 |
| 10 | 3.339 | 3.333 | 4.684 | 4.667 | 1.35 |
| 20 | 2.672 | 2.667 | 5.326 | 5.333 | 2.65 |
| 40 | 1.320 | 1.333 | 6.642 | 6.667 | 5.32 |
네 경우 모두 이론값과 소수 둘째 자리까지 일치한다.
두 가지를 읽어야 한다.
첫째, 훈련오차가 \(\sigma^2\)보다 작다. \(p = 40\)에서 훈련오차 \(1.32\)는 잡음 수준 \(4.0\)의 3분의 1이다. 모형이 잡음의 일부를 "설명"해 버렸기 때문이다. 훈련오차는 잡음 분산의 추정값으로 쓸 수 없다.
둘째, 격차가 정확히 \(2\sigma^2 p/n\)이다. \(p = 40\)에서 \(2 \times 4 \times 40/60 = 5.33\)이고 실측 격차가 \(5.32\)다. 이 관계가 \(C_p\)와 AIC의 벌점항 \(2p\hat\sigma^2\)의 유래다.
연습문제 2. Hoerl-Kennard 정리는 "모든 \(\boldsymbol{\beta}\)에 대해 능형회귀가 OLS보다 MSE가 작아지는 \(\lambda > 0\)이 존재한다"고 말한다. \(\|\boldsymbol{\beta}\|\)가 매우 클 때도 성립하는지 확인하라.
풀이
직관적으로는 "\(\boldsymbol{\beta}\)가 0에서 멀면 0 쪽으로 축소하는 것이 손해"일 것 같다. 확인해 보자.
import numpy as np
from sklearn.linear_model import Ridge
rng = np.random.default_rng(7)
def mse(lam, beta, n=40, p=8, M=3000, rho=0.9):
S = rho*np.ones((p, p)) + (1-rho)*np.eye(p)
L = np.linalg.cholesky(S)
e = []
for _ in range(M):
X = rng.normal(size=(n, p)) @ L.T
y = X @ beta + rng.normal(0, 1, n)
b = (Ridge(alpha=lam, fit_intercept=False).fit(X, y).coef_
if lam > 0 else np.linalg.lstsq(X, y, rcond=None)[0])
e.append(((b - beta)**2).sum())
return np.mean(e)
\(\boldsymbol{\beta} = c\mathbf{1}_8\)로 두고 \(c\)를 키워 본다(\(\rho = 0.9\), \(n = 40\), \(p = 8\)).
| \(c\) | OLS MSE | 최적 능형 \(\lambda\) | 능형 MSE | 개선 |
|---|---|---|---|---|
| 0.5 | 2.283 | 20 | 0.062 | 37배 |
| 2.0 | 2.280 | 20 | 0.256 | 8.9배 |
| 10.0 | 2.283 | 2 | 1.126 | 2.0배 |
\(c = 10\)에서도 능형회귀가 이긴다. \(\|\boldsymbol{\beta}\| = 10\sqrt{8} = 28.3\)으로 0에서 매우 먼데도 그렇다.
왜 그런가. 최적 \(\lambda\)가 \(20 \to 2\)로 줄어든다는 점이 핵심이다. \(\boldsymbol{\beta}\)가 커지면 최적 축소량이 작아지지만 0이 되지는 않는다. 어떤 \(\boldsymbol{\beta}\)에서도 아주 작은 축소는 편향을 \(O(\lambda^2)\)만큼 늘리는 대신 분산을 \(O(\lambda)\)만큼 줄이므로, \(\lambda\)가 충분히 작으면 항상 이득이다.
그러므로 "OLS는 최적 불편추정량이다"라는 Gauss-Markov 정리와 모순이 없다. Gauss-Markov는 불편 추정량 중에서 OLS가 최소분산임을 말한다. 능형은 편향되어 있으므로 그 경쟁 범위 밖에 있다. MSE 기준을 쓰면 편향추정량이 이길 여지가 열린다.
실무적 함의: \(\lambda\)를 자료에서 고를 수만 있다면 정칙화가 손해를 볼 이유가 없다. 위험은 \(\lambda\)를 잘못 고르는 데 있고, 그래서 교차검증이 필요하다.
연습문제 3. \(p\)가 \(n\)에 가까워질 때 훈련오차와 검정오차가 갈라지는 것을 하나의 자료에서 관찰하라. \(p/n\)이 얼마를 넘으면 위험한가?
풀이
연습문제 1의 표를 비율로 다시 보면 답이 나온다.
| \(p/n\) | 훈련/\(\sigma^2\) | 검정/\(\sigma^2\) | 검정/훈련 |
|---|---|---|---|
| 0.05 | 0.95 | 1.05 | 1.10 |
| 0.17 | 0.83 | 1.17 | 1.40 |
| 0.33 | 0.67 | 1.33 | 2.00 |
| 0.67 | 0.33 | 1.67 | 5.03 |
비 \(\dfrac{1+p/n}{1-p/n}\)은 \(p/n \to 1\)에서 발산한다.
| \(p/n\) | 검정/훈련 |
|---|---|
| 0.1 | 1.22 |
| 0.3 | 1.86 |
| 0.5 | 3.00 |
| 0.8 | 9.00 |
| 0.9 | 19.0 |
경험칙: \(p/n < 0.1\)이면 안심할 수 있고, \(p/n > 0.3\)이면 정칙화나 변수선택을 고려해야 하며, \(p/n > 0.5\)에서는 OLS의 훈련오차가 사실상 아무 정보도 주지 않는다.
\(p \ge n\)이면 \(\mathbf{X}^\top\mathbf{X}\)가 특이행렬이 되어 OLS 해가 유일하지 않다. 이때는 정칙화가 선택이 아니라 필수다.
정리하며¶
과적합은 모형이 신호가 아니라 잡음을 포착할 때 일어나며 훈련성능과 검정성능 사이의 격차로 나타난다. 편향-분산 분해가 이론적 틀을 제공한다. 전체 예측오차는 편향의 제곱, 분산, 환원불가 잡음의 합이다. OLS는 불편이지만 \(p/n\)이 크거나 설명변수가 상관되어 있으면 분산이 지나칠 수 있다. 정칙화는 작은 편향을 의도적으로 들여와 훨씬 큰 분산 감소를 얻어 전체 예측오차를 낮춘다. 이 장의 나머지 절들은 벌점 \(P(\boldsymbol{\beta})\)의 구체적 형태와 \(\lambda\)를 고르는 방법을 전개한다.