Train/Dev/Test Sets (C2W1L01)
Andrew Ng 교수님의 딥러닝 강의를 들으면서 내용 정리를 하려고 한다.
신경망을 훈련시키려면 많은 것을 결정해야 한다.
예를 들어 layers, hidden units, learning rates, activation functions 등이 있다.
신경망이 몇 개의 층을 가지는지, 각각의 층이 몇 개의 은닉 유닛을 가지는지, 학습률이 무엇인지, 서로 다른 층에 사용되는 활성화 함수는 무엇인지 등을 결정해야 한다.
처음 애플리케이션을 시작할 때, 한번에 적절한 값들을 찾는 것은 어렵다.
따라서 실질적으로 머신러닝을 적용하는 것은 위 사진과 같이 아이디어를 내고 코드를 작성하고 시험을 돌리는 이 과정이 매우 반복적인 과정이다.
Train, Dev, Test Sets를 잘 설정하는 것은 과정을 더 효율적으로 만든다.
전통적인 방식으로는 테이터 셋을 가져와 일부를 잘라서 Train Set으로 만들고 다른 일부는 Hold-out, cross validation 즉 Dev Set을 만들고, 마지막 부분은 Test Set으로 한다.
작업의 흐름은 train set에 대해 계속 train 알고리즘을 적용시키면서 훈련한다. dev set에 대해 다양한 모델 중 어떤 모델이 가장 좋은 성능을 내는지 확인한다. 이 과정을 충분히 거치고 더 발전시키고 싶은 최종 모델이 나오면 test set에 그 모델을 적용시켜 알고리즘이 얼마나 잘 작동하는지 측정하게 된다.
옛날에는 개발 세트가 없을 경우 데이터 셋의 70%를 훈련 세트, 30%는 테스트 세트로 나누는 것 혹은 60% 훈련 세트, 20% 개발 세트, 20% 테스트 세트로 나누는 것이 일반적인 관행이었다.
100, 1000, 10000개의 샘플의 경우에 위 비율이 가장 합당한 비율이었다.
100만개 이상의 데이터가 있는 현대 빅데이터 시대에는 개발 세트와 테스트 세트가 훨씬 더 작은 비율이 되는 것이 트렌드가 되었다.
왜냐하면 개발 세트와 테스트 세트의 목표는 서로 다른 알고리즘을 시험하고 어떤 알고리즘이 더 잘 동작하는지 확인하는 것이기 때문에 개발 세트는 평가할 수 있을 정도만 크면 된다.
2개 또는 10개의 알고리즘 선택 중 어느 것이 더 나은지 빠르게 선택할 수 있도록 말이다. 이를 위해 전체 데이터의 20%나 필요하지는 않다.
예를 들어 100만개의 데이터 중 1만개의 데이터로만 개발 세트로 둔다면 두 개의 알고리즘 중 어느 것이 더 좋은지 평가하는데 충분하다.
똑같이 테스트 셋에서도 최종 모델이 어느 정도 성능인지 신뢰있는 추정치를 제공하는 것이다.
그래서 예를 들어 100만 개의 데이터가 있으면 1만 개의 데이터를 설정해도 충분하다.
따라서 100만개의 데이터를 개발 세트 1만 개., 테스트 세트 1만 개로 설정하면 만개는 백만개의 1%이므로 98%의 훈련 세트, 1%의 개발세트와 테스트 세트가 된다.
백만개보다 많은 데이터가 있으면 99.5% 훈련세트, 0.25% 개발 세트, 0.25% 테스트 세트가 된거나 0.4% 개발 세트, 0.1% 테스트 세트로 설정할 수도 있다.
결론은 적은 양의 데이터 셋이면 전통적인 방식으로 60% 20% 20%로 나눠도 되지만 방대한 양의 데이터가 있으면 개발과 테스트 세트를 전체 데이터의 20% 혹은 10%보다 더 작게 설정하는 것도 좋은 방법이다.
현대에는 일치하지 않는 훈련/테스트 데이터를 사용한다는 것이다.
고양이 사진을 찾아서 사용자에게 보여주려고 한다고 가정해보자.
훈련 데이터로 사용하려는 사진들은 웹 사이트에서 다운로드할 것이고, 개발/테스트 셋으로 사용하려는 사진들은 앱에서 사용자들이 직접 찍은 사진들일 것이다.
훈련 데이터는 고해상도의 전문가스럽게 잘 정리된 사진들일 것이다. 반면에 개발/테스트 셋은 흐릿한 저해상도의 사진을 올리게 될 것이다.
따라서 이 두가지 데이터의 분포는 달라질 수 있다.
이런 경우에는 개발과 테스트 세트가 같은 분포에서 와야 한다.
개발 세트를 사용해 다양한 모델을 평가하고 성능을 개선하기 위해 열심히 노력할 것이므로 개발 세트가 테스트 세트와 같은 분포에서 나오는 것이 좋다.
딥러닝 알고리즘은 대량의 훈련 데이터가 필요하기 때문에 웹 페이지를 크롤링 하는 등 전략을 사용하게 될 것이다.
개발이나 테스트 세트와 같은 분포에서 훈련 세트 데이터가 오지 않는 경우에도 말이다.
마지막으로 테스트 세트를 갖지 않아도 된다.
테스트 세트의 목표는 최종 네트워크의 성능에 대한 비편향 추정을 제공하는 것이다.
비편향 추정이 필요 없는 경우에 테스트 세트를 갖지 않아도 된다.
따라서 개발 세트만 있는 경우에 모든 테스트 세트를 훈련 세트에서 훈련시키고 다른 모델 아키텍트를 시도하고 이것을 개발 세트에서 평가한다. 그리고 이 과정을 반복해 좋은 모델을 찾는다.
개발 세트에 데이터를 맞추기 때문에 성능에 대한 비편향 추정을 주지 않는다.
머신러닝에서 별도의 테스트 세트 없이 훈련 세트와 개발 세트만 있는 경우 대부분의 사람들은 개발 세트를 테스트 세트라고 부른다.
그러나 실제로 하는 것은 테스트 세트를 교차 검증 세트 즉, 개발 세트로 사용하는 것이다.
References
https://www.youtube.com/watch?v=1waHlpKiNyY&list=PLkDaE6sCZn6Hn0vK8co82zjQtt3T2Nkqc&index=1