머신러닝&딥러닝/Do it ! 딥러닝 입문

과대적합과 과소적합

욱이명 2020. 12. 23. 23:28

훈련 세트와 검증 세트는 모델의 과대적합(overfitting), 과소적합(underfitting)이라는 문제와 깊은 연관이 있다.

과대적합과 과소적합이란

과대적합이란 모델이 훈련 세트에서는 좋은 성능을 내지만 검증 세트에서는 낮은 성능을 내는 경우를 말한다. 구체적인 예로 분류 문제에서 훈련 세트의 정확도가 99%이고 검증 세트의 정확도가 80% 수준이라면 과대적합을 의심할 수 있다. 반면에 과소적합은 훈련 세트와 검증 세트의 성능에는 큰 차이가 없지만 모두 낮은 성능을 내는 경우이다.

 위와 같은 그래프를 학습 곡선(learning curve)이라고 부른다. 첫 번째 학습 곡선은 과대적합의 전형적인 모습이다. 훈련 세트와 검증 세트에서 측정한 성능의 간격이 크다. 그래서 과대적합된 모델을 '분산이 크다(high variance)'라고도 말한다. 과대적합의 주요 원인 중 하나는 훈련 세트에 충분히 다양한 패턴의 샘플이 포함되지 않은 경우이다. 훈련 세트에 다양한 패턴의 샘플이 없으니 검증 세트에 제대로 적응하지 못한 것이다. 이런 경우에는 더 많은 훈련 샘플을 모아 검증 세트의 성능을 향상시킬 수 있다. 현실적인 한계로 훈련 샘플을 더 많이 모을 수 없는 경우에는 모델이 훈련 세트에 집착하지 않도록 가중치를 제한할 수 있다. 이를 '모델의 복잡도를 낮춘다'라고 말하기도 한다. 두 번째 학습 곡선은 전형적인 과소적합의 모습이다. 훈련 세트와 검증 세트에서 측정한 성능의 간격은 점점 가까워지지만 성능 자체가 낮다. 그래서 과소적합된 모델을 '편향이 크다(high bias)'라고도 말한다. 과소적합은 모델이 충분히 복잡하지 않아 훈련 데이터에 있는 패턴을 모두 잡아내지 못하는 현상이다. 과소적합을 해결하는 대표적인 방법은 복잡도가 더 높은 모델을 사용하거나 가중치의 규제를 완화하는 것이다. 마지막으로 세 번째 학습 곡선은 과대적합과 과소적합 사이에서 절충점을 찾은 모습이다.

 

또, 에포크에 대한 손실 함수의 그래프를 사용하여 과대적합과 과소적합을 분석하기도 한다. 그래서 에포크에 대한 손실 함수의 그래프를 학습 곡선이라고 부르는 경우도 종종 있다. 다음은 에포크와 손실 함수에 대한 그래프와 에포크와 정확도에 대한 그래프이다.

왼쪽 그래프는 검증 세트의 손실과 훈련 세트의 손실을 나타낸 것이다. 훈련 세트의 손실은 에포크가 진행될수록 감소하지만 검증 세트의 손실은 에포크의 횟수가 최적점을 지나면 오히려 상승한다. 최적점 이후에도 계속해서 훈련 세트로 모델을 학습시키면 모델이 훈련 세트의 샘플에 더 밀착하여 학습하기 때문이다. 즉, 모델이 과대적합되기 시작한다. 반대로 최적점 이전에는 훈련 세트와 검증 세트의 손실이 비슷한 간격을 유지하면서 함께 줄어드는데, 이 영역에서 학습을 중지하면 과소적합된 모델이 만들어진다. 오른쪽 그래프는 세로 축에 손실 대신 정확도를 사용했다. 왼쪽 그래프와 비교해 보면 그래프가 뒤집혔을 뿐 해석은 동일함을 알 수 있다.

 

그리고 가끔 가로 축에 에포크 대신 모델 복잡도를 넣어 그래프를 표현하기도 한다.

모델 복잡도란 모델이 가진 학습 가능한 가중치 개수를 말하는데, 층의 개수나 유닛의 개수가 많아지면 복잡도가 높은 모델이 만들어진다. 모델이 복잡해지면 무조건 좋은 성능을 내는것이 아니다. 예를 들어 모델이 훈련 세트에만 잘 맞는 형태로 만들어지면 훈련 세트에서만 좋은 성능을 내기 때문이다. 과대적합이 바로 그런 경우이다.

 

지금까지 과대적합과 과소적합에 대한 개념을 다양한 학습 곡선을 통해 설명했다. 좋은 성능을 내는 모델을 만들기 위해서는 여러 조건이 필요하다는 것을 알 수 있었다. 지금은 훈련 세트의 크기나 모델의 복잡도를 변화시키기 어려우므로 적절한 에포크 횟수를 찾아보겠다.

 

적절한 편향-분산 트레이드오프 선택

앞에서 과소적합된 모델은 '편향되었다'라고 하고 과대적합된 모델은 '분산이 크다'라고 한다고 했다. 과소적합된 모델(편향)과 과대적합된 모델(분산) 사이의 관계를 편향-분산 트레이드오프(bias-variance tradeoff)라고 한다. 트레이드오프라는 말이 들어간 이뉴는 '하나를 얻기 위해서는 다른 하나를 희생해야 하기 때문'이다. 즉, 편향-분산 트레이드오프란 편향을 줄이면(훈련 세트의 성능을 높이면) 분산이 커지고(검증 세트와 성능 차이가 커지고) 반대로 분산을 줄이면(검증 세트와 성능 차이를 줄이면) 편향이 커지는(훈련 세트의 성능이 낮아진다는)것을 말한다. 따라서 분산이나 편향이 너무 커지지 않도록 적절한 중간 지점을 선택해야 한다. 그리고 이런 행위를 '적절한 편향-분산 트레이드오프를 선택했다'라고 한다. 여기서는 경사 하강법의 에포크 횟수에 대한 모델의 손실을 그래프로 그려 '적절한 편향-분산 트레이드오프'를 선택한다.

 

훈련 세트의 손실을 기록했듯이 검증 세트에 대한 손실을 기록한 다음 기록한 값으로 그래프를 그려보겠다. 이를 위해 SingleLayer 클래스의 __init__() 메서드에 self.val_losses 인스턴스 변수를 추가한다.

그 다음 fit() 메서드에 검증 세트를 전달 받을 수 있도록 x_val, y_val 매개변수를 추가한다.

검증 세트의 손실은 update_val_loss() 메서드에서 계산한다.

이 과정을 간단히 설명하면 먼저 검증 세트 샘플을 정방향으로 계산한 다음 활성화 함수를 통과시켜 출력값을 계산한다. 이 값을 사용하여 로지스틱 손실 함수의 값을 계산해서 val_losses 리스트에 추가한다. 

 

이제 표준화(전처리)된 훈련 세트와 검증 세트를 이용하여 단일층 신경망을 훈련하고 검증 손실과, 훈련 손실의 값으로 그래프를 그려보겠다.

이 그래프를 보면 검증 손실이 대략 20번째 에포크 이후에 훈련 세트보다 높아지는 것을 알 수 있다. 그래서 이 모델은 20번의 에포크 이후에는 훈련할 필요가 없다.

 

이렇게 훈련을 일찍 멈추는 기법을 조기 종료(early stopping)라고 부른다. 20번의 에포크까지 모델을 훈련한 다음 검증 세트의 성능을 확인해 보겠다.

과대적합되기 전에 훈련을 멈추었으므로 검증 세트의 성능이 0.967에서 0.978로 조금 더 향상되었다.