Skip to main content

과적합과 일반화

Views 97약 11분생성형 AI 활용

이전 장에서 우리는 모델이 어떻게 오차를 줄이며 학습하는지 살펴봤다. 그런데 여기서 바로 한 가지 함정이 생긴다. 오차를 잘 줄였다고 해서, 정말 잘 배운 것은 아닐 수 있다. 훈련 데이터에서는 거의 틀리지 않는데 처음 보는 데이터에서는 갑자기 성능이 무너지는 일이 벌어지기 때문이다.

이 지점에서 딥러닝은 단순한 최적화 문제가 아니라, 훨씬 더 까다로운 문제로 바뀐다. 모델이 해야 할 일은 눈앞의 정답지를 암기하는 것이 아니라, 아직 보지 못한 문제에도 통하는 규칙을 배우는 것이다. 이것이 바로 일반화다.

좋은 모델은 익숙한 문제를 완벽하게 푸는 모델이 아니다. 낯선 문제 앞에서도 덜 흔들리는 모델이다.

과적합과 일반화

훈련 성능이 좋아도 안심할 수 없는 이유

시험 공부를 하는 학생을 떠올려 보자. 기출문제를 통째로 외운 학생은 연습 시험에서는 아주 높은 점수를 받을 수 있다. 하지만 문제의 문장만 조금 바뀌어도 갑자기 헤맨다. 반대로 원리를 이해한 학생은 본 적 없는 문제에서도 비교적 안정적으로 답을 찾아간다.

딥러닝 모델도 비슷하다. 훈련 데이터에만 지나치게 맞춰지면 표면적으로는 성능이 좋아 보인다. 손실도 낮고 정확도도 높다. 하지만 그 성능은 훈련 데이터라는 익숙한 무대에서만 빛난다. 새로운 데이터가 들어오면 실력이 아니라 암기였다는 사실이 드러난다.

이런 현상을 과적합이라고 부른다. 모델이 데이터 속의 진짜 패턴뿐 아니라 우연한 잡음, 예외적인 세부사항, 샘플 특유의 흔적까지 함께 배워 버린 상태다.

반대로 일반화는 모델이 개별 사례의 껍데기보다 그 뒤에 있는 구조를 배웠다는 뜻이다. 그래서 입력이 조금 달라져도 본질이 같다면 비슷하게 처리할 수 있다.

딥러닝에서 중요한 질문은 늘 이것이다.

"이 모델은 정말 배운 것인가, 아니면 외운 것인가?"

훈련 데이터, 검증 데이터, 테스트 데이터는 왜 나누는가

이 질문에 답하려면 데이터를 나눠서 봐야 한다. 하나의 데이터셋만으로 학습도 하고 평가도 하면, 모델이 외운 것인지 배운 것인지 구분하기 어렵다. 그래서 보통 데이터를 세 가지 역할로 분리한다.

  • 훈련 데이터는 모델이 실제로 배우는 데 쓰는 데이터다. 가중치가 이 데이터를 보며 업데이트된다.

  • 검증 데이터는 학습 도중 모델을 비교하고 조정하는 데 쓰는 데이터다. 하이퍼파라미터를 바꾸거나, 어느 시점의 모델이 더 좋은지 판단할 때 본다.

  • 테스트 데이터는 마지막에 한 번, 정말 최종 성능을 확인하기 위해 남겨 둔 데이터다.

이 셋은 비슷해 보이지만 역할이 완전히 다르다.

훈련 데이터는 말 그대로 교재다. 모델은 여기서 연습한다. 검증 데이터는 모의고사에 가깝다. 공부 방향이 맞는지, 설정을 어떻게 바꿔야 하는지 점검하는 데 쓴다. 테스트 데이터는 수능처럼 마지막 평가다. 이미 여러 번 들여다본 모의고사를 또 보는 것이 아니라, 정말 처음 보는 문제여야 의미가 있다.

이 구분이 중요한 이유는 아주 단순하다. 모델을 고르는 과정에 사용된 데이터는 더 이상 완전히 낯선 데이터가 아니기 때문이다. 검증 데이터를 보며 학습률을 바꾸고, 층 수를 바꾸고, 드롭아웃 비율을 바꾸고, 가장 좋아 보이는 모델을 고르면, 모델 설계는 조금씩 검증 데이터에 적응한다. 그래서 최종 평가는 테스트 데이터로 따로 해야 한다.

과적합은 곡선에서 먼저 드러난다

