캡쳐 사진 및 글작성에 대한 도움 출저 : 유튜브 - 허민석님


머신에게 공이 무엇인지 학습시킨다고 가정해보자.
마치, 애기에게 공이 무엇인지 학습시키는 것과 유사하다.


먼저, 공은 야구공, 농구공, 축구공처럼 동그랗게 생긴 것이다 공이야~ 라고 가르칠 것이다.

image


이제 학습이 끝나고 testing단계에 돌입해보자.
imageimageimage
학습시킬 때 주어진 데이터는, 동그래서 공이라고 잘 판단할 것이다.


하지만 동그란 사과와 달까지 공이라고 판단해 버린다.

imageimage


이건 바로, 공 = 동그랗게 생긴 것이라고 만 학습시켜서이다.
그래서 학습시킬 때, 동그란 것 이외에 다른 공들의 공통점을 찾아낼 것이다.

  1. 동그란 것 ------------->
    많은 공통된 특성이 있음에도 불구하고 한가지 특성만으로 학습시킬 경우, 머신러닝 용어로 too BIAS하게 train된 모델이라 한다.
    그리고 testing단계에서 새로운 데이터를 너무 잘 예측해버리는 모델을 underfitting된 모델이라고 한다.
    (이전 시간에는, 새로운 데이터를 예측하지 못하는 모델overfitting된 모델이라고 하였다.)
  2. 먹을 수 없는 것
  3. 가지고 놀 수 있는 것
    을 추가해서 학습더니 잘 예측하게 되었다.
    image
    이제 욕심을 내서 아래와 같이 공통된 특성이외에 지엽적인 특성들을 과하게 학습시켰다.
  4. 실밥을 가지는 것
  5. 지름이 7cm보다 큰 것
    하지만 아래와 같이 결과가 더 안좋았다. 골프공, 탁구공까지 배제해버리는 것이다.
    봤던 데이터는 잘 맞추는데, 새로운 데이터는 잘 예측하지 못하게 된다. 이러한 경우를 머신러닝 용어로 high variance한 모델이라고 한다.
    그리고 testing단계에서 새로운 데이터를 예측하지 못하는 overfitting 모델이라고 한다.

    image


ㅇ요약하자면,
많은 공통특성 중 일부 특성만 반영하여, too bias하게 train되어, 새로운 데이터도 막 예측해버리는 모델 : UnderFitting
많은 공통특성 이외에 지엽적인 특성까지 반영하여, high variance하게 train되어, 새로운 데이터에 대해서는 예측하지못하는 모델 : overfitting

Bias 와 Variance

위에 설명한 언더피팅, 오버피팅을 극복하기 위해서는 bias와 variance개념을 알아야한다.
image

  1. Bias : 실제값에서 멀어진 척도
  2. variance : 예측된 값들이 서로 얼마나 떨어져있는가

언더피팅 모델은 high bias모델이라고 했다. 일부특성만 반영하여( 둥근것은 공이야라는) 편견을 가지고 있어서,
예측값들이 실제 값(공)과 거리가 멀어져서 예측한다
image

오버피팅 모델은 high variance모델이라고 했다. 지엽적인 특성까지 다 반영되서(실밥, 7cm이상),
학습된 것은 잘 예측하는데, 학습되지 않은 것들은 학습된 것의 예측값과는 떨어져서, 낮은 값으로 예측된다.
image


우리의 목표는 low bias하여 실제값과 가까이에서 예측되어야하고, low variance하여 예측값들이 서로 뭉쳐있어야한다.
image



그래프로 보자.


둥근것이 공이야 : (일부 특성만 반영)feature가 너무 적어 high bias하여 실제값과 떨어진 underfitting 모델은 왼쪽이다.
---> variance는 낮다.
실밥, 7cm이상까지 공이야 :
(지엽특성까지 다 반영->) feature가 많아져 high variance하여 예측값들이 떨어져있는 overfitting 모델은 오른쪽이다.
---> bias는 낮다.
둘다 error가 높다.
image


우리가 선택해야할 모데른 error가 낮은 중간지점이다.
image


my)
욕심내서 feature를 많이 반영하면, high variance되어, 오버피팅이다.
관심없어 feature를 적게 반영하면, high bias하여, 언더피팅이다.



bias와 variance를 활용하여 언더피팅, 오버피팅 극복하기


언더피팅은 어떻게 극복할 수 있을까?
먼저, 언더피팅 모델인지 아닌지 판단 : 새로운 데이터도 너무 예측을 막 잘해버린다.
언더피팅은 (관심없어 feature가 적게 반영된) high bias모델이므로, trade off로서 bias를 낮추고 variance를 높이는 전략을 쓴다

  1. feature를 더 많이 반영하여, variance 높이기
  2. variance가 높은 머신러닝 모델 사용하기 --> Decision Tree, kNN, SVM 모델로 사용해서 예측하기




