brunch

You can make anything
by writing

C.S.Lewis

by Changhwa Oh Nov 20. 2018

2-1화 : 처음 만난 장벽 overfitting

단순 이미지 분류가 성공적으로 진행된 뒤에 몇 가지 암초를 만났다.

2화에서는 그런 암초에 대한 설명과 그 암초를 넘기 위해 생각했던 내용들을 공유하게 될 예정이다.


당시 어려울 거라 생각했던 이미지 분류가 너무 쉽게 되어서 딥러닝에 대한 자신감이 붙었고

팀 내에서 고민하던 문제에 대해서 딥러닝으로 해결해보겠다고 제안했다.


학습을 돌렸고 정확도 99.98% 라는 최종 결과가 나왔고 우리는 환희에 가득 찼다.

라이브 배포를 하기 전에 실제 데이터에서는 어떻게 도는지 궁금해서 일부만 배포해두었는데..

웬걸 실제로 결과를 보니 A라는 카테고리로 100% 분류가 되었고 B라는 카테고리는 0% 였다.

우리는 최종적으로 B라는 카테고리를 뽑아내는 게 목표였는데 A에서도 보니 오탐이 꽤 나왔다.


문제를 분석해봤다. (사실 여기서도 꽤 오랜 시간이 걸렸다.)

원인은 바로 말로만 듣던 overfitting 즉 과적합 문제였다.


과적합은 학습 시 너무 과하게 학습하는 것을 뜻한다.

출처 위키백과 : https://ko.wikipedia.org/wiki/%EA%B3%BC%EC%A0%81%ED%95%A9#/media/File:Overfitting.svg


학습 데이터는 A 카테고리가 압도적으로 많았고 실제 데이터에서도 B 카테고리는 실제 데이터에서도 0.1% 정도에 불과했다. 학습할 때 이 부분을 고려하지 않았고 당연스레 A 카테고리로 몰리게 되었고 정확도가 높이 나올 수밖에 없던 것이었다.


특히 텍스트를 따지자면 100자 중에 2글자만 문제여도 B 카테고리로 가야 되기 때문에 전체적인 분포도에서도 문제가 있었다.


어떻게 이 문제를 해결하면 좋을까?


가장 쉽게 해결할 수 있는 방법은 데이터량을 비등하게 맞춰보는 것이었다. 

우선 전체 데이터량의 0.1% 인 B 카테고리는 최대한 길게 데이터를 수집하고 A 카테고리는 랜덤 하게 아주 미량의 데이터를 추출해서 A 카테고리 6 : B 카테고리 4로 맞췄다.

또한 당시 사용했던 모델에서 특정 로우에 가중치를 줄 수 있었는데 B 카테고리는 10점씩 줬다.


결과는 어땠을까


여전히 단순 정확도는 99.21% 가 나왔다.

B 카테고리를 찾는 정확도는 0.2% -> 1.5% 정도 나왔다.

조금 향상은 되었으나 이 정도로는 실서비스에서 활용하기 어렵다는 결론을 내렸다.

dropout 파라미터와 rate 값을 줘서 학습을 여러 번 시켜봤지만 큰 효과는 없었다.

(dropout은 쉽게 말하면 학습할 때 몇 개의 레이어를 일부로 건너뛴다고 보면 된다)


한 가지 더 궁금해졌다.

텐서플로우 로그에 찍히던 accuracy는 과연 무엇일까?

여기서 (단순) accuracy,  정밀도, 재현율을 알아보자.

매거진의 이전글 1-번외 : 데이터만 있으면 해결책은 많다
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari