사전 과적합
문제

과적합

gabury1고친 사람 github-actions[bot]

과적합은 모델이 공부한 데이터만 잘 맞히고 처음 보는 데이터는 못 맞히게 되는 고장입니다. 데이터 속의 규칙을 배우는 대신 데이터 자체를 외워 버린 상태입니다. 학습 점수는 계속 좋아지므로 그 점수만 보아서는 드러나지 않습니다.

쉽고 빠른 이해

과적합은 모델이 학습에 쓴 데이터만 잘 맞히고 새 데이터는 못 맞히는 상태입니다. 지난달 메일로 학습한 스팸 필터가 지난달 스팸은 다 가려내면서 이번 주 스팸은 놓치는 모습입니다.

이 고장에 따로 이름이 붙은 까닭은 학습 점수로는 안 보이기 때문입니다. 학습을 오래 할수록 학습 데이터 점수는 계속 오릅니다. 학습에 안 쓴 데이터로 재 봐야 떨어진 것이 보입니다.

어떻게 도나:

  1. 모델이 데이터 속 규칙을 배웁니다. 두 점수가 함께 오릅니다
  2. 규칙을 다 배운 뒤에도 학습을 이어 갑니다
  3. 모델이 그 데이터에만 있던 우연한 흔들림까지 외웁니다. 새 데이터 점수가 떨어집니다

무엇이 나빠지나 — 서비스에 내놓은 모델이 개발할 때 본 점수보다 못합니다. 막으려면 학습에 안 쓸 데이터를 따로 떼어 두어야 해서 학습에 쓸 데이터가 줄어듭니다.

상세

이 절은 과적합이 무엇인지부터 세웁니다. 작은 예 두 개로 과적합이 생기는 조건을 보입니다. 이어서 학습 중에 알아채는 법과 이웃한 문제를 가릅니다.

기출문제를 외운 수험생

기출문제집 한 권을 답까지 외운 수험생이 있습니다. 문제집에 있던 문제가 나오면 전부 맞힙니다. 숫자 하나만 바뀌어도 손을 못 댑니다. 풀이를 익힌 것이 아니라 문제와 답의 짝을 외웠기 때문입니다.

모델과 훈련 세트

머신러닝에서 모델은 입력을 받아 답을 내는 함수입니다. 메일 제목을 넣으면 「스팸」이나 「정상」을 내는 식입니다. 이 함수 안에는 숫자가 여럿 들어 있습니다. 이 숫자를 파라미터라고 합니다.

학습은 답을 아는 예제를 보여 주며 파라미터를 조금씩 고치는 일입니다. 예제마다 모델의 답과 정답이 얼마나 다른지 잽니다. 그 차이가 줄어드는 쪽으로 숫자를 옮깁니다.

이 차이를 오차라고 부릅니다. 오차가 작을수록 모델의 점수가 높습니다. 그래서 「점수가 오른다」와 「오차가 줄어든다」는 같은 변화를 두 쪽에서 본 말입니다.

학습에 쓰는 예제 묶음을 훈련 세트라고 합니다. 훈련 세트에서 잰 오차가 훈련 오차입니다.

모델을 만드는 목적은 훈련 세트를 맞히는 것이 아닙니다. 앞으로 들어올 새 입력을 맞히는 것입니다. 처음 보는 입력에서도 오차가 작은 성질을 일반화라고 합니다.

과적합은 훈련 오차는 작은데 새 입력에서의 오차는 큰 상태입니다. 모델이 훈련 세트에서만 통하는 것을 배웠다는 뜻입니다.

규칙과 잡음

데이터에는 두 가지가 섞여 있습니다. 하나는 새 데이터에도 되풀이되는 규칙입니다. 다른 하나는 그 데이터를 모을 때 우연히 끼어든 흔들림입니다. 이 흔들림을 잡음이라고 부릅니다.