과적합은 종종 학습 곡선을 보면 감이 온다. 학습이 진행될수록 훈련 손실은 계속 내려가는데, 검증 손실은 어느 시점부터 더 이상 좋아지지 않거나 오히려 올라가는 경우가 있다. 이때 모델은 훈련 데이터에 점점 더 익숙해지고 있지만, 새로운 데이터에 대한 실력은 나아지지 않는 것이다.

이 장면은 꽤 상징적이다. 모델은 열심히 배우고 있다. 그런데 잘못된 방향으로 열심히 배우고 있는 셈이다.

처음에는 훈련 손실도 크고 검증 손실도 크다. 아직 충분히 배우지 못한 상태다. 학습이 잘 진행되면 둘 다 함께 좋아진다. 그런데 어느 순간부터 훈련 손실만 좋아지고 검증 성능은 멈춘다. 이때가 바로 경계선이다. 조금 더 학습하면 더 똑똑해지는 것이 아니라, 더 편협해질 수 있다.

그래서 딥러닝에서 "더 오래 학습하면 무조건 좋다"는 말은 성립하지 않는다. 적당한 시점에서 멈추는 것도 실력이다.

과적합은 왜 생기는가

과적합은 한 가지 이유로만 생기지 않는다. 보통은 여러 조건이 겹치면서 나타난다.

첫째는 모델 용량이 너무 큰 경우다. 파라미터가 많고 표현력이 강한 모델은 복잡한 패턴을 배울 수 있다. 이것은 장점이지만, 동시에 훈련 데이터의 우연한 세부사항까지 흡수할 위험도 커진다. 넓은 메모장을 가진 학생은 원리도 정리할 수 있지만, 답안지 구석의 얼룩까지 외울 수도 있다.

둘째는 데이터가 부족한 경우다. 아무리 좋은 모델이라도 세상을 몇 장의 사진, 몇 줄의 문장으로 다 배울 수는 없다. 예시가 적으면 모델은 일반적인 규칙보다 눈앞의 샘플에 과하게 매달리기 쉽다. 데이터가 적을수록 "이게 진짜 패턴인지, 그냥 우연인지"를 구별하기 어렵다.

셋째는 데이터 안에 잡음이 많을 경우다. 라벨이 틀렸거나, 측정이 부정확하거나, 서로 비슷한 입력에 엉뚱하게 다른 정답이 붙어 있으면 모델은 혼란스러운 신호까지 따라 배우게 된다. 이때 모델이 잡음까지 성실하게 학습하면 훈련 성능은 올라갈 수 있지만, 일반화는 나빠진다.

넷째는 훈련을 너무 오래 하는 경우다. 처음에는 대체로 유용한 구조를 배운다. 하지만 학습이 계속되면 점점 더 세부적인 오차까지 줄이려 한다. 그 과정에서 훈련 데이터의 특수한 흔적까지 맞추게 되면 과적합이 심해진다.

다섯째는 문제에 비해 입력 표현이 불안정한 경우다. 예를 들어 이미지 분류에서 물체의 위치, 밝기, 배경이 조금만 바뀌어도 모델이 쉽게 흔들린다면, 모델은 본질보다 표면적 단서에 의존했을 가능성이 크다. 사람은 고양이가 왼쪽에 있든 오른쪽에 있든 고양이로 보지만, 모델은 배경색 하나에 지나치게 집착할 수 있다.

과적합의 반대편에는 과소적합도 있다

과적합만 경계하다 보면 반대편을 놓치기 쉽다. 과소적합은 모델이 훈련 데이터에서도 충분히 배우지 못한 상태다. 너무 단순한 모델이거나, 학습이 부족하거나, 설정이 잘못되어 아예 패턴을 잡지 못한 경우다.

과소적합에서는 훈련 성능도 나쁘고 검증 성능도 나쁘다. 쉽게 말해 아직 공부를 제대로 시작하지 못한 상태다. 반면 과적합은 훈련 성능은 좋은데 검증 성능이 나쁘다. 공부는 했는데 방향이 잘못된 상태다.

좋은 일반화는 이 둘 사이에서 균형을 찾는 일이다. 너무 단순해서 아무것도 배우지 못해도 안 되고, 너무 복잡해서 다 외워 버려도 안 된다.

일반화는 보이지 않는 규칙을 붙잡는 능력이다

그렇다면 일반화는 정확히 무엇일까. 가장 쉬운 표현으로 말하면, 샘플 하나하나의 겉모습이 아니라 여러 샘플을 관통하는 구조를 배우는 능력이다.

