딥러닝 성공의 이유
CNN으로 넘어가기 전에 짚고 가야 할 이야기가 있습니다. 딥러닝이 성공한 이유를 흔히 더 좋은 알고리즘 덕분이라고 생각하기 쉽지만, 사실 훨씬 더 결정적인 요인은 하드웨어의 발전입니다. GPU가 등장해 수천 개의 코어로 행렬 곱셈을 동시다발적으로 수행할 수 있게 됐고, 네트워크 기술의 발전으로 인터넷을 통해 대량의 데이터를 모을 수 있게 됐습니다. ReLU 사용이나 최적화 개선도 물론 중요했지만, 그보다 하드웨어 발전이 훨씬 더 큰 견인차 역할을 했습니다.
합성곱 신경망 (CNN)
딥 MLP의 한계
완전 연결 구조(Fully Connected, FC)에는 두 가지 근본적인 문제가 있습니다. 첫째는 높은 계산 복잡도입니다. 입력이 D차원이면 노드 하나를 만드는 데 D번의 곱셈이 필요하고, D차원 출력을 만들려면 D×D번의 연산이 듭니다. 둘째는 과도한 파라미터 수로 인한 과적합입니다. 노드 하나를 만드는 데 가중치 벡터 하나가 필요하고, 레이어 전체를 만들려면 D개의 가중치 벡터가 필요합니다. 차원이 커질수록 파라미터 수가 폭발적으로 증가해 과적합 문제가 심각해집니다.

