조기 종료(Early stopping): 훈련 손실(train loss)은 거짓말을 하고 검증 손실(validation loss)은 U자형으로
요약
모델이 훈련 데이터의 노이즈를 암기하여 과적합되는 현상을 방지하기 위한 조기 종료(Early stopping) 기법을 설명합니다. 검증 손실(validation loss)의 U자형 곡선을 모니터링하여 최적의 가중치를 저장하는 원리와 인내심(patience) 설정의 중요성을 다룹니다.
핵심 포인트
- 훈련 손실의 감소가 반드시 모델의 일반화 성능 향상을 의미하지는 않음
- 검증 손실이 최솟값을 찍고 상승하는 지점이 과적합의 시작점임
- 조기 종료는 검증 손실이 최저일 때의 모델 가중치를 저장하는 방식임
- Patience 설정을 통해 검증 손실의 일시적인 변동에 대응해야 함
충분히 큰 네트워크에 충분한 에포크(epoch)를 제공하면, 데이터의 노이즈(noise)를 암기함으로써 훈련(training) 손실(loss)을 0으로 몰아넣을 것입니다. 하지만 여러분이 실제로 관심을 갖는 것, 즉 보지 못한 데이터에 대한 오차는 다른 양상을 보입니다. 네트워크가 실제 신호(signal)를 학습할 때는 감소하다가, 일반화(generalize)되지 않는 특이점들을 맞추기 시작하면 최솟값에 도달한 후 다시 상승합니다. 두 가지를 모두 그래프로 그리면 딥러닝(deep learning)에서 가장 잘 알려진 도표를 얻게 됩니다. 즉, 0을 향해 미끄러지는 훈련 곡선(training curve)과 U자 모양을 그리는 검증 곡선(validation curve), 그리고 그 사이의 간격이 넓어지는 모습입니다. 그 간격이 바로 과적합(overfitting)입니다. 조기 종료(Early stopping)는 이 분야 전체에서 가장 단순하고 저렴한 해결책이며, 저는 16개의 노이즈가 섞인 지점에 대해 순수 경사 하강법(gradient descent)으로 실제 34-basis 모델을 맞추는 데모를 제작하여, U자형 변화(U-turn)가 실시간으로 일어나는 것을 볼 수 있도록 했습니다.
훈련 손실(Training loss)은 일반화(generalisation)에 대해 거짓말을 합니다
실제 데이터는 신호(signal)와 노이즈(noise)의 결합입니다. 신호가 필요로 하는 것보다 더 큰 용량(capacity)을 가진 모델은 먼저 광범위한 신호에 맞추게 되며(이는 훈련 및 검증 손실을 모두 낮춥니다), 그 후 정확한 노이즈 훈련 지점들을 통과하도록 스스로를 구부리기 시작합니다. 검증 세트의 노이즈는 서로 다르기 때문에, 이는 훈련 손실을 낮추지만 검증(val) 손실은 높입니다. 이 교차점이 검증(val) U자의 바닥입니다. 즉, 모델이 일반적인 특성을 학습하는 단계에서 구체적인 사항을 암기하는 단계로 전환되는 순간입니다. 따라서 옵티마이저(optimiser)가 그래디언트(gradient)를 전혀 보지 못하는 검증 세트(validation set)를 따로 떼어 놓아야 하며, 매 에포크(epoch)마다 그에 대한 손실을 측정하여 일반화에 대한 실시간 추정치를 얻습니다. 테스트 세트(test set)는 맨 마지막까지 봉인되어 있어야 합니다. 검증(val)에 맞춰 튜닝하는 순간, 검증 세트는 더 이상 '보지 못한 데이터'가 아니게 됩니다.
검증(val)을 관찰하고, 최적의 상태를 기억하세요
핵심 아이디어는 하나의 루프(loop)입니다. 각 에포크(epoch) 후에 검증 손실(val loss)을 평가합니다. 만약 그것이 지금까지 본 것 중 가장 좋다면, 가중치(weights)를 스냅샷(snapshot)으로 저장합니다. 그 스냅샷이 여러분이 실제로 유지하게 될 모델입니다. 그 외의 모든 과정은 단지 언제 그만둘지를 결정하는 것뿐입니다:
best_val = float("inf"); best_state = None
for epoch in range(max_epochs):
train_one_epoch(model, train_loader)
...
인내심(Patience)과 최소 변화량(min-delta)은 노이즈가 여러분을 속이지 못하게 합니다
검증 손실 (Val loss)은 유한하고 노이즈가 있는 데이터셋에서 측정되므로 요동칩니다. 즉, 한두 에포크 (epoch) 동안 상승했다가 다시 새로운 최솟값으로 계속 떨어질 수 있습니다. 만약 첫 번째 상승 시점에 멈춘다면 너무 일찍 중단하게 될 것입니다. 인내심 (Patience) 이 해결책입니다. 최솟값을 경신하지 못한 에포크가 연속으로 몇 번인지 계산하고, 그 카운터가 patience에 도달했을 때만 중단하십시오. 새로운 최솟값을 찾을 때마다 카운터를 0으로 초기화합니다. 또한 임계값 (threshold)이 없다면, 0.00001과 같은 미세한 하락도 "개선"으로 간주되어 인내심을 초기화하고 노이즈 속에서 영원히 학습을 지속하게 만듭니다. 따라서 최소 변화량 (min-delta) 을 통해 개선으로 인정할 최소한의 변화량을 설정합니다.
if v < best_val - min_delta: # 마진(margin)을 두고 경신해야 함
best_val = v; best_state = deepcopy(model.state_dict()); wait = 0
else:
...
최적의 가중치 복구 (Restore best weights) — 모두가 잊어버리는 단계
사람들이 가장 많이 실수하는 부분입니다. 루프가 중단될 때, 모델은 최적의 에포크에 있는 것이 아닙니다. patience 에포크만큼 지난 시점이며, 이미 과적합 (overfitting) 단계로 미끄러지고 있습니다. 모델을 있는 그대로 배포한다면 조기 종료의 이점을 모두 날려버리는 셈입니다. 스냅샷을 다시 불러오십시오:
model.load_state_dict(best_state) # 최적의 검증 손실(best-val) 에포크로 되감기
# 이것이 바로 배포해야 할 모델입니다. 이 단계를 건너뛰면 조기 종료는 절반만 수행된 것입니다.
데모에서 "최적의 가중치 복구 (restore best weights)"를 끄면 배포된 모델의 테스트 오차 (test error)가 눈에 띄게 급증합니다. 그 급증은 바로 당신이 실수로 유지해버린 patience 에포크만큼의 과적합 결과입니다. Keras는 심지어 restore_best_weights의 기본값을 False로 설정하여 많은 사람을 조용히 곤란하게 만듭니다. 항상 True로 설정하십시오.
이것이 암시적 규제 (implicit regularisation)인 이유
이것은 단순한 중단 휴리스틱 (stopping heuristic)이 아닙니다. 이는 훈련 스케줄 속에 숨겨진 규제 (regularisation)입니다. 경사 하강법 (Gradient descent)은 작은 가중치에서 시작하여 매 단계마다 이를 조금씩 키워나가기 때문에, 훈련을 오래 할수록 가중치는 더 멀리 이동하며 더 구불구불한 (wigglier) 함수를 표현할 수 있게 됩니다. 조기에 중단하는 것은 가중치가 이동할 수 있는 범위를 제한하여, 결과적으로 유효 모델을 더 단순하게 유지합니다. 선형 최소제곱법 (linear least-squares fit)의 경우, t 단계 후에 중단하는 것이 특정 강도의 L2 (ridge) 패널티를 적용한 것과 거의 정확히 동일한 솔루션을 제공한다는 것을 증명할 수 있습니다. 즉, 단계가 적을수록 ⇔ 더 강한 수축 (shrinkage)이 일어납니다. 이것이 바로 패널티 항을 추가하지 않고도 과적합 (overfitting)에 대응하며, 가중치 감쇠 (weight decay) 및 드롭아웃 (dropout)과 결합되어 거의 공짜로 얻을 수 있는 이유입니다. 유일한 실제 비용은 따로 떼어둔 데이터의 일부뿐이며, 심지어 낭비되는 에포크 (epoch)를 아껴주기도 합니다. 이것이 바로 거의 모든 진지한 훈련 과정에서 기본적으로 활성화되어 있는 이유입니다.
Train을 누르고 훈련 MSE는 떨어지는 동안 검증 MSE가 U자형으로 변하는 것을 지켜보세요. 그다음 patience를 드래그하여 중단 시점을 조절해 보세요:
https://dev48v.infy.uk/dl/day45-early-stopping.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기