고양이 사진을 분류하는 모델이 있다고 해보자. 일반화가 잘 된 모델은 귀 모양, 눈의 배치, 얼굴 윤곽, 털의 질감 같은 특징을 종합해 고양이라는 개념을 잡아낸다. 반대로 일반화가 나쁜 모델은 "배경이 소파면 고양이일 확률이 높다" 같은 편향된 단서를 배울 수 있다. 훈련 데이터에서는 잘 맞아도, 길거리 사진이 들어오면 바로 흔들린다.

이 차이는 생성형 AI에서도 그대로 이어진다. 언어 모델이 특정 표현을 반복적으로 외운 것인지, 문장 구조와 의미 관계를 어느 정도 배운 것인지는 처음 보는 프롬프트에서 드러난다. 결국 일반화는 딥러닝 전체를 꿰는 중심 개념이다.

정규화는 모델에게 함부로 외우지 말라고 말하는 방법이다

과적합을 줄이는 가장 대표적인 접근은 정규화다. 정규화는 한마디로, 모델이 훈련 데이터에 너무 과하게 맞춰지는 것을 억제하는 장치다.

가장 직관적인 예는 가중치 감쇠다. 모델이 특정 가중치를 지나치게 크게 키우지 못하게 벌점을 주는 방식이다. 손실 함수에 "너무 복잡한 해답은 약간 불이익을 주겠다"는 조건을 추가하는 셈이다. 그러면 모델은 훈련 데이터에 딱 맞는 날카로운 해답보다, 조금 더 매끈하고 안정적인 해답을 찾게 된다.

이 비유는 옷 맞춤과 비슷하다. 몸에 정확히 달라붙는 옷은 오늘 입기에는 완벽할 수 있다. 하지만 조금만 움직이거나 다른 날씨가 오면 불편하다. 정규화는 옷을 약간 여유 있게 만들어서, 다양한 상황에서도 잘 맞도록 돕는 일에 가깝다.

정규화의 핵심은 성능을 일부러 떨어뜨리는 데 있지 않다. 지금 눈앞의 점수보다 앞으로의 안정성을 사는 것에 있다.

드롭아웃은 일부 뉴런을 일부러 쉬게 한다

딥러닝에서 많이 쓰는 또 다른 기법이 드롭아웃이다. 학습 중에 일부 뉴런의 출력을 무작위로 꺼 버리는 방법이다.

처음 들으면 이상하게 느껴진다. 힘들게 만든 신경망의 일부를 왜 굳이 끌까? 하지만 바로 그 불편함이 효과를 만든다. 특정 뉴런들끼리만 강하게 짝을 이뤄 "우리끼리 이 데이터는 이렇게 외우자" 식으로 협업하는 것을 막기 때문이다. 어떤 뉴런이 갑자기 빠져도 나머지가 어느 정도 버틸 수 있어야 하므로, 모델은 더 분산되고 견고한 표현을 배우게 된다.

학생들이 팀 프로젝트를 할 때 늘 같은 한 사람이 다 해 주면, 나머지는 실력이 잘 늘지 않는다. 그런데 매번 누가 빠질지 모른다면 모두가 기본기를 갖추게 된다. 드롭아웃은 그런 긴장감을 네트워크에 주는 장치라고 생각하면 된다.

물론 드롭아웃이 모든 문제를 해결하는 것은 아니다. 하지만 모델이 특정한 경로에 지나치게 의존하는 습관을 줄이는 데 유용하다.

데이터 증강은 데이터의 시야를 넓혀 준다

과적합의 중요한 원인 중 하나가 데이터 부족이라면, 해결책 중 하나는 모델이 더 다양한 경우를 보게 만드는 것이다. 이때 쓰는 방법이 데이터 증강이다.

이미지에서는 사진을 약간 회전하거나, 좌우를 뒤집거나, 밝기를 바꾸거나, 일부분을 잘라 보는 식으로 원본을 변형한다. 핵심은 정답의 본질은 유지하되, 겉모습은 조금씩 다르게 만드는 것이다. 그러면 모델은 "고양이는 항상 정중앙에만 있다" 같은 얕은 규칙이 아니라, 위치와 조명이 달라도 유지되는 특징을 배우게 된다.

텍스트에서도 비슷한 생각이 가능하다. 문장을 직접 뒤집는 식의 단순한 증강은 조심해야 하지만, 표현을 바꾸거나, 일부 잡음을 섞거나, 다양한 문맥을 제공하는 방식으로 모델이 더 넓은 변형을 경험하게 할 수 있다.

데이터 증강이 주는 가장 큰 도움은, 모델에게 세상이 훈련셋 한 장면으로만 이루어져 있지 않다는 사실을 알려 준다는 점이다.

얼리 스토핑은 더 배우기 전에 멈추는 기술이다

