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% 뉴런을 무작위로 비활성화 한다.
model.fit()에는 사용, model.preduct(), model.evaluate()에는 사용 안 함
원 논문(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)에서는 기본 dropout 비율을 0.1로 사용했다.
dropout 비율을 정하는 핵심 기준은 현재 모델이 과적합(overfitting) 중인가? 이다.
| 상황 | 보통 사용하는 dropout |
|---|---|
| BERT fine-tuning | 0.1 |
| 일반 딥러닝 | 0.2 ~ 0.5 |
| CNN | 0.3 ~ 0.5 |
| Transformer | 0.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 로 정하여 각각 학습 후에
를 비교해서 가장 좋은 값을 선택할 수 있다.
NLP에서 dropout이 중요한 경우는 특히 데이터가 적을 때이다.
예를 들어:
이런 경우에는 BERT가 쉽게 외워버리므로 dropout을 기본 0.1에서 올리는 방향으로 가면 좋아질 수 있다.