본문 바로가기

Machine Learning

Overfitting을 막는 Regularization

반응형
Overfitting 이란?
학습데이터를 너무 맹신한 나머지, 예측을 올바르게 하지못하는 상황을 말함.



Regression : 초록색 선이 실제 모델(underlying function)이고, 붉은선이 학습된 linear model이다.

사실은 위의 그림에선 실제 underlying fuction을 알아서 overfit이라고 쉽게 말할 수 있는 것이지만, 일반적인 경우에선 underlying function이 어떻게 생겼는지 알 수가 없다. 그렇다고 무턱대고 trainging error가 지나치게(?)낮다고 판단되는걸 overfit이라고 단언할 수도 없다. training error가 낮아져하는건 궁극적으로 좋은 방향이기 때문이다.
따라서, optimal한 overfit을 막을 수는 없다. 진짜 underlying fuction을 알 수가 없기 때문이다.
이를 간접적으로 측정하는 방법이 proxy이다. (test set error와 trainging error와의 차이)
아니면, test set error가 증가하는 순간!





Overfitting이 초래하는 문제점


가설 함수의 복잡도(차수)가 올라갈 수록 일반적으로, 악화될 가능성이 높다. 무조건적으로 나쁜것은 아니지만, 데이터의 noise에 쉽게 영향을 받기 때문이다.
마찬가지로 DL에서 복잡한 hypothesis를 쓴다는 의미는, Layer가 더욱 Deep 해진다는 것이다.
이전에 보았듯이, 아무리 Deep한 network를 쓰더라도 신경써서 별도의 처리를 하지 않는다면, 성능이 악화될 확률이 높다. 바로 이 overfitting때문이다.

overfit으로 발생하는 문제의 가장 큰 원인Noise

(언제나 존재하는 관측에러 )


문제는 항상 노이즈는 이 두 Stocastic noise와 Deterministic Noise가 섞여있기 때문에 완벽하게 Decomposition(원본으로 분해)하는 것이 불가능하다.



Overfit에 대한 대책


Machine Learning의 Main gole은 Generalization performance 높이는 것이다.



시도해봐야할 우선순위
1순위 : data 모으기 (data를 더이상 모으지 못한다면, data augmentation 진행. )
2순위 : 적절한 수용력을 갖는 모델사용
3순위 : 앙상블 사용 ex) 10000개의 데이터셋이 있다면, 8000개씩 5개의 서로 다른 학습데이터 기반으로 Neural Net을 만들고, 이후에 testing 단계에서, 5개의 결과에서 majority voting을 통해 가장 득표가 높은 label을 채택함. (거의 모든 kaggle에서의 알고리즘은 사용함)
4순위 : 위의 모든 과정을 거치고 추가적으로 테크닉적인 요소로 DropOut, BatchNorm등을 수행함

Capa를 줄이는 방법
  1. Net 사이즈 줄이기
  2. Early stopping 과도한 학습이 될 때, ( validation error가 감소하다가 증가하는 순간 멈춤)
  3. weight decay -> 학습하는 parameter자체를 너무 커지지 않게하는 Penalty 추가

(*1/2을 추가 곱해주는 이유는 하단의 미분결과 처럼 깔끔하게 나오게 하기 위함이다.)

물론 끄는 노드들은 학습시에만 끄는 것이지, 실제 테스팅때는 다시 모두 정상 작동하게함. 이는 특정 노드에 연산이 몰리지 않고 좀더 포괄적으로 일반화하여 접근하게 해주게 하기 위함이다.

Dropout처럼 노드를 0으로 대체하는것이아니라 weight를 0으로 만들어 버림


