
ConvNet의 레이어 →


기존 ConvNet 설계는 주로 각 레이어 구조 를 어떻게 설계할지를 중심으로 하지만, 모델 스케일링은 를 고정하고, 레이어 개수(), 채널 수(너비, ), 해상도()를 확장함.
또한, 조합을 조정할 수 있는 design space를 줄이기 위해, 모든 레이어를 동일한 비율로 스케일하도록 제한함.
목표 : 주어진 resource constraints에 대해 모델 정확도를 최대화하는 것으로, 다음과 같은 최적화 문제로 공식화될 수 있음.

Observation 1 : 네트워크의 너비, 깊이, 해상도 중 어느 차원이든 확장하면 정확도가 향상되나, 모델이 커질수록 그 이득은 줄어든다.



Observation 2 : 더 나은 정확도와 효율성을 달성하려면, ConvNet 스케일링 시 너비, 깊이, 해상도 세 차원을 균형 있게 조정해야 한다. (스케일링 차원들이 서로 독립적이지 않으므로)


모델 스케일링은 기본 네트워크의 레이어 연산자를 변경하지 않기에 좋은 baseline network를 선택하는 것도 매우 중요하므로 모바일 사이즈 기본 네트워크를 별도 개발함. (EfficientNet)

# MBConv + SE
# 일반 Bottleneck : 입력 -> 채널 줄이기 -> 연산 -> 다시 늘리기
# Inverted Bottleneck(MBConv) : 입력 -> 채널 늘리기 -> depthwise conv -> 채널 줄이기 -> 출력
# SE 구조 : Squeeze (GAP 각 채널 정보 요약) -> Excitation (채널별 가중치를 통해 중요한 채널은 크게, 아닌 채널은 작게) -> Rescale (원래 Feature map에 가중치 곱해 반영)
(2): Sequential(
(0): MBConv(
(block): Sequential(
# 채널 확장
(0): Conv2dNormActivation(
(0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): SiLU(inplace=True)
)
# Depthwise 3*3 conv
(1): Conv2dNormActivation(
# 채널마다 독립적으로 3*3 convolution (groups=96)
(0): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=96, bias=False)
(1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): SiLU(inplace=True)
)
# Squeeze and Excitation -> SE 모듈
(2): SqueezeExcitation(
# Squeeze
(avgpool): AdaptiveAvgPool2d(output_size=1)
# Excitation (중요 채널 학습)
(fc1): Conv2d(96, 4, kernel_size=(1, 1), stride=(1, 1))
(fc2): Conv2d(4, 96, kernel_size=(1, 1), stride=(1, 1))
(activation): SiLU(inplace=True)
(scale_activation): Sigmoid() # 각 채널 사이 가중치 0~1 사이 조정 -> 즉, 채널별 가중치 부여
)
# 채널 축소
(3): Conv2dNormActivation(
(0): Conv2d(96, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
# stochastic_depth : residual 블록을 학습 중에 확률적으로 drop하는 방식
# mode값이 row면 샘플 단위, batch면 배치 전체 단위로 블록 drop
(stochastic_depth): StochasticDepth(p=0.0125, mode=row)
)
SiLU : 입력 x에 sigmoid를 곱한 형태 ()
→ 항상 연속적이고, 부드러우며 음수도 일부 통과시키는 형태로, EfficientNet에서 SiLU를 통해 ReLU 대비 더 높은 정확도를 얻었으며, NAS 구조 탐색 결과도 성능 좋은 조합으로 SiLU 선택
- 논문 : https://arxiv.org/pdf/1905.11946
- NAS 관련 Survey : https://arxiv.org/pdf/1808.05377
간단한 정리 )
- MobileNet → 너비, 해상도를 사용자가 따로 조정함.
- EfficientNet → 너비, 깊이, 해상도를 공식 기반으로 균형 확장함. (셋 다 조절)