스팸 필터라면 「무료」·「당첨」 같은 낱말이 스팸에 자주 나온다는 것이 규칙입니다. 훈련 세트의 스팸 세 통이 하필 화요일에 왔다는 것은 잡음입니다. 다음 달 스팸은 요일을 가리지 않고 옵니다.

모델은 둘을 구별하지 못합니다. 훈련 오차를 줄이는 데 도움이 되면 잡음도 배웁니다. 잡음을 배운 만큼 새 데이터에서는 틀립니다. 과적합은 모델이 잡음까지 배운 결과입니다.

점 다섯 개를 지나는 곡선

가장 작은 재현은 점 다섯 개로 합니다. 직선 하나를 긋고 그 근처에 점 다섯 개를 찍습니다. 점마다 직선에서 조금씩 위아래로 비껴 있습니다. 직선이 규칙이고 비껴난 만큼이 잡음입니다.

이 점들에 맞출 모델을 둘 고릅니다. 하나는 직선입니다. 기울기와 절편, 파라미터가 두 개입니다. 다른 하나는 4차 다항식입니다. x 의 0제곱부터 4제곱까지 계수가 다섯 개라 파라미터가 다섯 개입니다.

직선은 다섯 점을 다 지나지 못합니다. 점마다 조금씩 비껴서 훈련 오차가 0보다 큽니다.

4차 다항식은 다섯 점을 전부 지나는 곡선을 하나 찾을 수 있습니다. 점 n 개는 계수 n 개짜리 다항식으로 빠짐없이 지날 수 있기 때문입니다. 훈련 오차는 0입니다.

그런데 이 곡선은 점을 지나려고 점과 점 사이에서 크게 휘어집니다. 다섯 점 바깥으로 나가면 더 크게 벗어납니다. 같은 직선 근처에서 새 점을 하나 찍으면 직선이 4차 다항식보다 가깝게 맞히는 경우가 많습니다. 4차 다항식은 잡음까지 지나느라 규칙에서 멀어졌습니다.

답을 외우기만 하는 모델

과적합을 끝까지 밀면 모델이 표 하나가 됩니다. 아래 코드는 훈련 세트의 제목과 정답을 딕셔너리에 담아 두고 그대로 돌려줍니다.

Python
seen = {"무료 쿠폰 지급": "스팸",
        "회의 일정 공유": "정상"}

def predict(title):
    return seen.get(title)

predict("무료 쿠폰 지급")  # '스팸'
predict("무료 쿠폰 증정")  # None

훈련 세트의 두 제목은 전부 맞힙니다. 훈련 오차가 0입니다. 낱말 하나만 바뀐 제목에는 답을 내지 못합니다.

진짜 모델이 이렇게까지 외우는 일은 드뭅니다. 그래도 파라미터가 많아질수록 모델은 이 표에 가까워질 수 있습니다. 훈련 예제 하나하나를 따로 기억할 만큼 숫자가 넉넉해지기 때문입니다.

과적합이 생기는 조건

과적합은 아래 셋이 겹칠 때 납니다.

  1. 훈련 세트에 잡음이 섞여 있습니다
  2. 모델의 파라미터가 훈련 예제 수에 비해 많아서 잡음까지 따라갈 수 있습니다
  3. 훈련 오차만 보고 학습을 계속합니다

하나를 빼면 과적합이 약해집니다. 잡음이 없으면 모델이 외울 것은 규칙뿐입니다. 파라미터가 적으면 잡음을 따라갈 힘이 없습니다. 훈련 오차 말고 다른 것을 보며 멈추는 법은 아래 「갈라지는 두 오차」에서 봅니다.

2번의 「많다」는 훈련 예제 수에 견준 말입니다. 그래서 파라미터 수는 그대로 두고 예제만 늘려도 2번 조건이 약해집니다.