학습을 오래 하면 항상 좋은 줄 알기 쉽지만, 과적합 구간에 들어서면 오히려 독이 된다. 그래서 얼리 스토핑이 필요하다. 말 그대로, 검증 성능이 더 이상 좋아지지 않기 시작하면 학습을 멈추는 것이다.

이 기법이 흥미로운 이유는, 딥러닝에서 "끝까지 학습하는 것"이 아니라 "제때 멈추는 것"이 더 좋은 선택이 될 수 있다는 점을 보여 주기 때문이다. 모델은 훈련 손실을 계속 낮출 수 있다. 하지만 우리는 훈련 손실 챔피언을 원하는 것이 아니다. 낯선 데이터에서도 잘 작동하는 모델을 원한다.

얼리 스토핑은 그래서 일종의 절제다. 더 잘할 수 있을 것 같은 유혹이 보여도, 이미 일반화 성능의 정점이 지났다면 멈춘다. 학습에서 욕심을 줄이는 기술이라고 해도 좋다.

검증 데이터는 하이퍼파라미터를 위한 무대다

딥러닝에서는 가중치만 학습되는 것이 아니다. 사람이 정해야 하는 설정도 많다. 학습률은 얼마로 할지, 층은 몇 개로 할지, 배치 크기는 얼마로 할지, 드롭아웃 비율은 얼마나 줄지, 정규화 강도는 어느 정도로 할지 같은 값들이 있다. 이런 값을 하이퍼파라미터라고 부른다.

중요한 점은, 하이퍼파라미터는 훈련 데이터만 보고 정하면 안 된다는 것이다. 훈련 데이터에만 맞춰 조정하면, 결국 훈련셋을 가장 잘 외우는 방향으로 흐르기 쉽다. 우리가 알고 싶은 것은 "어떤 설정이 새로운 데이터에도 더 잘 통하는가"이므로, 비교의 기준은 검증 데이터가 되어야 한다.

예를 들어 두 모델이 있다고 하자. 하나는 훈련 정확도 99퍼센트, 검증 정확도 82퍼센트다. 다른 하나는 훈련 정확도 95퍼센트, 검증 정확도 89퍼센트다. 어느 쪽이 더 좋은 모델일까? 딥러닝 초보라면 첫 번째 숫자에 끌릴 수 있다. 하지만 실제로는 두 번째가 더 낫다. 훈련장에서의 화려함보다 실전에서의 안정감이 중요하기 때문이다.

그래서 모델 선택은 보통 이런 흐름으로 이루어진다.

  • 여러 하이퍼파라미터 조합으로 모델을 학습한다.

  • 검증 성능을 비교해 가장 일반화가 잘 되는 설정을 고른다.

  • 최종적으로 선택된 설정으로 얻은 모델을 테스트 데이터에서 한 번 평가한다.

이 순서를 지키는 이유는 테스트 데이터를 끝까지 깨끗하게 남겨 두기 위해서다. 테스트 점수를 보고 다시 설정을 바꾸기 시작하면, 테스트 데이터도 사실상 검증 데이터로 오염된다.

테스트 데이터는 마지막 카드다

테스트 데이터는 가능하면 마지막까지 아껴야 한다. 이유는 명확하다. 진짜 실전 성능을 알고 싶기 때문이다.

만약 테스트 점수를 여러 번 확인하면서 모델을 계속 고치면, 어느새 사람도 모르게 테스트셋에 맞춘 선택을 하게 된다. 그 순간 테스트셋은 더 이상 새로운 세계를 대표하지 못한다. 모델이 실제 서비스나 현실 데이터에서 어느 정도 성능을 낼지 가늠하기 어려워진다.

실무에서는 이 원칙이 특히 중요하다. 모델을 제품에 넣는 순간 들어오는 데이터는 테스트셋보다도 더 변덕스럽다. 사용자 행동도 바뀌고, 입력 형식도 달라지고, 예외적인 케이스도 쏟아진다. 테스트셋조차 너무 자주 들여다보며 맞춰 버리면, 현실에서는 더 쉽게 흔들린다.

일반화는 모델만의 문제가 아니라 데이터의 문제이기도 하다

과적합을 이야기할 때 흔히 "모델이 너무 크다"는 쪽만 떠올리지만, 실제로는 데이터 설계가 훨씬 큰 영향을 주는 경우가 많다.

훈련 데이터와 테스트 데이터의 분포가 너무 다르면, 모델이 일반화하지 못하는 것이 이상한 일이 아니다. 예를 들어 낮에 찍은 도로 사진만으로 학습한 모델에게 밤길 영상을 분류하라고 하면 성능이 떨어질 수밖에 없다. 이것은 모델이 게으르다기보다, 세상의 다양성을 충분히 보지 못했기 때문이다.

