핵심키워드
- Regularization
- Overfitting
학습하기
이번에는 레귤라이제이션을 배워보겠습니다. 이는 딥러닝뿐 아니라 머신러닝 자체에서 굉장히 중요한 영역입니다. 레귤라이제이션이란 뭘까요. 수학적 정의 자체는 저도 잘 모르겠습니다. 그러나 목적은. 명확합니다. 오버피팅이라는 현상을 막는 것이죠.
오버피팅이란 학습 데이터를 너무 믿는 것을 말합니다. 결국 학습 데이터에 과하게 최적화된 나머지, 다른 테스트 데이터에 대한 정확도가 떨어지는 것입니다. 회귀나 분류나 마찬가지입니다. 그렇다고 학습 데이터에 최적화되는 것(=트레인 정확도가 높아지는 것)이 나쁜 것이냐면, 당연히 아닙니다. 잘 맞추는데 좋은 거죠. 다만 문제는, 많은 학습 데이터가 모든 실전 데이터를 대표할 수 있을 만큼 질이 뛰어나지는 않다는 겁니다. 분명 여러 종류의 노이즈를 갖고 있고, 때문에 질 낮은 학습 데이터일수록 학습과정에서 오버피팅이 일어날 확률이 커지게 되는 겁니다.
수학적으로 분석을 해봅시다. ...그림을 참고해주세요... 오버피팅은 out of sample error(test error)와 in sample error(train error)의 차이로 결정나고, VC dimension 그러니까 모델의 복잡성이 증가할수록, 오버피팅이 발생할 확률이 훨씬 커집니다.
오버피팅을 막을 수 있는 첫번째 방법은, 데이터를 많이 모으는 것이며 가장 중요합니다. augmentation으로 데이터를 증가시키는 것도 하나의 방법입니다. 두번째로는, 적절한 능력을 갖는 모델을 활용해야합니다. 셋째로는, 앙상블을 활용하는 것입니다. 그러니까 데이터셋이 10000개 있으면, 샘플 8000개씩을 5번 뽑아서 5개의 모델을 각각 학습시키고, 5개의 결과를 합치는 것입니다. 거의 대부분의 대회에서는 앙상블 모델을 활용합니다. 네번째로 테크닉이 들어갑니다. 드랍아웃, 드랍커넥트, 배치 정규화 등이 그것입니다.
Limiting the capacity도 중요한 방법인데요, 그 중 하나는 Early stopping입니다. 뉴럴넷을 학습시키다가, 너무 많이 학습이 되면, 밸리데이션 에러가 감소하다가 다시 증가하는 경우가 생깁니다. 이 순간에 모델의 학습을 중단시키는 것, 그게 Early stopping입니다.
Weight decay의 경우에는 weight에 제약을 거는 겁니다. 어떤 weight가 너무 과하게 커지지 않도록, (l2나 l1등 의) 제약을 거는 거죠.
Dropout은 저번에도 말씀드렸지만, 학습 도중 일부의 노드를 꺼버리는 것입니다. 물론 테스트 시에는 다시 켜집니다.
Dropconnect는 노드를 0로 만드는 것이 아니라 웨이트를 0로 만드는 것입니다.
Batch Normalization은 굉장히 중요하면, 왠만하면 그냥 믿고 쓰셔도됩니다. 한 배치의 데이터를 열별로 정규화하는 것입니다. 이를 적용할 시, Learning rate를 조금 더 키워도 되고, dropout을 제거해도 되고, weight decay를 감소시켜도 됩니다. 등등 결국 Batch Normalization을 사용하면 많은 것이 개선됩니다.
결론을 말씀드리면, 사실상 오버피팅은 항상 발생합니다. 때문에 항상 regularzation을 고려하셔야합니다. 모델의 layer size를 항상 조금씩 늘려나가시면서 개선하는 것이 항상 굉장히 중요합니다. 특히 데이터셋이 작은 경우에는.
사실 이런 정규화 방법론 필드에서는 감이 굉장히 중요합니다. 어떤 정규화가 좋은 효과를 낸다. 이런 건 문제를 자주 접한 사람이 훨씬 빠르고, 효율적으로 해결책을 찾아낼 수 있습니다. 때문에 여러 시도를 해보시는 것을 추천드립니다.
지금부터는 이안 굿펠로우 교수의 11가지 정규화 내용을 확인해보도록 하겠습니다.
Parameter Norm Penalties, 이건 앞에서 봤던 L2 weight decay입니다. 학습을 할 때 weight가 과하게 커지지 않는 것이 중요한데, 이를 위해서, weight 학습 식에, 제한을 거는 것입니다.
Dataset Augmentation, 머신러닝 모델에 있어서 최고 좋은 방법은 데이터를 많이 쓰는 것입니다. 물론 실전에서는 이게 한계가 있고, fake data를 추가함으로써 학습 데이터를 늘리는 방법을 시도해야합니다. 이를 위해 데이터를 transformation하거나, injecting noise하거나, hand-designed dataset augmentation을 시행할 수 있습니다.
Noise Robustness, layer가 여러 개 있을 때 이 layer에 noise를 넣거나, weight에 noise를 넣어라. 또는 Label smoothing을 적용해라. 예를 들어 라벨이 1 0 0 이라면, 이걸 0.8 0.2 0 이런식으로 다듬으라는 말입니다.
Semi Supervise Learning, Unlabeld data와 Labeled data를 같이 사용하라는 말입니다. 일반적으로 딥러닝에서는, representation을 찾으라는 말입니다. feature extraction도 일종의 representation을 찾는 과정입니다. autoencoder도 해당 내용을 위한 아이디어입니다.
Multi-Task Learning, 이것도 굉장히 중요합니다. 결론부터 말씀드리자면, 한번에 여러 문제를 푸는 겁니다. 한 번에 사람의 나이도 분류하고, 성별도 분류하고. 같은 인풋으로 여러 결과를 내는 거죠. 왜 이게 좋으냐면, shared구조에서 representation을 잘 찾을 수 있기 때문입니다. "서로 다른 문제들 속에서, 그 중 몇가지에서는 공통된 특성이 있다" multi task learning 과정 중에서 이런 공통된 특성이 찾아지게 되면서 좋은 representation이 찾아지는 겁니다. 어떤 문장이 들어가면, 감정 분석도 하고, 번역도 하고, 이런 모델이 굉장히 좋은 효과를 내더라는 거죠
Early stopping, 아까 말씀 드렸습니다.
Parameter Tying and Parameter Sharing, 이는 여러 parameter가 있을 때, tying이라는 건, 다른 인풋으로 같은 아웃풋을 내야하는 2개의 모델이 있을 때, 2개의 모델에는 분명 비슷한 레이어가 있을 거라는 생각입니다. 이 레이어를 찾아 융합시키는 것이 parameter tying입니다. sharing이란, CNN에서 대표적입니다. CNN은 같은 convolution filter가 모든 이미지를 돌아다니면서, feature extraction을 시행하기 때문입니다.
Sparse Representations, 이는 찾아낸 representation이 sparse해야한다는 겁니다. sparse weight는 말그대로 weight가 sparse한 것이고, sparse activation은 activation결과가 spase한 것입니다. 일반적으로는 sparse activation이 중요합니다. relu도 sparse activation 중 하나입니다.
Bagging and Other Ensemble Methods, 일반적으로 모델은 Variance와 Bias로 설명이 가능합니다. 일반적으로 variance가 높다는건 결과가 할 때마다 조금 다르게, 다양하게 나오는 겁니다. bias가 높은건 그냥 안 좋은겁니다. 우릭 원하는건 low variance, low bias입니다. Ensemble에는 2가지가 있습니다. Bagging과 Boosting.
일반적으로 Bagging이란 건, high variance를 갖는 여러 모델을 합쳐 low variance를 갖는 모델을 만드는 겁니다. 단순히 여러 모델의 값들을 평균내는 것도 하나의 방법입니다. 데이터를 Bootstrap을 통해 분할하고, 각각의 모델을 학습하고, 합치는 방식입니다. 이 때, Boosting과 달리 각각의 모델(weak learners)이 high variance, low bias이길 가정합니다. 예를 들면 Random Forest가 있습니다.
Boosting이란 건, weak learner를 통해 strong learner를 만들어 나가는 것으로, 1번 모델이 예측하지 못한 나머지를 2번 모델이 학습하여 보완하고, 그 나머지를 다시 3번 모델이 학습하여 보완하고.. 하는 방식입니다. 대표적으로 AdaBoost가 있습니다. 전체적인 bias를 감소시키는 효과가 있습니다.
Dropout, 이건 보셨듯이 노드를 끄는 겁니다.
Adversarial Traing, 굉장히 재밌는 방법입니다. adversarial은 적대적이라는 말인데, 유명한 GAN을 통해 설명하자면, 지폐위조범과 경찰을 생각해봅시다. 시간이 갈 수록 지폐위조범은 지폐 제조 기술을 발전시키고, 경찰은 위조 지폐 탐지 방법을 발전시킵니다. 지폐위조범(Generator)는 가짜 데이터를 생성하고, 경찰(Discriminator)는 가짜 데이터를 검거합니다. 시간이 지나면 결국 검거할 수 없는 가짜 데이터가 생길 것이며, 이게 Adversarial Traing의 핵심입니다. 이게 가능한 이유는 사실 높은 정확도를 갖는 분류기도 input에 약간의 noise를 넣는 것 만으로 잘못된 분류를 하게 만들기 쉽기 때문입니다.
'머신러닝 > [논문으로 짚어보는 딥러닝의 맥]' 카테고리의 다른 글
Optimization 방법론 (0) | 2020.03.22 |
---|---|
Nature 논문으로 살펴보는 AlphaGo 알고리즘 (0) | 2020.03.21 |
[실습] 이미지 처리 실습하기 (0) | 2020.03.19 |
4가지 CNN 살펴보기: AlexNet, VGG, GoogLeNet, ResNet (4) | 2020.03.17 |
[실습] 기본 파이썬 문법 실습 (0) | 2020.03.15 |