Deep Learning/cs231n

cs231n Lecture 9 - CNN Architectures

준성(JunSeong) 2026. 6. 22. 13:18

 

Stanford cs231n: Deep Learning for Computer Vision 강의 정리 시리즈
챕터 9 - CNN Architectures
강의 링크: YouTube

#cs231n #딥러닝 #CNN #컴퓨터비전 #AlexNet #VGGNet #GoogLeNet #ResNet

•   •   •

1. ILSVRC라는 무대

CNN 아키텍처의 역사를 이야기할 때 빠질 수 없는 게 바로 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)다. 2010년부터 시작된 이 대회는 120만 장의 이미지를 1000개 클래스로 분류하는 과제를 해마다 내놨고, 여기서 우승한 모델들이 곧 그 시대 최고의 CNN 아키텍처라는 뜻이었다.

이 강의에서는 그 우승 계보를 따라가면서 아키텍처 설계가 어떻게 진화했는지를 살펴본다. 레이어를 어떻게 쌓을지, 필터 크기는 어떻게 고를지, 파라미터를 줄이면서도 성능은 높일 수 있는지 - 각 모델이 이 질문들에 어떤 답을 냈는지가 이 강의의 핵심이다.

ILSVRC winners over the years

▲ 연도별 ILSVRC 우승 모델과 top-5 error rate 추이 (출처: cs231n Lecture 9)

•   •   •

2. LeNet-5: CNN의 원형

1998년, Yann LeCun이 발표한 LeNet-5는 사실상 현대 CNN의 조상이다. 구조 자체는 단순하다. [CONV - POOL - CONV - POOL - FC - FC] 순으로 이어지고, 5×5 필터를 stride 1로, 풀링은 2×2 stride 2로 적용한다. 손으로 쓴 숫자(MNIST)나 우편 번호 인식 같은 작은 task에 성공적으로 쓰였다.

지금 기준으로 보면 아주 얕은 네트워크지만, 컨볼루션으로 공간 정보를 보존하고 풀링으로 차원을 줄이는 기본 패턴은 오늘날까지 그대로 이어진다. 이후 모든 CNN이 이 설계 철학에서 출발했다고 봐도 과언이 아니다.

•   •   •

3. AlexNet: 딥러닝의 빅뱅

2012년이 딥러닝 역사에서 특별한 이유가 있다. 그 해 Krizhevsky, Sutskever, Hinton이 AlexNet을 들고 ILSVRC에 나타났고, top-5 error rate 16.4%를 기록하며 2위를 26%대로 가볍게 제쳤다. 10%p 이상 차이가 난 건 경쟁자들이 전통적인 머신러닝 기법을 쓰고 있었기 때문이다. 이 사건 이후로 ImageNet 대회는 CNN의 각축장이 됐다.

구조

AlexNet의 입력은 227×227×3이다(원 논문은 224라고 써놨지만 실제 계산 맞추면 227이 맞다). 전체 구조는 이렇다:

CONV1(96개 11×11 필터, stride 4) → MAX POOL1 → NORM1 → CONV2(256개 5×5) → MAX POOL2 → NORM2 → CONV3(384개 3×3) → CONV4(384개 3×3) → CONV5(256개 3×3) → MAX POOL3 → FC6(4096) → FC7(4096) → FC8(1000)

총 파라미터 수는 약 6천만 개다. 당시 GPU 메모리(GTX 580, 3GB)가 부족해서 두 GPU에 나눠 학습했고, 중간중간 GPU 간 통신이 일어나는 특이한 구조였다.

AlexNet architecture

▲ AlexNet 구조 (출처: cs231n Lecture 9)

AlexNet이 도입한 것들

단순히 LeNet보다 크게 만든 게 아니라, 몇 가지 핵심 기술이 함께 들어왔다. 활성화 함수로 ReLU를 써서 sigmoid보다 훨씬 빠른 학습 속도를 얻었고, 데이터 증강(flipping, cropping, color jitter)과 Dropout(FC 레이어에 p=0.5)으로 과적합을 막았다. 여기에 Local Response Normalization(LRN)이라는 정규화 기법도 들어갔는데, 이건 이후 모델들에서 거의 쓰이지 않게 됐다.

