
Stochastic Depth(DropPath)를 구현했더니 파라미터 증가 없이 정확도가 약 9포인트 상승했습니다 【Keras 실험】
요약
Keras를 사용하여 Stochastic Depth(DropPath)를 직접 구현하고 CIFAR-10 데이터셋에서 성능을 실험한 결과입니다. 파라미터 수의 증가 없이 drop_rate=0.1 적용 시 정확도가 약 8.8%포인트 향상됨을 확인했습니다.
핵심 포인트
- Stochastic Depth는 블록 단위로 무작위 스킵을 수행하는 정규화 기법임
- 파라미터 증가 없이 정확도를 약 8.8%포인트 개선 가능
- 구현 시 Residual 연결(Skip connection)이 필수적임
- 학습 시 스케일링을 통해 추론 시의 기대값을 맞춰야 함
- 적절한 drop_rate 설정이 성능의 핵심임
ResNeXt, EfficientNet, DeiT 등 최근의 고정밀 모델에서 널리 사용되고 있는 **Stochastic Depth (확률적 깊이)**를 알고 계십니까?
Dropout은 뉴런을 무작위로 OFF 시키지만, Stochastic Depth는 블록 (Conv층의 그룹) 단위로 무작위 스킵(skip)합니다. "Dropout의 블록 버전"이라고 하면 직관적으로 이해하기 쉬울 것입니다.
이번에는 Keras로 Stochastic Depth 커스텀 레이어를 직접 구현하여, CIFAR-10 데이터셋에서 drop_rate를 변경한 3가지 패턴을 비교했습니다.
결과 요약
| 패턴 | Test Acc | 학습 시간 | 파라미터 수 |
|---|---|---|---|
| A: SD 없음 | 72.80% | 258.6초 | 695,114 |
| B: SD drop=0.1 | 81.62% | 266.6초 | 695,114 |
| C: SD drop=0.2 | 79.23% | 267.7초 | 695,114 |
A: SD 없음——72.80%가 베이스라인
Residual 블록만 있는 (Stochastic Depth가 없는) 베이스라인입니다.
B: SD drop=0.1——약 8.8포인트 향상, 파라미터 수는 동일
가장 인상적인 결과입니다. 파라미터 수가 695,114로 완전히 동일함에도 불구하고, test_accuracy가 72.80% → 81.62%로 약 8.8포인트 향상되었습니다.
정규화 (Regularization) 기법으로 이만큼 큰 개선을 얻는 경우는 드물며, 베이스라인이 과적합 (Overfitting)되고 있던 상황에서 블록 단위의 무작위 스킵이 강력하게 작용했음을 알 수 있습니다.
C: SD drop=0.2——B보다 2.4포인트 저하
drop_rate를 0.2로 올리면 79.23%가 되어, B보다 약 2.4포인트 저하되었습니다.
정규화가 너무 강하면 모델의 학습 능력이 손상됩니다. 이번 4블록 구성에서는 0.2는 이미 "너무 강한" 영역에 들어간 것으로 보입니다. 먼저 drop_rate=0.1부터 시도하는 것이 좋아 보입니다.
구현의 포인트: Residual 연결이 필수
class StochasticDepth(keras.layers.Layer):
def __init__(self, drop_rate=0.1, **kwargs):
super().__init__(**kwargs)
...
중요한 점은 Residual 연결 (Skip connection)이 필수라는 점입니다. 블록을 스킵했을 때, 입력이 숏컷 (Shortcut)을 통해 그대로 다음 층으로 전달됩니다. Residual 연결이 없는 모델에서 사용하면 정보가 완전히 유실되어 학습이 붕괴됩니다.
또한, 학습 시에 x / keep_prob * random_tensor를 통해 스케일링 (Scaling)하는 것은 Inverted Dropout과 같은 개념으로, 추론 (Inference) 시에 특별한 스케일링이 필요하지 않게 됩니다. 이를 잊으면 학습 시와 추론 시의 출력 기대값이 어긋나 정확도가 떨어집니다.
drop_rate의 기준
| drop_rate | 이번 결과 | 적합한 상황 |
|---|---|---|
| 0.0 (없음) | 72.80% | 얕은 네트워크 · 과적합이 경미함 |
| 0.1 | 81.62% (최고) | 우선 여기서부터 시도 |
| 0.2 | 79.23% | 더 깊은 네트워크 (8층 이상) |
| 0.3~ | 미검증 | ResNet50 상당 이상의 깊은 네트워크 |
실무에서는 깊은 블록일수록 drop_rate를 높이는 "Linear Decay" 스케줄이 표준적이지만, 이번에는 모든 블록에 동일한 drop_rate를 적용해도 충분한 효과를 확인할 수 있었습니다.
요약
- drop_rate=0.1에서 test_accuracy가 72.80% → 81.62% (약 +8.8포인트) —— 파라미터 수를 전혀 늘리지 않고도 이만큼 개선 가능
- drop_rate=0.2는 drop_rate=0.1보다 약 2.4포인트 저하 —— 너무 강한 정규화는 역효과. 우선 0.1부터 시도할 것
- Residual 연결 (Skip connection)이 필수 —— 없으면 블록 스킵 시 정보가 유실되어 학습 붕괴
- 파라미터 수에 영향 없음 (3가지 패턴 모두 695,114로 완전히 동일)
- 학습 시 Inverted Dropout과 동일한 스케일링을 수행함으로써 추론 시의 조정이 불필요함
구현 코드, 전체 로그, 그래프는 블로그 게시물에서 공개하고 있습니다.
이 기사가 도움이 되었다면 좋아요👍를 눌러주시면 큰 힘이 됩니다!
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn ML의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기