티스토리 뷰

 

 이전에 다뤘던 내용에 덧붙여서 개발 데이터와 테스트 데이터를 정의하고 난 이후에, 이제 개발 데이터의 성능을 향상시키는 방법에 초점을 맞출 것이다. 결론적으로 개발 데이터는 가장 최우선적으로 당신이 향상시키고자 하는 학습을 반영할 수 있어야 한다. 

 여기에 개발 데이터와 테스트 데이터의 분포가 다름으로써 발생할 수 있는 문제가 있다. 바로 개발 데이터 상에서는 잘 동작하는데, 실제로 테스트 데이터에서는 매우 안좋게 돌아가는 것이다. 이런 경우 큰 좌절감이 생기고, 노력이 낭비되는 것을 봐왔는데, 이런 현상이 발생하는 것을 막아야 한다.

 예를 들어 현재 개발되는 시스템이 개발 데이터에서는 잘 돌아가고 테스트 데이터에서는 잘 돌아가지 않는 현상이 발생한다고 가정하자. 만약 개발 데이터와 테스트 데이터가 같은 분포를 갖고 있다고 한다면, 문제점을 찾는 것은 매우 명확해진다. 지금 개발 데이터가 overfitting 되고 있는 것이다. 이런 경우 해결할 수 있는 방법은 개발 데이터를 더 많이 모으는 것이다.

 하지만 개발 데이터와 테스트 데이터가 다른 분포를 취하고 있다면, 선택할 여지는 이전에 비해 덜 명확하다. 문제가 발생할 수 있는 몇가지 요소들이 있다.

1. 앞에서 언급한 바와 같이 개발 데이터가 overfitting되고 있을 수 있다.
2. 테스트 데이터가 개발 데이터보다 조금더 학습시키기 어렵게 되어 있을 수 있다. 그래서 개발 데이터로 학습시킬 때는 예상한 바와 같이 잘 동작하겠지만, 그렇게 유의미하게 성능을 향상시킬 수 있는 방법이 없을 수 있다.
3. 테스트 데이터가 학습시키기 어렵게 되어 있지 않고, 단순히 개발 데이터와 다르게 되어 있을 수 있다. 그래서 개발 데이터 상에서 잘 동작하는 것이 실제 테스트 데이터에서는 잘 동작하지 않을 수 있다. 이 경우에는 개발 데이터를 통해 성능을 향상시키는 노력들이 정말 낭비되는 것일 수도 있다.

 머신러닝을 활용한 업무는 매우 어렵다. 개발 데이터와 테스트 데이터간의 불일치성 자체가 개발 데이터 향상을 통해 테스트 데이터의 성능을 향상시키는 것에 대해서 추가적으로 불확실성을 더해버릴 수 있다. 더불어 저런 케이스로 인해 어떤 것들이 동작하는지 혹은 동작하지 않는지를 판별하기 어렵게 만들고, 결과적으로 어떤 작업에 우선순위를 둬야 할지 어려워 진다.

 만약 외부의 써드파티에서 만든 benchmark를 활용하게 된다면, 아마 그 benchmark를 만든 개발자는 개발 데이터와 테스트 데이터가 서로 다른 분포를 가지고 있다는 것을 명시할 것이다. 이렇게 된다면, 개발 데이터와 테스트 데이터가 같은 분포를 취하게 될 때에 비해서 운이 스킬에 비해 성능에 더 큰 영향을 주게 될 것이다. 어떤 분포를 가진 데이터를 학습시키고, 다른 분포를 가지는 데이터에 대해서 일반화(generalize) 시키는 학습 알고리즘을 개발하는 것은 매우 중요한 연구 이슈다. 하지만 만약 이런 연구보다 특정 머신러닝 알고리즘을 활용한 업무를 통해 성능을 개선시키는 것이 주 업무라면, 개발 데이터와 테스트 데이터가 같은 분포를 띄게끔 하는 작업하는 것을 추천한다. 이 작업이 업무를 조금더 효율적으로 진행할 수 있게 해줄 

< 해당 포스트는 Andrew Ng의 Machine Learning Yearning 중 chapter 6. Your dev and test sets should come from the same distribution 을 번역한 내용입니다.>

댓글