AlexNet이 중요한 이유는 성능 그 자체보다, 깊은 CNN이 대규모 이미지 분류에 통한다는 걸 처음 증명했다는 데 있다. 이후 수년간 거의 모든 CNN 연구가 AlexNet을 베이스라인으로 삼았다.

•   •   •

4. ZFNet: AlexNet을 해부하다

2013년 ILSVRC 우승은 Zeiler와 Fergus의 ZFNet이 가져갔다. 새로운 아이디어라기보다는 AlexNet을 더 잘 이해하고 튜닝한 모델이라고 보면 된다. 이들이 기여한 진짜 공헌은 Deconvolution 시각화였다.

CNN의 각 레이어가 실제로 무엇을 학습하는지 역방향으로 추적해서 시각화하는 방법을 개발했는데, 이게 당시엔 꽤 신선한 접근이었다. AlexNet의 첫 번째 레이어가 너무 큰 필터(11×11 stride 4)를 쓰고 있어서 aliasing 문제가 있다는 걸 발견하고, 이를 7×7 stride 2로 바꿨다. CONV3, 4, 5의 필터 수도 늘렸다.

아키텍처 혁신보다는 CNN 해석 가능성 연구의 시작점이라는 의의가 크다.

ZFNet architecture

▲ ZFNet 구조. 첫 레이어 필터를 11×11 stride 4에서 7×7 stride 2로 바꾸고 CONV3~5 필터 수를 늘렸다 (출처: cs231n Lecture 9)

•   •   •

5. VGGNet: 깊이만이 답이다

2014년 Oxford의 VGG 팀이 내놓은 VGGNet은 하나의 설계 원칙을 극단까지 밀어붙인 모델이다. 핵심 메시지는 단순하다: 필터는 항상 3×3, 깊이는 최대한 깊게.

왜 3×3인가

3×3 필터를 stride 1로 세 번 쌓으면 7×7 필터 한 번과 동일한 수용 영역(receptive field)을 갖는다. 그런데 파라미터 수가 다르다. 채널 수를 C라고 하면:

$$ 3 \times (3^2 C^2) = 27C^2 \quad \text{vs} \quad 7^2 C^2 = 49C^2 $$

3×3 세 번이 파라미터가 더 적다. 게다가 중간마다 ReLU가 들어가니 비선형성도 늘어난다. 더 적은 파라미터로 더 깊고 표현력 있는 네트워크를 만들 수 있다는 거다.

구조

대표적인 VGG-16의 구조는 [conv3-64] × 2 → POOL → [conv3-128] × 2 → POOL → [conv3-256] × 3 → POOL → [conv3-512] × 3 → POOL → [conv3-512] × 3 → POOL → FC-4096 → FC-4096 → FC-1000 순이다. 총 16개의 weight 레이어(13 CONV + 3 FC)로 이루어져 있다.

총 파라미터는 약 1억 3800만 개. AlexNet의 두 배가 넘는다. FC 레이어 세 개가 파라미터의 대부분(약 1억 2200만 개)을 차지한다는 게 큰 문제였다. 이미지 한 장 forward pass에 96MB 메모리가 필요할 정도였다.

VGGNet architecture

▲ VGG-16 구조. 3×3 필터를 일관되게 쌓은 단순하고 규칙적인 패턴이 특징이다 (출처: cs231n Lecture 9)

VGGNet은 ILSVRC 2014에서 GoogLeNet에 밀려 2위를 했지만, 구조가 단순하고 이해하기 쉬워서 이후 transfer learning의 기본 backbone으로 엄청나게 많이 쓰였다. 지금도 특징 추출기로 쓰이는 경우가 많다.

•   •   •

6. GoogLeNet: 효율적으로 깊게

같은 해 2014년 ILSVRC 우승은 Google의 GoogLeNet이 가져갔다. 22개 레이어 깊이에 top-5 error 6.67%를 달성했는데, 흥미로운 건 파라미터가 고작 500만 개 수준이라는 거다. VGGNet의 1억 3천만 개와 비교하면 약 27배 적다. 어떻게 이게 가능했을까.

