5. CNN과 공간적 구조¶
이 챕터의 질문¶
이미지처럼 공간적으로 배열된 데이터의 locality를 어떻게 model에 반영할까?
일반 MLP에 이미지를 넣으려면 모든 pixel을 긴 vector로 펼칠 수 있다. 그러면 서로 가까운 pixel이라는 관계가 입력 표현에서 드러나지 않고, 위치마다 별도의 weight가 필요하다. Convolutional Neural Network(CNN)는 가까운 위치에서 반복되는 pattern을 같은 연산으로 찾는 구조를 사용한다. 이것은 이미지가 가진 locality와 translation에 대한 반복성을 model에 넣는 inductive bias다.
CNN은 이미지 전용 암기 항목이 아니다. regular grid 위의 local pattern이 중요한 음성, 시계열, 공간장, 체적 데이터에도 1D 또는 3D convolution을 사용할 수 있다. 이 장에서는 convolution 연산에서 시작해 receptive field, residual block, task별 output으로 이어지는 흐름을 본다.
이 장에서 알아볼 수준¶
핵심 개념¶
- image tensor의 channel, height, width
- convolution kernel, feature map, stride, padding
- locality, parameter sharing, translation equivariance
- receptive field와 hierarchical feature
- pooling, residual block, task head
- data augmentation과 transfer learning
이름과 위치를 알아둘 개념¶
- LeNet, AlexNet, VGG, ResNet
- object detection, semantic segmentation, U-Net
- 1D, 2D, 3D convolution
각 architecture의 layer 수나 연도를 암기하는 것이 목표는 아니다. 어떤 문제를 해결하려고 어떤 구조가 추가되었는지 설명할 수 있으면 된다.
이해에 필요한 항목¶
- matrix와 tensor의 shape
- weighted sum과 matrix multiplication
- 2차원 좌표와 neighborhood
- 2장의 activation과 backpropagation
- 3장의 residual learning과 normalization
Image tensor는 공간 구조를 보존한다¶
색 이미지 한 장은 흔히 height \(H\), width \(W\), color channel \(C\)를 가진 tensor로 표현한다. framework에 따라 shape 순서는 \((C,H,W)\) 또는 \((H,W,C)\)일 수 있다. mini-batch 축 \(N\)이 추가되면 4차원 tensor가 된다.
각 channel은 반드시 사람이 바로 해석할 수 있는 색만 뜻하지 않는다. 첫 입력에서는 RGB channel일 수 있지만 hidden layer의 channel은 model이 학습한 서로 다른 feature map을 나타낸다. shape를 읽을 때 각 축이 sample, channel, spatial coordinate 중 무엇인지 확인해야 한다.
Convolution kernel은 local weighted sum을 반복한다¶
작은 kernel \(K\)를 이미지 \(X\)의 여러 위치에 적용해 output feature map을 만든다. 2차원 단일 channel의 단순한 형태는 다음과 같다.
실제 CNN layer는 여러 input channel에서 값을 모아 여러 output channel을 만들고 bias와 activation을 적용한다. deep learning library에서 "convolution"이라고 부르는 연산은 수학적으로 kernel을 뒤집지 않는 cross-correlation인 경우가 많지만, 학습되는 kernel이라는 관점에서는 보통 같은 이름으로 다룬다.
Kernel이 학습하는 것¶
초기 layer의 kernel은 edge, 방향, local contrast처럼 작은 pattern에 반응할 수 있다. 뒤 layer는 앞 layer의 feature를 다시 조합해 더 넓고 복잡한 pattern을 나타낼 수 있다. 이 설명은 전형적인 직관이지 모든 channel이 사람이 이름 붙일 수 있는 detector가 된다는 보장은 아니다.
Locality와 parameter sharing¶
CNN이 MLP와 다른 핵심 가정은 두 가지다.
- Local connectivity: 한 output은 입력 전체가 아니라 가까운 neighborhood를 먼저 본다.
- Parameter sharing: 같은 kernel weight를 여러 spatial position에 반복해 사용한다.
이 덕분에 이미지 크기에 비례해 위치마다 별도 weight를 두지 않고도 local pattern을 탐지할 수 있다. 또한 왼쪽에서 유용한 edge detector를 오른쪽에도 적용할 수 있다.
이 가정이 언제나 맞는 것은 아니다. 이미지 절대 위치가 핵심이거나 멀리 떨어진 영역의 관계가 처음부터 중요한 문제에서는 convolution만으로 충분하지 않을 수 있다. 깊은 layer, 큰 kernel, dilation, attention 등으로 더 넓은 context를 다루게 된다.
Translation equivariance와 invariance¶
입력을 한 칸 이동했을 때 feature map도 같은 방식으로 이동하는 성질을 translation equivariance라고 한다. 이상적인 convolution은 이 성질을 가진다.
\(T\)가 translation operator라면 입력 변환 뒤 feature도 대응해 변한다는 뜻이다. 반면 translation invariance는 입력 위치가 변해도 최종 출력이 같아지는 성질이다. classification에서 object의 위치와 무관한 class를 원할 때 pooling과 global aggregation이 invariance에 가까운 결과를 만드는 데 도움을 준다.
padding, stride, image boundary, pooling 때문에 실제 network가 완전한 translation equivariance를 항상 유지하는 것은 아니다. equivariance와 invariance를 동의어처럼 쓰지 않는 것이 중요하다.
Stride와 padding이 output shape를 정한다¶
- Stride는 kernel을 몇 pixel씩 이동할지 정한다. stride가 커지면 spatial resolution이 줄어든다.
- Padding은 입력 경계 주변에 값을 추가한다. 적절한 padding으로 stride 1에서 output의 height와 width를 유지할 수 있다.
한 축에서 input size \(n\), kernel size \(k\), padding \(p\), stride \(s\)일 때 dilation을 생략한 output size는 다음과 같다.
공식을 암기하기보다 kernel이 경계 안에 놓일 수 있는 시작 위치 수를 세는 과정으로 이해하면 된다. shape 오류는 CNN 구현에서 흔하므로 각 layer 전후 tensor shape를 확인하는 습관이 중요하다.
padding은 계산 편의만의 문제가 아니다. zero padding은 image 바깥이 0이라는 인공적 경계를 만들며, 작은 image나 boundary-sensitive task에서는 예측에 영향을 줄 수 있다.
Feature map과 channel¶
하나의 learned kernel 집합은 하나의 output channel, 즉 feature map을 만든다. 여러 output channel은 서로 다른 local pattern을 나타낼 수 있다. layer가 깊어지면서 spatial size는 줄고 channel 수는 늘어나는 architecture가 흔하다. 이는 위치별 세부 해상도를 줄이면서 더 다양한 feature type을 표현하는 설계다.
channel 수가 곧 의미 있는 concept 수는 아니다. 정보가 여러 channel에 분산될 수 있고 하나의 channel이 여러 pattern에 반응할 수 있다. feature map visualization은 model을 탐색하는 도구이지 완전한 설명은 아니다.
Receptive field와 계층적 표현¶
한 hidden unit의 receptive field는 그 unit 값에 영향을 줄 수 있는 원 input 영역이다. 3x3 convolution 하나는 가까운 3x3 영역을 보지만, 두 layer를 연속하면 뒤 unit은 앞 feature를 통해 더 넓은 input 영역의 영향을 받는다. depth, kernel, stride, dilation에 따라 receptive field가 커진다.
이 구조는 작은 edge에서 texture와 shape로 점차 feature를 조합한다는 hierarchical representation의 직관을 준다. 그러나 theoretical receptive field 안의 모든 pixel이 같은 영향력을 갖는 것은 아니다. 실제 effective receptive field는 parameter와 activation에 따라 더 좁거나 비대칭일 수 있다.
Pooling과 downsampling¶
pooling은 local 영역을 하나의 값으로 요약한다.
- max pooling은 영역의 최댓값을 선택한다.
- average pooling은 평균을 계산한다.
- global average pooling은 각 channel의 전체 spatial 위치를 평균해 classification head에 연결할 수 있다.
pooling은 resolution과 계산량을 줄이고 작은 위치 변화에 덜 민감한 표현을 만드는 데 도움을 준다. 동시에 정확한 위치 정보를 잃는다. segmentation처럼 dense spatial output이 필요한 task에서는 encoder에서 줄인 resolution을 decoder와 skip connection으로 복원하는 설계가 중요하다.
stride convolution도 learned downsampling 역할을 할 수 있다. pooling이 필수라는 뜻은 아니며 task와 architecture에 따라 선택한다.
깊은 CNN과 residual block¶
network를 깊게 하면 더 넓은 receptive field와 복합적인 transformation을 만들 수 있지만 optimization이 어려워진다. 3장에서 본 residual block은 변환 \(F(x)\)에 입력 \(x\)를 더한다.
ResNet은 residual block을 반복해 매우 깊은 CNN을 안정적으로 학습하는 방향을 보여주었다. input과 output channel 또는 spatial size가 다르면 identity를 그대로 더할 수 없으므로 projection shortcut 같은 변환으로 shape를 맞춘다.
residual connection이 깊이의 모든 문제를 해결하는 것은 아니다. normalization 위치, activation, initialization, downsampling과 compute budget도 함께 설계된다. 핵심은 model이 전체 mapping을 새로 만들기보다 입력에 더할 변화인 residual을 학습하고, direct path로 signal을 전달한다는 점이다.
Architecture의 변화는 어떤 문제를 해결했는가¶
- LeNet은 handwritten digit recognition을 통해 convolution과 subsampling을 결합한 초기 CNN 사례다.
- AlexNet은 큰 labeled image dataset, GPU 계산, ReLU, augmentation 등을 결합해 deep CNN의 가능성을 널리 보여주었다.
- VGG는 작은 3x3 convolution을 반복하는 규칙적인 deep architecture를 제시했다.
- ResNet은 residual learning으로 깊이가 증가할 때의 optimization degradation을 다루었다.
- U-Net은 encoder와 decoder의 같은 resolution feature를 skip connection으로 연결해 biomedical image segmentation의 위치 정보를 복원했다.
이 계보를 "새 모델이 이전 모델을 완전히 폐기했다"고 읽지 않는다. 각 architecture가 사용한 data, compute, objective와 해결하려던 병목을 함께 본다.
Task에 따라 output head가 달라진다¶
Image classification¶
이미지 전체에 하나의 class를 출력한다. convolution backbone이 spatial feature를 만들고 global pooling 또는 flattening 뒤 classifier가 class score를 출력한다. accuracy뿐 아니라 class imbalance, calibration, domain shift를 평가해야 한다.
Object detection¶
이미지 안의 여러 object 위치와 class를 함께 예측한다. bounding box regression, objectness, classification 등 여러 objective가 결합될 수 있다. 단순 image-level label보다 annotation 비용과 평가 방식이 복잡하다.
Semantic segmentation¶
각 pixel의 class를 예측한다. output이 input과 대응하는 spatial grid이므로 downsampling으로 잃은 위치 정보를 복원해야 한다. U-Net의 encoder-decoder와 skip connection은 이 문제를 위한 대표 구조다.
같은 CNN backbone을 사용해도 output과 loss, metric은 task에 따라 달라진다. 1장의 공통 질문을 되돌려 적용해야 한다.
Data augmentation과 transfer learning¶
Data augmentation¶
crop, flip, color change, noise처럼 label 의미를 유지하는 변환으로 train data의 다양성을 늘린다. 적절한 augmentation은 model이 우연한 배경이나 pixel 위치에 과도하게 의존하는 것을 줄일 수 있다. 그러나 medical image의 좌우 방향, microscopy scale, 결정 구조의 chirality처럼 변환이 target 의미를 바꾸는 domain에서는 전문가 검토가 필요하다.
Pretraining과 transfer learning¶
큰 dataset에서 학습된 backbone parameter를 새로운 task의 시작점으로 사용할 수 있다. feature extractor를 고정하거나 일부 또는 전체 layer를 fine-tuning한다. pretraining source와 target domain이 충분히 다르면 transfer가 항상 유리하지 않을 수 있으며, normalization 통계와 image channel 정의도 확인해야 한다.
self-supervised image pretraining은 사람이 붙인 class label 없이 image의 서로 다른 view나 가린 부분에서 training target을 만든다. 이는 1장의 self-supervised learning이 실제 representation learning에 연결되는 사례다.
CNN을 공통 분석 틀로 읽기¶
- 입력과 출력: grid tensor를 받아 image-level, region-level, pixel-level 값을 낸다.
- inductive bias: local connectivity와 shared kernel로 translation-related structure를 반영한다.
- 학습 신호와 objective: class label, bounding box, mask 등에 맞는 loss를 사용한다.
- baseline과 metric: 작은 CNN, pretrained backbone, 전통적 image feature와 비교하고 task별 metric을 사용한다.
- 실패 조건: background shortcut, scale 변화, sensor 변화, adversarial perturbation, OOD image를 확인한다.
- 계산 비용: resolution, channel, layer 수에 따라 memory와 operation이 크게 달라진다.
흔한 혼동과 실패¶
- CNN은 image에만 쓴다고 생각한다: 핵심은 regular grid와 local pattern이며 1D signal과 3D volume에도 적용된다.
- convolution이 자동으로 완전한 invariance를 만든다고 생각한다: convolution은 기본적으로 equivariant한 local operation이며 boundary와 downsampling이 성질에 영향을 준다.
- kernel visualization을 완전한 의미 해석으로 본다: hidden representation은 여러 channel과 layer에 분산될 수 있다.
- deeper model이 항상 더 좋다고 생각한다: optimization, data, regularization, compute와 task 적합성이 함께 필요하다.
- augmentation은 많을수록 좋다고 생각한다: label을 보존하지 않는 변환은 잘못된 training signal을 만든다.
- pretrained score를 그대로 재현할 수 있다고 본다: preprocessing, resolution, weight version, evaluation protocol을 맞춰야 한다.
- random image split만으로 실제 generalization을 평가한다: 같은 환자, 시료, 촬영 조건의 유사 image가 split 사이에 섞이면 leakage가 생길 수 있다.
앞뒤 장과의 연결¶
4장에서는 표현이 무엇을 보존하는지 물었다. CNN은 local grid structure를 반영해 표현 자체를 학습한다. 6장과 7장에서는 순서가 있는 언어 데이터와 멀리 떨어진 token 관계를 다루고, 8장에서는 irregular graph의 neighborhood를 다룬다. U-Net과 Transformer 계열은 10장의 diffusion denoiser에서도 다시 등장한다. 15장의 원자 모델에서는 convolution 대신 graph와 3D geometry에 맞는 message passing을 사용한다.
스스로 확인하기¶
- locality와 parameter sharing은 image를 펼친 MLP와 비교해 어떤 가정을 model에 넣을까?
- translation equivariance와 invariance는 입력이 이동했을 때 출력이 변하는 방식에서 어떻게 다를까?
- image classification과 segmentation은 원하는 output의 spatial structure와 정보 보존 요구가 어떻게 다를까?
더 읽을 자료¶
- LeCun et al., Gradient-Based Learning Applied to Document Recognition, 1998. LeNet과 convolutional recognition의 고전 논문: https://doi.org/10.1109/5.726791
- Krizhevsky, Sutskever, Hinton, ImageNet Classification with Deep Convolutional Neural Networks, 2012. AlexNet 논문: https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks
- Simonyan and Zisserman, Very Deep Convolutional Networks for Large-Scale Image Recognition, 2015. VGG 논문: https://arxiv.org/abs/1409.1556
- He et al., Deep Residual Learning for Image Recognition, 2016. ResNet 논문: https://arxiv.org/abs/1512.03385
- Ronneberger, Fischer, Brox, U-Net: Convolutional Networks for Biomedical Image Segmentation, 2015: https://arxiv.org/abs/1505.04597
- PyTorch, Conv2d 공식 문서, accessed 2026-09-04. input과 output shape, stride, padding의 정의: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html