지도 학습에서 가장 중요한 과제 중 하나는 훈련된 모델이 새로운 데이터에서는 잘 작동하는 가 입니다. 이를 위해 저희는 지난 포스팅에서 보았던 모집단 리스크(population risk)를 추정해야하지만 실제 데이터 분포를 알 수 없기 때문에 보통은 데이터를 나누는 방식으로 추정하게 됩니다.
먼저 데이터를 훈련 데이터와 검증 데이터로 나눕니다. 모델은 훈련 데이터를 이용해서 학습하고 검증 데이터에서 성능을 평가합니다. 이를 식으로 쓰면 다음과 같습니다.
$$R_{\lambda}(\theta, \mathcal{D}) = \frac{1}{|\mathcal{D}|} \sum_{(x, y) \in \mathcal{D}} l(y, f(x; \theta)) + \lambda C(\theta)$$
여기서 $\hat{\theta}_{\lambda}(\mathcal{D}_{\text{train}})$은 훈련 데이터로 학습된 모델의 파라미터를 의미합니다. 그리고 이 훈련데이터에 최적화된 파라미터를 검증 데이터에서 평가한 리스크는 다음과 같습니다.
$$R_{\lambda}^{\text{val}} = R_{0}(\hat{\theta}_{\lambda}(\mathcal{D}_{\text{train}}), \mathcal{D}_{\text{valid}})$$
즉, 훈련 데이터에 사용하지 않은 데이터를 이용해서 일반화 성능을 근사하는 것으로 이해하면 될 거 같습니다. 이 방식은 아주 간단하고 효과적이지만 데이터가 적을 때는 문제가 됩니다. 왜냐하면 훈련에 사용할 데이터가 부족해서 모델의 성능도 낮아지고 검증에 사용할 데이터도 부족해서 신뢰할 수 없는 평가가 나오기 때문이죠. 이를 위한 가장 대표적인 방식이 바로 교차검증(Cross-Validation)입니다. 방식은 아주 단순합니다. 데이터를 총 $K$개로 분할합니다. 그리고 각 분할(fold)를 한 번씩 검증용으로 사용하고 나머지 $K - 1$개는 다시 합쳐서 훈련 데이터로 사용합니다. 이 과정을 $K$번 반복하여 평균 성능을 계산하게 됩니다. 교차검증을 이용한 리스크를 다음과 같이 계산됩니다.
$$R_{\lambda}^{\text{cv}} = \frac{1}{K} \sum_{k = 1}^{K} R_{0}(\hat{\theta}_{\lambda}(\mathcal{D}_{-k}), \mathcal{D}_{k})$$
이때 $K = N$, 즉 데이터의 개수만큼 분할을 수행한다면 한 번에 하나의 데이터만 빼고 나머지로 훈련하는 Leave-One-Out CV(LOO CV)가 됩니다. 이 방식은 데이터가 매우 적을 때 유용하지만 계산량이 커진다는 단점이 있죠.
교차검증을 통해 구한 $R^{\text{cv}}_{\lambda}$를 최소화하는 하이퍼파라미터 $\hat{\lambda} = \text{argmin}_{\lambda} R_{\lambda}^{\text{cv}}$를 선택합니다. 마지막으로 전체 데이터를 모두 사용해 선택된 $\hat{\lambda}$로 최종 파라미터를 추정합니다.
$$\hat{\theta} = \text{argmin}_{\theta} R_{\hat{\lambda}} (\theta, \mathcal{D})$$