오버피팅 방지 1 : Validation set으로 k-fold cross validation하면서 / train방법을 learing_rate를 높혀 Regularization

오버피팅은 어떻게 극복할 수 있을까?
먼저, 오버피팅 모델인지 아닌지 판단 : 새로운 데이터를 너무 예측 못함.
오버피팅은 (욕심내서 feature가 많이 반영된) high variance모델이므로, trade off로서 bias를 높이고, variance를 낮추는 전략을 쓴다.

  1. validation set을 갖추고, k-fold cross validation을 사용하여, train set과 비교한다.(train보다 낮으면 overfitting)
    image
    cf) keras의 경우, fit()함수에서 validation_split을 쓰면, k-fold cross validation이 아닌 마지막 10%만 반영되므로.. 조심
    validation set을 새로운데이터로서, accuracy가 낮다면 train방법을 바꾸어서 validation accuracy를 높여야한다.
    -> regularization을 반복해서 시행해야한다.


  2. validation set의 accuracy가 train보다 낮다면 Regularization을 계속해서 반복해야한다.
    쉽게 이해하기 위해서, 아래 Regression모델 3가지를 살펴보자. (y축은 cost함수 or loss함수인 것 같다)

    1) 3번째의 overfitting된 모델을 보자.
        데이터 분포에 비해 loss함수가 복잡해지고 smooth하지 않다. overfitting되어서,
       새로운 데이터를 넣으면 제대로 예측하지 못할 가능성이 높다.

    2) 2번째의 모델을 보자. 아래와 처럼 데이터분포와 조화가 되어서 smooth하다
        이러한 smooth한 곡선이 되기 위해서는, variance를 낮추어야한다.

     
    image

    두 그래프의 차이점은 무엇일까?
    3번째 그래프는 Regularization이 안되어서 울퉁불퉁한 그래프를 띈다고 한다.
    즉, overfitting 그래프 = variance 높은 그래프 = 울퉁불퉁한 그래프 = Regularization안된 그래프 =>
    variance를 낮추는 것이 Regularization => smooth한 그래프가 되어, 예측도 더 잘된다.


  3. 딥러닝의 테크닉인 조기종료(Early Stopping)- 아래에서 설명


cost function  in Regression문제(MSE) 의 변형으로 variance를 낮출 수 있다.

Regression문제를 해결하는데 있어서 cost function은 Mean squared Error를 쓴다고 했다.
실제값과 예측값의 차이를 제곱해서 평균내는 것이다. 공식은 아래와 같다.
(참고 : classification문제를 해결하는데 있어서 cost function은 Cross-entropy를 쓴다)

image


variance를 낮추는 방법은 아래와 같다.
기존의 cost function에 100(w1 + w2 + w3 + w4)를 더하는 방법이다.

cost function을 최소화하는 w1, w2, w3, w4를 찾는 것이 목적인데,
더해진 양수인 ( w1+ w2 + w3 + w4 )의 값을 낮추어야만 한다.
image

w1 ~ 4는 h(x) (예측값, Regression함수) 의 계수값이었다.
아래의 예처럼, 계수값을 반으로 줄였다고 가정해보자.

기존의 h(x)가 가파란 것이 완만해진다.
결과적으로 각 미분값인 접선의 기울기값들이 낮아졌다.
variance값도 낮아지게 된다.

image

결과적으로, h(x)의 계수값인 w1, w2,w3 ..를 낮추면, variance가 낮아져서, Regression함수(h(x))도 smooth하게 된다.

좀더 공식적으로 +100(w1+w2+w3+w4)를 일반적인 공식으로 나타내면 아래와 같다.
image

이제, 돌아가서
울퉁불퉁한 그래프는 cost function 뒤에 Regularization을 의미하는 람다(w1+w2+w3..)가 붙지 않은 cost function을 가진다고 볼 수 있다.
즉, Overfitting한 그래프는 람다 = Learning rate가 0인것이다.
만약 람다(Learning rate)가 너무 높으면,  그만큼 w계수들 (코에피던시)들이 반대로 너무 낮아져서, 접선의 기울기 낫-> variance는 너무낮은 underfitting함수가 되어버린다.
image



my) 오버피팅을 방지하기 위한 Regularization -> 코스트함수에 Learning Rate를 붙혀서 variance를 낮춘다.
Learning Rate가 너무 높으면 w는 그만큼 너무 낮아져서 varinace가 너무 감소하여 언더피팅이 된다.


