Skip to content

4장. 외운 것과 배운 것

이 장의 질문: 훈련 데이터를 완벽히 맞추는 모델이 왜 실전에서 무너지는가? 머신러닝의 진짜 목표 — 일반화 — 를 이해하고, 그것을 지키는 실무 규율을 세운다.

전제: 2장(모델·손실·최적화), 3장(기대값).

완벽한 성적표의 함정

당신이 만든 집값 모델이 훈련 데이터 1만 채에 대해 오차 0을 기록했다고 하자. 축하할 일인가?

축하는커녕, 경보를 울려야 할 가능성이 크다. 왜 그런지 극단적인 예로 보자. 다음 "모델"을 생각하라.

입력된 집이 훈련 데이터에 있으면 그 가격을 그대로 답한다. 없으면 아무 값이나 답한다.

이 모델의 훈련 오차는 정확히 0이다. 그리고 완전히 쓸모없다. 우리가 원한 것은 훈련 데이터의 정답이 아니라 — 그건 이미 알고 있다 — 처음 보는 집의 가격이기 때문이다.

이것이 머신러닝의 목표를 다시 쓰게 한다. 진짜 목표는 훈련 손실의 최소화가 아니라, 아직 보지 못한 데이터에 대한 기대 손실(3장의 기대값이 여기서 등장한다)의 최소화다. 이 능력을 일반화(generalization)라고 부른다. 그리고 훈련 데이터의 우연한 세부 사항 — 노이즈 — 까지 통째로 외워서 훈련 성적만 좋아진 상태를 과적합(overfitting), 반대로 모델이 너무 단순해서 훈련 데이터조차 못 맞추는 상태를 과소적합(underfitting)이라 한다.

시험 공부 비유가 정확하다. 과소적합은 공부를 안 한 학생 — 족보도 새 문제도 다 틀린다. 과적합은 족보를 통째로 외운 학생 — 족보는 만점, 새 문제는 낙제. 우리가 기르고 싶은 것은 원리를 이해한 학생이다. 그런데 성적표(훈련 손실)만 봐서는 외운 학생과 이해한 학생을 구분할 수 없다는 것, 그것이 문제의 핵심이다.

왜 외우게 되는가: 모델의 힘과 데이터의 양

점 다섯 개가 대략 직선을 이루는 데이터를 상상하자(작은 측정 오차가 섞여 있다). 직선(w,b 두 개의 파라미터)을 맞추면 점들을 "거의" 지나며 경향을 잡는다. 그런데 4차 곡선(파라미터 다섯 개)을 맞추면? 다섯 점을 정확히 전부 통과하는 요동치는 곡선이 나온다. 훈련 오차 0. 그러나 점들 사이에서 곡선은 미친 듯이 출렁이고, 새 데이터 앞에서 참담해진다.

무슨 일이 일어난 건가. 파라미터가 많은 모델은 후보 집합이 크다 — 표현할 수 있는 함수가 많다(이를 모델의 용량이 크다고 한다). 용량이 크면 데이터의 진짜 경향뿐 아니라 노이즈까지 표현할 수 있고, 손실을 낮추라는 명령만 받은 최적화는 노이즈까지 맞추는 쪽을 기꺼이 택한다. 최적화는 우리가 시킨 일(훈련 손실 최소화)을 너무 성실히 한 죄밖에 없다. 잘못은 시킨 일과 원하는 일이 달랐던 우리에게 있다.

그렇다면 용량이 작은 게 좋은가? 데이터가 사실 곡선 관계인데 직선을 강요하면 과소적합이다. 결국 이것은 균형의 문제다. 균형점은 데이터 양에 따라 움직인다 — 데이터가 많을수록 노이즈는 서로 상쇄되고 진짜 패턴만 일관되게 남으므로, 큰 용량을 감당할 수 있다. 오늘날 수천억 파라미터 모델이 성립하는 이유는 수조 단위의 데이터가 그것을 떠받치기 때문이다.

같은 현상을 보는 고전적 렌즈가 편향-분산 분해다. 새 데이터에 대한 기대 오차는 세 조각으로 쪼개진다.

