GPT와 함께 배우는 CNN

이미지 분류를 처음 공부할 때 가장 먼저 부딪히는 질문은 하나다. 왜 일반적인 완전연결 신경망보다 CNN이 이미지에 더 잘 맞는가 하는 점이다. 이 질문에 답하려면 단순히 합성곱 계층이 있다 정도로는 부족하다. 이미지가 어떤 형태의 숫자 데이터로 표현되는지, 필터가 무엇을 학습하는지, 스트라이드와 패딩이 출력 크기에 어떤 영향을 주는지, 그리고 마지막에 왜 평탄화와 선형 계층이 필요한지까지 하나의 흐름으로 이해해야 한다.

CNN은 이미지의 공간 구조를 보존하면서 특징을 추출하도록 설계된 모델이다. 픽셀을 일렬로 펼쳐서 처리하는 방식과 달리, 가까운 픽셀 사이의 관계를 유지한 채 작은 영역을 반복적으로 훑으면서 패턴을 찾는다. 이 구조 덕분에 에지, 질감, 모서리 같은 저수준 특징부터 더 복잡한 형태까지 단계적으로 학습할 수 있다.


1 이미지 데이터를 신경망이 이해하는 방식

이미지는 결국 숫자 배열이다. 흑백 이미지는 보통 하나의 채널을 가지며, 각 위치에는 밝기 값이 들어간다. 컬러 이미지는 보통 RGB 세 개의 채널로 구성되고, 각 채널마다 독립적인 값이 저장된다. 딥러닝 프레임워크에서는 보통 이미지 텐서를 다음과 같은 형태로 다룬다.

[
\text{input shape} = (N, C, H, W)
]

여기서 $N$은 배치 크기, $C$는 채널 수, $H$는 높이, $W$는 너비다. 예를 들어 손글씨 숫자처럼 흑백 28×28 이미지를 한 장만 넣는다면 shape는 다음과 같다.

[
(1, 1, 28, 28)
]

이 표현은 매우 중요하다. 이후 합성곱 계층과 풀링 계층은 모두 이 네 차원 구조를 기준으로 작동하기 때문이다. 초보자가 자주 헷갈리는 부분은 채널과 공간 차원을 뒤섞는 것이다. 특히 PyTorch는 $(N, C, H, W)$ 순서를 기본으로 사용하므로, 이미지 라이브러리에서 자주 보는 $(H, W, C)$ 형식과는 다르다.

shape가 중요한 이유

CNN에서 shape는 단순한 부가 정보가 아니라 연산이 가능한지 결정하는 핵심 조건이다. 예를 들어 첫 번째 합성곱 계층이 입력 채널 수를 1로 기대하고 있는데 실제 입력이 3채널이면 연산 자체가 성립하지 않는다. 또 마지막 완전연결 계층에 들어가기 전 벡터 길이를 잘못 계산하면 선형 계층의 입력 차원과 맞지 않아 오류가 난다.

AI가 추천하는 심화예제

같은 28×28 이미지라도 흑백을 3채널로 복제해 넣으면 첫 번째 합성곱 계층의 in_channels를 어떻게 바꿔야 하는지 직접 실험해보면 좋다. 이 실험은 채널 수가 단순한 장식이 아니라 필터의 구조 자체를 바꾸는 요소라는 점을 이해하는 데 도움이 된다.


2 CNN이 DNN보다 이미지에 유리한 이유

이미지를 완전연결 신경망으로 처리하려면 먼저 2차원 혹은 3차원 구조를 1차원 벡터로 펼쳐야 한다. 예를 들어 28×28 흑백 이미지는 길이 784의 벡터가 된다. 이 벡터를 바로 다음 층과 완전 연결하면, 각 픽셀은 모든 출력 뉴런과 연결된다. 계산량이 커질 뿐 아니라 중요한 문제도 생긴다. 이미지에서 가까운 픽셀끼리의 관계, 즉 공간적 구조가 사라진다.

CNN은 이 문제를 해결하기 위해 세 가지 핵심 아이디어를 사용한다.

지역 수용 영역

필터는 이미지 전체를 한 번에 보지 않고 작은 영역만 본다. 예를 들어 3×3 커널은 한 번에 9개의 픽셀만 사용한다. 덕분에 국소적인 패턴을 먼저 학습할 수 있다.

가중치 공유