라벨 품질도 중요하다. 정답이 들쑥날쑥하면 모델은 불안정한 규칙을 배우게 된다. 중복 데이터가 많거나 특정 유형의 샘플이 과도하게 몰려 있어도 문제다. 결국 일반화는 모델 구조, 학습 방법, 데이터 품질이 함께 만드는 결과다.

이 점은 앞으로의 장들과도 연결된다. 임베딩, 트랜스포머, LLM, RAG처럼 더 복잡한 기술로 가더라도, 데이터가 부실하면 일반화의 문제는 다른 옷을 입고 다시 나타난다.

좋은 모델을 고른다는 것은 무엇인가

이제 좋은 모델의 기준을 다시 정의할 수 있다. 좋은 모델은 훈련셋에서 가장 낮은 손실을 만든 모델이 아니다. 테스트셋에서 한 번의 운 좋은 점수를 얻은 모델도 아니다. 검증 과정에서 안정적으로 성능을 보이고, 처음 보는 데이터에서도 비교적 덜 흔들리는 모델이 좋은 모델이다.

즉, 모델 선택은 화려한 최고점 찾기가 아니라, 믿을 수 있는 균형점 찾기에 가깝다. 이 균형에는 여러 요소가 함께 들어간다. 성능이 충분히 좋아야 하고, 과적합이 심하지 않아야 하고, 계산 비용도 감당 가능해야 하며, 데이터 변화에도 어느 정도 견뎌야 한다.

딥러닝이 어려운 이유는 바로 여기에 있다. 단순히 손실만 줄이는 기계가 아니라, 현실에 내놓아도 무너지지 않을 함수를 만들어야 하기 때문이다.

생성형 AI 시대에도 일반화가 더 중요해진다

과적합과 일반화는 전통적인 분류 문제에서만 중요한 것이 아니다. 오히려 생성형 AI 시대에는 더 중요해졌다.

언어 모델이 특정 문장 패턴만 멋지게 흉내 내는 것과, 다양한 질문에 맞춰 적절한 답을 만들어 내는 것은 다르다. 이미지 생성 모델이 훈련 이미지의 분위기를 반복하는 것과, 새로운 조합을 자연스럽게 만들어 내는 것도 다르다. 프롬프트만 바뀌어도 쉽게 무너진다면, 그 모델은 겉으로는 똑똑해 보여도 일반화가 약한 것이다.

이후에 배우게 될 파인튜닝, RAG, 에이전트 설계 역시 결국 이 문제를 다시 다룬다. 적은 데이터로 특정 작업에 맞출 때는 과적합 위험이 커지고, 검색을 붙일 때는 훈련 바깥의 정보를 다루는 방식이 일반화 품질을 좌우한다. 그러니 이 장의 내용은 초반 개념이 아니라, 책 전체의 밑바닥에 깔린 감각이라고 보는 편이 맞다.

이 장의 핵심

이번 장에서 꼭 붙잡아야 할 것은 다음과 같다.

  • 과적합은 모델이 훈련 데이터에 지나치게 맞춰져 새로운 데이터에서 성능이 떨어지는 현상이다.

  • 일반화는 처음 보는 데이터에서도 통하는 규칙을 배우는 능력이다.

  • 훈련 데이터는 학습에, 검증 데이터는 모델 선택과 하이퍼파라미터 조정에, 테스트 데이터는 최종 평가에 사용한다.

  • 과적합은 큰 모델 용량, 적은 데이터, 잡음, 과도한 학습 등으로 인해 생기기 쉽다.

  • 정규화, 드롭아웃, 데이터 증강, 얼리 스토핑은 일반화를 돕는 대표적인 방법이다.

  • 좋은 모델은 훈련셋 점수가 가장 높은 모델이 아니라, 낯선 데이터에서도 덜 무너지는 모델이다.

딥러닝에서 진짜 실력은 훈련셋 안에서 증명되지 않는다. 아직 만나지 않은 데이터 앞에서 비로소 드러난다.

다음 장에서는 이런 일반화의 감각을 바탕으로, 딥러닝 역사에서 첫 번째 큰 혁명을 만든 모델인 CNN으로 넘어간다. 이미지처럼 구조가 복잡한 데이터를 신경망은 어떻게 다루기 시작했는지, 그리고 왜 그것이 컴퓨터 비전을 바꿨는지를 살펴보자.

책 목록

딥러닝의 감각 — 신경망에서 파운데이션 모델까지, AI를 끝까지 이해하는 가장 현실적인 지도

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기