기대 오차=편향2모델이 단순해서 생기는 체계적 오차+분산훈련 데이터가 바뀔 때 모델이 흔들리는 정도+잡음누구도 못 줄이는 본질적 무작위성

직선 모델은 편향이 크고(곡선을 표현 못 함) 분산이 작다(데이터가 좀 바뀌어도 비슷한 직선). 4차 곡선은 편향이 작고 분산이 크다(점 하나만 바뀌어도 곡선이 요동). 용량을 키우면 편향은 줄고 분산은 는다 — 이 줄다리기가 과소적합↔과적합 스펙트럼의 수학적 정체다. (한 가지 정직한 각주: 아주 거대한 현대 모델들은 이 고전적 U자 곡선을 넘어 다시 좋아지는 기묘한 현상도 보인다. 그러나 실무 규모의 직관으로는 이 분해가 여전히 가장 좋은 지도다.)

외운 학생을 적발하는 법: 데이터를 쪼개라

성적표만으로 구분이 안 된다면, 새 시험지를 만들면 된다. 가진 데이터를 나눈다.

  • 훈련 집합(train, 예: 70%) — 모델이 공부하는 교재. 파라미터가 여기서 학습된다.
  • 검증 집합(validation, 예: 15%) — 모의고사. 하이퍼파라미터를 고르고, 모델 A와 B 중 무엇이 나은지 비교하고, 언제 학습을 멈출지 정하는 모든 의사결정을 이 성적으로 한다.
  • 테스트 집합(test, 예: 15%) — 수능. 모든 결정이 끝난 뒤 단 한 번, 최종 성능을 보고할 때만 연다.

훈련 성적은 좋은데 검증 성적이 나쁘면 과적합이다. 둘 다 나쁘면 과소적합이다. 이 두 숫자의 간격이 당신의 진단 도구다.

왜 검증과 테스트를 굳이 나누는가 — 여기에 미묘하고 중요한 함정이 있다. 검증 성적을 보고 모델을 백 번 고르다 보면, 당신은 자신도 모르게 검증 집합에 과적합한다. 검증 집합이 우연히 좋아하는 선택지를 골라 온 셈이라, 검증 성적은 슬금슬금 낙관적으로 오염된다. 그래서 한 번도 의사결정에 쓰지 않은 순결한 집합 — 테스트 — 이 따로 필요한 것이다. 테스트 성적을 보고 모델을 고치는 순간, 그것은 더 이상 테스트가 아니다. 이 규율을 어긴 프로젝트의 "95% 정확도"는 배포 첫 주에 무너진다.

데이터가 적어 나누기가 아까우면 교차검증을 쓴다. 데이터를 다섯 조각으로 나눠, 각 조각을 한 번씩 모의고사로 쓰고 나머지로 공부하기를 다섯 번 반복해 평균한다. 데이터를 전부 활용하면서도 공정한 추정을 얻는 표준 기법이다.

한 가지 함정을 더 — 데이터 누수(leakage). 시험 정보가 교재에 몰래 스며드는 사고다. 대표적인 두 경로: ① 정규화·결측치 채우기 같은 전처리를 데이터 전체로 계산한 뒤에 나누는 것(테스트의 통계가 훈련에 새어든다 — 전처리는 반드시 훈련 집합만으로 계산해 나머지에 적용한다). ② 시간이 흐르는 데이터를 무작위로 섞어 나누는 것(미래 정보로 과거를 예측하는 초능력이 생긴다 — 시계열은 반드시 과거로 훈련, 미래로 검증한다). 누수는 개발 중에는 성적을 화려하게 만들고 배포 후에 청구서를 내미는, 실무에서 가장 비싼 버그다.

과적합과 싸우는 무기들

진단했으면 치료해야 한다. 무기는 크게 넷이고, 전부 하나의 원리 — 노이즈까지 외울 자유를 줄인다 — 의 변주다.

1. 데이터를 늘린다. 가장 확실하고, 가장 자주 잊히는 해법. 모델을 만지기 전에 항상 자문하라 — "데이터를 두 배로 만들 방법은 없는가?" 원본 수집이 어려우면 증강(augmentation)이 있다: 사진을 좌우 반전하고 살짝 회전시켜도 고양이는 고양이다. 정답을 바꾸지 않는 변형으로 데이터를 불리는 이 기법은 4부에서 상세히 다룬다.

