본문으로 이동

과적합

훈련 손실은 계속 내려가는데 검증 손실이 어느 시점부터 올라간다면, 더 오래 학습할지 먼저 멈출지 판단해야 한다. 모델이 훈련 표본에 잘 맞는 것과 새로운 입력에서도 잘 맞는 것은 다른 질문이다. 훈련에서 배운 패턴을 새 데이터에 적용하는 능력을 일반화(generalization)라고 한다.

훈련에서 줄어든 오차가 검증에서도 줄어드는가

훈련 손실은 계속 내려가는데 검증 손실이 어느 시점부터 올라간다면, 더 오래 학습할지 먼저 멈출지 판단해야 한다. 모델이 훈련 표본에 잘 맞는 것과 새로운 입력에서도 잘 맞는 것은 다른 질문이다. 훈련에서 배운 패턴을 새 데이터에 적용하는 능력을 일반화(generalization)라고 한다.

훈련 데이터의 우연한 패턴이나 잡음에 지나치게 맞춰 새 데이터에서 성능이 나빠지는 상태가 과적합(overfitting)이다. 반대로 훈련 데이터의 규칙성도 충분히 포착하지 못하면 과소적합(underfitting)을 의심한다. 모델의 표현력이 부족할 수도 있고, 아직 학습이 덜 됐거나 입력·손실·gradient 계산에 문제가 있을 수도 있다.

두 손실을 읽을 때는 곡선의 모양과 다음에 확인할 원인을 함께 본다.

관찰 살펴볼 가능성 먼저 확인할 것
훈련 손실은 감소하지만 검증 손실은 최저점 뒤 상승 훈련 표본에 지나치게 맞아가는 과적합 같은 지표·평가 모드인지, 분포 차이와 검증 표본의 변동
훈련·검증 손실이 모두 높은 채 정체 표현력이나 학습 예산 부족, 과도한 규제, 최적화·구현 문제 기준 모델, 입력·라벨, gradient와 학습률
훈련·검증 손실이 모두 목표 수준에 도달 현재 검증 분포에서 잘 맞는 후보 데이터 누수와 별도로 보존한 최종 test 결과

여기서 높고 낮다는 말에는 비교 기준이 필요하다. 서로 다른 손실 함수의 절대값을 바로 비교하거나, 검증 손실이 한 번 올랐다는 이유만으로 암기를 확인했다고 판단하지 않는다. 데이터 분할과 최종 평가의 구분은 검증 데이터에서 이어진다.

같은 모델 상태에서 두 손실을 잰다

한 에폭 동안 기록한 훈련 손실은 배치마다 다른 가중치에서 계산된 값일 수 있다. 여기에 Dropout이나 무작위 입력 변형까지 적용했다면, 에폭이 끝난 모델을 고정된 검증 입력에 평가한 손실과 계산 조건이 다르다. 이 차이 때문에 검증 손실이 훈련 손실보다 작게 나올 수도 있다.

일반화 격차를 비교하려면 각 에폭의 훈련 직후 같은 모델을 고정하고, 비교할 데이터에 같은 손실 정의와 추론 모드를 적용한다. 훈련용 증강과 벌점 항을 포함했는지도 기록한다. 20 epoch 학습을 모두 마친 뒤 최종 모델의 검증 손실을 20번 계산하면 중간의 20개 모델을 평가한 곡선이 되지 않는다.

현재 NumPy NeuralNetwork의 loss(x,y,train=False)는 Dropout의 추론 분기와 BatchNorm의 running 통계를 사용한다. train=True의 마스크와 현재 배치 통계가 검증에 섞이지 않게 하는 것이다. 다만 현재 CLI는 application.py의 train()에서 에폭별 훈련 손실과 validation accuracy를 기록한다. 이를 이미 수집된 epoch별 validation loss 곡선으로 소개하지 않는다. 현재 모델의 모드 전환 · 61b7000, 현재 학습·평가 경로 · 61b7000

표현할 수 있는 함수와 실제로 배운 함수

직선만 표현하는 모델로 굽은 관계를 맞추려 하면 충분히 학습해도 규칙을 놓칠 수 있다. 더 복잡한 함수를 표현하도록 모델 용량(capacity)을 늘리는 이유다. 반면 표본 하나하나를 지나는 곡선을 만들 수 있어도, 그 곡선이 새 입력의 답을 잘 예측한다는 보장은 없다.

