Wide Residual Networks(WRN)는 Sergey Zagoruyko와 Nikos Komodakis가 2016년에 발표한 아키텍처로, 잔차 블록의 채널 수를 확장하면서 깊이를 줄이는 전략으로 이미지 분류의 효율성을 극대화했다. CIFAR-10에서 3.8%, CIFAR-100에서 18.3%의 오류율을 기록하며, 기존의 깊은 네트워크 대비 월등한 학습 속도를 입증했다.
깊이 대신 넓이를 선택한 이유
기존 ResNet은 층수를 늘려 성능을 어올렸으나, 특성 재활용의 비효율과 느린 수렴 속도라는 한계에 부딪혔다. WRN은 이를 해결하기 위해 다음과 같은 설계 철학을 제시한다:
- 깊이 축소: 수백 층에서 28~40층으로 대폭 감소
- 채널 확장: "넓이 계수"를 통해 잔차 블록의 필터 수를 증가
- 파라미터 균형: 깊이와 넓이를 조절하여 전체 파라미터 규모 유지
이러한 방식으로 WRN-16은 1000층 ResNet보다 우수한 성능을 60% 이상 짧은 시간에 달성한다.
WRN의 핵심 설계 요소
잔차 블록 재설계
ResNet의 1×1→3×3→1×1 병목 구조 대신, WRN은 3×3 합성곱의 채널을 늘려 특성 추출 능력을 강화한다. 과적합 방지를 위해 드롭아웃을 블록 내부에 삽입하며, 다음과 같은 구조를 따른다:
입력 → [BatchNorm → ReLU → Conv(3×3, k×w)] → [BatchNorm → ReLU → Conv(3×3, k×w)] → 드롭아웃 → 출력
여기서 k는 기본 채널 수, w는 넓이 계수를 의미한다.
아키텍처 파라미터 체계
WRN은 두 개의 하이퍼파라미터로 구조를 정의한다:
| 파라미터 | 의미 | 대표 값 |
|---|---|---|
| 깊이(depth) | 네트워크 전체 층 수 | 28, 40 |
| 넓이 계수(widen_factor) | 채널 확장 배율 | 2, 8, 10 |
WRN-28-10(28층, 10배 확장)은 CIFAR-10에서 3.89% 오류율을 기록해 ResNet-1001의 4.92%를 상회한다.
벤치마크 성능
| 데이터셋 | 모델 | 오류율 |
|---|---|---|
| CIFAR-10 | WRN-40-10 + 드롭아웃 | 3.8% |
| CIFAR-100 | WRN-40-10 + 드롭아웃 | 18.3% |
| SVHN | WRN-16-8 + 드롭아웃 | 1.54% |
| ImageNet | WRN-50-2-병목 | 21.9% (top-1) |
실제 구현 및 활용
개발 환경 구축
git clone https://github.com/szagoruyko/wide-residual-networks.git
cd wide-residual-networks/pytorch
pip install torch torchvision numpy
학습 실행
CIFAR-10 데이터셋으로 WRN-28-10을 학습하는 예시:
python train.py \
--architecture wrn \
--layers 28 \
--expansion 10 \
--dataset cifar10 \
--augment \
--outdir ./checkpoints
핵심 인자 설명:
--layers: 잔차 유닛의 총 층 수--expansion: 넓이 계수 (기본 채널 대비 배수)--dropout: 잔차 경로 내 드롭아웃 비율 (기본 0.3)
추론 코드 예시
import torch
import torch.nn as nn
class WideBasicBlock(nn.Module):
def __init__(self, in_ch, out_ch, stride, dropout_rate, widen_ratio):
super().__init__()
self.bn1 = nn.BatchNorm2d(in_ch)
self.relu = nn.ReLU(inplace=True)
self.conv1 = nn.Conv2d(in_ch, out_ch, 3, stride, 1, bias=False)
self.bn2 = nn.BatchNorm2d(out_ch)
self.conv2 = nn.Conv2d(out_ch, out_ch, 3, 1, 1, bias=False)
self.dropout = nn.Dropout(p=dropout_rate)
self.shortcut = nn.Sequential()
if stride != 1 or in_ch != out_ch:
self.shortcut = nn.Conv2d(in_ch, out_ch, 1, stride, bias=False)
def forward(self, x):
out = self.conv1(self.relu(self.bn1(x)))
out = self.dropout(out)
out = self.conv2(self.relu(self.bn2(out)))
return out + self.shortcut(x)
사전학습 모델 로드
import torchvision
backbone = torchvision.models.wide_resnet50_2(pretrained=True)
backbone.fc = nn.Linear(backbone.fc.in_features, num_classes)
확장 적용 분야
WRN의 설계 원칙은 다양한 후속 연구에 영향을 미쳤다:
- 물체 탐지: WRN-34-2를 백본으로 한 COCO 탐지 모델, 36 mAP 달성
- 특성 추출: 사전학습 WRN을 전이학습의 기반 인코더로 활용
- 경량화: 고 넓은 구조가 가지치기와 양자화에 유리한 특성 제공
설계 원칙의 함의
Wide Residual Networks는 층의 총량보다 특성 변환의 품질이 중요함을 보여준다. 적절한 넓이-깊이 트레이드오프를 통해, 더 적은 연산으로 동등 이상의 표현력을 달성할 수 있다. 이는 제한된 자원 환경에서 신경망을 구축할 때 특히 유의미한 지침이 된다.