족보와 기출문제. 이 두 단어는 시험과는 떼려도 뗄 수 없는 단어들입니다. 학생들의 시험 기간 동안의 대화를 분석하면 이 단어들의 빈도 수가 높지 않을까요? 저 역시 고등학교 때 선배들한테 받은 기출문제들을 보면서 공부했던 기억이 나네요. 어떤 과목은 거의 과거 문제에서 숫자만 바뀐 정도로 시험이 나와 그 기출문제를 입수한 학생들이 웃기도 했지만, 어떨 때는 전혀 다른 문제가 나와 뒤통수를 맞은 느낌으로 시험장을 나오기도 했었던 기억이 있습니다. 학생들이 시험지를 받아보고 괴로워하는 모습을 보고 즐거워 (?) 하는 모습의 선생님, 다 추억으로 남네요. 공부 안 하다가 벼락 치기를 일삼던 우리들은 종종 그렇게 당하기도 했었습니다.

만약 학생이 교과서만 주구장창 읽기만 한다면 내용을 잘 이해했는지 알 수가 없습니다. 면접을 보든 시험을 보든 어떻게든 평가를 해야 이 학생의 이해도를 가늠할 수 있다는 것은 당연한 이야기이겠지요. 머신 러닝 모델도 마찬가지입니다. 학습 데이터가 아무리 많더라도 제대로 학습되고 있는지 평가를 해주어야 합니다. 많은 머신러닝 입문자들이 아주 쉽게 실수하는 부분이 바로 모델 평가입니다. 잘못하면 좋은 학습 데이터를 가지고도 엉터리 모델을 생산해낼 수도 있습니다.

오늘은 머신 러닝의 기초 중에 가장 중요한 개념이라고 볼 수 있는 Cross-validation(교차 검증)에 대해 알아보겠습니다.

학습 데이터 뿐만 아니라 평가용 데이터도 중요한 이유

우리가 지난번에 공부한 문서 분류 모델 중 텍스트 감성 평가 (sentiment analysis) 모델을 예시로 봅시다. 우리는 이러한 형태의 데이터를 100,000 쌍을 가지고 있다고 칩시다.

("정말 재밌게 본 영화. 스토리도 연출도 정말 대박!", 1)‌‌
("배우들이 연기를 너무 잘하는데? 두 번 봐도 좋음.", 1)‌‌
("올해 최고의 작품!", 1)‌‌
("나는 그냥 별로. 졸다가 나왔다.", 0)‌‌
("도대체 이 뻔한 스토리는...", 0)‌‌
("정말 돈 아깝다. 인생 최악의 영화.", 0)

그렇다면 100,000 쌍의 데이터를 전부 학습용 (training data)으로 쓰고 나서 모델이 얼마나 잘하는지 볼까요? 제대로 된 모델을 선택해서 학습했다면 아마 8~90% 이상의 정확도를 가질 것입니다. 이를 우리는 학습 데이터에서의 성능, training performance라고 합니다 (틀린 경우를 계산하면 training error라고도 합니다).  

하지만 이미 모델이 본 데이터에 잘하면 무슨 소용일까요. 교과서에 나오는 문제가 토씨도 틀리지 않고 시험으로 나온다면 그저 기억력이 좋다면 대부분 맞출 수 있을 것입니다. 하지만 그렇다고 정말 실제로 이해를 한 게 맞을까요?

그렇기 때문에 우리는 학습 데이터뿐만 아니라 평가용 데이터 (evaluation data)가 필요합니다. 평가용 데이터는 모델을 학습할 때는 절대로  사용하면 안됩니다. 그렇게 되면 커닝하는 것과 마찬가지로, 실제로 이 모델이 얼마나 잘 학습을 했는지 알 수가 없거든요.

주로 전체 데이터 중 10~30%를 평가용 데이터로 할당합니다. 데이터가 귀한 세상인데도 꽤나 큰 부분을 평가용으로 나누어 놓지요. 그만큼 평가가 중요하다는 이야기입니다. 이렇게 전체 데이터에서 일부분을 뚝 떼는 방식을 holdout method라고 합니다.

연구를 하거나 실제 개발을 할 때도 평가용 데이터가 얼마나 큰지는 매우 중요한 부분입니다. 선거 여론 조사도 샘플 표본 수가 얼마나  크냐에 따라 오차 범위가 결정되지요? 이를 신뢰 구간 (confidence level)이라고 하는데 같은 통계학적 원리로 머신러닝 모델의 평가용 데이터도 너무 작으면 결과를 신뢰할 수 없습니다.

sample size가 커질수록, margin of error가 작아지고, confidence level이 커집니다 https://en.wikipedia.org/wiki/Margin_of_error

Validation set = 예비 고사, Test set = 수능

더 나아가 평가용 데이터를 두 세트로 나누고는 합니다: Validation과 Test.

저는 첫 번째는 예비 고사, 두 번째는 수능 당일이라고 이해를 하시면 좋을 것 같습니다. Validation set이 필요한 이유는 예비 고사가 필요한 이유와 비슷하기 때문입니다.

