[AI 이야기]
인공지능 제대로 가르치기…기계학습에서 모델의 일반화 성능을 높이는 방법 [한경비즈니스 칼럼=이주열 LG CNS AI빅데이터연구소장, 김명지 AI빅데이터연구소 책임]
참고 자료
Michael Nielsen, Neural Networks and Deep Learning, http://neuralnetworksanddeeplearning.com/
회사원들이 우스갯소리로 말하는 ‘시연의 법칙’이라는 것이 있다. 분명 어젯밤에 테스트해 볼 때는 잘 작동하던 것이 중요한 보고나 고객 앞에서 시연할 때만 갑자기 기능이 동작하지 않고 느려지고 예외가 발생하는 일이 있다.
오버피팅과 일반화 성능
억울한 일이지만 이러한 문제는 기계 학습에서도 굉장히 자주 발생한다. 학습시킬 때는 주어진 데이터를 잘 맞혔는데 이상하게도 운영 환경에만 올리면 추론 성능이 뚝뚝 떨어지곤 한다. 이는 기계 학습에서 가장 중요한 개념 중 하나인 일반화 성능과 연관이 있다. 일반화 성능은 ‘이전에 본적 없는 데이터’에 대해서도 잘 수행하는 능력이다. 즉, 우리가 만든 인공지능(AI) 모델은 훈련 시에는 본 적이 없는 새로운 입력 데이터에 대해서도 잘 수행돼야 한다는 것이다. 훈련 시에만 잘 작동하고 일반화 성능이 떨어지는 모델을 오버피팅(overfitting)됐다고 한다.
예시를 통해 알아보자.
에서 A학생과 B학생은 고3 수험생으로 올해 수능을 치른다. 남은 시간은 한 달 남짓이다. A학생은 이해력이 조금 딸리지만 굉장한 노력파로, 남은 한 달 동안 최근 5년간의 수능 기출을 전부 암기해 버렸다. 그래서 A학생은 문제만 들으면 정답이 몇 번 보기에 어떤 문장이었는지 정확하게 복원해 냈다. 다만 문제의 의도가 무엇인지, 왜 그 보기가 정답인지는 이해할 수 없었다. 단순히 문제와 답을 외웠기 때문이다.
B학생은 한 달간 과거 기출의 출제 의도를 파악하고 그 보기가 왜 정답인지 이해하며 공부했다. 최근 5개년의 출제 동향이나 문항 패턴을 파악했지만 어려운 문제도 있어 기출 문제를 전부 맞힐 수는 없었다. 기출을 암기한 A학생과 내용을 이해한 B학생은 올해 수능 수험장에 들어갔다. 수능 결과가 어땠을까.
여기서 A학생은 AI 모델로 따지자면 오버피팅된 모델이라고 볼 수 있다. 이미 습득한 데이터에 대해서는 모두 외웠기 때문에 기가 막히게 잘 맞힐 수 있지만 일반화 능력이 떨어지기 때문에 외운 것과 다른 데이터에 대해서는 제대로 역할을 수행하지 못한다.
만일 AI를 도입하려는 적용처가 늘 한정된 데이터 몇 가지만 다루는 곳이라면 데이터를 외워 추론하는 모델을 만들어도 무관하다. 이때 머신러닝이나 딥러닝 모델을 사용하지 않는다고 해도 간단하게 처리할 수 있는 것이 많을 것이다. 하지만 현장은 다양한 패턴의 데이터가 셀 수 없이 쏟아져 나오는 경우가 대부분이다. 특히 사진·동영상·글·음성 등과 같은 비정형 데이터를 다루는 곳이라면 더더욱 그러하다. 미리 쌓아 놓은 데이터를 잘 맞히도록 학습하는 것은 물론 중요하지만 앞으로 실시간으로 발생할 데이터도 잘 추론하도록 하는 것이 목적이 돼야 한다. 즉, 운영 환경에서의 일반화 성능 또한 학습 과정에서의 최적화만큼이나 중요하고 늘 이를 염두에 두고 모델을 만들어야 한다. 학습·검증·테스트
학습된 모델이 현장에서도 잘 작동할지는 어떻게 확인할 수 있을까. 먼저 확보한 데이터를 학습·검증·테스트의 3세트로로 나누고 각 세트가 수행할 역할을 구분해 주도록 한다.
각 데이터 세트의 역할은 다음과 같다.
1) 학습 세트(training set)
학습 세트는 머신러닝·딥러닝 모델을 학습하는 데 이용하는 데이터다. 모델은 학습 세트의 입력 데이터와 정답을 보고 정답을 더 잘 맞히기 위해 노력한다. 이는 단순 최적화에 해당한다.
2) 검증 세트(validation set)
검증 세트는 머신러닝·딥러닝 모델에 정답을 알려 줄 데이터는 아니지만 모델을 튜닝하는 데 도움을 주는 데이터다. 즉 모델의 일반화 성능을 판단해 이어질 실험을 계획하는 데 이용한다. 모델은 검증 세트의 정답은 본 적이 없지만 이 세트의 입력 데이터만으로 일단 정답을 추론하게 된다. 모델이 배우지 않았던 데이터, 즉 처음 보는 데이터에 대해 얼마나 잘 맞히는지 계산할 수 있으니 이 결과를 보고 우리는 실험을 개선할 수 있다. 예를 들어 우리가 만든 모델이 학습 세트에 대해서는 잘 맞히는데 검증 세트에 대해서는 너무 못 맞힌다고 가정하자. 위 예제의 학생A처럼 알려준 것만을 달달 외우고 일반화 성능이 부족한 오버피팅 현상이 발생했다고 볼 수 있다. 이를 통해 다음 실험 때는 오버피팅을 방지할 전략을 세워볼 수 있다.
3) 테스트 세트(test set)
테스트 세트는 모델의 학습에 어떤 식으로도 전혀 관여하지 않는 데이터로, 오로지 모델의 최종 성능을 평가하기 위해 따로 떼어 놓은 데이터다. 여러 모델 간 성능을 비교할 때 테스트 세트에 대한 스코어를 활용한다. 학습 세트로 모델을 학습하고 검증 세트에 대한 성능을 확인하며 모델을 개선해 왔으니 그 결과를 공정히 평가하기 위한 기준이다. 학생A와 학생B가 치른 금년도 수능 시험과 같은 데이터라고 볼 수 있다. 모든 수험생이 제각기 다른 방식으로 공부했겠지만 모두 처음 보는 문제로 동시에 공정하게 평가하는 기준이 수능이다. 학습 곡선 확인하기
역할에 따라 데이터를 나눴다면 학습이 제대로 이뤄지는지, 일반화 성능이 떨어져 오버피팅이 발생하지 않았는지 확인해야 한다. 확인하는 방법은 학습 곡선을 그려보는 것인데, 학습 곡선은 학습이 진행됨에 따라 모델의 성능을 기록하는 그래프다.
오버피팅이 발생했는지 확인할 수 있는 방법은 학습 곡선상에서 학습 세트와 검증 세트에 대한 모델의 성능이 어떻게 변화하는지를 확인해 보는 것이다. 정답을 알면서 배우는 데이터에 대해서는 당연히 잘 맞혀야겠지만 정답을 모르고 추론만 진행하는 데이터에 대해서는 어떤 경향을 보이는지 살펴보는 것이다. 어느 순간 검증 세트에 대해서 성능 개선이 없다면 모델은 ‘학습’이 아닌 ‘암기’를 하는 것이라고 볼 수 있다. 학습 곡선은 전형적인 오버피팅의 예다.
위 은 400 에포트 동안 모델 학습을 시켰다. 왼쪽의 그래프를 보면 학습 세트, 즉 모델에게 정답을 알려주면서 잘 맞히도록 유도하는 경우에 대해서는 문제없이 최적화가 진행되는 것처럼 보인다. 왼쪽 그래프의 세로축을 이루는 ‘코스트(Cost)’라는 것은 실제 정답과 모델이 예측한 예측 값의 차이를 정량화한 수치로, 작을수록 모델이 잘 맞힌 것이다. 하지만 오른쪽의 그래프를 보면 모델이 정답을 모른 채 예측만 해야 하는 검증 세트에 대해서는 280 에포크 즈음부터 크게 개선된 게 없다는 것을 볼 수 있는데 이때의 세로축은 분류 정확도(accuracy)로, 그 값이 클수록 분류를 잘한다는 뜻이다. 학습 세트에 대해서만 성능을 개선하고 있고 검증 세트에 대해서는 별다른 향상이 없는 시점이 오버피팅 발생 시점이다.
정규화
만일 머신러닝·딥러닝 모델을 학습할 때 과 같은 경향을 마주했다면 다음 실험에서는 이 현상을 개선하기 위한 전략을 취해야 한다. 오버피팅을 피하기 위한 모든 전략들을 정규화(regularization)라고 한다. 정규화의 목적은 일반화 성능을 향상하는 데 있다. 학습 세트에 대해 더 잘 맞히고자 하는 것이 아니라 현장에 나가 처음 보는 데이터에 대해서도 잘 맞힐 수 있도록 하는 목적이다. 이를 위해 취할 수 있는 대표적인 정규화 방법을 간단히 소개한다.
4) 데이터 증강
오버피팅을 피하는 가장 좋은 방법은 데이터를 더 많이 확보하는 것이다. 다양한 데이터가 있다는 것을 알려준다면 AI 모델도 현장에 나갔을 때 새로운 데이터를 더 잘 맞힐 수 있을 것이다. 하지만 현실적으로 데이터가 절대적으로 부족한 경우가 대부분인데 이를 위해 부족한 데이터 수를 많은 것처럼 증강시키는 다양한 기법이 있다.
이미지 데이터 학습을 예로 든다면, 한 장의 이미지를 좌우로 반전시키거나 일부 영역을 크롭하거나 노이즈를 추가하거나 색상·명암·채도 등에 변화를 줘 모델 학습에 추가로 데이터를 이용할 수 있다. 이렇게 하면 AI에 더 다양한 환경에서 찍은 듯한 이미지를 학습시키는 효과를 주어 오버피팅을 방지할 수 있다. 하지만 너무 과도한 변형은 오히려 해가 될 수 있으니 주의해 이용해야 한다. 5) 모델 수용력 줄이기
모델 수용력은 모델의 복잡한 정도를 나타내는 개념이다. 일반적으로 딥러닝 모델이 머신러닝 모델보다 모델 수용력이 높고 그중에서도 신경망을 여러 층 쌓거나 뉴런의 수를 많이 둘수록 수용력이 높아진다고 말할 수 있다. 수용력이 높은 모델은 처리할 데이터의 복잡 다양한 패턴을 더 잘 담아낼 수 있다.
하지만 수용력이 필요 이상으로 너무 높은 모델은 주어진 데이터를 외우게 될 가능성이 높다. 따라서 수행하려는 태스크에 알맞은 수용력을 가진 모델을 선택하는 것이 좋은데 태스크의 복잡도와 수용력의 관계는 딱 정해진 규칙이 없어 어느 수준이 적정선이라고 말하기는 어렵다. 만일 오버피팅의 경향이 발견된다 싶으면 모델의 층수를 줄여본다든지 한 층의 뉴런 수를 줄인다든지 등의 조치를 취해 볼 필요가 있다.
6) 조기 종료
조기 종료라는 기법은 말 그대로 오버피팅이 감지될 경우 목표하는 학습 시간이 다 되지 않았다고 하더라도 ‘조기 종료’해 버리는 것이다. 학습 곡선 예제 그림의 경우 400에포크를 학습하기로 계획했지만 오버피팅이 감지되니 280 에포크쯤에서 학습을 중단할 수 있다. 요즈음의 기계 학습 프레임워크에서는 조기 종료를 적용하기 쉽도록 관련 기능을 잘 패키징해 둔 경우가 많다.
7) 드롭 아웃
드롭 아웃은 학습 과정에서 일정 비율만큼의 노드를 무작위로 끄고 학습을 진행하는 기법이다. 딥러닝 모델 학습 시 상당히 많이 적용하는 정규화 기법 중 하나인데, 일부 노드가 사라진 상태에서 남아 있는 노드만으로 어떻게든 정답을 맞혀야 하는 딥러닝 모델은 훨씬 더 강력해질 수 있다. 없어진 주변 노드의 몫까지 수행해야 하니 훨씬 기능이 강화된 모델이 되는 것이다.
AI를 현장에 적용할 때도 ‘나무를 보지 말고 숲을 보라’는 말이 유효하다. 이미 확보해 놓은 과거의 데이터에 대해 좋은 성능을 낼 수 있도록 잘 학습하는 것, 이는 물론 굉장히 중요하지만 목적은 거기에서 끝나지 않는다. 잘 만들어진 모델이 향후 실제 현장에서도 좋은 성능을 내며 데이터를 처리할 수 있게 되는 것이 최종 목표일 것이다.
기계 학습에서 한 번에 완벽한 모델이 만들어지는 경우는 없다. 첫째 모델의 성능이 엉망진창이라고 해도 실패한 것은 아니다. 다만 어떤 현상이 문제인지 확인하고 앞으로의 개선 전략을 잘 세워 둘째·셋째 모델을 만들 수 있으면 된다.
[본 기사는 한경비즈니스 제 1302호(2020.11.09 ~ 2020.11.15) 기사입니다.]
© 매거진한경, 무단전재 및 재배포 금지