같은 필터를 이미지 전체 위치에 반복해서 적용한다. 즉, 왼쪽 위에서 쓰인 가중치와 오른쪽 아래에서 쓰인 가중치가 동일하다. 이것이 가중치 공유다. 같은 패턴이 어디에 나타나든 비슷하게 반응하도록 만들 수 있고, 파라미터 수도 크게 줄어든다.

계층적 특징 추출

초기 계층은 선이나 모서리 같은 단순한 특징을 잡고, 뒤쪽 계층은 이 특징들을 조합해 더 복잡한 패턴을 인식한다. 이 계층적 구조는 이미지처럼 복잡한 데이터를 다루는 데 매우 적합하다.

완전연결 계층의 파라미터 수는 보통 입력 차원과 출력 차원의 곱에 비례한다. 반면 합성곱 계층의 파라미터 수는 커널 크기와 입력 채널, 출력 채널 수에 따라 결정된다. 예를 들어 커널 크기가 3×3이라면, 입력 이미지가 아무리 커져도 하나의 필터가 학습하는 가중치 수는 크게 늘어나지 않는다.


3 합성곱 연산의 본질

합성곱 계층은 입력 위를 작은 필터가 미끄러지듯 이동하면서 국소 패턴을 측정하는 계층이다. 각 위치에서 일어나는 계산은 입력 패치와 커널 사이의 원소별 곱을 더하는 연산이다.

[
y_{i,j} = \sum_{u=0}^{k_h-1}\sum_{v=0}^{k_w-1} x_{i+u,j+v} \cdot w_{u,v} + b
]

여기서 $x$는 입력, $w$는 커널, $b$는 편향, $y_{i,j}$는 출력 특징 맵의 특정 위치 값이다. 커널은 고정된 수식이 아니라 학습을 통해 바뀌는 파라미터다. 따라서 처음에는 의미 없는 값으로 시작하지만, 학습이 진행되면서 특정 패턴에 반응하는 필터로 바뀐다.

편향이 더해지는 이유

합성곱은 단지 가중합만 계산하는 것이 아니다. 각 출력 채널에는 보통 편향이 하나씩 붙는다. 편향은 필터가 입력과 얼마나 잘 맞는지를 이동시키는 역할을 한다. 어떤 필터는 입력이 조금만 맞아도 활성화되도록 만들고, 어떤 필터는 더 강한 증거가 있어야 반응하도록 만들 수 있다.

다채널 입력에서의 합성곱

컬러 이미지는 채널이 3개이므로, 하나의 3×3 필터도 실제로는 $3 \times 3 \times 3$ 구조를 가진다. 즉 각 채널마다 별도의 가중치를 가지고, 채널별 합성곱 결과를 모두 더해 하나의 출력값을 만든다.

[
y_{i,j}^{(m)} = \sum_{c=1}^{C}\sum_{u=0}^{k_h-1}\sum_{v=0}^{k_w-1} x_{c,i+u,j+v} \cdot w_{c,u,v}^{(m)} + b^{(m)}
]

여기서 $m$은 출력 필터 번호다. 출력 채널 수가 32라면, 이런 필터가 32개 있다는 뜻이다.

AI가 추천하는 심화예제

3×3 커널 대신 5×5 커널을 써보고 파라미터 수와 출력 특징의 차이를 비교해보면 좋다. 커널이 커질수록 한 번에 보는 영역은 넓어지지만, 파라미터 수도 증가하고 세부적인 국소 패턴을 구분하는 방식도 달라진다.


4 스트라이드와 패딩이 출력 크기를 결정하는 방식

합성곱 계층을 이해할 때 가장 자주 나오는 실수가 출력 shape 계산이다. 출력 크기는 감으로 정하는 것이 아니라 공식으로 계산된다.

[
H_{out} = \left\lfloor \frac{H_{in} + 2P - K}{S} \right\rfloor + 1
]

[
W_{out} = \left\lfloor \frac{W_{in} + 2P - K}{S} \right\rfloor + 1
]

여기서 $H_{in}, W_{in}$은 입력 높이와 너비, $K$는 커널 크기, $P$는 패딩, $S$는 스트라이드다.

스트라이드

스트라이드는 필터가 한 번 이동할 때 몇 칸씩 움직일지를 의미한다. 스트라이드가 1이면 모든 위치를 세밀하게 본다. 스트라이드가 2면 한 칸 건너뛰며 이동하므로 출력 크기가 줄고 계산량도 감소한다. 대신 세부 정보 일부를 놓칠 수 있다.

