머신러닝 공부 - 오버피팅(Overfitting)의 개념과 해결 방법
Overfitting(과적합)이란
머신러닝은 (쉽게 얘기하자면) 대량의 데이터를 알고리즘에 넣어서 일종의 규칙을 생성하고, 그 규칙에 따라 입력값을 분류하도록 하는 거다. 그래서 이 알고리즘에 제공하는 학습 데이터가 매우 중요하다. 학습 데이터의 모든 값들을 하나하나 살펴보면서 규칙을 생성하기 때문이다.
overfitting은 모델의 파라미터들을 학습 데이터에 너무 가깝게 맞췄을 때 발생하는 현상이다. 즉, 학습 데이터가 실제 세계에서 나타나는 방식과 완전히 똑같을 거라고 가정해버리는 거다. 그래서 학습 데이터 세트에 속한 각각의 개별 데이터들을 완벽하게 설명하기 위한 모델을 생성한다.
일단 말로만 들었을 땐 좋을 수도 있는데 정말 현실이 그러할까?
아래 그림을 보자.
각 점들은 학습 데이터, 선은 머신러닝이 생성한 모델이라고 볼 수 있다. 이 모델은 개별 점들을 하나도 놓치고 싶지 않아서, 이 현상을 어떻게든 완벽하게 설명하고 싶어서 요리조리 따라가며 선을 그리고 있다. (이게 바로 오버피팅 된 거다.)
그런데 실제 현상도 이렇게 구불구불한 선을 따라서 나타날까? 아닐 거다. 우리는 적당히 큰 그림을 볼 필요가 있다. 그래야 전체적인 추세나 패턴이 보이고, 제대로 된 인사이트를 얻어 예측을 해낼 수 있으니까.
만약 학습 데이터를 통해 전체적인 패턴을 유추하면 아래 그림과 같은 선을 그을 수 있다.
딱 봐도 이 선이 좀 더 좋은 모델처럼 보인다.
결국 오버피팅은 너무 세밀하게 학습 데이터 하나하나를 다 설명하려고 하다보니 정작 중요한 패턴을 설명할 수 없게 되는 현상을 말한다고 이해하면 된다.
학습 데이터에 지나치게 의존하면 거기에 포함된 다양한 편견이나 불공정한 내용까지 모델이 답습하게 된다. Garbage In, Garbage Out.
자, 그럼 이제 이 문제를 어떤 방식으로 다루고 해결해야 할까?
Overfitting 문제를 해결하는 방법
1. 일단 데이터부터 자세히 살펴보기
데이터에서 중요한 통계치들을 면밀히 봐야 한다. 변수들의 평균과 중앙값은 물론이고, 예를 들면 pandas의 groupby
와 같은 메서드를 사용해서 반드시 집단별 통계치를 확인해야 한다. 그게 곧 머신러닝이 학습하게 될 패턴이니까.
데이터 확인할 때 가장 도움이 되는 건 역시 시각화(visualization)다. 시각화만 잘 해도 중요한 패턴이 우리 눈에 띌 거다.
2. 애초에 적절하게 수집된 데이터인지 확인하기
머신러닝 모델을 적용하고자 하는 모든 집단으로부터 골고루 수집된 데이터인지 확인할 필요도 있다. 수집된 데이터가 특정 장면에만 적용되는 것이라면 애초에 보편적으로 적용할 수 있는 모델이 아니니까. 특정 집단의 특성만 반영할 가능성이 높다. 데이터 수집 단계에서부터 신중했는지 검토하자.
3. 학습 데이터 보강(Augmentation)하기
예를 들어 불법 신용카드 거래를 감지하는 머신러닝 모델을 생성한다고 가정해보자. 우선 모든 거래 중 불법 거래는 거의 없을 테니 모든 거래가 합법적이라고 예측하는 무식한 모델을 세워놔도 매우 높은 정확도를 얻게 될 수 있다.
그래서 이 문제를 해결하려면 학습 데이터에 내가 가지고 있던 사례의 특성들을 조금씩 조작해서 추가하는 방법을 사용하기도 한다. 위 예시에서 만약 애초에 내가 가지고 있던 학습 데이터에 사기 거래가 2건밖에 없었다면 이 알고리즘은 그 2건이 가진 특성에 대해서만 완전 꽂혀버려서 당연히 오버피팅이 발생할 수밖에 없을 거다. 그래서 조금씩 다른 사기 거래 케이스를 조작적으로 추가해서 다양한 케이스를 확보하여 오버피팅을 줄여주는 작전이다. (이를 Data Augmentation이라 부른다.)
이런 작전은 이미지 분류에서 특히 많이 사용된다. 만약 동물 사진을 분류하는 모델이라고 한다면, 멀쩡한 이미지뿐만 아니라 그 사진들을 회전시키거나 약간 찌그러뜨린 수정본들도 함께 학습시키는 거다.
4. 학습 데이터에 포함될 특성(featureset)을 제한하기
한때 Amazon이 채용 프로그램에 인공지능(AI) 시스템을 적용했다가 결국 폐기했다는 사실이 이슈가 된 적이 있다.
우스운 얘기지만, 이게 머신러닝의 현실이다. 물론 아마존과 같은 거대한 기업에서 본인들의 실수를 인정하고 공개했다는 것만으로도 정말 대단한 일이라고 생각한다. 덕분에 이에 대한 논의의 필요성이 더 부각되기도 했다.
아무튼 (위 예시에서 성별처럼) 어떤 특성이 모델에 영향을 과도하게 미치는 경우에는 오히려 해당 특성을 제거하고 모델을 학습하는 전략을 짜볼 수도 있다. 안 그러면 다른 모든 특성이 다 똑같더라도 특정한 특성(성별) 하나가 다르다는 이유만으로 분류나 예측을 수행하게 되는 셈인데, 이건 결국 이 모델이 현실에서 나타나는 편견이나 차별을 그대로 반영한다는 뜻이기 때문이다.
이상적으로 생각하면 모델이 어떤 특성들을 바탕으로 분류/예측을 하길 기대하는지 잘 생각해보고 정말 필요하다고 생각하는 특성들을 포함시켜야 한다. 그런데 이게 말처럼 쉬운 일일까? 기울어진 운동장 얘기가 왜 나오는지 생각해보자. 그리고 만약 AI 채용에서도 성별 관련 내용들만 빼고 다시 학습시키면 남녀차별 문제가 해결될까? 그리고 이런 식으로 개입하는 게 과연 맞긴 한 걸까?
5. 반성, 또 반성하기
머신러닝 알고리즘은 학습 데이터를 들여다보면서 가정과 규칙을 세우기 때문에 어차피 어떤 식으로든 일종의 편향을 갖게 된다.
머신러닝 알고리즘은 학습 데이터를 들여다보면서 가정과 규칙을 세우기 때문에 어차피 어떤 식으로든 일종의 편향을 만들어낼 거다.
그러니 우리는 학습 데이터에 편향이 내재되어 있다는 것을 인정하고 시작하는 게 좋다. 그리고 만약 그러한 편향을 어떤 식으로든 보상하거나 그 효과를 상쇄시키려고 개입하는 행위는 결국 데이터에 또 다른 편향을 심게 되는 꼴이 될 수도 있기 때문에 주의해야 하고… 결국 균형을 잡는 게 중요하다. 중요한 건 현실에 이미 편향이나 차별, 기울어진 운동장이 존재한다는 걸 공개적으로 언급하고, 모든 이해관계자들이 이 사실을 인정한 상태에서 모델을 활용해야 한다는 거다.
우리나라 정보통신기술진흥센터에서 발행한 동향보고서에도 이런 칼럼이 하나 올라왔다.
서론을 일부 발췌하자면…
알고리즘 전문가에게는 익숙하지만 세간에는 잘 알려지지 않아서 알고리즘에 관한 오해를 초래할 수 있는 주요 개념들을 정리하여 소개한다. 사실 이에 대한 이해는 알고리즘 책임성을 위한 올바른 논의를 정초함에 있어서 중요하다.
(중략)
이를 바탕으로 알고리즘 책임성에 대한 최근의 논의를 살펴보고 이 이슈를 보다 생산적인 방향으로 이끌 수 있는 방법을 모색해본다. 본 고의 접근법은 컴퓨터과학 및 경영과학과 법제도에 관한 사회과학적 시각 사이의 간극을 메우면서 소모적인 논쟁을 줄이는 데 도움을 줄 수 있을 것이다.