BERT에서 dropout을 왜 하나

Soogyung Gwon·3일 전

구름을잡아라

목록 보기
57/60

BERT에서 dropout을 사용하는 이유는 과적합(overfitting)을 줄이기 위해서 이다.

특히 BERT는:

레이어 수가 많고
self-attention 구조가 매우 강력하며
파라미터 수가 엄청 큼

예:

BERT-base: 약 1.1억 개
BERT-large: 약 3.4억 개

그래서 작은 데이터셋으로 fine-tuning하면 쉽게 과적합 (훈련 정확도보다 테스트 정확도가 떨어짐)

Dropout은 이런 현상을 완화하는 대표적인 정규화(regularization)기법이다.

dropout = tf.keras.layers.Dropout(0.1)

-> 약 10% 뉴런을 무작위로 비활성화 한다.

  • Dropout은 훈련시에만 활성화되며 추론 시에는 비활성화 된다.

model.fit()에는 사용, model.preduct(), model.evaluate()에는 사용 안 함

그럼 이 비율은 어떻게 정하나?

원 논문(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)에서는 기본 dropout 비율을 0.1로 사용했다.

dropout 비율을 정하는 핵심 기준은 현재 모델이 과적합(overfitting) 중인가? 이다.

일반적인 경험적 기준

상황보통 사용하는 dropout
BERT fine-tuning0.1
일반 딥러닝0.2 ~ 0.5
CNN0.3 ~ 0.5
Transformer0.1
데이터 매우 적음0.2 ~ 0.5
데이터 매우 많음0.0 ~ 0.1

과적합 상태를 보고 조절

  • train accuracy 가 validation accuracy보다 많이 높을 때

  • train loss가 validation loss보다 작을 때

  • underfitting인 경우: train accuracy도 validation accuracy도 낮음, train loss도 validation loss도 좋지 않음

과적합이라고 판단되면 dropout을 증가시키면서 추이를 보고, underfitting이면 dropout을 감소시킨다.

dropout을 각각 0.0, 0.1, 0.2, 0.3 로 정하여 각각 학습 후에

  • validation accruracy
  • validation F1
  • validation loss

를 비교해서 가장 좋은 값을 선택할 수 있다.

NLP에서 dropout이 중요한 경우는 특히 데이터가 적을 때이다.

예를 들어:

  • 리뷰 2천 개
  • NER 데이터 수백 문장

이런 경우에는 BERT가 쉽게 외워버리므로 dropout을 기본 0.1에서 올리는 방향으로 가면 좋아질 수 있다.

profile
오랜시간 망설였던 코딩을 다시 해보려고 노력하고 있는 사람

0개의 댓글