티스토리 뷰

 만약 고양이 사진을 추출해주는 앱을 만들고 있다고 가정해보자.

 아마 사진들로부터 고양이라는 것을 판별할 수 있는 영상처리 SW를 만들기 위해 신경망을 사용할 것이다. 하지만 불행하게도 만든 알고리즘의 정확도가 그렇게 생각만큼 높지 않을 것이고, 고양이 이미지를 추출하는 SW를 개선하기 위해서 압박을 받을 것이다. 어떻게 하면 좋을까?

 여기에 대해서 다양한 아이디어를 낼 수 있다. 예를 들어

- 고양이 사진을 조금더 모으기
- 조금더 다양한 학습 데이터를 모으기. 예를 들어서 흔하지 않은 자세를 취하는 고양이나, 흔하지 않은 색을 가진 고양이나, 다양한 카메라 각도를 가지는 사진 같은 것들.
- gradient decent 횟수를 늘림으로써 알고리즘을 조금더 오랫동안 학습시키기
- 더 많은 layer와 node, parameter를 가지는 신경망을 사용하기
- 작은 신경망 사용해보기
- L2 regularization 같은 정규화 기법을 적용해보기
- activation function이나 hidden unit의 갯수를 바꿔보는 등의 신경망 구조를 변경시켜보기

이제 고양이 사진(참인 데이터)들과 고양이가 아닌 사진들(거짓인 데이터)들로 구성된 수많은 데이터를 인터넷상에서 다운로드 받아 가지게 되었다. 이 데이터셋을 70:30의 비율로 학습 데이터와 테스트 데이터로 나눈 다음, 이것을 활용해서 학습 데이터와 테스트 데이터에서 잘 동작하는 고양이 감별기를 만들 수 있다. 

 그런데 이걸 실제로 돌려보면 정말 낮은 성능이 나온다는 사실을 확인할 수 있을 것이다.

 무슨 일이 일어난 것일까?

 아마 사진들을 잘 살펴보면 학습 데이터를 구성하고 있는 데이터들이 실제로 본 것과는 많이 다르다는 것을 파악할 수 있다. 사람들이 보통 올리는 사진들은 휴대폰으로 촬영하는데, 보통 해상도가 낮거나, blur가 생겨 있거나, 빛이 적다. 우리가 사용한 학습 데이터나 테스트 데이터가 이런식으로 되어 있기 때문에, 당신이 만든 알고리즘이 실제 적용할 데이터 셋의 분포에 일반화되지 않은 것이다.

 빅데이터 시대 전에, 70:30의 비율로 학습 데이터와 테스트 데이터를 랜덤하게 나누는 방법은 머신러닝에서 취할 수 있는 일반적인 방법이다. 이런 원리는 어쩌다보면 동작할 수 있겠지만, 학습 데이터의 분포가 궁극적으로 접해야 할 실제의 데이터의 분포와 다를 경우에는 매우 나쁜 접근 방법이다.

 우리는 보통 다음과 같이 정의한다.

- 학습 데이터 : 당신의 학습 알고리즘에 적용하고자 하는 데이터들
- 개발 데이터 : 학습 알고리즘에 관해서 parameter를 tune하거나 feature를 결정할 때, 혹은 개발 관점에서 다른 결정을 취해야 할 때 사용할 데이터. (보통 hold-off cross validation set이라고 표현하기도 함)
- 테스트 데이터 : 학습 알고리즘의 성능을 측정하고자 할때 사용하는 데이터들 (실제 알고리즘이나 내부 parameter를 변경하는데는 사용하지 않음)

 이렇게 개발 데이터와 테스트 데이터를 구분짓게 되면, 다른 학습 알고리즘 parameter를 변경시켜본다던지 해당 알고리즘 성능을 높일 수 있는 여러가지 방법들을 취해볼 수 있다. 이를 통해 얼마나 잘 동작하는지도 빠르게 확인해볼 수 있다. 다른 말로 이렇게 개발 데이터와 테스트 데이터로 나누는 목적은 머신러닝 시스템을 만드는데 있어 가장 중요한 변화를 취할 수 있게 한다는 것이다.

 그래서 꼭 이렇게 할 것을 권한다.

나중에 얻을 데이터나 성능 개선을 반영하기 위해서 개발 데이터와 테스트 데이터를 구분짓자.

다른말로 꼭 테스트 데이터를 가용 데이터의 30%를 취할 필요가 없다는 것이고, 특히 후에 취하게 될 데이터가 실제 학습시킨 데이터가 다를 경우에는 더더욱 그렇다는 것이다.

 개발 데이터와 테스트 데이터를 개발하는 것에 얼마나 투자하느냐는 약간의 판단력이 필요하다. 하지만 당신이 학습시킨 데이터의 분포가 반드시 테스트 데이터의 분포와 같을 것이라고 가정하지는 말자. 당신이 현재 가지고 학습시킨 데이터보다는 당신이 궁극적으로 사용하는 데이터의 성향을 반영한 데이터를 선택하게끔 해보자.

< 해당 포스트는 Andrew Ng의 Machine Learning Yearning 중 chapter 5. Your development and test sets 을 번역한 내용입니다.>

댓글