웬만하면 무조건 사용하는 것이 좋다. 방법은 간단함. mean을 빼고, variance로 나눠줌
일반적으로 mini-batch learning를 하는데 한번의 학습때 여건에 따라 128, 256, 512, ...개의 데이터를 사용한다.
통계량들을 zero mean unit gaussian으로 만들어 줌. 
일반적인 방식과 달리 learning rate를 늘려도 문제가 되지 않는다. 내부의 공분산 shift를 줄일 수 있기 때문이다.
즉, 데이터 셋들 사이에 있는 여러 통계치들이 들쑥날쑥해서, learning rate을 올리게 되면, 학습이 발산하기 쉬운데, Batch Normalization을 쓰면, 정규화 되서 Learning rate을 늘려도 문제가 되지 않는다. 따라서 학습이 훨씬 빨라진다는 것이다.
거의 모든 논문에서 사용됨.



정리

Overfitting을 반드시 발생한다.
따라서, data를 최대한 많이 구하고 augmentation을 수행한다.
이후에 layer를 무작정 깊게 하기보다, 점차적으로 늘리거나 줄여가면서, 학습을 진행해 보는것이 데이터가 적을때 매우 중요하다.

augmentation을 하지 않았을때, CIFAR-10 학습 과정... 
Training Acc가 100을 찍어 버려서 이후론 학습이 되지 않는다.
data가 많은 것이 절대적으로 중요하다.



Ian GoodFellow
Chapter 7 Regularization for Deep Learning (책)




1


weight의 제곱을 더하거나 절댓값을 더해서 규제를 줌.

2

가장 좋은 방법은 데이터를 많이 늘리는 것이지만, 이는 한정적이여서 Fake data를 만드는 것이다.
Label을 유지하면서 이미지를 조금씩 변형하는 것인데 noise를 넣는 것도 하나의 방법이다.
좌우 반전, 임의의 RGB 더하기, 이미지를 잘라서 subsampling, GAN등.. 많은 방법이 있다.


3

  • L2 weight decay같이 parameter를 단순하게 약화 시키는거보다 레이어 중간중간 noise를 주는 것이 효과적
  • 히든레이어에 노이즈를 준다는 것은 dropout(히든레이어의 노드 일부를 0으로 만듦)과 유사한 개념이다.
    • 이에 더해 NeuralNet의 weight 자체에 노이즈를 주는 것.
  • 분류문제에서 label을 1 0 0 0같이 극단적인 방식으로 책정하는 것이 아니라, 0.8 0.1 0.06 0.04 와 같이 부드럽게 해줌.


4

unsupervised(input만 있을때 처리), supervised learning(input과 output)을 합친 것.

deeplearning에 한정해서, semi-supervised learning은 representation을 위함
특히 CNN에선 subsampling과 conv 반복이 feature extraction인데, 그것이 일종의 representation을 찾는 것이다. 왜냐하면, 이미지에서 중요한 부분(feature)을 찾는 과정이기 때문이다.

앞단의 conv레이어를 정의 할때, unspervised data를 통해 pre-training 시키면, unspervised(unlabeled data)에 적합한 representation을 찾기에 도움이된다. 가장 대표적으로 auto encoder가 있다.

5

한번에 여러 문제를 풀어내는 것
같은 input으로 여러 task를 수행하는데, 예를 들어 나이를 분류함과 동시에 성별을 분류하는 것.
shared 구조가 핵심이다. 다양한 task들에선 공통된 요소들이 있는데, 이로 인해 앞단의 shared 부분을 얻어낼때, 보다 더 좋은 representation을 구하게 되는 것이 main topic이다. 즉, multi-task 러닝을 하면 보다 핵심적인 요소로 regularized되어서 성능이 좋아진다.
최근 NLP에선, 언어를 해석하고, 감정분석하고 여러 작업을 하는 논문을 구글에서 발표했는데  각각을 분석하는 것보다 성능이 매우 좋았다.

6

training error와 validation error의 차이가 발생하는 순간에 학습을 중단하는 방법.

7

다양한 parameter중 일부를 묶거나 공유시킴 -> 궁극적으로 parameter수를 줄여준다.
예를들어 한쪽은 mnist데이터이고, 다른 한쪽은 손으로 적은 숫자 데이터인데, 입력은 다르지만, 클래스가 동일해 매우 유사한 task를 생각할 수 있다. 임의의 단의 layer를 공유시키거나 각 network의 weight를 비슷하게 만들어서 parameter수를 줄일 수 있다.
그런데, parameter 수를 줄이면, 일반적으로 generalize성능이 좋아지므로 이방식이 도움을 주는 것이다.