Inception 모듈

GoogLeNet overview and Inception module

▲ GoogLeNet 전체 구조(오른쪽)와 Inception 모듈 다이어그램. 같은 모듈을 반복 쌓아 22개 레이어를 구성했다 (출처: cs231n Lecture 9)

GoogLeNet의 핵심 아이디어는 Inception 모듈이다. 하나의 레이어 안에서 1×1, 3×3, 5×5 컨볼루션과 3×3 max pooling을 병렬로 수행한 뒤 그 결과를 채널 방향으로 합쳐(concatenate) 내보낸다. 서로 다른 크기의 수용 영역에서 특징을 동시에 뽑겠다는 발상이다.

Naive inception module

▲ Naive Inception 모듈. 다양한 크기의 필터를 병렬로 적용한 뒤 concatenate한다 (출처: cs231n Lecture 9)

문제는 연산량이다. 28×28×256 입력에 naive inception을 그대로 적용하면 1×1(128개), 3×3(192개), 5×5(96개), 3×3 pool(256개) 결과를 합쳐 28×28×672의 출력이 나오는데, 이 과정에서 5×5 conv 하나에만 854M 번의 연산이 들어간다. 이걸 22번 쌓으면 감당이 안 된다.

1×1 컨볼루션과 보틀넥

1x1 convolution dimension reduction

▲ 1×1 conv: 공간 크기(H, W)는 유지하면서 채널(depth)만 줄인다. 56×56×64 → 56×56×32 (출처: cs231n Lecture 9)

해결책은 1×1 컨볼루션이다. 공간 크기(H, W)는 그대로 두면서 채널 수만 줄이는 연산이다. 예를 들어 256채널 입력에 32개의 1×1 필터를 적용하면 256→32로 채널이 줄어든다. 이걸 각 conv 앞에 끼워넣으면 된다.

Inception module with bottleneck

▲ 보틀넥 레이어가 추가된 Inception 모듈. 1×1 conv로 채널을 먼저 줄인 뒤 3×3, 5×5를 적용한다 (출처: cs231n Lecture 9)

이렇게 하면 같은 5×5 conv에서 연산량이 854M에서 358M으로 절반 이하로 준다. 공간 정보는 그대로 보존하면서 채널 방향으로만 압축하는 셈이다. 이 1×1 conv가 들어간 자리를 보틀넥 레이어(bottleneck layer)라고 부른다.

여기서 1×1 컨볼루션의 역할이 흥미롭다. 단순히 차원을 줄이는 것뿐만 아니라, 여러 채널에 걸친 선형 조합을 학습하는 역할도 한다. 입력 feature map들 사이의 관계를 포착한 뒤 압축하는 것과 비슷하다.

나머지 특징들

GoogLeNet은 마지막에 FC 레이어 대신 Global Average Pooling을 쓴다. 7×7 feature map을 공간 방향으로 평균 내서 1×1로 만들어버리는 방식인데, 파라미터가 거의 없다. AlexNet의 FC 레이어 1억 2천만 개와 비교하면 엄청난 절감이다.

그리고 학습 안정성을 위해 네트워크 중간 두 곳에서 보조 분류기(Auxiliary Classifier)를 달았다. gradient가 얕은 레이어까지 잘 전달되도록 돕는 장치인데, 추론 시엔 제거한다.

GoogLeNet auxiliary classifiers

▲ GoogLeNet의 보조 분류기(Auxiliary Classifier). 네트워크 중간 두 지점에서 gradient를 직접 주입한다 (출처: cs231n Lecture 9)

•   •   •

7. ResNet: 깊이의 한계를 허물다

2015년 ILSVRC에서 Microsoft Research의 Kaiming He 팀이 ResNet을 발표했을 때, 사람들은 꽤 놀랐다. top-5 error 3.57%, 152개 레이어. 인간 성능(약 5.1%)을 처음으로 넘어선 모델이었다.

깊이와 degradation 문제