신경망의 폭과 깊이는 용량에 영향을 준다. 그러나 파라미터 수만으로 실제로 선택된 함수나 일반화 성능을 결정할 수는 없다. 모델 구조, 입력이 제공하는 정보, 규제와 optimizer의 학습 과정이 함께 작용한다. 두 실패 상태 사이에 늘 하나의 최적 경계가 존재하거나, 폭을 늘릴 때 검증 오차가 반드시 한 방향으로 움직인다고 가정하지 않는다.

현재 NeuralNetwork에서 비교할 수 있는 설정은 다음과 같다. 각 행은 측정 전의 후보이며 이름만으로 과소적합·과적합·최적 모델을 확정하지 않는다.

후보 hidden_sizes use_batchnorm use_dropout 확인할 질문
작은 은닉층 [16] False False 훈련 오차가 충분히 내려가는가?
넓은 은닉층 [512,256] False False 추가 용량이 훈련·검증 양쪽에 도움이 되는가?
같은 폭에 다른 학습 계산 [512,256] True True, dropout_ratio=0.5 통계·마스크의 변화가 같은 평가 기준에서 도움이 되는가?

784→16→10의 Affine 가중치 수는 784*16+16*10=12,704이고, 편향 26개까지 포함하면 12,730개다. 공식 MNIST training 60,000장을 이 수로 나누면 약 4.7이지만, 이 비율은 저장 슬롯 수나 과소적합 판정 기준이 아니다. 784→512→256→10은 편향을 포함해 535,818개이므로 같은 비율은 약 0.11이다. 이 차이만으로 어느 모델이 외우거나 일반화할지 결정할 수는 없다. BatchNorm의 학습 파라미터·저장 통계는 별도로 센다. 더 넓은 구조의 세부 계산과 현재 50,000/10,000 분할은 검증 데이터에서 확인할 수 있다.

편향과 분산은 여러 훈련 표본에 걸친 질문이다

같은 입력 x를 서로 다른 훈련 데이터로 학습한 모델에 넣어 보자. 예측이 평균적으로 정답에서 얼마나 벗어나는지와, 훈련 표본이 바뀔 때 예측이 얼마나 흔들리는지는 서로 다른 성질이다. 이를 각각 편향(bias)과 분산(variance)으로 구분한다.

제곱오차 회귀에서 Y=f*(x)+ε, f*(x)=E[Y|x], 조건부 평균이 0인 잡음을 가정하자. 훈련 데이터 D에 따라 달라지는 예측을 f_D(x)라 하면, 독립된 새 관측에 대한 기대 오차는 다음처럼 나뉜다.

E[(Y-f_D(x))²] = (E_D[f_D(x)]-f*(x))² + Var_D(f_D(x)) + Var(ε|x)

첫 항은 평균 예측의 편향 제곱, 둘째는 훈련 표본에 따른 예측의 분산, 마지막은 현재 입력 정보로 없앨 수 없는 잡음이다. 여기서 기대값은 훈련 표본과 새 관측에 걸친 값이다. 한 번 그린 train/validation 곡선의 간격이 바로 분산이 되는 것은 아니며, 이 식을 분류 정확도나 cross entropy에 그대로 대입하지도 않는다. 제곱오차의 편향·분산 분해

단순한 모델의 표현 한계는 큰 편향으로, 훈련 표본 변화에 민감한 학습은 큰 분산으로 나타날 수 있다. 이는 원인을 나눠 생각하는 관점이다. 용량을 늘리면 언제나 편향은 감소하고 분산은 증가한다는 보편적 단조 관계까지 뜻하지 않는다.

다음 비교에서 바꿀 조건 하나

훈련 오차부터 큰 경우에는 입력·라벨·gradient와 학습률을 확인하고, 문제가 없다면 학습 예산이나 표현력을 조정한다. 훈련은 좋아지는데 검증이 나빠지는 경우에는 데이터 분포와 평가 절차를 먼저 맞춘 뒤 데이터 추가, 용량, 규제 강도나 종료 시점을 비교한다. 규제의 L2·Dropout·증강·Early Stopping은 각각 다른 위치에 개입한다.

Dropout의 p는 매번 정확히 p 비율을 끄는 개수가 아니라 각 원소를 차단할 확률이다. 현재 NumPy 구현의 추론 스케일과 PyTorch의 inverted 방식은 규제의 설명을 따른다. BatchNorm과 Dropout을 동시에 켠 결과 하나만으로 둘 중 무엇이 영향을 주었는지 구분할 수 없으므로, 다음 비교에서는 무엇을 하나 바꾸고 어느 검증 지표를 볼지 먼저 정한다.