본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

드롭아웃

~18 min · dropout, regularization

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

드롭아웃이 하는 일

학습할 때는 활성화값 중 p 비율을 무작위로 0으로 만들고, 기댓값을 유지하도록 나머지 활성화값의 크기를 1/(1-p) 배로 조정해. 평가할 때는 드롭아웃 없이 그대로 통과시켜. 이렇게 하면 모델이 특정 뉴런 하나에 의존할 수 없어서 정보를 여러 뉴런에 분산해야 해. 그래서 드롭아웃은 강력한 암묵적 규제로 작동해.

흔히 쓰는 비율은 Transformer에서 p=0.1, CNN의 완전연결층에서 p=0.2-0.5, 합성곱층에서 p=0.0이야. 합성곱층에도 정말 드롭아웃이 필요하다면 SpatialDropout2d를 써.

팁: 드롭아웃은 활성화 함수 다음에 적용해야 해. 그전이 아니야. nn.Sequential(nn.Linear(...), nn.ReLU(), nn.Dropout(0.2), nn.Linear(...))처럼 구성해. 순서를 반대로 두면 비선형 변환 전에 활성화값을 0으로 만드는 고전적인 실수가 돼.

도움이 될 때와 해가 될 때

드롭아웃은 dense MLP가 주류이던 시절과 초기 Transformer에서 큰 효과를 냈어. 하지만 BatchNorm과 현대적인 데이터 증강을 함께 쓰면 효과가 크지 않을 수 있어. 일부 비전 파이프라인에서는 드롭아웃이 BatchNorm과 나쁘게 상호작용해 성능을 떨어뜨리기도 해. Transformer에서는 기본값으로 쓰고, CNN에서는 조정해 봐. 이미 다른 규제를 쓰는 표 형식 모델에서는 꺼 두는 편이 좋아.

알아둘 변형

SpatialDropout2d는 CNN에서 특징 맵 전체를 제거해. 인접 채널의 상관관계가 높을 때 유용해. DropPath / 확률적 깊이는 잔차 블록 전체를 무작위로 제거하며, ConvNeXt와 ViT처럼 매우 깊은 신경망에 사용해. Word/토큰 드롭아웃은 NLP에서 토큰 전체를 제거하며, 때로는 데이터 증강의 대안으로 써.

원칙: 드롭아웃은 한 번 시도해 볼 기본 조절값이지, 무조건 켜 둘 기본 설정은 아니야. 본인 과제에서 드롭아웃을 적용했을 때와 적용하지 않았을 때를 직접 측정해. BatchNorm과 데이터 증강이 이미 격차를 메우고 있어서 p=0이 더 좋은 경우도 있어.

Code

올바른 위치에 드롭아웃 적용·python
import torch.nn as nn

mlp = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Dropout(p=0.2),       # after ReLU
    nn.Linear(256, 128),
    nn.ReLU(),
    nn.Dropout(p=0.2),
    nn.Linear(128, 10),
)
# Eval mode disables dropout automatically.
mlp.train(); print(mlp(x))   # noisy outputs (dropout active)
mlp.eval();  print(mlp(x))   # deterministic outputs

External links

Exercise

MNIST의 3층 MLP를 드롭아웃=0.0, 0.2, 0.5로 각각 학습해. 검증 정확도 곡선을 그리고, 드롭아웃이 도움이 되는 지점과 성능을 해치는 지점을 확인해. 작은 데이터 설정에서는 높은 값이 성능을 해치는 경우가 많다는 점도 살펴봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.