패딩

패딩은 입력 가장자리에 값을 덧붙여 경계 정보를 더 오래 보존하는 방법이다. 가장 흔한 것은 0으로 둘러싸는 제로 패딩이다. 패딩이 없으면 합성곱을 거칠수록 공간 크기가 계속 줄어든다. 패딩을 적절히 주면 입력 크기를 유지하는 것도 가능하다.

예를 들어 28×28 입력에 3×3 커널, 스트라이드 1, same 패딩을 적용하면 출력도 28×28이 된다. same 패딩은 출력의 공간 크기를 입력과 같게 맞추도록 패딩을 자동으로 조정하는 방식이다.

왜 경계 정보가 중요한가

이미지의 중요한 특징이 항상 중앙에만 있는 것은 아니다. 숫자 1의 세로획, 물체의 외곽선, 얼굴 윤곽처럼 경계 부근에도 유의미한 정보가 많다. 패딩이 없으면 이런 정보는 초기 층에서 빠르게 사라질 수 있다.


5 풀링이 하는 일

풀링은 특징 맵의 공간 크기를 줄이는 연산이다. 가장 대표적인 방식은 최대 풀링이다. 예를 들어 2×2 최대 풀링은 2×2 영역에서 가장 큰 값 하나만 남긴다.

[
y_{i,j} = \max_{(u,v) \in \mathcal{R}{i,j}} x{u,v}
]

여기서 $\mathcal{R}_{i,j}$는 특정 풀링 영역이다. 이 연산은 단순해 보이지만 중요한 의미가 있다. 첫째, 공간 크기를 줄여 계산량과 메모리 사용량을 줄인다. 둘째, 가장 강한 반응만 남기므로 특징의 존재 여부를 더 강조한다. 셋째, 입력 위치가 약간 달라져도 비슷한 출력을 만들 수 있어 위치 변화에 조금 더 강해진다.

최대 풀링과 평균 풀링의 차이

최대 풀링은 가장 강한 특징을 선택한다. 평균 풀링은 영역 전체의 평균을 계산한다. 일반적으로 에지나 패턴의 존재를 강조하고 싶을 때는 최대 풀링이 자주 쓰이고, 전체적인 분포를 부드럽게 요약하고 싶을 때는 평균 풀링이 쓰인다.

AI가 추천하는 심화예제

같은 합성곱 출력을 대상으로 최대 풀링과 평균 풀링을 각각 적용해보고, 숫자 이미지에서 어떤 방식이 더 날카로운 특징을 남기는지 비교해보면 좋다. 시각화까지 해보면 차이가 훨씬 명확해진다.


6 실제 레이어 흐름으로 보는 CNN 구조

이제 CNN의 개념을 실제 텐서 흐름으로 연결해보자. 입력은 28×28 흑백 이미지 한 장이다.

[
(1, 1, 28, 28)
]

이 입력은 다음과 같은 순서로 처리된다.

  1. 첫 번째 합성곱 계층
  2. 첫 번째 최대 풀링
  3. 두 번째 합성곱 계층
  4. 두 번째 최대 풀링
  5. 평탄화
  6. 드롭아웃과 선형 계층
  7. 10개 클래스 출력

이 구조는 가장 기본적인 CNN 분류기 형태다. 앞부분은 특징 추출기 역할을 하고, 뒷부분은 추출된 특징을 사용해 최종 클래스를 예측하는 분류기 역할을 한다.

첫 번째 합성곱 계층

첫 번째 계층은 입력 채널 1개를 받아 출력 채널 32개를 만든다. 커널 크기는 3×3이고, same 패딩을 사용한다. 따라서 공간 크기는 유지되고 채널 수만 늘어난다.

[
(1, 1, 28, 28) \rightarrow (1, 32, 28, 28)
]

이 계층의 파라미터 수는 다음과 같다.

[
32 \times (1 \times 3 \times 3) + 32 = 320
]

앞의 32는 필터 개수, $1 \times 3 \times 3$은 필터 하나의 가중치 수, 마지막 32는 각 필터의 편향이다.

합성곱 뒤에는 ReLU가 붙는다. ReLU는 다음과 같은 비선형 활성화 함수다.

[
\text{ReLU}(x) = \max(0, x)
]

비선형성이 없으면 여러 층을 쌓아도 결국 하나의 선형 변환과 다를 바 없어지기 때문에, ReLU는 CNN이 복잡한 패턴을 학습할 수 있게 해주는 핵심 요소다.