즉, 오버피팅된 상황에서는 learning rate를 높혀 Regularization한다??


오버피팅 방지 2 : Early stopping in Deep learning

오버피팅을 방지 방법으로

  1. validation set을 이용하여 k-fold cross validation을 통해, train방법을 피드백 하는데
    그 과정에서 learning_Rate를 높이는 Regularization을 한다고 했다.

  2. 조기종료(Early stropping)이 두번째 방법이다.
  3. DropOut


딥러닝이란, 여러 Layer로 이루어진 뉴런들을, epoch수를 통해 반복해서 계속 학습시키는 것이다.
그러나, 게쏙 반복학습하게 되면 어느시점에서, 가지고있는  train set은 accuracy가 올라가나,
test set과 마찬가지로 작용하는 validation set의 accuracy가 멈추거나 낮아지는 지점이 온다.

예를 들어, epoch을 50으로 준 상태에서, epoch 30에서 validation set의 accuracy가 제일 높았다고 가정하자
validation accuracy가 더이상 올라가지 않을 때, stop시키는 것을 early stopping이라고 한다.


image



오버피팅 방지3 : Dropout

  1. validation set을 이용하여 k-fold cross validation을 통해, train방법을 피드백 하는데
    그 과정에서 learning_Rate를 높이는 Regularization을 한다고 했다.

  2. 조기종료(Early stropping)이 두번째 방법이다.
  3. DropOut

드랍아웃은 train과정 중에서 몇개의 neuron을 쉬도록 만드는 것이다.



image


이러한 방식은 어떻게 Overfitting을 방지할 수 있을까?

  1. 몇개는 쉬게하고, 몇개는sub group을 맺어서 학습하게 되면, variance가 낮아진다고 한다.
    즉, 앙상블 방법과 비슷하게, 적은 variance로 예측을 서로 도와준다
    한다.

  2. 몇번 쉬게 되어 over train을 막아준다.


  1. 박민지 2019.01.15 10:37

    안녕하세요 블로그 내용 잘 보았습니다. 좋은 내용 감사합니다. 내용 중에서 <cf) keras의 경우, fit()함수에서 validation_split을 쓰면, k-fold cross validation이 아닌 마지막 10%만 반영되므로.. 조심>
    이부분에서 궁금증이 생겨 문의드립니다. 만약 따로 k_fold_split 하는 함수를 만들고(StratifiedKFold()사용) , x_train /x_val 데이터로 구분한 다음에 fit()할 때, validation_data=(X_valid_cv, y_valid_cv), 매개 변수로 넣어준다면 위와 같은 상황이 적용이 안되는 것이 맞나요??

    • nittaku 2019.01.16 17:53 신고

      댓글덕에 오랜만에 복습했네요.
      저것은 fit()함수 중에 validation_split = 옵션만 쓸경우 확실히 cross 안했습니다. 마지막 10%만 했어요.
      아직 fit()함수가 어떻게 작동하는지 모르겠지만,
      미리 데이터를 잘라주고 넣는다면 cross_validation 안할 것 같긴한데, 해주는 함수를 찾아보시면 어떨까요??

    • nittaku 2019.01.16 23:38 신고

      다시 생각해보니, 딥러닝에서는 valid-_data만 넣어주면, 알아서 validation하지 않습니까??

      제가 케라스로 이미지 학습시킬 때는 딱히 cross_validation을 하지 않았어요. 알아서 valid_data가지고 계속 검사할 것 같아서요. 내부 로직은 제가 모르겠습니다.

      다만, valid데이터 안만들고, validation_split으로 짜르기만 하면 끝에 10%만 가지고 하는 것만 확실합니다!

      제 정보가 틀리면 알려주세요!

    • nittaku 2019.01.20 17:14 신고

      https://www.kaggle.com/stefanie04736/simple-keras-model-with-k-fold-cross-validation

      미리 잘라놓고, kfold만큼
      for문으로 반복하는 것 같습니다.
      구글에서 쉽게 검색 하실 수 있습니다.

  2. 2020.08.29 11:19

    비밀댓글입니다

  3. 독성약재 2021.02.25 20:42

    잊을 만 하면 한번 씩 검색되는 동신한의 조재성 ㅋㅋㅋㅋㅋㅋ 재성님 반가워요 또 잘 보고 갑니당~

  4. Hayat Lee 2021.05.31 04:27

    와우 진짜 제가 본 underfitting / overfitting 정리 중 최고였습니다!

  5. 힐둔 2021.06.30 09:35

    잘 보고 갑니다. 정리를 아주 깔끔하게 해주셨네요.

+ Recent posts