본문 바로가기
Deep Learning Specialization

Improving Deep Neural Network [Deep Learning Specialization #4]

by ALTERww 2022. 7. 14.
320x100

Coursera의 Deep Learning Specialization - Week 2의 강의를 수강하면서 필기한 내용을 바탕으로 정리한 글입니다.

 

2주차는 DNN을 향상시키기 위한 Hyperparameter Tuning, Regularization, Optimization을 배웁니다.
이번 주차에서는 DNN의 결과가 의미하는 것을 분석하고, DNN 향상 기법들을 알아봅니다.

 

Dataset Distribution

일반적인 데이터셋은 크게 세 가지로 나뉩니다.

  • Training set : 모델을 훈련하는 데 이용되는 데이터셋의 모음으로 가장 큰 지분을 차지합니다. 60%가 일반적입니다.
    이 데이터셋을 반복적으로 이용하여 모델의 성능을 끌어올립니다.
  • Development set : 앞서 훈련한 모델을 검증하기 위한 데이터셋으로, 'Validation set'으로도 불립니다만 본 강의에서는 줄여서 'dev set'이라고 말합니다. 훈련에서 보지 못한 데이터를 이용해 검증을 실시합니다.
    이 데이터셋을 반복시켜 모델의 성능을 향상시킬 순 있지만, 과적합이 일어날 수 있기에 이 모델이 실제로 배포되었을 때 좋은 성능을 보인다고는 확신할 수 없습니다.
  • Test set : 최상의 모델을 평가하기 위한 최종 데이터셋으로 편향이 없어야 합니다. 
    이 데이터셋을 따로 준비하지 않아도 됩니다. 실제 실무에서는 이 데이터셋이 없는 경우도 많습니다.

 

 

Bias & Variance (편향과 분산)

다음으로 Bias와 Variance에 대해 알아봅니다. 먼저 용어를 정리해보면,

  • Bias는 편향이라는 뜻으로,  주변의 영향을 크게 받지 않고 어느 쪽에 강하게 치우친 상태를 의미합니다. 
    Deep Learning의 모델에서는 데이터의 분포가 바뀜에도 영향을 받지 않고 크게 바뀌지 않는 경우, Bias가 큰 상태 ( High Bias )라고 일컫습니다. 이 경우는 모델이 데이터에 너무 맞지 않는 과소적합(Underfitting)하게 됩니다.
  • Variance는 분산이라는 뜻으로, 퍼져 있는 정도를 의미합니다. 데이터의 분포가 바뀌었을 때 모델의 결과가 분포에 따라 크게 퍼지게 되면 Variance가 크다(High Variance)고 말합니다. 이 경우 모델이 데이터에 과대적합(Overfitting)하게 됩니다.

 

Bias와 Variance

 

그 아래에는 데이터셋마다 오차(Error)를 확인했을 때 모델의 상태를 평가하는 모습을 보여주고 있습니다.

  • 먼저 Training set error는 1%로 좋은 성능을 보여주고 있는데, Dev set에서는 11%로 그리 좋지 않습니다. 이는 Training set에 모델이 과대적합되어 처음 보는 데이터에 대해서는 성능이 좋지 않음을 의미합니다. 즉 분산이 높은 상태입니다. (High Variance)
  • 다음으로 Training set는 15%, dev set는 16%로 Training data에 성능이 좋지 않은 모델입니다. 이는 모델이 과소적합되어 편향이 큰 상태입니다. (High Bias) dev set error가 크긴 하지만 training set와 비슷한 값이므로 훈련 과정에서의 문제점을 고치는 것이 우선입니다.
  • 마지막은 Training set 15%, dev set 30%로 Training data에도 성능이 좋지 않고 dev set에서는 성능이 더욱 떨어졌습니다. 이는 위 두 개의 Case가 합쳐진 것으로 볼 수 있습니다. 

Bayes Error라는 용어가 등장하는데, 이는 이론적으로 최상의 성능 모델에서 나오는 오차값을 의미합니다. 즉, 이론적으로 나올 수 있는 가장 작은 오차값입니다. 이 값이 15%라면, 두 번째 case는 가장 이상적이고 합리적인 모델임을 의미합니다.

 

 

Bias와 Variance를 줄이는 단계를 확인해 봅시다.

먼저 Bias가 높은 상태인지를 확인합니다. Training data에 대한 성능을 먼저 확인하는 것입니다.

만일 크다면, 네트워크가 그리 크지 않아서 분류를 못 하고 있거나 훈련이 덜 되어 제 성능이 나오지 않는 것일 수 있습니다. 따라서 Layer를 추가하여 네트워크를 크게 하거나 훈련을 더 진행한 뒤, 다시 확인해 보면 되겠습니다.

 

Bias가 정상이라면 다음으로 dev set에 대한 성능을 의미하는 Variance가 높은지 확인합니다.

만일 크다면, Training data가 적어서 모델이 과대적합되었을 수도 있습니다. 따라서 Training data를 추가합니다.

그 외에 정규화(Regularization)를 수행하는 방법도 있습니다. 이는 아래에서 서술하겠습니다.

 

 

Regularization (정규화)

Regularization은 과대적합 모델에 대해 data를 정규화하는 과정입니다.

Cost Function인 J에 W와 b에 대한 항을 추가합니다. 단, bias는 Weight에 비해 기여하는 바가 상대적으로 훨씬 작으므로 생략합니다. 

빨간 글씨로 쓴 항을 살펴보면, lambda라는 파라미터가 등장합니다. 이 값은 최종적으로 W를 감소시키는 역할을 하게 됩니다. 이를 Weight Decay라고 합니다.

 

 

W값을 갱신하는 과정에서, lambda가 커질수록 W는 0에 근접하게 됩니다.

가중치가 0이 된다는 건 Network가 Logistic Regression처럼 Linear해지는 것을 의미합니다.

이를 직관적으로 살펴보자면, Z = W*a + b에서 W가 작아질 때 Z는 0에 근접합니다. 

Linear에 가까워 진다는 것은 분산이 낮아진다는 것을 의미하지요. 과대적합을 줄여준다는 점에 의의가 있습니다.

결과적으로 정규화는 가중치 W가 큰 값들을 낮추는 작업을 통해 모델의 과대적합을 줄이는 역할을 한다고 이해하면 되겠습니다.

 

 

Dropout (드롭아웃)

Dropout은 일정 확률로 Hidden Layer의 node를 제거하는 정규화 방법입니다. 

노드가 keep_prob 확률로 생존하므로, 1 - keep_prob 확률로 제거됩니다.

이렇게 노드 제거만 이루어지게 되면, 전체적인 활성 값 a는 감소하게 됩니다. 따라서 제거를 한 뒤, keep_prob 값으로 활성 값 a를 나누는 작업을 진행합니다. 제거된 노드만큼 생존한 노드의 값이 증가하게 되므로, a의 기댓값을 유지시키기 위한 작업이라고 이해하면 되겠습니다.

Dropout은 각 node들의 가중치가 몰리는 현상을 방지하기 위해 도입되었습니다. 어느 노드에 대해서 가중치가 너무 커지게 되면, 다른 노드에 대한 의존도가 떨어져 학습의 효과가 떨어지게 됩니다. 따라서 매 학습 마다 노드들을 랜덤으로 제거하여 특정 노드에 의존하지 않게 하여 가중치를 최대한 여러 노드에 분산시키도록 하는 것이 Dropout의 목적입니다.

 

 

Other Regularizations - Data augmentation, Early stopping

다른 정규화 방법으로는 먼저

Data Augmentation - 데이터 증강이 있습니다.

dataset 내 image를 반전시키고, 회전시키고, 변형하는 아주 간단한 작업을 진행하여 데이터셋을 쉽게 증가시키는 방법입니다.

그리고 Early Stopping이란 Training을 정해진 epoch만큼 수행하는 것이 아니라, dev set error가 가장 낮게 기록될 때 Training을 정지하는 방법입니다. 이렇게 하면 dev set에 과적합되지 않고, 비용 함수 J를 최적화할 수 있습니다. 

하지만 이 방식의 최대 단점은 직교화(Orthogonalization)하지 못한다는 것입니다. 

이후에 자세히 다룰 것이지만, 비용 함수를 최적화하는 것과 과대적합을 줄이는 것은 별개의 문제이기 때문에 서로 독립적인 해결방안을 모색하는 것이 바람직합니다. Early Stopping은 이 둘을 동시에 해결하려 하기 때문에 좋은 방법은 아닙니다.

 

 

Other Regularizations - Normalized input

입력의 분포를 균일하게 하는 작업을 말합니다. 이 작업을 통해 데이터셋마다 다르게 분포되어 있는 것을 균일한 범위 내로 이동시켜 학습의 효율을 증가시킵니다.

두 단계로 나뉘어 진행됩니다.

  • Step 1. 평균을 구한 뒤, 모든 데이터에서 평균값을 뺍니다.
  • Step 2. 분산을 구한 뒤, 모든 데이터에서 분산으로 나눕니다.

 

 

Vanishing / Exploding Gradient

가중치 W가 제대로 업데이트되지 않으면 모델에 문제가 발생합니다. 가중치가 너무 크면 Gradient가 폭발하고, 너무 작으면 Gradient가 사라지는 현상이 발생합니다. 영어로 Vanishing Gradient, Exploding Gradient라고 말합니다.

이를 막기 위한 방법에는 여러 가지가 있는데, 가중치 W를 초기화해주는 것만으로도 대부분 좋은 해결책이 됩니다.

  • 아래에서 명시한 방법은 2를 이전 Layer의 unit 수로 나눈 값에 root를 씌운 값을 곱해 주는 것으로, ReLU를 사용할 때 주로 이용합니다. He 초기화(He Initialization)라고 합니다.

 

 

Checking Gradient ( 기울기 확인 )

Backward Propagation이 잘 작동하고 있는지 확인하는 방법 중 하나가 기울기 확인입니다.

J는 Forward Propagation과 Cost Function으로부터 계산하는 값이고, 이는 쉽게 계산할 수 있습니다.

따라서 이로부터 Gradient의 근사치 d_approx를 계산하고, 이 값을 Backward Propagation의 값과 비교하여 그 차이가 충분히 작다면 Backward Propagation을 믿을만 하다고 볼 수 있습니다.

 

 

아래는 기울기 확인의 유의할 점들입니다.

  • Training 중에는 사용하지 않고, 디버깅 중에만 이용합니다. 특히, 모든 노드들에 대해 검사해야 하므로 Dropout을 끈 채로 확인합니다.
  • 검사에 실패했다면, db와 dW를 확인합니다. 
  • 정규화항이 lambda 파라미터가 있는 새로운 수식이라는 것을 인지하고, 제대로 구현했는지 확인합니다.
  • 파라미터, 특히 W를 무작위 초기화 한 후 Training한 모델에 대해 검사를 적용해야 합니다.

 

댓글