Validation set의 존재 목적은:  

  • 어떤 모델 구조, 크기를 사용할지, 모델 변수들은 무엇으로 할지 (model hyperparameter)  
  • 얼마나 오래, 얼마나 빠르게 학습을 시킬 것인지 (learning hyperparameter)  

등을 결정하기 위함입니다. Validation set의 결과가 좋지 않다면, 생각보다 낮은 예비 고사 성적을 받아 들고 만족하지 않는 학생과 다음과 같은 고민을 해야 합니다.

내가 공부하는 방식이 잘못되었나?
영어는 이미 좀 잘 나오니깐 수학을 좀 더 집중적으로 해야 하나?
공부 시간을 좀 늘려야 되나?
과외 선생님을 갈아치워야 하나?

더 영리한 학생들은 내가 틀린 문제를 보고 분석을 합니다. 어떤 유형의 문제를 잘 틀리면 그 유형을 집중적으로 공략합니다.

틀린 유형의 문제를 더 풉니다 (=> 학습 데이터를 늘립니다),
문제를 접근하는 사고방식을 바꿉니다 (=> 모델 구조를 바꿉니다),
단순히 그 유형의 문제에 대해 더 오랜 시간을 쏟습니다 (=> 학습 시간을 늘립니다).

그렇게 오답노트를 보고 여러 대비를 한 학생은 한 달 후에 같은 예비 고사 문제를 다시 풀어봅니다. 아마 대비가 제대로 되었다면 당연히 더 좋은 점수를 받겠지요? 하지만 그렇다고 이 학생이 몇 달 후에 있는 수능을 잘 볼 거라는 보장은 없습니다. 예비 고사와 비슷하겠지만, 본시험이 똑같이 나오지는 않을 테니깐요. 그래도 수능을 준비하는 입장에서는 예비 고사 점수가 매우 중요한 척도라는 건 부정할 수 없습니다.

머신 러닝 모델의 잘 학습시키는 족집게 과외 선생의 팁

1. 무작위로 잘 나누고 있는지 확인해라!

  • 학습용과 평가용을 나눌 때에는 무작위(random shuffle)로 나누는 게 중요합니다. 의외로 데이터의 순서가 학습이나 평가에 큰 영향을 줄 수 있기 때문에 가장 기초적이면서도 제일 중요한 부분입니다.

2. Validation / Test set에 있는 데이터가 Training과 중복이 안되는지 잘 확인해라!

  • 중복을 확인하지 않으면 의도치 않게 커닝하고 있는 본인 모델에 속아 넘어갈 수 있습니다. 저는 만약 생각보다 결과가 잘 나오면 기뻐하기보다는 일단 이러한 의심부터 합니다.

3. 세 부분의 분포가 최대한 비슷하게 만들어라!

  • 만약 수업 시간에는 챕터 1~5까지만 나갔는데, 시험은 진도도 안 나간 챕터 6을 내면 학생들은 멘붕 하겠지요? 마찬가지로 학습용 데이터와 평가용 데이터가 너무 다르다면 문제가 생길 수 있습니다. 특히 여러 개의 정답이 있는 multi-class classification을 다룰 때는 class 간의 분포를 맞춰주고, regression을 다룰 때는 평균값이나 표준 편차를 최대한 맞춰주는 게 중요합니다.

4. 데이터 수가 적으면 k-fold cross validation을 이용해라.

  • 만약 데이터가 수가 적으면 자연스레 평가용 데이터가 작아지고 오차 범위가 커집니다. 이를 대비해서 k-fold CV라는 방식이 존재하는데요. 예를 들어, 데이터를 5묶음 (k=5)으로 나누어 한 묶음을 평가용으로, 나머지를 학습용으로 쓰는 방식으로 총 5번 모델을 학습시킵니다. 그렇다면 총 5번의 평가 결과가 나오겠지요. 이를 평균을 내서 신뢰도를 높이는 방식입니다.

5. 마지막 팁은 조경현 교수님의 강의 노트의 마지막 챕터를 인용하겠습니다:

"I would like to emphasize is the importance of not looking at a held-out test set. One must always select anything related to learning, e.g., hyperparameters, networks architectures and so on, based solely on a validation set."

즉, test set은 마지막까지 최대한 보지 마라. 그래야만 당신의 결과가 정말 순수하고 신뢰받을 수 있는 결과가 된다는 이야기입니다. 앞서 말했듯이, 학습에 관련된 모든 결정은 validation set에서, 예비 고사 결과를 보고 끝내야 진정한 본인 모델의 실력을 측정할 수 있다는 얘기입니다.


오늘은 NLP 뿐만 아니라 머신 러닝 모델을 학습시킨다면 전부 적용되는 이야기를 해보았습니다. 사실 저도 이 큰 그림을 이해하는 것이 쉽지만은 않았는데요. Reference에 있는 Andrew Ng 교수님이나 조경현 교수님의 강의를 읽고 배웠고, 조금 더 쉽게 비유를 통해 여러분께 설명드리고 싶었습니다. 이해가 조금 쉬웠으면 바라는 마음이고, 혹시 혼란스럽거나 더 알고 싶으신 게 있다면 댓글로 달아주세요!

Reference