Dropout Layer
드롭아웃 레이어는 학습 중 활성값의 일부를 무작위로 0으로 설정해 네트워크가 특정 유닛 하나에 의존하지 못하게 하며, 과적합을 줄입니다.
드롭아웃 레이어는 정규화를 위한 신경망 구성 요소로, 매 학습 단계마다 입력의 p 비율에 해당하는 값을 무작위로 0으로 설정하고 추론 시에는 모든 값을 변경 없이 통과시킵니다. 어떤 유닛이든 각 단계에서 비활성화될 수 있으므로 네트워크는 소수의 특정 뉴런이나 뉴런 간의 취약한 상호 적응에 의존할 수 없으며, 그 결과 더 잘 일반화하는 중복 특성을 학습하고 과적합 현상이 학습 데이터에서 덜 나타납니다. Geoffrey Hinton과 동료들은 2012년에 이 기법을 소개했으며, Srivastava, Hinton 등은 2014년에 이 기법을 자세히 설명했습니다. 드롭아웃은 PyTorch, TensorFlow 및 대부분의 다른 딥러닝 프레임워크에 기본 제공되는 레이어이며, 완전 연결 분류기 헤드부터 트랜스포머에 이르는 아키텍처에서 사용됩니다.
드롭아웃의 작동 방식#
학습 중 레이어는 순전파마다 새로운 무작위 마스크를 샘플링하여 각 요소를 확률 1 − p로 유지하고 확률 p로 0으로 만듭니다. 따라서 각 단계에서는 서로 다른 축소 신경망이 학습되고, 테스트 시 사용하는 전체 네트워크는 가중치를 공유하는 지수적으로 많은 신경망의 평균을 근사합니다. 이 때문에 드롭아웃을 저렴한 앙상블 학습이라고 설명하기도 합니다. 두 단계에서 기대 활성값을 동일하게 유지하기 위해 최신 프레임워크는 역 드롭아웃을 사용합니다. 학습 중 살아남은 값에 1 / (1 − p)를 곱하므로 추론 시에는 레이어가 아무 작업도 하지 않습니다. PyTorch에서 nn.Dropout은 모듈의 학습 또는 평가 모드에 따라 동작합니다.
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# 학습 모드: 값의 약 절반이 0이 되고 살아남은 값에는 1 / (1 - p) = 2를 곱합니다
dropout.train()
print("Train:", dropout(x))
# 평가 모드: 레이어가 모든 값을 변경 없이 통과시킵니다
dropout.eval()
print("Eval: ", dropout(x))학습 모드에서는 값 10개 중 6개가 제거되고 살아남은 4개는 2.0이 되어 기대값 1.0을 유지합니다. 평가 모드에서는 값 10개가 모두 1.0으로 유지됩니다.
일반적인 드롭아웃 변형#
- 공간 드롭아웃: PyTorch의
nn.Dropout2d은 전체 특성 맵 채널을 0으로 만듭니다. 채널 내 인접 픽셀은 강한 상관관계를 가지므로, 픽셀 단위로 제거하면 정규화 효과가 거의 없는 합성곱 신경망에 적합합니다. - 확률적 깊이 (DropPath): 개별 활성값 대신 각 샘플에 대해 잔차 분기 전체를 무작위로 건너뜁니다. 이는 Vision Transformer와 최신 CNN 학습의 표준 구성 요소입니다.
- 몬테카를로 드롭아웃: 추론 시에도 드롭아웃을 활성화한 상태로 두고 동일한 입력에 대해 모델의 순전파를 여러 번 실행합니다. 예측값의 분산은 안전이 중요한 시스템에서 모델 불확실성을 저렴하게 추정하는 방법이며, Gal과 Ghahramani는 이를 근사 베이지안 추론으로 해석했습니다.
- DropConnect: 활성값 대신 개별 가중치를 무작위로 0으로 만들며, 각 연결에는 자체 마스크가 적용됩니다.
실전 드롭아웃#
드롭아웃 비율은 다른 하이퍼파라미터와 마찬가지로 조정합니다. Srivastava 외 연구진은 은닉 유닛을 확률 0.5로 제거하는 방식이 다양한 네트워크와 작업에서 효과적이라고 밝혔습니다. 입력 유닛은 유지 확률을 1에 가깝게 설정하는 편이 좋으며, 원래 Transformer는 p = 0.1을 사용했습니다. 비율이 너무 높으면 수렴이 느려지고 과소적합이 발생할 수 있습니다. 배치 정규화 직전에 드롭아웃을 배치하면 학습과 테스트 간 분산 이동으로 정확도가 떨어질 수 있습니다. 많은 합성곱 신경망은 주로 배치 정규화, 데이터 증강, 가중치 감쇠에 의존하고 분류기 헤드에 드롭아웃을 적용합니다. Ultralytics YOLO26 분류 모델도 이 패턴을 따릅니다. 풀링된 1,280채널 특성과 최종 선형 분류기 사이에 드롭아웃 레이어 하나를 포함하며, 비율은 dropout 학습 인수로 설정합니다(기본값은 0.0).
from ultralytics import YOLO
# 헤드에 드롭아웃 레이어가 포함된 YOLO26 분류 모델을 불러옵니다
model = YOLO("yolo26n-cls.pt")
# 소규모 MNIST 하위 집합에서 분류기 헤드에 드롭아웃 10%를 적용해 학습합니다
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)실제 적용 사례#
- 의료 영상 분석: 레이블이 지정된 스캔은 확보 비용이 높으므로, 진단 분류기는 수천 장의 이미지를 사용해 사전 학습된 백본을 미세 조정하는 경우가 많습니다. 분류기 헤드에 드롭아웃을 적용하면 소규모 데이터셋에서 헤드가 개별 사례를 암기하는 정도를 제한할 수 있습니다.
- 자연어 처리: BERT와 같은 Transformer 인코더는 사전 학습과 미세 조정 중 어텐션 가중치를 포함한 모든 레이어에 확률 0.1의 드롭아웃을 적용합니다.