ResNet이 해결하려 한 문제는 이렇다. 이론적으로 레이어가 많을수록 표현력이 높아야 한다. 그런데 실제로 실험해보면 56레이어 네트워크가 20레이어보다 학습 오차가 오히려 높게 나온다. 오버피팅이 아니다 - 학습 자체가 잘 안 되는 것이다. 이걸 degradation 문제라고 한다.

Degradation problem in deep networks

▲ 깊은 네트워크(56-layer)가 얕은 네트워크(20-layer)보다 학습/테스트 오차 모두 높게 나오는 degradation 문제 (출처: cs231n Lecture 9)

왜 이런 일이 생길까. 단순히 레이어를 더 쌓는다는 건 각 레이어가 identity(입력을 그대로 통과)를 학습하면 얕은 네트워크와 동등해질 수 있어야 한다는 뜻이다. 그런데 실제 최적화가 그걸 못 찾는다. gradient가 수많은 레이어를 거치면서 소멸하기 때문이다.

Residual Connection

He 팀의 해결책은 단순하면서도 강력하다. 각 레이어 블록이 입력을 그대로 더하는 shortcut을 만들어주는 것이다.

$$ \mathbf{y} = F(\mathbf{x}, \{W_i\}) + \mathbf{x} $$

기존엔 각 레이어가 \(\mathbf{x} \rightarrow H(\mathbf{x})\) 를 학습했다면, 이제는 잔차(residual) \(F(\mathbf{x}) = H(\mathbf{x}) - \mathbf{x}\) 를 학습하게 만든다. 완전히 새로운 함수를 학습하는 것보다, 이미 들어온 입력에서 얼마나 달라져야 하는지만 학습하는 게 최적화가 훨씬 쉽다.

Residual block diagram

▲ Residual block. 입력 x가 두 conv 레이어를 거친 F(x)에 직접 더해진다 (출처: cs231n Lecture 9)

이 shortcut 덕분에 backpropagation 시에도 gradient가 shortcut 경로를 통해 초기 레이어까지 바로 전달된다. gradient 소멸 문제가 자연스럽게 완화된다. 더하기 연산은 backprop 시 gradient를 그대로 분기시키므로, 최소한 identity만큼의 gradient는 항상 보장된다.

구조와 보틀넥

ResNet의 기본 블록은 CONV-BN-ReLU-CONV-BN으로 이뤄지고, 여기에 shortcut이 더해진 뒤 ReLU를 통과한다. ResNet-50 이상에서는 GoogLeNet처럼 보틀넥 구조도 쓴다. 1×1로 채널 줄이고, 3×3 conv, 다시 1×1로 복원하는 방식이다.

ResNet bottleneck block

▲ ResNet-50+ Bottleneck block. 1×1로 채널 축소 → 3×3 conv → 1×1로 복원. GoogLeNet의 보틀넥과 같은 방식이다 (출처: cs231n Lecture 9)

풀링 대신 stride 2 conv로 해상도를 줄이고, 마지막엔 GoogLeNet처럼 global average pooling 후 FC-1000으로 끝낸다. 배치 정규화(Batch Normalization)를 전 레이어에 적용하고, weight 초기화는 He initialization을 쓴다.

ResNet architectures comparison

▲ ResNet-34(기본 블록)와 ResNet-50(보틀넥 블록) 구조 비교 (출처: cs231n Lecture 9)

결과적으로 ResNet-152는 VGGNet보다 8배 깊지만 연산 복잡도는 비슷하다. 이후 ResNet은 이미지 분류를 넘어 detection, segmentation 등 거의 모든 vision task의 backbone으로 자리 잡았다.

•   •   •

8. 아키텍처 비교

강의에서는 주요 아키텍처를 파라미터 수, 연산량(FLOPs), 메모리, 정확도 기준으로 비교한다. 간단히 정리하면 이렇다.

모델 연도 레이어 파라미터 top-5 error 특징
AlexNet 2012 8 ~60M 16.4% 최초의 대형 CNN, ReLU 도입
ZFNet 2013 8 ~60M 14.8% AlexNet 튜닝, 시각화 기여
VGGNet 2014 16/19 ~138M 7.3% 3×3 필터만, 메모리 많이 씀
GoogLeNet 2014 22 ~5M 6.7% Inception 모듈, 가장 효율적
ResNet 2015 152 ~25M 3.6% Skip connection, 인간 성능 초월

