Skip to main content

CNN 아키텍처 — 합성곱 신경망의 진화

CNN은 1998년 LeNet을 시작으로, 2012년 AlexNet의 ImageNet 우승을 계기로 폭발적으로 발전했습니다. 각 아키텍처가 해결한 문제와 도입한 핵심 아이디어를 계보 순으로 살펴봅니다.

핵심 아이디어

CNN 아키텍처의 발전은 하나의 질문에 대한 답을 찾아온 과정입니다: “어떻게 더 깊고 효율적인 네트워크를 학습시킬 수 있는가?”

동작 방식

주요 아키텍처

LeNet-5 (1998)

최초의 실용적 CNN입니다. 필기체 숫자 인식(MNIST)에 사용되었습니다.
  • 구조: Conv → Pool → Conv → Pool → FC → FC → Output
  • 기여: 합성곱 + 풀링의 기본 패턴 정립

AlexNet (2012)

ImageNet 대회에서 top-5 오류율을 26.2%에서 15.3%로 낮추며 딥러닝 시대를 열었습니다.
  • 기여: ReLU 활성화 함수, Dropout, GPU 병렬 학습, 데이터 증강

VGG (2014)

3x3 커널만 사용하여 깊이의 중요성을 증명했습니다. VGG-16(16층), VGG-19(19층).
  • 기여: 작은 커널의 반복이 큰 커널보다 효과적 (3x3 두 번 = 5x5 하나의 수용 영역, 파라미터는 더 적음)

ResNet (2015)

**스킵 연결(Skip Connection)**로 152층까지 깊은 네트워크 학습에 성공했습니다. y=F(x,{Wi})+x\mathbf{y} = \mathcal{F}(\mathbf{x}, \{W_i\}) + \mathbf{x} 네트워크가 입력을 그대로 통과시키는 항등 매핑을 기본으로 하고, 잔차(Residual)만 학습하므로 기울기 소실 문제를 해결합니다.
import torch.nn as nn

class ResidualBlock(nn.Module):
    def __init__(self, channels):
        super().__init__()
        self.conv1 = nn.Conv2d(channels, channels, 3, padding=1)
        self.bn1 = nn.BatchNorm2d(channels)
        self.conv2 = nn.Conv2d(channels, channels, 3, padding=1)
        self.bn2 = nn.BatchNorm2d(channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        identity = x                # 스킵 연결
        out = self.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += identity              # 잔차 + 입력
        return self.relu(out)

EfficientNet (2019)

깊이, 너비, 해상도를 동시에 균형 있게 스케일링하는 Compound Scaling을 제안했습니다.
  • 기여: 더 적은 파라미터로 더 높은 정확도 달성

ConvNeXt (2022)

Transformer의 설계 원칙(큰 커널, LayerNorm, GELU 등)을 CNN에 적용하여 ViT와 동등한 성능을 달성했습니다.
  • 기여: CNN의 현대화, “CNN is not dead” 증명

구현

import torchvision.models as models

# 사전학습 모델 로드
resnet18 = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
efficientnet = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT)
convnext = models.convnext_tiny(weights=models.ConvNeXt_Tiny_Weights.DEFAULT)

# 파라미터 수 비교
for name, model in [('ResNet-18', resnet18), ('EfficientNet-B0', efficientnet), ('ConvNeXt-Tiny', convnext)]:
    params = sum(p.numel() for p in model.parameters()) / 1e6
    print(f"{name}: {params:.1f}M 파라미터")

관련 기술 비교

아키텍처층 수파라미터ImageNet Top-1핵심 기여
AlexNet861M63.3%GPU + ReLU + Dropout
VGG-1616138M74.4%3x3 커널의 깊이
ResNet-505025M80.4%Skip Connection
EfficientNet-B0-5.3M77.1%Compound Scaling
ConvNeXt-T-28M82.1%현대화된 CNN
CNN은 지역적 수용 영역(Receptive Field)에 기반하므로, 이미지의 전역 정보를 포착하기 어렵습니다. Vision Transformer(ViT)는 Self-Attention으로 이 한계를 극복하지만, 더 많은 데이터와 연산이 필요합니다. ConvNeXt는 7x7 큰 커널과 현대적 설계로 이 격차를 좁혔습니다.

참고 논문

논문학회/연도링크
ImageNet Classification with Deep CNNs (Krizhevsky et al.)NeurIPS 2012Paper
Very Deep Convolutional Networks (Simonyan & Zisserman)ICLR 2015arXiv 1409.1556
Deep Residual Learning (He et al.)CVPR 2016arXiv 1512.03385
EfficientNet: Rethinking Model Scaling (Tan & Le)ICML 2019arXiv 1905.11946
A ConvNet for the 2020s (Liu et al.)CVPR 2022arXiv 2201.03545