첫 번째 풀링 계층

2×2 최대 풀링을 적용하면 공간 크기가 절반으로 줄어든다.

[
(1, 32, 28, 28) \rightarrow (1, 32, 14, 14)
]

채널 수는 변하지 않고 높이와 너비만 감소한다.

두 번째 합성곱 계층

이번에는 입력 채널 32개를 받아 출력 채널 64개를 만든다. 역시 3×3 커널과 same 패딩을 사용하므로 공간 크기는 유지된다.

[
(1, 32, 14, 14) \rightarrow (1, 64, 14, 14)
]

파라미터 수는 다음과 같다.

[
64 \times (32 \times 3 \times 3) + 64 = 18496
]

첫 번째 계층보다 훨씬 커졌다. 그 이유는 출력 채널뿐 아니라 입력 채널 수까지 함께 늘었기 때문이다. 합성곱 계층의 비용은 단순히 커널 크기만이 아니라 채널 수에도 크게 좌우된다.

두 번째 풀링 계층

다시 2×2 최대 풀링을 적용하면 다음과 같이 줄어든다.

[
(1, 64, 14, 14) \rightarrow (1, 64, 7, 7)
]

이 시점에서 하나의 이미지는 64개의 특징 맵으로 표현되고, 각 특징 맵의 크기는 7×7이다.


7 평탄화와 완전연결 계층이 필요한 이유

합성곱과 풀링 계층은 공간 구조를 가진 텐서를 다룬다. 하지만 최종 분류는 보통 클래스 개수만큼의 점수를 출력해야 하므로, 마지막에는 이 텐서를 하나의 벡터로 바꿔야 한다. 이 과정이 평탄화다.

[
(1, 64, 7, 7) \rightarrow (1, 3136)
]

여기서 3136은 다음 계산에서 나온다.

[
64 \times 7 \times 7 = 3136
]

이 벡터는 완전연결 계층으로 들어가 10개 클래스에 대한 점수로 변환된다.

[
(1, 3136) \rightarrow (1, 10)
]

선형 계층의 계산식은 다음과 같다.

[
z = Wx + b
]

여기서 $x \in \mathbb{R}^{3136}$, $W \in \mathbb{R}^{10 \times 3136}$, $b \in \mathbb{R}^{10}$이다. 출력 $z$는 보통 각 클래스의 로짓이라고 부른다. 아직 확률은 아니며, 소프트맥스를 거치면 확률로 해석할 수 있다.

[
p_i = \frac{e^{z_i}}{\sum_{j=1}^{10} e^{z_j}}
]

드롭아웃을 넣는 이유

완전연결 계층 앞에는 드롭아웃 0.5가 들어간다. 드롭아웃은 학습 중 일부 뉴런을 무작위로 꺼서 특정 특징에 과도하게 의존하는 현상을 줄인다. 0.5는 절반 정도를 비활성화한다는 뜻이다. 추론 시에는 드롭아웃이 꺼지고 전체 뉴런을 사용한다.

드롭아웃은 파라미터를 추가하지 않지만, 일반화 성능을 높이는 데 자주 사용된다. 특히 완전연결 계층은 파라미터 수가 많아 과적합 위험이 상대적으로 크므로, 드롭아웃과 궁합이 잘 맞는다.

선형 계층의 파라미터 수

마지막 선형 계층의 파라미터 수는 다음과 같다.

[
3136 \times 10 + 10 = 31370
]

오히려 이 간단한 구조에서는 마지막 선형 계층이 가장 많은 파라미터를 가진다. CNN이라고 해서 항상 합성곱 계층이 가장 무거운 것은 아니라는 점도 중요한 관찰이다.

AI가 추천하는 심화예제

평탄화 대신 Global Average Pooling을 써서 분류기를 구성해보면 좋다. 이 방법은 공간 차원을 평균으로 줄여 파라미터 수를 크게 줄일 수 있으며, 최근 CNN 구조에서는 자주 등장하는 설계 방식이다.


8 학습 코드가 없더라도 이해해야 하는 핵심 디테일

이 구조는 주로 CNN의 순전파 흐름을 설명하는 데 집중하고 있다. 하지만 실제 학습으로 이어질 때 꼭 알아야 할 디테일이 몇 가지 있다.

dtype과 텐서 값의 의미

