과적합 문제 방지 기법

GURI·2022년 1월 15일
0

Deep-Learning

목록 보기
2/3

딥러닝 모델 학습에서의 과적합 방지 기법으로는 정규화, 드롭아웃, 배치 정규화가 대표적이다.

🌞 정규화 (Regularization)

모델이 복잡해질수록 parameter들은 많아지고, 절댓값이 커지는 경향이 발생한다.

이는 기존 손실함수에 규제항을 더해 최적값을 찾을 수 있다.

대표적으로 L1, L2 규제가 있다.

L1 정규화(Lasso Regularization)

  • TotalLoss=Loss+λwWTotalLoss = Loss + \lambda \sum_w |W|
  • 가중치의 절댓값의 합을 더한 값에 규제 강도 λ를 곱하여 오차에 더한다.
  • 즉, 가중치(w)의 절댓값에 비례하는 손실(loss)이 기존 손실 함수에 추가되는 형태
  • 어떤 가중치(w)는 실제로 0이 된다. 즉, 모델에서 완전히 제외되는 특성이 생기는 것이다.
  • 이를 통해 모델을 일반화시킨다. 다른 말로 Sparse Model을 만든다라고 한다.
  • tf.keras.layers.Dense(kernel_regularizer = tf.keras.regularizers.l1(ratio))
    • ratio : 가중치에 L1 정규화를 적용하는 비율 (0.001 ~ 0.005)

L2 정규화 (Ridge Regularization)

  • TotalLoss=Loss+λwW2TotalLoss = Loss + \lambda \sum_w W^2
  • 각 가중치 제곱의 합에 규제 강도 λ를 곱한다.
  • 즉, 가중치의 제곱에 비례하는 손실이 기존 손실 함수에 추가되는 형태
  • λ를 크게 하면 가중치가 더 많이 감소되고, λ를 작게 하면 가중치가 증가한다.
  • 학습이 진행될 때 가중치의 값이 0에 가까워지도록 만들어준다. 가중치를 0으로 만드는 L1 정규화와는 차이가 있다.
  • 이를 통해 특정 가중치에 치중되지 않도록 가중치 값을 조율하게 되며 가중치 감쇠(Weight Decay)라고도 부른다.
  • tf.keras.layers.Dense(kernel_regularizer = tf.keras.regularizers.l2(ratio))
    • ratio : 가중치에 L2 정규화를 적용하는 비율 (0.001 ~ 0.005)

🌞 Dropout

  • 각 layer마다 일정 비율의 뉴런을 랜덤하게 drop시켜(0으로 만들어) 나머지 뉴런들만 학습하는 방법이다.
  • Dropout을 적용하면 학습되는 노드와 가중치들이 매번 달라진다.
  • 이를 통해 모델 내부의 특정 가중치에 치중되는 것을 막고 일반화된 모델을 만들 수 있다.
  • 주의할 점은 학습이 끝난 후 테스트 과정에서는 Dropout을 사용하면 안된다는 점이다.
  • tf.keras.layers.Dropout(prob)
    • prob : 드롭 아웃을 적용할 확률 (0.1 ~ 0.5)

🌞 배치 정규화 (Batch Normalization)

  • 배치 정규화 (Batch Normalization)는 정규화를 모델에 들어가는 입력 데이터뿐만 아니라 모델 내부 은닉층의 입력 노드에도 적용하는 것이다.
  • 배치 정규화를 적용하면 매 층마다 정규화를 진행하므로 가중치 초기값에 크게 의존하지 않는다. 즉, 가중치 초기화의 중요도가 감소한다.
  • 또한 과적합을 억제하므로 Dropout과 L1, L2 정규화의 필요성이 감소한다.
  • 가장 큰 장점은 학습 속도가 빨라진다는 것이다.
  • 배치 정규화는 하나의 Layer로써 Dense Layer와 활성화 함수 사이에서 작용한다.
  • 그래서 적용을 할 때,
tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(128),
            tf.keras.layers.BatchNormalization(),
            tf.keras.layers.Activation('relu'),
            tf.keras.layers.Dense(64),
            tf.keras.layers.BatchNormalization(),
            tf.keras.layers.Activation('relu'),
            tf.keras.layers.Dense(1, activation='softmax')])

이런 식으로 Activation Layer를 따로 사용하여 Dense와 Activation 사이에 넣어야 한다.!

profile
Done is better than Perfect.

0개의 댓글