앞의 과정들을 통해 머신러닝이 어떻게 작동하는지 살펴보았습니다. 머신러닝 모델이란 실제 데이터를 대체할 수 있는 모형이고 이러한 모델을 통해 실제 데이터 없이도 현실 세계에서 활용할 수 있습니다. 그런데 이 모델은 정교해지기 위해 복잡하게 만들면 학습한 데이터와 조금만 다른 데이터가 들어와도 큰 오차를 만들 수 있고, 반대의 경우는 변수들과의 관계를 충분히 설명할 수 없게 되는 Trade-off 문제가 발생하게 됩니다.
이러한 문제를 수학적으로 표현한 것이 Bias-Variance(편향-분산) Trade-off 입니다. 조금 더 자세히 알아보겠습니다.
Bias-Variance Trade-off 를 설명하는 유명한 그림 중 하나 입니다. 사격 게임을 할 때 가장 높은 점수를 받는 방법은 나에게 주어진 총알을 가운데에 비슷한 위치에 계속 맞춰 높은 점수를 받을 수 있도록 하는 것입니다. 모델의 가장 이상적인 모습 역시 새로운 데이터가 들어와도 정확하게 실제 현상을 대체하는 값을 찾아내는 Low Bias-Low Variance 상태 일 것입니다. 이해를 돕기 위해 유명한 그림 한 가지를 더 소개 하겠습니다.
위에서 본 과녁의 모습을 그래프로 바꿔 표현한 것입니다. ML101 손실 함수 편을 보셨다면 머신러닝 모델은 loss를 최소화하는 방향으로 학습을 하는 것을 알고 계실 것입니다. [ML101-Loss function / ML101-Gradient descent]
그런데 이 에러를 표현하는 곡선 말고 모델의 복잡도에 따라 변화하는 다른 두 값을 보실 수 있습니다. 위에서 설명드렸던 Bias와 Variance 입니다.
모델의 복잡도가 작을수록 - 즉, 현재 가지고 있는 데이터를 모두 설명하지는 못하는 상태이기 때문에 정확한 예측을 하지 못하는 상태 - Bias는 증가하게 되고, 모델이 너무 복잡하여 예측은 정교해지나 새로운 데이터에 변동이 큰 상태에는 Variance가 증가하게 됩니다.
Bias가 크게 증가하여 정확한 예측을 못하는 상태를 언더피팅(Underfitting), Variance가 증가하여 새로운 데이터는 예측하지 못하는 상태를 오버피팅(Overfitting)이라 합니다. 이 두가지 에러를 모두 최소화할 수 있는 지점에서 모델의 복잡도를 결정될 때 좋은 성능을 기대할 수 있으며, 앞선 모델링 과정에서 가장 주의해야 할 부분이기에 이번 편에서 자세히 알아보도록 하겠습니다.
앞서 설명드렸듯이 Bias가 증가하여 Error가 증가한 왼쪽의 초록색 박스가 언더피팅 모델입니다.
조금 이해가 쉽도록 ‘피자’를 학습시키는 모델을 만든다고 가정하도록 하겠습니다.
위 사진들을 보고 저희는 ‘원형이면 피자다’라는 1차원적 형태만 feature로 하여 학습을 한다면,
다음 사진과 같이 생긴 피자를 모두 ‘피자’ 정확히 판단하겠지만, 파이와 시계도 원형이기에 ‘피자’라고 판단을 할 것입니다.
이러한 상황이 바로 Feature가 적어 Bias가 큰 상황이고, 언더피팅 모델인 것입니다.
그렇다면 오버피팅은 어떤 상황일까요?
위 사례의 상황을 계속 지속해봅시다. Feature가 너무 적어 정확도가 떨어진다는 것을 인지한 설계자는 피자의 공통점을 찾아 다음의 Feature를 추가합니다.
(1)먹을 수 있음 (2)치즈가 들어감 (3)밀가루로 만들어짐 (4) 올리브가 들어감
그 결과, 위 조건에 부합되는 피자들은 모두 피자라고 정확히 분류하지만, 페퍼로니 피자나 치즈피자와 같이 올리브가 들어가지 않은 피자는 피자가 아니라고 판단하는 새로운 유형의 문제가 발생합니다.
이와 같이 feature가 너무 많다 못해 불필요한 feature까지 과도하게 많이 고려하다 보니 Variance가 커진 모델이 오버피팅 모델입니다. 사공이 너무 많아 배가 산으로 간 상황이랄까요?
언더피팅의 근본적인 원인은 학습 데이터가 부족한 경우이거나 모델을 잘못 선택했을 가능성이 있습니다. 그래서 더 많은 데이터를 쌓고, 다른 모델을 사용하면 대부분 해결할 수 있습니다.
그럼 이제 오버피팅이 발생하는 이유를 더 개념적으로 알아보도록 하겠습니다.
오버피팅(과적합)이 발생하는 이유 중 한 가지는 모델의 복잡도 때문입니다.
Deep Learning에서의 모델의 복잡도는 모델의 파라미터의 수 입니다. 즉, 파라미터 수가 많으면 정교하지만 복잡한 모델이고 반대로 적으면, 정교하지 못한 간단한 모델이 됩니다.
하지만 복잡도가 올라갈수록 모델의 성능이 비례해서 올라가지 않습니다. 데이터 특징이 단순하지만 높은 복잡도의 모델을 사용하면 실제 결과와 상관없는 특징들까지 학습하여 오버피팅이 일어나게 됩니다. 그렇기 때문에 데이터에 맞는 적당한 복잡도의 모델을 사용하는 것이 중요합니다.
오버피팅과 모델 복잡도를 쉽게 요약하자면 시험에 빗댈 수 있습니다. 시험 준비를 하면서 여러가지 문제들을 풀어보고 유형을 정리하고, 틀린 문제들은 오답노트를 만들며 기출문제 100점의 경지에 이르렀습니다. 그러나 막상 시험에 가면 새로운 유형들이 등장 하죠. 기출 문제들에 너무나 익숙해져 순간 당황하고 문제를 풀지 못하게 됩니다.
제한된 자원과 데이터를 통해 실제 데이터들을 유추하는 과정이 모델링의 본질이며 이는 어떤 모델을 만드는지에 따라 난이도가 달라질 것 입니다. 이러한 상대적인 특성으로 모델 복잡도와 관련된 오버피팅 역시 모델 마다 가변적일 수 있기 때문에 까다로운 문제이며 근본적인 해결을 위해서는 양질의 데이터를 확보하는 것이 중요하겠습니다.
그러한 맥락에서 오버피팅이 발생하는 두 번째 원인이자 근본적인 원인은 데이터셋에 있습니다. 앞서 피자를 판단할 때도, 페퍼로니 피자나 치즈 피자 등 더 다양하고 많은 피자를 고려하지 않고 콤비네이션 피자만 고려했기 때문에 오버피팅이 발생했다고 할 수 있습니다. 도입부에서도 언급했듯이 머신러닝 모델은 실제 데이터를 대체할 수 있는 모형이기에 학습에 사용하는 데이터셋은 ‘실제 데이터’를 충분히 설명할 수 있어야 하며, 이를 위해선 데이터셋의 양과 질이 모두 보장되어야 합니다.
그렇다면 내가 가지고 있는 데이터셋의 양과 질이 충분한지는 어떻게 판단할 수 있을까요?
첫 번째 스텝이자 가장 중요한 것은 모델링의 목적을 명확히 하는 것입니다. ‘피자’를 모델링할 땐 위의 데이터셋과 Feature가 문제가 되었지만, ‘콤비네이션 피자’를 모델링하고자 한다면 상황이 달라질 것이기 때문입니다.
모델링의 목적을 확실히 한다면, 어떤 feature가 꼭 필요한 feature인지, 혹은 noise인지 판단할 수 있을 것입니다. 그 기준을 가지고 탐색적 데이터 분석(EDA)을 통해 지금의 데이터가 양질의 데이터를 갖추었는지 파악하고 그에 맞는 전처리와 모델링 기법을 선택하시면 됩니다.
모델 복잡도 측면에서 오버피팅을 줄이기 위한 방법은 어떤 것이 있을까요? 대표적인 방법인 Reguralization을 소개해 드리겠습니다.
Regularization
보통 번역으로는 “정규화” 혹은 “일반화”라고 표현되고 있습니다. 이해를 쉽게 하기엔 일반화가 더 도움이 되는 것 같습니다. 모델은 앞서 설명한대로 실제 현상을 표현하는 것이라면 특정 데이터로 만들어진 모델은 해당 분야에 일반적으로 사용될 수 있어야 합니다. 하지만 오버피팅되어 있다면 특정 조건 하에서만 사용이 가능할 것 입니다.(훈련용 데이터셋과 유사하게 만들어질 수 있는 조건)
오버피팅을 예방하고 모델을 좀 더 일반적으로 만들어 줄 수 있는 일종의 패널티라고 이해한다면 쉬울 것 입니다. Regularization에는 dropout, early stopping, L1-norm, L2-norm 등 다양한 방법들이 있습니다. 쉽게 이해할 수 있는 dropout과 early stopping에 대해서 살펴보고, 다양한 테크닉들은 상황에 맞게 이어질 ML101에서 소개하겠습니다.
- Dropout
Dropout은 딥러닝에서 쓰이는 기법으로, 말 그대로 학습 과정에서 무작위로 몇 개의 뉴런(neuron)을 제외(dropout)하는 기법입니다.
본 모델에 N개의 뉴런이 있다고 할 때, 무작위로 a개의 뉴런을 제외하기 때문에 ‘N-a’개의 뉴런을 가진 수많은 모델이 생성되고, 그 수많은 모델이 각각 학습한 결과를 내는 것으로 쉽게 말하면 ‘집단지성’으로 오버피팅을 방지하고자 하는 것이라고 할 수 있습니다.
- Early Stopping
직관적으로 이해하는게 가능할 것 같습니다. 말 그대로 오버피팅이 일어나기 전에 학습을 종료하는 것입니다. 그렇다면 오버피팅이 일어나는 것은 어떻게 알 수 있을까요? 눈치 빠르신 분들은 위에서 답을 찾으셨을지도 모르겠습니다.
기계학습 모델링 과정에서는 학습하는 과정에서 사용하는 훈련용 데이터셋의 에러를 기록해두고, 검증용 데이터셋으로 실제 모델이 잘 작동하는지 확인하는 과정을 거치게 됩니다. 검증용 데이터셋이 에러가 감소하다가 다시 증가하는 지점. 즉, 훈련용 데이터셋에 오버피팅된 시점에서 학습을 종료시키는 방법이 Early stopping 테크닉 입니다.
이제 데이터셋 측면에서 오버피팅을 줄일 수 있는 방법을 알아보겠습니다.
Cross Validation
데이터 셋 측면에서 오버피팅을 줄이는 가장 대표적인 기법입니다.
데이터를 학습 데이터와 검증용 데이터로 나누어 학습된 모델을 검증하여 과적합 여부를 검증하는데, 모델의 성능을 향상시키다 보면 검증용 데이터에 오버피팅이 일어날 수 있습니다. 그래서 이를 방지하기 위해 학습 데이터와 검증용 데이터를 계속 바꾸며 문자 그대로 교차 검증을 하는 기법입니다.
다양한 교차 검증 기법 중 대표적인 hold-out 교차 검증과 K-fold 교차 검증을 소개하도록 하겠습니다.
- Hold-out 교차 검증
1번과 같이 가장 기본적인 학습 데이터와 검증용 데이터로 나누어 학습된 모델을 검증한다면, 동일한 테스트 데이터를 반복하여 재사용 시 모델이 오히려 오버피팅 될 위험성이 있습니다.
이를 방지하기 위해 2번의 그림과 같이 훈련데이터를 훈련데이터와 검증데이터로 한 번 더 나누는 기법이 Hold-out 교차 검증 기법입니다.
훈련데이터로 학습하고, 검증데이터로 성능을 높이며, 테스트 데이터로 최종 성능을 파악하는 구조입니다. 테스트 데이터가 오버피팅 될 우려 없이 훈련을 할 때마다 검증데이터로 모델을 평가할 수 있다는 장점이 있습니다.
교과서와 많은 연습 문제집(훈련 데이터)로 공부를 하고, 모의 고사 문제집(검증데이터)로 자신의 실력을 파악한 뒤, 실제 수능(테스트 데이터)으로 최종 성적을 파악하는 것이라 비유할 수 있겠습니다.
- K-fold 교차 검증
위 사진과 같이 데이터를 K개의 그룹으로 나누어 K번의 학습과 검증을 수행하여 나온 각각의 결과로 평균을 내어 본 모델의 정확도를 검증하는 방법입니다.
아무래도 모델 생성과 평가하는 과정을 K번 반복하는 만큼 시간이 많이 소요되는 것이 이 기법의 단점인데요, 그럼에도 모든 데이터를 학습과 평가에 활용할 수 있기에 테스트 데이터에 오버피팅이 일어나는 것을 방지할 수 있으며 특히 데이터가 적은 경우 주어진 데이터를 최대한 활용하여 언더피팅을 방지할 수 있다는 장점이 있습니다.
이렇게 Overfitting을 마지막으로 5회에 걸친 Regression 모델 파트를 마무리하였습니다. 다음부터는 Clustering에 대해 알아볼텐데, 지난 5번의 글이 머신러닝 모델링에 있어 가장 기본적인 부분이었던 만큼, 지난 글들을 복습하고 넘어가는 것은 어떨까요?