Deep Learning study
컨볼루션 신경망(CNN) 심층 분석: 수식·구현·최신 트릭 본문
컨볼루션 신경망(CNN) 심층 분석: 수식·구현·최신 트릭
포스트 요약: CNN의 기본 합성곱·풀링 연산을 수식으로 유도하고, 수용 영역(receptive field), 패딩·스트라이드·딜레이션 효과를 계산합니다. Depthwise/Separable Convolution, 그룹 컨볼루션 등 최신 최적화 기법과 PyTorch 구현 예제도 다룹니다.
1. CNN 기본 연산
1.1 2D 컨볼루션 수식
입력 \(\mathbf{X}\in\mathbb{R}^{C_{\mathrm{in}}\times H\times W}\), 필터 \(\mathbf{W}\in\mathbb{R}^{C_{\mathrm{out}}\times C_{\mathrm{in}}\times k\times k}\)일 때 출력 \(\mathbf{Y}\in\mathbb{R}^{C_{\mathrm{out}}\times H'\times W'}\)의 원소는:
\[ Y_{m,i,j} = \sum_{c=1}^{C_{\mathrm{in}}} \sum_{u=1}^{k}\sum_{v=1}^{k} W_{m,c,u,v}\; X_{c,\,i+u-1-\lfloor k/2\rfloor,\,j+v-1-\lfloor k/2\rfloor} \]
- \(i=1,\dots,H'\), \(j=1,\dots,W'\)
- 패딩(p) 적용 시 인덱스 오프셋에 \(+p\) 반영
1.2 출력 크기 공식
패딩 \(p\), 스트라이드 \(s\)일 때:
\[ H' = \left\lfloor\frac{H + 2p - k}{s}\right\rfloor + 1, \quad W' = \left\lfloor\frac{W + 2p - k}{s}\right\rfloor + 1 \]
2. 수용 영역(Receptive Field)
깊은 층에서 한 픽셀이 입력 이미지에 미치는 영역은 다음과 같이 재귀 계산:
# receptive field 계산 (1D 예시)
def receptive_field(kernels, strides):
r = 1
for k, s in zip(kernels[::-1], strides[::-1]):
r = r * s + (k - 1)
return r
# 예: [3,3,3] kernel, [1,1,1] stride → rf=7
예를 들어 3×3 컨볼루션 3개 연속 시 RF = \(1+(3-1)\times(1+(3-1)\times(1)) = 7\).
3. 최신 트릭: 효율화 기법
3.1 Depthwise Separable Convolution
표준 컨볼루션 비용 \(\mathcal{O}(k^2C_{\mathrm{in}}C_{\mathrm{out}}HW)\)를 다음과 같이 분해:
- Depthwise: \(\mathcal{O}(k^2C_{\mathrm{in}}HW)\)
- Pointwise(1×1): \(\mathcal{O}(C_{\mathrm{in}}C_{\mathrm{out}}HW)\)
파라미터·연산량을 약 \(1/k^2\) 수준으로 줄일 수 있습니다 [1].
3.2 그룹 컨볼루션(Group Convolution)
채널을 \(G\) 그룹으로 나누어 별도 컨볼루션 적용:
\(\displaystyle \mathrm{Cost} = G \times \mathcal{O}\bigl(k^2\frac{C_{\mathrm{in}}}{G}\frac{C_{\mathrm{out}}}{G}HW\bigr) \)
효율과 표현력을 균형 있게 조절할 수 있습니다 (ResNeXt 등).
4. PyTorch 구현 예제
4.1 표준 컨볼루션
import torch.nn as nn
conv = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)
x = torch.randn(8, 32, 128, 128)
y = conv(x)
print(y.shape) # torch.Size([8,64,128,128])
4.2 Depthwise Separable
from torchvision.ops import Conv2dNormActivation
# Depthwise + Pointwise
dw_pw = nn.Sequential(
nn.Conv2d(32, 32, 3, padding=1, groups=32),
nn.ReLU(),
nn.Conv2d(32, 64, 1),
nn.ReLU()
)
y2 = dw_pw(x)
print(y2.shape) # torch.Size([8,64,128,128])
5. 성능 비교 표
| 기법 | 파라미터 | FLOPs | 장점·단점 |
|---|---|---|---|
| 표준 Conv | \(k^2CI CO\) | \(k^2CI CO HW\) | 단순·강력·비용 높음 |
| Depthwise Sep | \(k^2CI + CI CO\) | \(k^2CI HW + CI CO HW\) | 경량·속도↑·표현력↓ |
| Group Conv | \(\frac{k^2CI CO}{G}\) | \(\frac{k^2CI CO HW}{G}\) | 유연·중간 성능·구현 복잡 |
6. 결론 및 실험 과제
- 다양한 receptive field 구성(딜레이션 포함) 실험
- Depthwise vs 표준 Conv accuracy·speed 비교
- 그룹 수 \(G\) 변화에 따른 성능 분석
참고 문헌
- Howard, A. et al. (2017). MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. arXiv.
- Zhang, X. et al. (2018). MobileNetV2. CVPR.
- Ioffe, S. & Szegedy, C. (2015). Batch Normalization. ICML.
'AI > Deep learning 을 위한 지식' 카테고리의 다른 글
| Self‑Attention 심층 분석: 수식·구현·튜닝 (0) | 2025.04.18 |
|---|---|
| Self‑Supervised Learning(SSL) 심층 가이드: Contrastive vs Generative (0) | 2025.04.18 |
| 배치 정규화(Batch Normalization) 심층 분석: 수학적 유도부터 구현·튜닝까지 (0) | 2025.04.18 |
| GPU 메모리·연산 효율 최적화 완전 가이드 (0) | 2025.04.18 |
| 전이 학습(Transfer Learning) 심층 가이드: 이론부터 도메인 적응까지 (0) | 2025.04.18 |