메모리 사용량으로 보면 VGGNet이 가장 무겁고, 연산 효율로 보면 GoogLeNet이 가장 뛰어나다. AlexNet은 파라미터에 비해 메모리를 많이 쓰고 정확도가 낮다. ResNet은 깊이 대비 파라미터 효율이 좋고 정확도도 압도적이다.

Architecture complexity comparison

▲ 주요 아키텍처의 정확도 vs 연산량(operations) vs 파라미터 수 비교 (출처: cs231n Lecture 9)

ResNet 이후의 흐름

ResNet이 깊이 문제를 해결하자, 이후 연구들은 "skip connection 아이디어를 어떻게 더 잘 쓸 수 있을까"라는 질문으로 이어졌다. 강의에서 소개되는 몇 가지 방향을 간단히 짚어본다.

ResNeXt(Xie et al., 2016)는 residual block 내부에 GoogLeNet의 병렬 처리 발상을 가져왔다. 하나의 두꺼운 경로 대신, 같은 구조의 얇은 경로를 여러 개 병렬로 쌓고 결과를 더한다. 이 병렬 경로의 수를 cardinality라고 부르는데, depth나 width를 늘리는 것보다 cardinality를 키우는 게 효율이 더 좋다는 결론을 보여준다.

DenseNet(Huang et al., 2017)은 skip connection을 더 극단까지 밀어붙인다. ResNet이 바로 이전 블록의 출력을 더해줬다면, DenseNet은 이전 모든 레이어의 feature map을 채널 방향으로 concatenate해서 다음 레이어로 넘긴다. 정보 흐름이 최대로 보장되고 gradient 소멸 문제가 더 근본적으로 해결되지만, 채널이 계속 쌓이면서 메모리는 많이 필요하다.

DenseNet Dense Block

▲ DenseNet의 Dense Block. 각 레이어가 이전 모든 레이어의 output을 concat해서 입력으로 받는다 (출처: cs231n Lecture 9)

SqueezeNet(Iandola et al., 2017)은 반대 방향의 문제를 다룬다. AlexNet 수준의 정확도를 파라미터 50배 적게, 모델 크기 0.5MB 이하로 달성하는 걸 목표로 했다. 1×1 conv(squeeze)로 채널을 줄인 뒤 1×1과 3×3 conv를 병렬로 쓰는 Fire module이 핵심이다. 엣지 디바이스나 모바일 배포를 고려한 설계다.

•   •   •

핵심 요약

아키텍처 핵심 기여 한계
LeNet-5 CNN의 기본 패턴 확립 소규모 task에만 적용 가능
AlexNet 대규모 CNN 가능성 증명, ReLU/Dropout 파라미터 과다, 설계 체계성 부족
ZFNet CNN 시각화로 해석 가능성 향상 AlexNet 개선에 그침
VGGNet 3×3 필터 원칙, 전이학습 backbone 파라미터·메모리 매우 많음
GoogLeNet Inception 모듈, 1×1 conv, GAP로 효율화 구조가 복잡해 실험·수정이 어려움
ResNet Skip connection으로 degradation 해결 메모리 사용량이 적지 않음

•   •   •

참고

  • CS231n Lecture 9 슬라이드 (Fei-Fei Li, Justin Johnson, Serena Yeung, 2017)
  • Krizhevsky et al. (2012), ImageNet Classification with Deep Convolutional Neural Networks
  • Simonyan & Zisserman (2014), Very Deep Convolutional Networks for Large-Scale Image Recognition
  • Szegedy et al. (2014), Going Deeper with Convolutions
  • He et al. (2015), Deep Residual Learning for Image Recognition

•   •   •

다음 포스팅은 Lecture 10 - Recurrent Neural Networks입니다.
순환 신경망의 구조, LSTM과 GRU, 그리고 언어 모델과 image captioning까지 다룹니다.