대표적인 방식이 CNN이다. 같은 conv filter가 전체 image를 순회하기 때문에, parameter sharing의 대표적인 예이다.

8

어떤 output이 도출 되었을때, 대부분이 0이 되길 원하는 것이다.
위의 예에서는 앞단의 A에서 weight을 sparse하게 하거나, 뒷단의 activation을 sparse하게 하는 것인데, 일반적으로 sparse activation을 중요하게 생각한다.

대표적으로 ReLU가 Sparse activation과 연관이 깊다.
Rectify Linear Unit의 가장 큰 특징은 0보다 작은 값을 모두 0으로 만들어준다.
이것은 output에 0이 많아지게 되고 sparse representation을 유도하여 성능이 향상 된다.

hidden layer에 나오는 값들 자체를 줄여주는 penalty를 추가해주면 separse representation을 찾는데 도움이 된다.


9

bagging
high variance Model을 가지고 low variance를 만듦.
(ensemble) network를 쪼개서 여러 결과를 내고 평균을 냄.
데이터 셋에서 여러 데이터 셋으로 추출하여, 다른 모델을 학습시키고, 여러 예측을 만들고, 모델의 평균을 내서 취합

boosting 
weak learner(학습결과가 안좋은 것)들이 high bias인데, low variance이길 바라고 있는 상태 
=> 각 weak 분류기를 ensemble bagging해도 결과는 안좋을 것으로 추정됨.
각각의 model을 sequential하게 더함. 
첫 모델을 만들고 가지고 있는 data set에 맞춰서 차이를 구함. 
그 차이만큼을 학습한, 두번째 모델을 더하고, 더해진 모델을 가지고 원래 데이터에 차이를 구하고, 그차이를 맞추는 세번째 모델을 붙이고...
이처럼 학습 모델을 계속 붙어나감.

10

노드를 끄는 방식으로 net size down의 한 방법으로도 생각할 수 있다.


11

사람이 인지하기 힘든 수준의 노이즈를 넣고 인풋을 변형했을때, 결과는 매우 극적으로 바뀌기도 한다.
가령, 팬더 input image를 57.7%의 score로 panda를 분류하는데, 이 노이즈(노이즈 data에 0.007을 곱해서 사실상 거의 추가된 노이즈가 없는 정도의 수준)를 넣었을때, 뜬금없이 gibbon(원숭이 종류)로 97.7%의 score로 분류해버리는 큰 에러가 발생하기도 한다.

학습시킬때, 입력단에 noise를 넣어서 data augmentation을 수행하면, 이러한 adversarial example도 처리할 수 있게 되는 것이다.


입력의 아주 작은 noise가 output의 큰 변화를 초래한다는 의미(adversarial example의 존재)는 
많은 machine learning 기법중 deeplearning model의 원리의 단서를 보여주기도 하는 것이다.
함수로 생각해보면, 작은 input의 변화가 큰 output의 변화를 준다는 의미는 기울기가 매우 가파르다는 의미고, overfitting이 일어날때 일어나는 현상과 같다. 
즉, deeplearning model 자체는 수없이 많은 data에 overfitting시켜서 작동시키는 것으로 생각할 수도 있는 것이다.

사실, 기울기의 가파름은 좋은 특성은 아니다. 즉, 현재의 deeplearning model도 분명히 regularized가 덜 된것이고 이를 해소 한다면 더 큰 성능 향상에 기여할 수 있을 것이다.


반응형

'Machine Learning' 카테고리의 다른 글

Linear Model  (0) 2019.01.22
KNN Classifier, Regression  (0) 2019.01.21
Restricted Boltzmann Machine  (0) 2019.01.19
Bias term의 필요성  (0) 2019.01.13
Optimization 방법론  (0) 2019.01.12