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장. 갈림길을 배우다 — 분류 →