Andrew Ng 교수님의 Deep Learning Specialization 강의를 정리한 내용입니다.
Coursera가 아닌 네이버 부스트코스에서 제공하는 버전을 수강하고 있습니다.
Test/Dev/Train Sets
NN 구축을 이전까지 살펴보았다면, 실질적인 NN구축에 있어서 하이퍼파라미터 튜닝부터 최적화 알고리즘으로 어떻게 알고리즘 속도를 높일 것인지 등을 생각해보고자 합니다. Train/Dev Sets을 어떻게 설정할지 좋은 선택을 하는 것은 좋은 네트워크를 찾는데 영향을 줍니다.
NN를 훈련할 때 필요한 초기값 설정이 있습니다. 예를 들어 다음 4가지가 있습니다.
- layer 갯수
- hidden unit 수
- learning rates $\alpha$
- activation functions
위와 같은 하이퍼파라미터를 모델링 초기에 최적의 값을 선택하는 것은 거의 불가능합니다. 그래서 앞선 Course 2에서도 봤듯이, 코드를 짜고, 경험하고, 새로운 아이디어를 도출하고 이 과정이 계속 반복되어야 합니다.
전통적으로 애플리케이션의 네트워크를 위한 선택을 잘하기 위해 데이터를 훈련용, 테스트용, 검증용으로 나눴습니다.
- 훈련 세트(Train set): 훈련을 위해 사용되는 데이터
- 개발 세트(Dev set): 다양한 모델 중 어떤 모델이 좋은 성능 나타내는지 확인
- 테스트 세트(Test set): 모델이 얼마나 잘 작동하는지 확인
강의에서 설명하고 있는 용어는 train sets/ hold-out cross validation set = development set (dev) / test set 입니다. 과거 머신러닝 시대에는 보통 train set과 test set 비율을 70%, 30% 으로 잡아서 데이터를 나누는 것이 관행이 있었고, 또는 train set, dev set, test set을 60%, 20%, 20% 로 나누기도 했었습니다.
그러나 이제는 빅데이터 시대에 들어서면서 전체 데이터셋이 100만개 이상은 가뿐히 넘길 정도로 데이터의 양이 커졌고, 성능을 테스트하기 위해서 dev set 데이터가 전체 데이터의 20% 정도는 필요가 없습니다. 어떤 알고리즘이 더 나은 성능을 보이는 데에 평가할 정도인 10,000 개 정도면 충분하다고 합니다. 또한 test set 데이터도 알고리즘의 성능이 어느 정도인지 훈련에 쓰이지 않은 새로운 데이터를 가지고 신뢰할만한 추정치를 제공하는 목적이므로 이 또한 10,000개 정도면 괜찮습니다. 제안하는 데이터셋 비율을 다음과 같이 정리할 수 있겠습니다.
Train set | Dev set | Test set | |
데이터 100만개 | 98 % | 1 % | 1 % |
데이터 100만개 이상 | 99 % | 0.25 % | 0.25 % |
99 % | 0.4 % | 0.1 % |
빅데이터 새로운 시대가 오면서 train set과 test set이 무조건 같은 데이터 분포에서 오지 않는 트렌드가 있다고 합니다. 사용자의 모든 사진을 받고 그 중 고양이 사진을 분류하는 애플리케이션을 만든다고 한다면, 훈련된 데이터와 사용자가 올리는 데이터는 분명 차이가 있을 것입니다. 따라서 이 두 데이터셋은 달라질 수 있지만, Andrew Ng 교수님의 경험상 dev set과 test set은 무조건 같은 분포에서 데이터가 와야 한다고 합니다. 뒤 강의에서 더 자세하게 설명해주실 예정이지만, dev set과 test set의 데이터 분포는 동일한 데서 가져오는 것이 머신러닝 알고리즘을 빠르게 개선할 수도 있다고 합니다.
또 한가지 빅데이터 시대의 새로운 트렌드는 test set 을 갖지 않아도 된다는 것입니다. 앞서 언급한대로 test set은 우리가 만든 네트워크에 대해 특성을 가지지 않은 데이터로 성능을 평가하기 위함입니다. 만약 이런 성능에 대한 편향되지 않은 추정치가 필요 없는 경우, dev set만 가지고 계속 모델을 향상시킬 수 있습니다. 머신러닝에서 별도의 test set이 없다면 dev set을 test set으로 부릅니다. 따라서 train set과 test set으로만 데이터가 나눠져있다면 test set으로 cross validation 작업을 하는 겁니다!
Bias/Variance
Bias와 variance의 개념 자체는 간단하고, trade-off 관계에 있는 것은 유명하지만 실질적으로 딥러닝에서는 bias와 variance의 개념을 완벽하게 이해하기 어렵고, trade-off 관계에 대한 논의가 줄어드는 트렌드가 있습니다. 전통적으로 말하던 bias와 variance trade-off 관계는 다음과 같습니다.
high bias | underfitting |
just right | - |
high variance | overfitting |
사람은 완벽하게 데이터를 분류할 수 있다는 가정하에 즉, error 가 0%에 가깝다고 생각하면 아래와 같이 train set error와 dev set error에 따라 bias, variance를 정의할 수 있겠습니다. 사람이라 가정한 것을 사실은 optimal (Bayes) error를 의미합니다. Optimal (Bayes) error가 0이 아닌 15 % 정도로 높은 경우에는 아래 표에서 underfitting이라 표현한 train set error 15 % 가 합리적인 error rate 되겠습니다.
high variance | high bias underfitting low variance |
high bias high variance |
low bias low variance |
|
Train set error | 1 % | 15 % | 15 % | 0.5 % |
Dev set error | 11 % | 16 % | 30 % | 1 % |
모델을 만들고 잘 작동하지 않을 때에는 bias, variance를 잘 분석해야 합니다. 이와 별개로 train set error로 알고리즘이 얼마나 적합한지 알 수 있고, bias에 문제가 없는 것을 꼭 확인해야 합니다.
Basic recipe for machine learning
Andrew Ng 교수님의 경험으로 획득한 머신러닝 알고리즘을 만들기 위한 간단 레시피를 공유해주었습니다. 높은 bias일 경우, train set의 데이터에서의 성능을 들여다봐야 합니다. 더 깊은 NN를 구축하거나 train을 더 길게 하거나 다른 최적화 알고리즘을 선택하는 방법이 있습니다. 다른 최적화 알고리즘을 선택하는 것은 가능할 수도 아닐 수도 있다고 합니다. 높은 variance일 경우, dev set에서의 성능을 봐야한다고 합니다. 이 경우, 더 많은 데이터를 투입하거나 regularization(정규화)를 통해 문제를 해결할 수 있습니다. 마찬가지로 다른 NN 알고리즘을 찾는 것은 해결이될 수도 아닐 수도 있습니다.
앞서 말한 bias variance 간의 trade-off 간의 논의가 옛날에는 많았던 것은 bias와 variance 문제를 둘 다 해결할 수 있는 도구가 많지 않았기 때문입니다. 현재의 딥러닝 빅데이터 시대에는 더 큰 네트워크를 훈련시키고 더 많은 데이터를 얻음으로써 variance를 해치지 않고 bias만 감소시키는 게 가능해졌습니다. 또한 추가 데이터를 얻는 것도 bias를 해치지 않고 variance만 감소시키는 것이 가능합니다. 정규화를 올바르게 했다면 bias와 variance의 균형을 신경쓰지 않는 것이 가능하고 앞으로 정규화를 배워볼 예정입니다.
[출처]
- 부스트코스 강의: http://www.boostcourse.org/ai216