점 다섯 개 예에서 점을 쉰 개로 늘려 봅니다. 4차 다항식은 이제 쉰 점을 다 지나갈 수 없습니다. 곡선은 잡음을 따라가지 못하고 직선 가까이 눕게 됩니다. 같은 모델이라도 데이터가 많으면 과적합이 덜합니다.

갈라지는 두 오차

과적합을 알아채려면 학습에 쓰지 않는 데이터를 따로 떼어 둡니다. 학습 도중에 모델을 재는 데 쓰는 이 데이터를 검증 세트라고 합니다. 검증 세트에서 잰 오차가 검증 오차입니다.

학습은 훈련 세트를 여러 번 되풀이해 봅니다. 훈련 세트 전체를 한 번 다 보는 것을 한 에포크라고 셉니다. 에포크마다 훈련 오차와 검증 오차를 나란히 적어 두면 두 오차가 움직이는 모양이 보입니다.

처음에는 두 오차가 함께 줄어듭니다. 모델이 규칙을 배우는 동안에는 어느 데이터에서나 나아지기 때문입니다. 어느 에포크를 지나면 검증 오차가 더 줄지 않고 다시 커집니다. 훈련 오차는 그 뒤에도 계속 줄어듭니다. 두 오차가 갈라지기 시작한 때부터가 과적합입니다.

검증 오차가 가장 작았던 에포크에서 학습을 멈추는 방법이 있습니다. 이를 조기 종료라고 부릅니다.

과소적합과 알맞은 적합

과적합의 반대편에는 과소적합이 있습니다. 모델이 너무 단순해서 규칙조차 다 담지 못하는 상태입니다. 휘어진 규칙을 직선 하나로 맞추려 드는 경우가 그렇습니다.

두 오차를 함께 보면 세 상태가 갈립니다.

상태 훈련 오차 검증 오차
과소적합 크다 크다
알맞은 적합 작다 훈련 오차와 비슷하게 작다
과적합 아주 작다 훈련 오차보다 훨씬 크다

과소적합은 두 오차가 모두 큽니다. 과적합은 두 오차의 차이가 큽니다. 모델을 복잡하게 할수록 과소적합에서 멀어지고 과적합에 가까워집니다. 이 맞바꿈을 따지는 틀이 편향과 분산입니다.

훈련 세트로 잰 정밀도와 재현율

이 절은 훈련 세트로 잰 점수가 과적합을 숨긴다는 것을 스팸 필터의 두 점수로 보입니다. 스팸 필터처럼 입력을 몇 갈래로 나누는 모델은 흔히 정밀도와 재현율로 잽니다. 둘 다 높을수록 모델이 잘 맞힌다는 뜻입니다.

정밀도는 모델이 「스팸」이라고 고른 것 가운데 진짜 스팸의 비율입니다. 스팸이라고 고른 10통 가운데 진짜 스팸이 8통이면 정밀도는 0.8입니다. 정상 메일을 스팸으로 잘못 거를수록 떨어집니다.

재현율은 진짜 스팸 가운데 모델이 찾아낸 것의 비율입니다. 들어온 스팸 20통 가운데 16통을 찾아냈다면 재현율은 0.8입니다. 스팸을 놓칠수록 떨어집니다.

두 수를 훈련 세트로 재면 과적합이 숨습니다. 외운 모델은 훈련 세트에서 두 수를 모두 1에 가깝게 냅니다. 새 메일에서는 두 수가 함께 떨어집니다.

그래서 두 수는 학습에도 검증에도 쓰지 않은 데이터로 한 번 더 잽니다. 끝까지 아껴 두었다가 마지막에 한 번 쓰는 이 데이터가 테스트 세트입니다.

검증 세트가 있는데도 세트가 하나 더 필요한 까닭은 검증 세트가 이미 고르는 데 쓰였기 때문입니다. 여러 에포크 가운데 검증 오차가 가장 작은 것을 고르면, 그 오차에는 우연히 검증 세트와 잘 맞은 몫이 섞입니다. 그래서 고른 모델의 검증 오차는 새 데이터에서의 오차보다 작게 나오기 쉽습니다. 고르는 데 한 번도 쓰지 않은 테스트 세트에는 이 치우침이 없습니다.