예제에서는 입력 텐서를 단순히 생성해 shape만 확인하지만, 실제 학습에서는 보통 실수형 텐서를 사용한다. 이미지가 원래 0에서 255 사이 정수값을 갖더라도, 모델에는 대개 float32로 변환한 뒤 정규화해서 넣는다. 그래야 경사하강법이 안정적으로 동작한다.

왜 출력이 확률이 아닌 점수인가

마지막 선형 계층의 출력은 확률이 아니라 로짓이다. 학습 시 다중분류 문제라면 보통 Cross Entropy Loss를 사용한다. 이 손실 함수는 내부적으로 softmax와 negative log likelihood를 함께 처리하므로, 출력층에 softmax를 미리 붙이지 않는 경우가 많다.

[
\mathcal{L} = -\log \frac{e^{z_y}}{\sum_{j} e^{z_j}}
]

여기서 $z_y$는 정답 클래스의 로짓이다.

역전파에서 shape가 중요한 이유

순전파에서는 shape가 맞기만 하면 계산이 진행되지만, 역전파에서는 각 파라미터의 gradient도 정확히 대응되어야 한다. 예를 들어 평탄화 이전 shape를 잘못 가정하면 선형 계층 입력 차원이 틀어지고, 결과적으로 모델 정의 자체가 잘못된다.

ReLU를 두는 위치

합성곱 직후 ReLU를 배치하는 것은 매우 일반적이다. 먼저 합성곱으로 선형 변환을 만들고, 그다음 비선형성을 부여하는 흐름이 가장 직관적이고 안정적이기 때문이다. 만약 활성화 함수가 없다면 두 개의 합성곱 층을 연달아 쌓아도 결국 하나의 큰 선형 연산과 크게 다르지 않다.


9 DNN과 CNN의 차이를 파라미터 관점에서 다시 보기

CNN의 장점은 단지 성능이 좋다는 인상적인 문장으로 끝나지 않는다. 구조적으로 왜 효율적인지를 파라미터 수 관점에서 다시 보면 더 분명해진다.

완전연결 방식은 입력의 각 위치마다 별도의 가중치를 둔다. 즉, 같은 선 패턴이 이미지 왼쪽 위에 있든 오른쪽 아래에 있든 다른 파라미터로 학습해야 한다. 반면 CNN은 같은 필터를 모든 위치에 공유하므로, 같은 패턴을 위치와 무관하게 하나의 가중치 집합으로 배울 수 있다.

이것은 단순한 메모리 절약 이상의 의미가 있다. 모델이 공간적 일반화를 더 쉽게 하도록 만드는 구조적 편향, 즉 inductive bias를 제공한다는 뜻이다. 이미지처럼 국소 패턴과 위치 불변성이 중요한 데이터에서는 이런 편향이 매우 큰 힘을 발휘한다.


10 전체 흐름 다시 묶기

CNN의 핵심은 이미지를 숫자로 다루는 것에서 끝나지 않는다. 입력 텐서의 채널과 공간 구조를 유지한 채, 작은 커널로 국소 패턴을 추출하고, 풀링으로 정보를 압축하며, 점차 더 추상적인 표현으로 바꿔가는 과정 전체가 중요하다.

이번 구조를 한 줄로 요약하면 다음과 같다.

[
(1,1,28,28)
\rightarrow
(1,32,28,28)
\rightarrow
(1,32,14,14)
\rightarrow
(1,64,14,14)
\rightarrow
(1,64,7,7)
\rightarrow
(1,3136)
\rightarrow
(1,10)
]

앞의 합성곱 블록은 특징을 추출하고, 뒤의 선형 계층은 그 특징을 바탕으로 클래스를 판별한다. ReLU는 비선형성을 추가하고, 풀링은 표현을 압축하며, 드롭아웃은 과적합을 줄인다. 이 단순한 흐름만 제대로 이해해도 이후 등장하는 더 깊은 CNN, ResNet, EfficientNet 같은 구조를 받아들이기가 훨씬 쉬워진다.

결국 CNN은 이미지 데이터를 위한 특수한 트릭이 아니라, 이미지가 가진 구조적 성질을 모델 안에 자연스럽게 반영한 설계라고 볼 수 있다. 그래서 CNN을 이해하는 일은 단지 한 모델을 배우는 것이 아니라, 데이터의 구조에 맞는 신경망을 어떻게 설계해야 하는지를 배우는 일에 가깝다.