#cs231n #딥러닝 #CNN #컴퓨터비전 #AlexNet #VGGNet #GoogLeNet #ResNet
• • •
1. ILSVRC라는 무대
CNN 아키텍처의 역사를 이야기할 때 빠질 수 없는 게 바로 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)다. 2010년부터 시작된 이 대회는 120만 장의 이미지를 1000개 클래스로 분류하는 과제를 해마다 내놨고, 여기서 우승한 모델들이 곧 그 시대 최고의 CNN 아키텍처라는 뜻이었다.
이 강의에서는 그 우승 계보를 따라가면서 아키텍처 설계가 어떻게 진화했는지를 살펴본다. 레이어를 어떻게 쌓을지, 필터 크기는 어떻게 고를지, 파라미터를 줄이면서도 성능은 높일 수 있는지 - 각 모델이 이 질문들에 어떤 답을 냈는지가 이 강의의 핵심이다.
▲ 연도별 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 구조 (출처: 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 구조. 첫 레이어 필터를 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 메모리가 필요할 정도였다.
▲ 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 전체 구조(오른쪽)와 Inception 모듈 다이어그램. 같은 모듈을 반복 쌓아 22개 레이어를 구성했다 (출처: cs231n Lecture 9)
GoogLeNet의 핵심 아이디어는 Inception 모듈이다. 하나의 레이어 안에서 1×1, 3×3, 5×5 컨볼루션과 3×3 max pooling을 병렬로 수행한 뒤 그 결과를 채널 방향으로 합쳐(concatenate) 내보낸다. 서로 다른 크기의 수용 영역에서 특징을 동시에 뽑겠다는 발상이다.
▲ 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 컨볼루션과 보틀넥
▲ 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 모듈. 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 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 문제라고 한다.
▲ 깊은 네트워크(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. 입력 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-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-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은 깊이 대비 파라미터 효율이 좋고 정확도도 압도적이다.
▲ 주요 아키텍처의 정확도 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. 각 레이어가 이전 모든 레이어의 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까지 다룹니다.