Deep Learning study

컨볼루션 신경망(CNN) 심층 분석: 수식·구현·최신 트릭 본문

AI/Deep learning 을 위한 지식

컨볼루션 신경망(CNN) 심층 분석: 수식·구현·최신 트릭

illinaire 2025. 4. 18. 12:20
반응형
컨볼루션 신경망(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)\)를 다음과 같이 분해:

  1. Depthwise: \(\mathcal{O}(k^2C_{\mathrm{in}}HW)\)
  2. 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 등).

Depthwise Separable Convolution
Depthwise Separable Convolution 구조 (출처: Wikimedia Commons, CC BY-SA 4.0)

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. 결론 및 실험 과제

  1. 다양한 receptive field 구성(딜레이션 포함) 실험
  2. Depthwise vs 표준 Conv accuracy·speed 비교
  3. 그룹 수 \(G\) 변화에 따른 성능 분석

참고 문헌

  1. Howard, A. et al. (2017). MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. arXiv.
  2. Zhang, X. et al. (2018). MobileNetV2. CVPR.
  3. Ioffe, S. & Szegedy, C. (2015). Batch Normalization. ICML.
반응형
Comments