공유경제
CNN은 이 두 문제를 희소 연결(sparse connectivity) 구조로 해결합니다. 핵심 아이디어는 단 하나입니다. 작은 커널(kernel) 하나를 모든 위치에서 공유해서 사용하는 것입니다.
예를 들어 W₁, W₂, W₃라는 3개짜리 가중치 벡터를 입력의 모든 위치에 동일하게 적용하면, 노드 하나를 만드는 데 필요한 곱셈이 D×D에서 단 3번으로 줄고, 전체 파라미터 수도 3개에 불과합니다. 이는 공유경제에 비유될 수 있습니다. 모든 노드가 W₁, W₂, W₃를 공공재처럼 돌려 쓰는 것이죠. 계산 복잡도와 모델 복잡도를 동시에 극적으로 줄이면서도 좋은 특징을 뽑아낼 수 있다는 점이 CNN의 혁신입니다.
CNN은 특히 격자(grid) 구조를 가진 데이터에 적합합니다. 이미지(2D 픽셀 배열)나 음성(1D 시계열 샘플링)이 대표적입니다. 이런 데이터는 인접한 원소들 사이에 높은 상관관계(correlation)가 있어서, 예를 들어 픽셀 값 97이 있으면 그 옆 픽셀도 비슷한 값일 가능성이 높습니다. CNN은 바로 이 국부적 상관관계를 활용해 특징을 추출합니다.
수용장과 Convolution 연산
수용장(Receptive Field)이란 한 노드를 계산할 때 실제로 사용되는 입력 특징의 범위입니다. FC 레이어의 수용장이 전체 입력이라면, CNN의 수용장은 커널 크기 k(예: 3 또는 5)에 불과합니다. 그런데 레이어를 깊게 쌓을수록 수용장은 커집니다. 3짜리 커널 두 개를 쌓으면 두 번째 레이어의 한 노드는 원래 입력 기준으로 5개의 원소를 볼 수 있습니다. 이는 인간의 시각 체계와 유사합니다. 공기총을 쏠 때 과녁에만 집중하고 나머지는 흐릿하게 보이는 것처럼, CNN도 현재 위치 주변의 중요한 패턴에만 집중해서 특징을 추출합니다.
Convolution 연산 자체는 쉽게 말하면 국부 내적입니다. 전체 특징 벡터와 내적하는 FC와 달리, 부분 특징 벡터를 뽑아 그 부분에 대한 내적을 수행합니다. 1차원에서는 다음과 같이 표현됩니다.
zᵢ = Σₛ x(i+s) × w(s), s = -⌊h/2⌋ ~ ⌊h/2⌋
i는 현재 출력의 인덱스(중심 위치)이고, h는 커널 길이, w(s)는 커널 가중치입니다. 2차원도 마찬가지로 x축과 y축 인덱스를 모두 합산하는 형태가 됩니다.
Convolution의 물리적 의미
Convolution이 실제로 하는 일을 한마디로 표현하면 이렇습니다. 자기와 닮은 모양을 찾아서 그 위치에 보상을 준다. 수직 방향 엣지 모양의 커널을 갖고 있다면, 입력 이미지에서 수직 엣지가 있는 위치에서 높은 출력값이 나옵니다. 학습을 통해 이 커널 모양이 자동으로 새겨지는 것이 CNN의 특징 학습 과정입니다. 수직 엣지 커널과 수평 엣지 커널을 합치면 대각선 방향 엣지 커널이 되는 것처럼, 커널들을 조합하면 더 다양한 패턴을 추출할 수 있습니다.
커널 하나만 쓰면 특징 하나밖에 못 뽑습니다. 그래서 커널을 여러 개 사용합니다. 각 커널이 눈, 코, 입처럼 서로 다른 특징을 학습하게 되어 더 풍부한 표현을 얻을 수 있습니다. 커널 K개를 사용하면 특징 맵(feature map) K개가 출력됩니다.
Padding과 Stride
패딩 없이 Convolution을 수행하면 출력 크기가 입력보다 작아집니다. 중심 인덱스가 0이 아닌 1부터 시작하기 때문입니다. 입력과 출력 크기를 같게 맞추려면 패딩 크기 ⌊h/2⌋만큼 가장자리에 값을 채워야 합니다. Zero Padding은 0을 채우는 방식으로 구현이 단순하고 연산량이 적어 가장 널리 쓰입니다. 이미지 크기가 충분히 크면 가장자리에서 값이 조금 작아지는 부작용이 있어도 성능에 거의 영향이 없다는 것이 알려져 있습니다.
Stride는 커널이 이동하는 보폭입니다. Stride=1이면 한 칸씩, Stride=2이면 두 칸씩 이동합니다. Stride=k로 설정하면 출력 크기가 1/k² 로 줄어들어, Convolution 자체를 차원 축소에 사용할 수 있습니다. 반대로 Stride를 0.5로 설정하면 사이 값을 보간(interpolation)해서 출력 크기를 2배로 키울 수도 있습니다.
Pooling
Pooling은 대표값 추출을 통해 차원을 줄이는 연산입니다. 일반적으로 Stride=2, h=2로 설정해 입력 크기를 절반으로 줄입니다. Max Pooling이 가장 많이 쓰이는 이유는, 특징값이 크다는 것이 그 위치에서 중요한 패턴이 강하게 반응했다는 뜻이기 때문입니다. 2개 중 하나를 버려야 한다면 정보량이 더 많은 쪽을 살리는 것이 합리적입니다. Pooling은 학습 파라미터가 없고, 채널 수는 그대로 유지하면서 공간 해상도(가로, 세로)만 줄입니다.
CNN Building Block과 LeNet
하나의 기본 블록은 Convolution Layer에서 K개의 특징 맵을 만들고, Pooling Layer에서 공간 크기를 절반으로 줄이는 순서로 구성됩니다. 채널 수는 커널 개수가 결정하고, 공간 해상도는 Pooling이 결정합니다.
LeNet은 이 구조의 선구자로, Yann LeCun이 1998년 MNIST 손글씨 분류에 적용해 대성공을 거뒀습니다. Conv → Pool → Conv → Pool → Conv의 5층 구조로 28×28 이미지를 120차원 특징 벡터로 압축한 뒤, 마지막에 MLP를 붙여 최종 분류를 수행합니다.
고전적 CNN 사례 연구
ImageNet과 ILSVRC
2010년대 초, AI 성능을 본격적으로 겨루기 위한 무대가 마련됐습니다. ImageNet은 2만 개 이상의 카테고리, 각 카테고리별 500~1,000장의 이미지를 보유한 대규모 데이터셋입니다. 이를 기반으로 매년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회가 열렸고, 1,000개 클래스에 대한 분류·검출·위치지정 문제를 겨뤘습니다.
성능은 Top-1과 Top-5 오류율로 측정했습니다. Top-1은 모델이 가장 높은 확률로 예측한 클래스가 정답이어야 하고, Top-5는 확률이 높은 상위 5개 안에 정답이 포함되면 됩니다. Top-5를 쓰는 이유는 레이블이 진돗개와 시바견처럼 굉장히 세분화되어 있고, 이미지 자체가 여러 물체를 담고 있는 경우도 많기 때문입니다. 실제로 Top-1 성능이 더 좋은 모델은 Top-5 성능도 일반적으로 더 좋은 경향을 보였습니다.
AlexNet (2012)
AlexNet은 2012년 ILSVRC에서 기존 SVM 기반 방법들을 압도적으로 이기며 딥러닝 시대의 문을 연 모델입니다. 약 10~15년간 지배하던 SVM 패러다임을 단번에 무너뜨렸습니다.
구조는 Convolution 5개와 FC 3개, 총 8층입니다. 특이한 점은 Convolution 층은 약 200만 개의 파라미터를 가지는 반면, FC 층은 무려 6,500만 개의 파라미터를 가진다는 것입니다. 층 수도 적고 공유 가중치도 쓰는 Convolution보다 FC가 30배 이상 많은 파라미터를 갖는 것이죠. 예를 들어 4,096에서 4,096으로 가는 완전 연결층에는 4,096의 제곱 개의 가중치가 필요합니다. 이 비대한 FC 층이 앞으로 연구가 집중해야 할 과적합의 원흉임을 알게 됐습니다.
AlexNet의 성공 요인은 외부 요인과 내부 요인으로 나눌 수 있습니다. 외부 요인으로는 ImageNet이라는 대용량 데이터베이스와 GPU 병렬 처리가 있습니다. 내부 요인으로는 네 가지를 들 수 있습니다. 첫째, ReLU 활성함수로 깊은 층에서도 그래디언트 소멸 문제를 줄였습니다. 둘째, Local Response Normalization으로 레이어를 거칠수록 출력 분포가 원점에서 멀어지는 공진 현상을 억제했는데, 이것이 나중에 배치 정규화(Batch Normalization)로 발전합니다. 셋째, 데이터 증강으로 256×256 이미지를 224×224로 무작위 크롭하고 좌우 반전해 1개 샘플에서 2,048개를 만들었습니다. 넷째, Dropout을 FC 층에만 적용했습니다.
Dropout은 단순한 정규화 기법이 아닙니다. 매 iteration마다 각 노드를 50% 확률로 무작위로 끊으면, 서로 조금씩 다른 구조의 서브 네트워크가 가상으로 생겼다가 사라지며 학습됩니다. 추론 시에는 모든 노드를 연결한 전체 네트워크를 사용하는데, 이는 수많은 서브 모델의 앙상블 효과와 같습니다. 앙상블이란 여러 모델의 출력을 평균 내어 최종 결정을 내리는 방법으로, 단일 모델보다 일반적으로 성능이 좋습니다. 실제로 동일 구조의 AlexNet 8개를 서로 다른 초기값으로 학습시켜 평균을 내면 단일 모델보다 약 9% 성능이 향상됩니다.
VGGNet (2014)
VGGNet의 핵심 아이디어는 단순합니다. 큰 커널 대신 3×3 커널을 여러 층 쌓아라. 7×7 커널 하나는 49개의 파라미터로 레이어 1개이지만, 3×3 커널 3개는 27개의 파라미터로 레이어 3개를 만들 수 있습니다. 같은 수용장을 확보하면서 파라미터 수는 줄고, 층은 더 깊게 쌓을 수 있습니다. 층을 깊게 쌓을수록 비선형성이 증가해 더 정교한 결정 경계를 만들 수 있죠.
VGGNet에서 1×1 Convolution이라는 개념이 등장합니다. 1×1 커널은 공간적 패턴을 보지 않고 채널 방향의 상관관계만 추출합니다. 각 채널에 분포한 정보들을 조합해 새로운 특징을 만드는 역할입니다. 또 하나의 중요한 역할은 차원 축소입니다. 채널 64개를 1×1 Conv로 16개로 줄인 뒤 3×3 Conv를 수행하면 계산량이 절반으로 줄어듭니다.
GoogLeNet (2014)
GoogLeNet은 Network In Network(NIN)의 아이디어를 발전시킨 모델입니다. 핵심 블록인 인셉션 모듈은 영화 인셉션에서 꿈 속에 꿈을 만드는 것처럼, 큰 네트워크 안에 작은 네트워크를 쌓는다는 컨셉에서 이름이 붙었습니다.
NIN에서 나온 아이디어 중 하나가 Global Average Pooling(GAP)입니다. VGGNet의 FC 층은 약 1억 2,200만 개의 파라미터로 전체의 85%를 차지할 정도였습니다. GAP는 이 문제를 해결하기 위해 각 채널 전체의 평균값을 스코어로 사용합니다. 학습 가능한 가중치를 1/n이라는 상수로 대체한 셈이어서 파라미터가 0이 됩니다. 입출력 동작은 FC와 동일하게 차원을 줄이면서 과적합 문제는 없애버린 것입니다.
인셉션 모듈은 입력을 4가지 서로 다른 경로로 동시에 처리한 뒤 채널 방향으로 쌓는(Concatenation) 구조입니다. 1×1 Conv, 1×1→3×3 Conv, 1×1→5×5 Conv, Max Pooling→1×1 Conv의 네 경로를 병렬로 처리합니다. 다양한 스케일의 특징을 동시에 추출해 비선형성을 높이기 위함입니다. 각 경로 앞에 1×1 Conv를 두어 채널을 먼저 줄임으로써 무거운 3×3, 5×5의 계산 부담도 덜었습니다. GoogLeNet은 이 인셉션 모듈을 9개 쌓아 총 22층 구조를 만들었습니다.
22층이나 되니 그래디언트 소멸 문제가 심각했습니다. GoogLeNet은 중간 두 곳에 보조 분류기(Auxiliary Classifier)를 달아 임시로 해결했습니다. 학습 시에만 사용하고 추론 시에는 떼어냅니다. 뒤에서 생성된 그래디언트가 앞으로 전달될수록 점점 약해지니, 중간에서 추가로 그래디언트를 만들어 보조해주는 장치입니다. 다만 중간 레이어가 저수준 특징을 학습해야 하는데 보조 분류기 때문에 고수준 특징도 학습하게 되는 부작용이 있었고, 이는 나중에 ResNet의 Residual Connection이 근본적으로 해결합니다.
ResNet (2015)
ResNet의 핵심 아이디어는 잔류 학습(Residual Learning)입니다. 방법은 놀랍도록 단순합니다. Convolution 두 개를 통과시킨 뒤, 입력 x를 그냥 더해주는 것이 전부입니다.
H(x) = F(x) + x
기존 방식은 입력 x로부터 목표 출력 H(x)를 직접 학습했습니다. 잔류 학습은 잔차(residual) F(x) = H(x) - x만 학습하도록 합니다. 원본 신호 H(x)는 값의 범위가 크고 다양해 학습이 어렵지만, 잔차 F(x)는 대부분 0에 가까운 훨씬 단순한 신호입니다. Convolution 입장에서 훨씬 쉬운 과제를 주는 것입니다.
두 번째 중요한 이유는 그래디언트 소멸 방지입니다. 기존 역전파의 로컬 그래디언트가 ∂F(x)/∂x라면, Residual Block의 로컬 그래디언트는 ∂F(x)/∂x + 1이 됩니다. 그래디언트가 아무리 작아져도 1이 딱 버티고 있어서, 로컬 그래디언트가 최소 1±ε 수준으로 유지됩니다. 이 덕분에 1,200층을 쌓아도 그래디언트가 소멸하지 않고 앞쪽 레이어까지 전달될 수 있었습니다.
아이디어 자체는 너무나 간단합니다. 그냥 Convolution 두 개를 통과시키고, 메모리에 저장해둔 x를 마지막에 한 번 더해주면 끝입니다. 그런데 이게 엄청난 혁명적 아이디어였습니다. ResNet은 여기에 Global Average Pooling과 Batch Normalization까지 적용했습니다.
ILSVRC 성능 변화
2012년 AlexNet이 오류율 약 15.3%로 딥러닝 시대를 열었고, VGGNet이 19층으로 올리고, GoogLeNet이 22층으로, ResNet이 152층으로 쌓아 불과 3년 만에 오류율이 3.5%까지 내려갔습니다. 핵심 트렌드는 층을 더 깊게 쌓는 것이었습니다. 지금도 ChatGPT가 버전업될 때마다 파라미터 수가 약 1,000배씩 증가한다고 알려져 있습니다. 더 깊은 네트워크, 더 깊은 추론, 더 지혜로운 답변이라는 경쟁은 지금도 계속되고 있습니다.
분류 문제는 이미 인간 수준을 넘어서 포화 상태가 됐고, 연구는 더 어려운 객체 검출(Object Detection)로 옮겨갔습니다. 검출은 객체가 어디 있는지 바운딩 박스를 치고(Localization), 그 객체가 무엇인지 클래스를 맞추는(Classification) 문제를 동시에 푸는 것입니다.
생성 모델과 GAN
분별 모델 vs. 생성 모델
지금까지 다룬 모델들은 모두 주어진 입력 X로부터 레이블 Y를 예측하는 분별 모델(Discriminative Model)이었습니다. 분별 모델은 P(Y|X)를 추정합니다. 반면 생성 모델(Generative Model)은 P(X)를 추정합니다. 데이터 자체의 분포를 학습해서 새로운 샘플을 만들어내는 것입니다.
생성 모델에서 학습하는 P(X)는 어떻게 구할까요? 샘플이 충분히 많다면 단순하게 히스토그램을 구하면 됩니다. 10개의 샘플이 있고 그 중 4개가 (1,1)이라면 P(1,1) = 40%입니다. 이 분포를 알면 새로운 샘플을 무한히 생성할 수 있습니다. Uniform Distribution에서 z를 뽑아 각 확률에 비례하는 구간을 할당해두면, z값이 어디에 속하느냐에 따라 샘플이 결정됩니다. 이것이 가장 기본적인 샘플링 방법입니다.
그렇다면 실제 이미지 데이터에서 P(X)를 알 수 있을까요? 불가능합니다. 이미지의 경우 픽셀 수가 수십만 개에 달하고, 각 픽셀이 가질 수 있는 값도 0~255로 매우 많습니다. 이렇게 엄청나게 고차원적인 공간에서 어떤 지점이 강아지 이미지이고 어떤 지점이 사람 얼굴인지 특정하기가 굉장히 어렵습니다. 아무리 데이터를 모아도 전체 분포를 명시적으로 알아내는 것은 불가능에 가깝습니다.
그래서 암시적(implicit) 방법을 씁니다. P(X)를 수식으로 직접 쓰는 것이 아니라, 딥러닝 모델의 가중치 안에 P(X)가 내재적으로 저장된다고 보는 것입니다. 딥러닝은 학습 데이터 샘플들 사이에 있는 위치에 대해서도 어느 정도 예측하는 내사(interpolation) 능력이 있습니다. 이 덕분에 전체 샘플을 다 보지 않아도 분포를 어느 정도 추정할 수 있습니다.
GAN
GAN 이전에도 RNN 기반으로 한 픽셀씩 순차적으로 생성하거나 VAE를 활용하는 방법들이 있었습니다. 하지만 결과물이 흐릿하거나 다양성이 부족했습니다. GAN(Generative Adversarial Network)은 2014년 Ian Goodfellow가 제안하면서 생성 분야에 엄청난 도약을 이끌었습니다.
기존 연구가 하나의 네트워크를 어떻게 바꿔볼까에 집중했다면, GAN은 완전히 다른 패러다임을 제시했습니다. 네트워크를 2개 만들고, 그 관계를 게임 이론으로 설정한다. 두 네트워크가 생기는 순간 그 사이에 관계를 정의할 수 있고, 그 관계에서 경쟁이 시작됩니다. 지금의 멀티 에이전트 시스템도 이 연장선에 있다고 볼 수 있습니다.
두 플레이어는 Generator(위조범)와 Discriminator(감별사)입니다. Generator는 랜덤 시드 z를 입력받아 가짜(Fake) 샘플을 생성하고, 목표는 Discriminator를 속일 만큼 리얼한 가짜를 만드는 것입니다. Discriminator는 입력 샘플이 진짜(Real)인지 가짜(Fake)인지 구별해서 진짜면 1, 가짜면 0을 출력하도록 학습됩니다.
학습은 두 단계를 번갈아가며 진행합니다. 먼저 Generator를 고정하고 Discriminator를 학습시킵니다. Real 샘플을 넣으면 1, Fake 샘플을 넣으면 0이 나오도록 이진 분류를 학습합니다. 그다음 Discriminator를 고정하고 Generator를 학습시킵니다. Fake 샘플을 넣었을 때 Discriminator가 1을 출력하도록, 즉 Discriminator를 속이는 방향으로 Generator의 파라미터를 업데이트합니다. 이 과정을 반복하면 Generator는 점점 더 리얼한 샘플을 생성하게 됩니다. 결국 Discriminator가 진짜와 가짜를 50% 확률로밖에 구분 못 하는 지점에 도달하면 학습이 종료됩니다.
최종적으로 중요한 것은 Generator입니다. Discriminator는 Generator의 학습을 돕기 위해 존재할 뿐, 학습이 끝나면 버려집니다.
GAN의 목적함수
목적함수는 다음과 같습니다.
min_G max_D V(D,G) = E[log D(x_real)] + E[log(1 - D(G(z)))]
Discriminator는 이 값을 최대화합니다. 첫 번째 항은 Real 샘플을 넣으면 D(x)=1이 되도록, 두 번째 항은 Fake 샘플을 넣으면 D(G(z))=0이 되도록 만드는 텀입니다. Generator는 이 값을 최소화합니다. 두 번째 항만 관련되며, D(G(z))=1이 되도록, 즉 Fake를 Real로 착각하게 만드는 방향으로 학습됩니다.
같은 목적함수에 대해 D는 올리고 G는 내리는 minimax 게임입니다. 죄수의 딜레마처럼, 서로가 최선의 선택을 하면서 경쟁하는 게임 이론의 구조입니다.
Mode Collapse
GAN의 두 플레이어는 겉으로는 대등해 보이지만, 사실 Discriminator가 유리합니다. 가짜 이미지를 만드는 것보다 진짜와 가짜를 구분하는 것이 훨씬 쉽기 때문입니다. Discriminator가 너무 빨리 학습되면 Generator가 아무리 업데이트해도 Discriminator를 속일 수 없는 상태가 됩니다. 이때 Mode Collapse 문제가 발생합니다. Generator가 다양한 이미지를 만들지 못하고 비슷한 이미지만 반복하며 더 이상 학습이 진행되지 않는 현상입니다.
해결책으로는 Generator를 Discriminator보다 훨씬 더 많이 업데이트하거나, Real 레이블에 노이즈를 추가해 Discriminator의 학습을 의도적으로 늦추는 방법이 있습니다.
이후 DCGAN은 FC 대신 CNN을 Generator와 Discriminator에 적용해 훨씬 고품질의 이미지를 생성할 수 있음을 보였습니다. 파라미터 수가 적어 과적합 방지에 유리하고, 층을 더 깊게 쌓을 수 있기 때문입니다.
딥러닝은 왜 강력한가
딥러닝이 고전적인 방법보다 강력한 이유에는 크게 세 가지가 있습니다.
첫째는 End-to-End Learning(통째 학습)입니다. 고전적 방법은 이미지 전처리, 특징 추출, 분류기까지 각 단계를 사람이 설계했고, 인식 대상이 바뀌면 전체를 다시 갈아엎어야 했습니다. 딥러닝은 X와 Y만 주면 전체 과정을 동시에 최적화합니다. Loss를 최소화하는 관점에서 가장 최적의 특징과 분류기가 자동으로 만들어집니다.
둘째는 깊이(Depth)입니다. 같은 노드 20개를 한 층에 쓰는 것보다 10개씩 2층으로 쌓았을 때 결정 경계가 훨씬 정교하게 만들어집니다. 층을 깊게 쌓으면 표현 공간이 변환되는 경우의 수가 많아지고, 더 좋은 표현 공간을 얻을 확률이 높아집니다.
셋째는 계층적 특징 학습(Hierarchical Feature Learning)입니다. 인간의 시각 피질과 유사하게, 초반 레이어는 선·엣지·코너 같은 저수준 특징을, 중간 레이어는 형태나 실루엣 같은 중수준 특징을, 후반 레이어는 눈·코·입이나 얼굴 전체 같은 고수준 특징을 학습합니다. 이렇게 다양한 계층의 특징들이 각 층마다 의미 있게 학습되어 최적의 성능을 냅니다.