과적합을 가리는 데이터 누수

데이터 누수는 테스트 세트에 있어야 할 정보가 학습 쪽으로 새어 들어가는 문제입니다. 같은 메일이 훈련 세트와 테스트 세트에 둘 다 들어간 경우가 흔한 예입니다.

누수가 있으면 외운 모델이 테스트 세트에서도 오차가 작게 나옵니다. 이미 본 문제가 시험에 나왔기 때문입니다. 과적합이 있어도 오차에 드러나지 않습니다.

과적합은 새 데이터에서 오차가 커지는 문제입니다. 데이터 누수는 그 커짐을 재는 장치가 고장 난 문제입니다. 누수를 먼저 막아야 과적합을 잴 수 있습니다.

과적합을 누르는 방법

과적합을 누르는 방법은 앞의 세 조건 가운데 하나를 약하게 만듭니다. 대부분은 2번과 3번을 건드립니다. 1번의 잡음은 데이터를 모을 때 저절로 끼어들어 걷어 내기 어렵기 때문입니다.

아래 표는 방법마다 건드리는 조건을 적습니다.

방법 건드리는 조건 무엇을 바꾸나
데이터를 더 모은다 2번 예제가 늘어 파라미터가 상대적으로 적어진다
데이터 증강 2번 가진 예제를 살짝 바꿔 예제 수를 늘린다
모델을 작게 한다 2번 파라미터를 줄여 잡음을 따라갈 힘을 뺀다
규제 2번 파라미터 값이 커지면 오차에 벌점을 더해 곡선이 덜 휘게 한다
조기 종료 3번 검증 오차가 커지기 전에 학습을 멈춘다

어느 방법이든 검증 오차를 보며 세기를 정합니다. 너무 세게 누르면 과소적합으로 넘어갑니다.

모델 밖의 과적합

같은 일은 사람이 규칙을 다듬을 때도 일어납니다. 지난 분기 장애 기록에 맞춰 알림 조건을 여러 겹 손본다고 합시다. 조건을 늘릴수록 지난 분기 기록에서는 정밀도와 재현율이 모두 좋아집니다.

다음 분기의 장애가 같은 모양으로 온다는 보장은 없습니다. 지난 분기에만 있던 우연까지 조건으로 굳혔다면 그 조건은 새 장애를 놓칩니다. 규칙을 만든 데이터와 규칙을 재는 데이터를 나누는 것은 모델이 아닐 때도 같은 이유로 필요합니다.

관련 항목

과적합과 맞세워지는 대립 상태

과소적합 · 일반화 · 편향과 분산 · 모델 용량

과적합을 드러내는 데이터 나눔

훈련 데이터 · 검증 세트 · 테스트 세트 · 교차 검증 · 홀드아웃 검증 · 학습 곡선

과적합이 일어나는 학습 과정의 구성 요소

머신러닝 · 파라미터 · 하이퍼파라미터 · 손실 함수 · 에포크 · 미니배치 · 경사 하강법 · 신경망

과적합을 누르는 기법

규제 (머신러닝) · 가중치 감쇠 · 드롭아웃 · 조기 종료 · 데이터 증강 · 앙상블

과적합이 흐리는 평가 지표

정밀도 · 재현율 · 정확도 · F1 점수 · 혼동 행렬

과적합과 함께 평가를 어긋나게 하는 문제

데이터 누수 · 표본 편향 · 클래스 불균형 · 잡음 · 분포 이동

과적합을 보이는 데 쓰는 모델

다항식 회귀 · 선형 회귀 · 결정 트리 · 최근접 이웃

다른 이름: overfitting · 오버피팅 · 과대적합