이제까지와 조금 다른 이야기. 예측모형을 다루다 보면 어떤 문제가 발생하게 되는데, 그것이 바로 Overfitting(과적합), Underfitting(과소적합)입니다. 벌써 이 부분에 대해서 이전에 "적합성은 좋은데 계수가 유의하지 않으면 어쩐다? 걍 버릴까..? 다중공선성의 해석"편에서 은근슬쩍 이야기한 적이 있긴 합니다만, 예측모형의 성능이 안 좋을 때에는 꼭 따져봐야 하는 것이기 때문에 기계학습(예측 모형)을 다루기 전에 아주 간단하게 다뤄볼까 합니다.
잠시만, 그전에 조금 정리해야 하는 용어가 있는데, 학습(Training), 검증(Validation), 시험(Testing) 입니다. 그에 따라 우리가 가지고 있는 표본을 Training데이터, Validation데이터 그리고, Testing데이터로 나눠서 사용합니다. 학습이라는 것은 말이죠, 가정하고 있는 모형을 표본데이터를 이용하여 완성하는 것이고 검증과 시험은 나머지 학습에 사용되지 않은 표본데이터를 이용하여 예측 성능을 검증하는 것입니다. 아직 학습이 되지 않은 모형의 입장에서는 Training데이터로 학습을 하고, Validation데이터와 Testing데이터는 학습할 때 못 본 데이터니까 예측을 하는 것과 다름없습니다. 게다가 Validation과 Testing데이터는 종속변수의 정답을 알고 있으니까 얼마나 예측이 잘 되고 있는지를 파악할 수 있습니다.
자, 그러면 여기에서 Validation과 Testing은 뭐가 다르냐 할텐데, Validation은 학습 중에 사용되고, Testing은 학습이 완료된 후에 사용됩니다. 그게 무슨 말이냐 하면, Validation은 학습 중에 학습을 잘하고 있는지 계속 확인하는 것이고, Testing은 학습이 완료된 후에 학습이 잘 되었는지를 확인하는 것이죠. 뭐, 어찌 보면 당연한 이야기입니다. 한 가지 주의할 점은 Validation데이터는 학습에 절대로 사용하지 않아야 합니다. 난생처음 보는 데이터이어야 하거든요.
자, 이제 과적합(Overfitting)과 과소적합(Underfitting)을 이야기 해 보자면, 이게 말로 하는 것보다 그림을 보면 더 확실하게 이해할 수가 있는데 회귀를 예시로 해서 한번 보시죠. 자, 회귀를 통해서 어떤 모형을 완성했다고 했을 때, Underfit 같은 경우에는 헐렁하게 모형이 완성되거나, 엉뚱하게 완성된 것입니다. 반면에 Overfit은 모든 훈련데이터만을 맞출 수 있도록 과도하게 학습한 상태를 말하죠.
그런데, 이 Overfit과 Underfit을 다룰 때 난데없이 Bias(편의)와 Variacne(분산)의 용어를 사용할 때가 있는데 이게 어 그렇지.. 어? 하면서 좀 헷갈립니다. 이 뜬금없는 Bias와 Variance라는 용어가 등장하면서, Bias가 크면 어떻다고 하고, Variance가 크면 어떻다는 표현이 등장하게 되는데, 왜 그런 식으로 말하는지 감을 잡아야 다른 사람들과 응응. 맞아. 그런 듯? 하고 잘 대화할 수 있으니까, 조금 귀찮더라도 잘 이해하면 좋을 것 같습니다.
결론부터 이야기하자면 Bias가 크면 학습을 할 때 엉뚱한 학습을 한거고, Variance가 크면 너무 자세하게 학습을 한 겁니다.
보통 Bias와 Variance를 설명할 때 다음과 같은 그림이 아주 자주 나오는데요,
사실 이 과녁 그림은 뭔가를 이해하는데 끼워 맞추면 밎출수도 있겠지만, 이건 마치 객체지향을 다루면서 클래스를 설명할 때 붕어빵과 붕어빵틀 이야기를 하는 것과 비슷한 설명 같아서 적잖이 당황했습니다. - 붕어빵과 붕어빵틀 설명을 보면서 쉽게 설명은 매우 쉬워 보이지만 막상 이해시키기 어려운 방법을 선택한 것 같아서 매우 경악했습니다. - 결국에는 왜 그렇게 설명했어야만 했는지 그도 그럴만한 사정이 있었겠지 하고 생각하긴 했지만요.
이 설명을 직관적으로 이해하자면, 과녁이 정답 Test 데이터이고, 그 과녁을 예측해서 맞출 때, 예측들값과 과녁의 정답이 대체로 멀리 떨어져 있으면 편향(Bias)이 높다고 말하고, 예측값들이 서로 대체로 멀리 흩어져있으면 결과의 분산(Variance)이 높다고 하는 것입니다. 과녁에 0점 사격을 하는데, 탄창군이 정답에서 멀리 떨어져 있으면 Bias가 크고, 한 곳에 몰려있지 않으면 Variance가 크다고 설명하는 셈입니다. 여기에서 중요한 것은 주어가 '예측값'이라는 점입니다. 이 설명이 이상한 점은 과녁이 정해져 있는데 그에 대한 예측값이 여러 가지라는 점입니다. 이 그림이 예측을 정확하게 묘사하려면 과녁이 조금씩 움직인다고 봐야 하겠죠. 게다가 Bias/Variance : High/Low 이렇게 4가지 경우를 모두 고려할 필요도 없거든요.
결과적으로 모형의 Behavior에 대한 이야기이긴 한데, 왜 이런 일이 벌어지는지에 대한 원인을 이야기를 하면 조금 나은 설명이 될 것 같은데, Bias가 큰 경우에는 학습할 때 과녁이 어디에 있는지를 제대로 못 찾은 거고, Variance가 큰 경우에는 학습할 때 너무 학습데이터에 꼭 맞춰서 학습했기 때문에 예측이 조금씩 엇나가게 되는 경우를 의미합니다. 이게 무슨 소리냐 하면, 학습할 때 엉뚱한 점을 향해서 학습하게 되면 엉뚱한 곳을 향해서 사격을 하게 되고, 학습할 때 너무 학습 데이터에만 꼭 맞춰서 학습하게 되면 유연성이 떨어져서, 모형의 Sensitivity가 크다는 의미입니다.
처음에 제시한 그림을 통해서 잘 살펴 보면, 데이터중 ★이 Testing 또는 Validation 데이터라고 했을 때, Underfit을 먼저 보면 모형이 훈련데이터를 전혀 맞추지 못하는 상태입니다. 이런 경우에 모형 예측값이 붕 떠서 완전 다른 값으로 예측됩니다. 이런 경우 예측값의 Bias가 크다고 볼 수 있겠고요, Overfit을 보면 모형의 예측값은 입력이 조금만 변해도 변화가 엄청 큽니다. 그래서 정답과 많이 동떨어져 있지는 않지만, 딱 맞추질 못합니다. 이런 경우에 예측값의 Variance가 크다고 할 수 있겠습니다. 이런 의미로 Variance를 모형의 Sensitivity로 생각해도 크게 틀리지 않겠습니다.
결론적으로 정리하면,
Underfitting(High Bias) : 학습이 덜되거나 안되어서, 데이터를 잘 설명하지 못하는 경우이고요, 왜 이런 일이 벌어지냐 생각해 보면, 아직 학습이 충분히 되지 않았거나, 잘못된 Feature를 설계해서 학습시킨 경우가 태반입니다. 한마디로 Training Data도 잘 못 맞추고, 처음 보는 Test Data도 못 맞추는 그런 총체적인 난관입니다. 즉 아직 학습이 덜 된 덜떨어진 모델이라고 생각하면 편합니다.
Overfitting(High Variance) : 학습이 훈련 데이터에 너무 꼭 맞추어서 빡세게 된 나머지 Training Data를 너무나 잘 설명하는데, 처음 보는 Test Data에 대해서는 예측을 잘 못하는 경우를 의미하겠죠. 왜 이런 일이 벌어지느냐 하면 같은 데이터로 여러 번 활용해서 학습을 하거나 - 다르게 이야기하면 반복 학습한 것에 횟수에 비해 데이터 수가 너무 적거나 - 데이터 특성에 비해 모형이 너무 많은 표현을 할 수 있는 복잡한 모형일 경우입니다. 이런 경우 Training Data의 Error는 굉장히 작은데, Test Data의 Error는 크게 됩니다. 결국 Training Data에 대해서는 잘 맞추는 반면에, 처음 보는 Data인 Test Data는 잘 못 맞추게 되는데, 입력이 조금만 변해도 예측이 마구 변해서 High Variance라고 합니다.
그러니까, 누군가가 Bias는 안큰데, Variance가 크네 하면, Overfitting 된 상태라고 이해하면 매우 유식한 사람이 될 수 있습니다.
잠시만요, 지금까지 복잡한 모형이라는 말이 자꾸 나오는데, 이것은 모형의 표현력과 직결되는 개념입니다. Model Complexity라고도 표현을 많이 했는데, 그건 또 뭔지 잠시 짚고 넘어갈 필요가 있겠습니다.
우선 회귀모형에서는 표현식의 차수가 높아지면 높아질 수록 데이터에 대한 표현력이 높아지고, Model Complexity라는 게 높아집니다.
그리고 추가로 Logistic 분류에서도 표현식의 차수가 높아질 수록 Model Complexity가 높아지면, 데이터에 대한 표현력이 높아집니다. 당연히 기억하겠지만, 여기에서 σ는 Sigmoid입니다.
간단히 본다면 이런 식입니다. 오른쪽으로 갈 수록 표현력/복잡도가 증가한다고 보면 되겠는데, 한마디로 모형의 파라미터가 많을수록 표현력과 복잡도가 증가하는데 데이터에 비해 표현력이 낮으면 Underfit이 되고, 너무 높으면 Overfit이 됩니다.
Overfit과 Underfit의 원인을 알아보긴 했는데, 우리가 모형을 학습시킬 때 어떤 식으로 이걸 알아챌 수 있을까를 알아야 뭘 하든 하겠죠. 지금까지 모형을 학습시킬 때 Loss(예측값과 정답의 차이)를 계속 봐왔잖아요? 이걸 학습곡선이라고 하는데, 그 Loss 그래프를 기준으로 Overfit과 Underfit이 발생했을 때의 그래프의 양상을 좀 살펴보면 도움이 되겠습니다. 이때의 전제조건은 모형이 잘 설계되어 표현력은 적당하다는 전제조건이 있습니다.
모형의 표현력이 적절할 때에는 학습을 할 수록 Underfit에서 Overfit으로 넘어가는 것이 정상적인 현상입니다. 이게 정상적이라는 점을 알고 있으면 다른 현상도 스스로 해석할 수 있습니다. 빗금 친 부분에서 Overfit이 발생하기 시작하죠? 그러니까, 정상적인 학습에서는 Validation Loss가 같이 잘 떨어지다가 혼자 치고 올라갈 때에는 Training데이터는 아주 잘 맞추고, Validation데이터는 잘 못 맞추는 때가 되는 것이니 이때 - Overfitting이 되기 전에 - 학습을 멈추면 적절한 학습이 이루어집니다. 이런 걸 Early Stop이라고 부릅니다.
자, 그러면 모형의 Complexity에 대해서도 이걸 따져볼 수가 있는데, 다음의 그림과 같은 설명이 꽤나 인용되는데, 어떤 면에서는 이런 식으로 설명하는 뒷 사정을 공감하긴 하지만, 이렇게 설명하면 학습곡선과 헷갈리게 되어 많이 헷갈릴 수 있습니다. x축이 무엇인지 잘 보세욥.
이렇게 Error 곡선이 똑같은 느낌의 그래프가 됩니다. 그림으로 이해하기보다는 다음과 같이 이해하는 편을 추천합니다.
그리고 이 Overfit는 늘 우리를 괴롭힐 테니 이런 Symptom을 미리 숙지해 두면 도움이 될 거라 생각합니다. 특히 익숙한 MLE를 통한 모형 학습은 Overfitting을 유발할 수 있는데, 이 이유와 이 Overfit문제를 Regularization을 통해 해결해야 하는 것에 대한 이야기를 했던 적이 있습니다. "MLE과 MAP, 그리고 회귀방법 (최소좌승법-OLS, 정규화-Ridge)의 랑데뷰
"편에서 본 것이 다시 나왔을 뿐입니다.
예측 모형에서의 가장 큰 이슈를 미리 짚고 넘어가는 것이고, 실무적으로 이런 현상을 미리 알아두면 헤매는 일이 없을 거라 생각합니다. 신경망 모형을 다룰 때에는 Early Stop 외에 Overfitting이 되지 않도록 하는 방법에 대해 더 다루려고 하니, 걱정 마세요.
댓글