5. CNN 6강 - CNN 아키텍처와 학습 기법
해설글
작성 · 5분 읽기 · 조회수 —
들어가며
이번 강의는 지금까지 배운 Conv, Pooling, Activation을 조합해서 실제로 어떤 구조(아키텍처)를 만들었는지 배우는 시간이었다. VGGNet, ResNet 같은 유명한 모델들이 왜 그런 구조를 가지게 됐는지 맥락을 알게 되니까, 논문을 읽을 때 “아 이래서 이렇게 설계했구나”가 되기 시작했다.
처음엔 아키텍처라는 게 그냥 레이어를 더 많이 쌓은 것 정도로 생각했는데, 알고 보니 하나하나가 당시 풀리지 않던 문제에 대한 해법이었다. 그 흐름을 따라가며 정리해본다.
이번 강의의 한 줄 요약: CNN 아키텍처의 발전은 곧 “어떤 문제가 있었고, 그걸 어떻게 해결했는가”의 역사다.
CNN의 구성 요소 정리
CNN은 다음 요소들로 이루어진다.
| 구성 요소 | 역할 |
|---|---|
| Convolution Layers | 특징 추출 |
| Pooling Layers | 다운샘플링 |
| Fully-Connected Layers | 최종 분류 |
| Normalization Layers | 학습 안정화 |
| Dropout | 과적합 방지 |
| Activation Functions | 비선형성 |
이 중에서 이번 강의에서 새로 배운 것들을 정리한다.
Normalization
데이터를 평균=0, 표준편차=1로 정규화하는 과정이다. 정규화 후에 학습 가능한 감마(γ)와 베타(β) 값으로 위치가 조정되며, 이 값은 Back Propagation으로 학습된다.
종류별 차이 — 결국은 “축”의 문제
종류가 여러 개인데, 차이를 이해하는 게 은근 어려웠다.
| 종류 | 정규화 기준 |
|---|---|
| Batch Norm (BN) | 하나의 채널에 대해 미니배치 단위(여러 이미지)로 정규화 |
| Layer Norm (LN) | 하나의 이미지에 대해 여러 채널에 대해 정규화 |
| Instance Norm | 한 이미지의 한 채널만 정규화 |
| Group Norm | 한 이미지의 채널을 그룹으로 묶어서 정규화 |
처음에는 “왜 이렇게 종류가 많지?”라고 생각했는데, 핵심은 하나였다.
정규화 종류의 차이는 결국 어떤 축을 기준으로 평균과 분산을 구하느냐의 차이일 뿐이다. BN은 배치 축, LN은 채널 축. 데이터 특성과 모델 구조에 따라 맞는 걸 고른다.
Dropout
모델의 일부 노드 출력값을 0으로 만들어서 일반화 성능을 높이는 기법이다. 과적합 방지와 중복 특징 추출 방지에 효과가 있다.
여기서 중요한 건, 단순히 노드를 끄는 것이 아니라는 점이다.
Dropout된 노드와 연결된 모든 역방향 경로도 BP 계산에서 제외된다. 노드를 끄는 데서 그치는 게 아니라 그래디언트 흐름 자체가 차단된다.
활성화 함수 다시 정리
| 함수 | 특징 |
|---|---|
| sigmoid | 깊은 레이어에서 반복 사용하면 기울기가 0에 수렴 → Vanishing Gradient |
| ReLU | 비선형성 확보 + 미분이 쉬움 + gradient vanishing 없음 |
| GeLU | $x=0$ 에서 미분 가능성 확보, 트랜스포머에서 많이 쓰임 |
VGGNet — 작은 필터의 힘
핵심 아이디어
VGGNet의 핵심 아이디어는 이거다.
3x3 conv를 3번 쌓으면, 7x7 conv 1번과 같은 receptive field를 얻는다.
파라미터 수 비교
그런데 파라미터 수를 비교하면 차이가 극적이다.
| 구성 | 파라미터 수 |
|---|---|
| 7×7 필터 1개 | $7 \times 7 \times C^2 = 49C^2$ |
| 3×3 필터 3개 | $3 \times (3 \times 3 \times C^2) = 27C^2$ |
같은 수용 영역인데 파라미터가 거의 절반이다! 게다가 중간중간 ReLU가 들어가니까 비선형성도 더 확보된다.
이 "작은 필터를 여러 번 쌓는 게 큰 필터 하나보다 좋다"는 원리가 이후 대부분의 CNN 아키텍처 설계 철학이 됐다.
ResNet — Skip Connection의 혁신
여기가 이번 강의에서 가장 인상적이었다.
깊게 쌓으면 오히려 나빠진다
네트워크를 깊게 쌓으면 성능이 계속 올라갈 것 같지만, 실제로는 일정 깊이 이상에서 훈련 정확도가 오히려 떨어진다. 이건 과적합이 아니다 (훈련 정확도도 낮으니까). 깊은 네트워크에서 최적화 자체가 어렵기 때문이다.
해결책 — 잔차를 학습하라
ResNet의 해결책은 Skip Connection이다. 한 블록의 출력을 $F(x) + x$로 만든다. 즉 입력 $x$를 그대로 출력에 더해준다.
왜 이게 효과적인지 처음에 이해가 안 됐는데, 이렇게 생각하니 납득이 갔다.
- 기존 구조: 블록이 $H(x)$를 직접 학습해야 함
- ResNet: 블록은 $F(x) = H(x) - x$, 즉 "입력 대비 얼마나 변해야 하는지(잔차)"만 학습
- 아무것도 변하지 않아도 되는 레이어에서는 $F(x) = 0$만 학습하면 됨
- gradient도 skip connection을 통해 직접 흘러갈 수 있어서 vanishing 문제가 완화됨
이 간단한 아이디어 하나로 100개 이상의 레이어를 가진 네트워크가 가능해졌다.
Weight Initialization
가중치 초기값에 따라 모델 성능이 크게 달라진다. Kaiming Initialization이 현재 가장 많이 쓰이는데, 입력 차원 크기의 제곱근 2로 값을 초기화하는 방법이다.
초기화를 대충 하면 아무리 좋은 아키텍처도 학습이 안 된다. 이게 생각보다 치명적이라는 걸 이번에 알았다.
Data Preprocessing & Augmentation
전처리
이미지 정규화를 채널별로 수행한다. 각 픽셀에서 해당 채널의 평균을 빼고 표준편차로 나눈다. 모델이 색상 편향 없이 학습하도록 하는 기본 단계다.
증강
제한된 데이터로도 일반화 성능을 높이는 실용적인 방법이다.
| 기법 | 설명 |
|---|---|
| 수평 뒤집기 | 좌우 반전 |
| 크기 조정 및 자르기 | 스케일·위치 변형 |
| 색상 변경 | 밝기·채도 등 조정 |
| 잘라내기 (Cutout) | 이미지 일부 영역 제거 |
Transfer Learning
데이터가 모델 규모에 비해 작을 때 쓰는 핵심 기법이다. ImageNet 같은 대규모 데이터로 학습된 모델의 마지막 헤더 부분만 재학습하고, 나머지 가중치는 frozen(동결)시킨다.
왜 이게 되나
이게 되는 이유는 모델의 앞쪽은 일반적인 특징(가로선, 세로선, 텍스처)을 잡아내고, 뒤로 갈수록 데이터셋에 특화된 특징을 잡아내기 때문이다.
앞쪽은 이미 잘 학습되어 있으니 그대로 쓰고, 뒤쪽만 내 데이터에 맞게 바꾸면 된다.
실무에서 가장 많이 활용되는 학습 전략 중 하나라고 한다.
Hyperparameter 튜닝 전략
체계적인 점검 순서는 다음과 같다.
- 학습 손실이 0에 가까워지는지 확인
- 작은 샘플에 대해 과적합되는지 확인 (과적합도 못하면 모델 자체에 문제)
- 적절한 Learning Rate 찾기
- train/val 정확도 그래프를 동시에 확인
헷갈리기 쉬운 포인트
1. “Batch Norm과 Layer Norm 중 뭘 써야 하나?”
CNN에서는 Batch Norm이 표준이고, 트랜스포머에서는 Layer Norm을 쓴다. BN은 배치 크기가 작으면 통계량이 불안정해지는 문제가 있어서, 배치 크기가 제한적인 상황에서는 Group Norm을 쓰기도 한다.
2. “ResNet의 skip connection이 gradient 흐름을 어떻게 돕는지?”
$H(x) = F(x) + x$에서 미분하면 이렇게 된다.
\[\frac{\partial H}{\partial x} = \frac{\partial F}{\partial x} + 1\]+1 덕분에 gradient가 최소 1은 보장된다. $F(x)$의 gradient가 아무리 작아져도 skip connection의 1이 있어서 gradient가 사라지지 않는다.
3. “Transfer Learning에서 어디까지 동결하고 어디부터 학습해야 하나?”
데이터가 매우 적으면 마지막 FC layer만 학습하고, 데이터가 어느 정도 있으면 뒤쪽 몇 개 레이어까지 fine-tuning한다. 데이터가 충분하면 전체를 학습하되, pretrained 가중치로 시작한다.
정리하며
이번 강의에서 가장 크게 느낀 건, CNN 아키텍처의 발전이 “어떤 문제가 있었고, 그걸 어떻게 해결했는가”의 역사라는 것이다.
VGGNet은 “큰 필터 대신 작은 필터를 쌓자”, ResNet은 “깊어지면 최적화가 안 되니까 skip connection을 넣자”.
이런 맥락을 알면 새로운 아키텍처가 나왔을 때도 “어떤 문제를 해결하려는 건지”를 먼저 생각하게 되는 것 같다.