딥러닝 시대의 핵심, 컨볼루션 신경망(CNN) 깊이 파헤치기 🧠💻
지난 시간까지 패턴 인식의 전통적인 기법들을 살펴보았다면, 이제는 현대 컴퓨터 비전의 혁명을 이끌고 있는 딥러닝(Deep Learning), 그리고 그 중심부에 자리한 컨볼루션 신경망(Convolutional Neural Network, CNN)의 세계로 본격적으로 뛰어들 시간이다. 이번 시간에는 CNN의 근본 원리와 핵심 구성 요소들을 차근차근, 그리고 깊이 있게 탐구해보고자 한다.
딥러닝의 부상: 왜 지금, 딥러닝인가? 🚀
딥러닝은 말 그대로 기계가 원시 데이터(raw data)로부터 직접 특정 작업을 수행하는 방법을 학습하는 기술이다. 기존의 머신러닝 방식에서는 '특징(feature)'이라는 것을 사람이 일일이 고민하고 설계해야 했다. 예를 들어, 고양이 이미지를 분류하려면 "귀가 뾰족하다", "수염이 있다" 같은 특징들을 사람이 정의하고 추출하는 코드를 짜야 했다. 이 과정은 시간이 매우 오래 걸릴 뿐 아니라, 다양한 상황(조명 변화, 가려짐 등)에서는 쉽게 무너지고, 새로운 문제에 적용하기 어려운(확장 불가능한) 단점이 있었다.
딥러닝은 이러한 패러다임을 바꾸며 "데이터가 충분하다면, 기계가 알아서 유용한 특징을 학습할 수 있지 않을까?"라는 질문에서 출발했다. 사실 신경망이라는 개념 자체는 수십 년 전부터 존재했지만, 최근 몇 년 사이에 폭발적인 부흥기를 맞이했다. 그 배경에는 크게 세 가지 요인이 있다고 본다.
- 빅 데이터(Big Data)의 출현: ImageNet과 같이 수백만 장 이상의 레이블링된 대규모 데이터셋이 등장하면서, 깊은 신경망을 효과적으로 훈련시킬 충분한 "먹이"가 생겼다.
- 하드웨어의 발전 (GPU): 병렬 연산에 특화된 GPU(Graphics Processing Unit)의 성능이 비약적으로 발전하면서, 이전에는 상상하기 어려웠던 대규모 신경망의 연산을 합리적인 시간 내에 처리할 수 있게 되었다.
- 알고리즘의 진보: ReLU와 같은 더 나은 활성화 함수의 등장, Adam과 같은 효율적인 최적화 알고리즘, 드롭아웃(Dropout)과 같은 규제(regularization) 기법, 그리고 ResNet, Transformer 등 혁신적인 네트워크 아키텍처들이 개발되면서 훈련의 안정성과 성능이 크게 향상되었다.
신경망의 기본 벽돌: 퍼셉트론과 활성화 함수 🧱
딥러닝 모델, 특히 신경망의 가장 기본적인 구조적 빌딩 블록은 퍼셉트론(Perceptron)이다. 퍼셉트론은 여러 입력(x1,x2,...,xn)을 받아 각 입력에 해당하는 가중치(w1,w2,...,wn)를 곱하고, 여기에 편향(bias, b)을 더한 값을 활성화 함수(Activation Function)라는 비선형 함수에 통과시켜 최종 출력(y)을 만들어내는 일종의 의사 결정 함수이다.
\[ y=ActivationFunction(\sum_{i=1}^{n}(w_{i}x_{i}+b))\]
![]() |
Importance of Activation Functions |
이러한 퍼셉트론들이 여러 개 모여 하나의 계층(layer)을 이루고, 이 계층들이 여러 겹 깊게 쌓이면 우리가 아는 심층 신경망(Deep Neural Network, DNN)이 되는 것이다.
여기서 활성화 함수의 역할은 절대적으로 중요하다. 활성화 함수의 주된 목적은 신경망에 비선형성(non-linearity)을 도입하는 것이다. 만약 활성화 함수가 선형이라면 (예: ), 아무리 많은 계층을 쌓아도 전체 네트워크는 결국 하나의 선형 변환에 불과하게 된다. 선형 모델은 매우 단순한 패턴밖에 학습할 수 없지만, 우리가 해결하려는 현실 세계의 문제(이미지 인식, 자연어 이해 등)는 대부분 복잡한 비선형 관계를 가지고 있다. 활성화 함수가 이러한 비선형성을 제공함으로써 신경망은 복잡한 패턴과 데이터 간의 미묘한 관계를 학습할 수 있는 표현력(representational power)을 갖추게 된다.
![]() |
Activation Functions |
과거에는 시그모이드(Sigmoid)나 하이퍼볼릭 탄젠트(tanh) 함수가 많이 사용되었지만, 이들은 깊은 네트워크에서 그래디언트 소실(vanishing gradient) 문제를 일으키는 경향이 있었다. 최근에는 ReLU(Rectified Linear Unit), 즉 함수와 그 변형들이 널리 사용된다. ReLU는 계산이 간단하고, 특정 조건에서 그래디언트 소실 문제를 완화하며, 학습 속도를 높이는 데 기여한다.
학습의 나침반: 손실 함수와 최적화 🧭
신경망 모델을 학습시킨다는 것은 본질적으로 손실(Loss)을 최소화하는 과정이다. 손실 함수는 네트워크의 예측이 실제 정답과 얼마나 다른지, 즉 예측의 "부정확성"에 대한 비용(cost)을 측정하는 함수다.
- 회귀(Regression) 문제 (연속적인 실수 값 예측): 평균 제곱 오차(Mean Squared Error, MSE) 손실이 대표적이다. \[L_{MSE}=\frac{1}{N}\sum_{i=1}^{N}(y_{i}-\hat{y_{i}})^{2}\] 여기서 \(y_{i}\)는 실제 값, \(\hat{y_{i}}\)는 모델의 예측 값이다.
- 분류(Classification) 문제 (이산적인 클래스 레이블 예측): 교차 엔트로피(Cross-Entropy) 손실이 주로 사용된다. 특히 다중 클래스 분류에서는 소프트맥스(Softmax) 함수를 출력층에 사용하여 각 클래스에 대한 확률 분포를 얻고, 이 예측 분포와 실제 정답 분포(one-hot encoded vector) 간의 차이를 교차 엔트로피로 측정한다.
우리의 궁극적인 목표는 이 손실 값을 가장 낮추는 네트워크의 가중치(w)와 편향(b)을 찾는 것이다. 이를 위해 경사 하강법(Gradient Descent)이라는 최적화 알고리즘이 널리 사용된다. 경사 하강법은 손실 함수를 가중치에 대해 미분하여 얻은 기울기(gradient)의 반대 방향으로 가중치를 조금씩 조정해나가는 방식이다. 마치 안개 속에서 산을 내려올 때 가장 가파른 경사를 따라 한 걸음씩 내려오는 것과 같다.
![]() |
Gradient Descent |
실제로는 손실 함수의 전체 데이터셋에 대한 기울기를 계산하고 업데이트하는 배치 경사 하강법(Batch Gradient Descent), 데이터 하나마다 업데이트하는 확률적 경사 하강법(Stochastic Gradient Descent, SGD), 그리고 이 둘의 절충안인 미니배치 경사 하강법(Mini-batch SGD)이 주로 사용된다. 이러한 기울기를 효율적으로 계산하는 알고리즘이 바로 그 유명한 역전파(Backpropagation) 알고리즘이다.
![]() |
Backpropagation |
컨볼루션 신경망(CNN) 아키텍처 대탐험 🗺️
드디어 오늘의 주인공, 컨볼루션 신경망(CNN)이다. CNN은 특히 이미지나 영상처럼 격자 구조(grid-like topology)를 가진 데이터를 처리하는 데 특화된 딥 신경망 아키텍처다. 일반적인 CNN은 다음과 같은 계층들이 순차적으로 연결된 구조를 가진다.
- 입력(Input) 계층: 이미지 데이터 (예: 높이 × 너비 × 채널 수)
- 컨볼루션(Convolution) 계층: 핵심적인 특징 추출 연산. 여러 번 반복될 수 있다.
- 풀링(Pooling) 계층: 특징 맵의 크기를 줄여 연산량을 감소시키고 약간의 이동 불변성을 제공. 선택 사항이며, 컨볼루션 계층과 번갈아 가며 사용될 수 있다.
- 완전 연결(Fully Connected) 계층: 추출된 특징들을 바탕으로 최종적인 분류나 회귀를 수행. 여러 번 반복될 수 있다.
- 출력(Output) 계층: 최종 결과 (예: 클래스 확률, 예측 값)
이미지는 이러한 계층들을 통과하면서 원본 픽셀 값에서 점차 추상화되고 의미 있는 특징들(예: 처음에는 에지, 코너 -> 중간에는 객체의 부분 -> 나중에는 객체 전체)로 변환되며, 최종적으로 원하는 작업(예: "이 이미지는 고양이다")을 수행하게 된다.
![]() |
Feature extraction |
CNN의 심장: 컨볼루션 연산 파헤치기
CNN이라는 이름에서 알 수 있듯이, 컨볼루션(Convolution) 연산은 이 네트워크의 가장 핵심적인 부분이다.
-
기본 작동 방식: 컨볼루션 연산은 입력 데이터(또는 이전 계층의 특징 맵) 위에 작은 크기의 필터(filter) 또는 커널(kernel)을 오버레이하여, 필터의 가중치와 입력 데이터의 해당 부분 값들을 요소별로 곱한 후 모두 더하는(sum) 방식으로 이루어진다. 이 계산은 스트라이드(stride)라는 설정값만큼 필터를 이동시키면서 입력 데이터 전체 영역에 대해 반복 수행된다. 이렇게 필터 하나가 입력 전체를 훑고 지나가면 하나의 특징 맵(feature map) 또는 활성화 맵(activation map)이 생성된다.
-
필터의 역할: 각 필터는 입력 데이터로부터 특정 종류의 특징(예: 수직 에지, 수평 에지, 특정 색상 패턴, 특정 질감 등)을 감지하도록 학습된다. 하나의 컨볼루션 계층에서는 여러 개의 필터를 사용할 수 있으며, 각기 다른 필터는 서로 다른 특징을 감지하여 다양한 측면에서 입력을 분석한다. 사용된 필터의 수가 곧 해당 컨볼루션 계층 출력의 채널(channel) 수가 된다.
-
핵심 아이디어:
- 지역적 연결성(Local Connectivity) / 지역 수용장(Local Receptive Fields): 각 뉴런(특징 맵의 한 픽셀)이 입력의 전체가 아닌 일부 작은 영역(필터 크기만큼)에만 연결된다. 이는 이미지의 특징이 보통 지역적으로 나타난다는 점에서 착안한 것이다.
- 가중치 공유(Parameter Sharing): 하나의 필터(커널)에 있는 가중치들은 입력 전체를 스캔하면서 동일하게 적용된다. 즉, 이미지의 위쪽에서 특정 에지를 감지한 필터는 이미지의 아래쪽에서도 동일한 에지를 감지할 수 있다. 이는 모델이 학습해야 할 파라미터 수를 획기적으로 줄여주며, 과적합(overfitting)을 방지하고 모델의 일반화 성능을 높인다. 또한, 객체가 이미지의 다른 위치에 나타나더라도 동일한 특징을 감지할 수 있는 이동 등변성(translation equivariance)을 제공한다. (풀링 계층과 결합되면 이동 불변성(translation invariance)에 기여한다.)
-
다중 채널 입력 처리 (예: RGB 이미지):
입력 데이터가 여러 채널(예: 컬러 이미지는 Red, Green, Blue 3개 채널)을 가질 때, 컨볼루션 필터 또한 입력 채널 수와 동일한 깊이(depth)를 가진다. 예를 들어, 입력이 H×W×3 이고 필터 크기가 F×F 라면, 실제 필터의 크기는 F×F×3 이 된다. 이 3차원 필터는 입력의 3개 채널에 걸쳐 동시에 적용된다. 즉, 필터의 각 채널은 입력의 해당 채널과 컨볼루션(정확히는 요소별 곱셈 후 합)되고, 이렇게 각 채널에서 나온 결과들이 모두 합쳐져(summed up) 최종적으로 하나의 스칼라 값을 형성한다. 이 값이 해당 위치에서의 필터 응답이며, 하나의 2D 특징 맵을 구성한다. 만약 K개의 필터를 사용한다면, K개의 서로 다른 특징 맵(즉, H′×W′×K 크기의 출력)이 생성된다.
Convolution with padding
(to detect the feature near boundary)
-
"이것이 진정한 의미의 컨볼루션인가?": 수학적으로 엄밀히 말하면, CNN에서 사용되는 연산은 상관(cross-correlation) 연산에 가깝다. 전통적인 신호 처리에서의 컨볼루션은 필터를 뒤집은(flipped) 후 적용하지만, CNN에서는 필터를 뒤집지 않는다. (이전글 참고) 하지만 필터의 가중치는 어차피 학습을 통해 결정되므로, 네트워크는 필요하다면 뒤집힌 형태의 필터를 학습할 수 있다. 따라서 실제 구현에서는 이 둘을 구분하지 않고 '컨볼루션'이라고 통칭하는 경우가 많다.
-
"컬러 채널에 대해 동일한 가중치를 사용하는 것이 괜찮은가?": 이 질문은 약간의 오해에서 비롯된 것일 수 있다. 앞서 설명했듯이, 하나의 필터는 입력의 모든 채널에 걸쳐 서로 다른 가중치를 가질 수 있다 ( 개의 가중치). "동일한 가중치"라는 개념은 한 필터가 이미지의 공간적인 위치를 이동하면서 동일한 가중치 세트를 사용하는 파라미터 공유를 의미하는 것이지, 한 필터 내에서 RGB 채널에 모두 동일한 가중치를 적용한다는 의미는 아니다. 각 필터는 R, G, B 채널의 정보를 적절히 조합하여 특정 특징을 추출하도록 학습된다.
최종 결정타: 풀링 계층과 완전 연결 계층 💫
-
풀링(Pooling) 계층:
컨볼루션 계층 다음에는 종종 풀링 계층이 온다. 풀링의 주된 목적은 특징 맵의 공간적인 차원을 축소(downsampling)하는 것이다. 가장 흔히 사용되는 것은 최대 풀링(Max Pooling)으로, 입력 특징 맵의 특정 작은 윈도우(예: 2×2) 내에서 가장 큰 값을 선택하고 나머지는 버린다.
- 장점:
- 연산량 감소: 특징 맵의 크기를 줄여 다음 계층의 파라미터 수와 계산량을 줄인다.
- 과적합 억제: 불필요한 세부 정보를 제거하여 모델을 좀 더 강인하게 만든다.
- 약간의 이동 불변성 제공: 윈도우 내에서 특징의 위치가 조금 바뀌어도 최대값은 그대로 유지될 가능성이 높아, 특징의 정확한 위치 변화에 덜 민감해진다.
-
완전 연결(Fully Connected, FC) 계층:
여러 번의 컨볼루션과 풀링 계층을 거쳐 추출된 고수준의 특징들은 최종적인 의사 결정을 위해 하나 이상의 완전 연결 계층으로 전달된다. 이 과정에서 보통 2D (또는 3D) 형태의 특징 맵을 1차원 벡터로 쭉 펼치는 평탄화(Flattening) 작업이 선행된다. 완전 연결 계층은 일반적인 다층 퍼셉트론(MLP)과 동일하며, 이전 계층의 모든 뉴런이 다음 계층의 모든 뉴런과 연결된다. CNN의 앞부분에서 추출된 특징들을 종합하여 최종적으로 이미지 분류(예: MNIST 숫자 인식), 객체 탐지 등의 작업을 수행하는 "결정자" 역할을 한다. 자료에서 언급된 MNIST 인식 예제는 CNN으로 특징을 추출하고, 그 특징을 완전 연결 계층에 입력하여 0부터 9까지의 숫자를 분류하는 전형적인 구조를 보여준다.
마무리하며: CNN 여정은 이제부터 시작! 🌟
지금까지 컨볼루션 신경망의 탄생 배경, 기본 구성 요소, 핵심 연산 원리, 그리고 전체적인 아키텍처에 대해 나름 깊이 있게 살펴보았다. 딥러닝의 필요성부터 퍼셉트론, 활성화 함수, 손실 함수, 최적화 과정, 그리고 CNN 고유의 컨볼루션과 풀링, 완전 연결 계층에 이르기까지, CNN이 세상을 "보는" 방식에 대한 기초를 다진 셈이다.
물론 CNN의 세계는 여기서 끝이 아니다. 오늘 자세히 다루지 못한 패딩(Padding) 기법, 다양한 종류의 풀링 방식, 학습 안정화와 성능 향상에 기여하는 배치 정규화(Batch Normalization), 과적합을 막는 드롭아웃(Dropout), 그리고 AlexNet, VGG, GoogLeNet, ResNet, DenseNet 등 수많은 혁신적인 CNN 아키텍처들이 존재한다. 하지만 오늘 우리가 함께 탐구한 내용들은 이러한 advance된 주제들을 이해하는 데 필수적인 튼튼한 발판이 될 것이다.
추천글:
[컴퓨터비전개론] Object Recognition - Decision-theoretic methods, Minimum distance classifier
[컴퓨터비전개론] Object Recognition - Bayes' classifier
[컴퓨터비전개론] Object Recognition - Template Matching, Fourier Descriptor