2. 용량을 줄이거나, 벌점으로 묶는다. 모델을 작게 하는 직접적 방법도 있지만, 더 유연한 방법은 정규화(regularization)다. 손실에 "파라미터가 큰 것에 대한 벌점"을 더한다:

Lnew=Ldata+λw2

읽는 법: 새 손실은 원래 손실에, 모든 가중치 제곱의 합을 λ(벌점 강도) 배 해서 더한 것. 왜 가중치가 작으면 덜 외우는가? 요동치는 4차 곡선을 떠올려 보라 — 급격한 요동에는 큰 계수가 필요하다. 가중치를 작게 묶으면 모델은 매끄러운(=단순한) 함수 쪽으로 기울고, 매끄러운 함수는 노이즈를 못 외운다. 제곱 벌점을 L2 정규화(가중치 감쇠)라 하며 딥러닝의 기본 옵션이고, 절댓값 벌점(L1)은 덜 중요한 가중치를 아예 0으로 만들어 "어떤 입력이 중요한지"까지 알려주는 부수 효과가 있다.

3. 일찍 멈춘다(early stopping). 학습 중 검증 손실을 지켜보면, 처음엔 훈련·검증이 같이 내려가다가 어느 순간 검증만 다시 올라가기 시작한다 — 패턴 학습이 끝나고 노이즈 암기가 시작되는 순간이다. 그 직전에 멈춘다. 공짜나 다름없이 강력해서 실무에서 거의 항상 쓴다.

4. 학습 과정에 무작위성을 섞는다. 드롭아웃(뉴런을 무작위로 꺼 가며 학습) 같은 기법들 — 특정 우연에 기대는 암기를 방해한다. 신경망 맥락이 필요하니 11장에서 제대로 다룬다.

핵심 요약

  • 진짜 목표는 훈련 성적이 아니라 처음 보는 데이터에 대한 성능(일반화) 이다. 훈련 오차 0은 자랑이 아니라 종종 경보다.
  • 용량 큰 모델 + 적은 데이터 = 노이즈까지 암기(과적합, 저편향·고분산). 용량 작은 모델 = 패턴도 못 담음(과소적합, 고편향·저분산). 데이터가 많을수록 큰 용량을 감당한다.
  • train/validation/test 삼분할: 공부는 train으로, 모든 결정은 validation으로, 최종 보고는 test로 단 한 번. 테스트로 모델을 고치는 순간 테스트가 아니다. 전처리 누수와 시계열 누수를 경계하라.
  • 과적합 대책: 데이터 늘리기(증강 포함) > 정규화(L2/L1 벌점) > 조기 종료 > 무작위성 주입. 모두 "외울 자유를 줄이는" 한 원리의 변주다.

스스로 점검

  1. 훈련 정확도 99%, 검증 정확도 71%인 모델과, 훈련 83%, 검증 81%인 모델. 각각 무슨 상태이며, 각각에게 처방할 무기는 무엇인가?
  2. 검증 집합과 테스트 집합을 분리하는 이유를 "검증 집합에 과적합한다"는 문장을 풀어서 설명해 보라.
  3. 내일의 주가를 예측하는 모델을 만들며 데이터를 무작위로 섞어 8:2로 나눴다. 무엇이 잘못이며, 이 실수는 성적을 어느 방향으로 왜곡하는가?
  4. L2 벌점이 과적합을 줄이는 이유를 "요동치는 곡선에는 큰 계수가 필요하다"는 문장으로부터 설명해 보라.

다음 장에서

뼈대(2장), 도구(3장), 규율(4장)을 갖췄다. 1부가 끝났다 — 1부 복습 퀴즈로 점검하고 가라. 2부에서는 이 뼈대 위에 실제 무기들을 얹는다. 첫 번째는 세상에서 가장 많이 풀리는 문제 유형 — "예냐 아니오냐"를 배우는 분류다. 그리고 거기서, 딥러닝 전체를 관통할 손실 함수 하나를 만나게 된다.

5장. 갈림길을 배우다 — 분류 →