상태: 초안 (2026-10-13), 일부 실측. 예제는 노트북 CPU(파이썬 3.9, numpy 2.0)에서 직접 돌린 값입니다. 코드는 이 폴더의
code/01_conv.py에 있고 몇 초 안에 끝납니다. 논문 수치는 원문을 열어 조건과 함께 옮겼습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.
목차
- 1. 왜 그림에는 특별한 구조가 필요한가
- 2. 합성곱: 작은 창을 밀며 곱하고 더하기
- 3. 필터는 손으로 정하지 않는다: 손실, 역전파, 경사 하강
- 4. 풀링과 수용 영역: 한 칸이 보는 범위
- 5. LeNet-5(1998): 합성곱 + 풀링 + 역전파의 원형
- 6. AlexNet(2012): 같은 생각, 다른 규모
- 7. 한계
- 8. 우리 프로젝트와의 연결
- 참고 문헌
1. 왜 그림에는 특별한 구조가 필요한가
휴대폰 사진 한 장은 수백만 개의 숫자(화소)입니다. 이것을 보통의 신경망, 곧 완전 연결층(모든 입력이 모든 출력과 연결된 층)에 넣으면 연결 수가 폭발합니다. 32×32 흑백 그림을 28×28 크기의 특징 지도 6장으로 바꾸는 층 하나만 보아도 그렇습니다.
| 방식 | 학습할 숫자(가중치) |
|---|---|
| 완전 연결층 | 4,821,600개 |
| 5×5 합성곱 필터 6개 | 156개 |
(직접 계산, code/01_conv.py [5]. 합성곱은 필터 6개 × (25 + 편향 1).)
3만 배 차이가 나는 이유는 그림에 있는 두 가지 성질 때문입니다.
- 가까운 화소끼리 관계가 깊다(국소성). 공의 윤곽을 알아보는 데 반대편 구석 화소는 필요 없습니다.
- 같은 무늬는 어디에 있어도 같은 무늬다(위치 이동에 대한 같음). 화면 왼쪽의 공과 오른쪽의 공은 같은 방법으로 찾으면 됩니다.
합성곱은 이 두 가정을 구조에 박아 넣은 연산입니다. 작은 창만 보고(국소성), 같은 필터를 그림 전체에 돌려씁니다(가중치 공유). 이 「가정을 구조에 넣는 것」을 귀납 편향이라고 부르는데, 7편의 Vision Transformer 가 바로 이것을 버리면서 무엇을 대가로 치르는지 보게 됩니다.
2. 합성곱: 작은 창을 밀며 곱하고 더하기
계산은 단순합니다. 3×3 필터(숫자 9개)를 그림의 3×3 창에 겹쳐 같은 자리끼리 곱하고 모두 더하면 출력 한 칸이 나옵니다. 창을 한 칸씩 옮기며 반복하면 출력 지도가 완성됩니다.
# code/01_conv.py 에서
def conv2d(x, k):
kh, kw = k.shape
out = np.empty((x.shape[0] - kh + 1, x.shape[1] - kw + 1))
for i in range(out.shape[0]):
for j in range(out.shape[1]):
out[i, j] = np.sum(x[i:i + kh, j:j + kw] * k)
return out
왼쪽 절반이 0(어둡다), 오른쪽 절반이 1(밝다)인 6×6 그림에 세로 경계 필터(소벨 필터)를 대면 이렇게 나옵니다(실측).
필터 출력(4×4)
[-1 0 1] [0 4 4 0]
[-2 0 2] [0 4 4 0]
[-1 0 1] [0 4 4 0]
[0 4 4 0]
밝기가 바뀌는 경계에서만 4, 나머지는 0 입니다. 필터는 「이런 무늬가 여기 있나」를 묻는 질문이고, 출력 지도는 그 질문에 대한 답을 그림 전체에 펼친 것입니다. 실제 망은 한 층에 이런 필터를 수십~수백 개 두고, 각 필터가 서로 다른 무늬(가로 경계, 대각선, 색 덩어리 등)를 찾습니다.
덧붙여, 딥러닝 프레임워크가 「합성곱」이라고 부르는 것은 수학 교과서의 합성곱과 달리 필터를 뒤집지 않는 상호 상관입니다. 필터를 어차피 학습으로 정하므로 뒤집느냐는 차이가 없습니다.
3. 필터는 손으로 정하지 않는다: 손실, 역전파, 경사 하강
예전 컴퓨터 비전은 위의 소벨 필터처럼 사람이 필터를 설계했습니다. CNN 의 핵심은 필터의 숫자를 데이터에서 배운다는 것입니다. 배우는 방법은 세 단계입니다.
- 손실 함수: 지금 필터로 낸 출력이 정답과 얼마나 다른지 숫자 하나로 잽니다. 여기서는 오차 제곱의 평균(MSE)입니다.
- 역전파: 필터의 숫자 9개 각각을 조금 바꾸면 손실이 얼마나 바뀌는지(기울기)를 계산합니다. 합성곱의 경우 「출력 오차」와 「입력」을 다시 합성곱하면 필터의 기울기가 나옵니다.
- 경사 하강: 기울기의 반대 방향으로 필터를 조금 옮깁니다.
k ← k − 학습률 × 기울기.
# code/01_conv.py 에서 — 필터 k 의 기울기
for x, y in zip(X, Y):
err = conv2d(x, k) - y # 출력 오차
for a in range(3):
for b in range(3):
g[a, b] += np.mean(2 * err * x[a:a + err.shape[0], b:b + err.shape[1]])
k -= lr * g
직접 해 보기: 무작위 필터가 소벨 필터가 되기까지
무작위 그림 32장을 소벨 필터에 통과시켜 「정답 출력」을 만들고, 정답 필터는 알려 주지 않은 채 무작위 필터(평균 0, 표준편차 0.1)에서 출발해 학습률 0.1 로 경사 하강을 했습니다(실측, 노트북 CPU 약 6초).
| 걸음 | 손실(MSE) |
|---|---|
| 0 | 1.064 |
| 10 | 0.730 |
| 50 | 0.193 |
| 100 | 0.037 |
| 200 | 0.0013 |
| 500 | 0.000000 |
500걸음 뒤 배운 필터는 [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]] 이었고 정답과의 최대 차는 0.0005 였습니다. 사람이 「세로 경계를 찾아라」라고 말하지 않았는데도, 데이터가 그런 필터를 요구하니 필터가 그 모양이 된 것입니다. 실제 CNN 의 첫 층 필터를 그림으로 그려 보면 경계·색 무늬 모양이 나오는 것도 같은 이유입니다.
역전파로 구한 기울기가 맞는지는 수치 미분(숫자 하나를 아주 조금 바꿔 손실 변화를 직접 재는 방법)과 비교해 확인했습니다. 최대 상대 차가 6.4×10⁻¹¹ 로 일치했습니다. 직접 짠 학습 코드를 믿기 전에 늘 해 볼 만한 검사입니다.
4. 풀링과 수용 영역: 한 칸이 보는 범위
합성곱 한 층의 출력 한 칸은 입력의 3×3 만 봅니다. 공 전체나 선수의 팔을 알아보려면 더 넓게 보아야 합니다. 방법은 둘입니다.
- 층을 쌓는다. 3×3 위에 3×3 을 얹으면 위층 한 칸은 아래층 3×3, 곧 입력 5×5 를 봅니다.
- 줄인다(풀링·보폭). 2×2 칸을 하나로 합치면(최대값 또는 평균) 같은 필터가 두 배 넓은 범위를 봅니다.
출력 한 칸이 입력에서 영향을 받는 범위를 수용 영역이라고 합니다. 층마다 r ← r + (커널 − 1) × j, j ← j × 보폭 으로 계산합니다(j 는 누적 보폭). LeNet-5 와 AlexNet 의 구성으로 계산하면 이렇습니다(직접 계산, code/01_conv.py [4]).
| 망 | 층을 지나며 수용 영역(px) | 마지막 |
|---|---|---|
| LeNet-5 | 5 → 6 → 14 → 16 → 32 | 입력 32×32 전체 |
| AlexNet | 11 → 19 → 51 → 67 → 99 → 131 → 163 → 195 | 입력 224×224 의 대부분 |
풀링에는 대가가 있습니다. 해상도를 줄이면 정확한 위치를 잃습니다. 분류(「이 그림에 고양이가 있나」)에는 문제가 없지만, 공의 좌표를 화소 단위로 알아야 하는 일에는 치명적입니다. 3편(U-Net·HRNet)이 바로 이 문제를 다룹니다.
5. LeNet-5(1998): 합성곱 + 풀링 + 역전파의 원형
LeCun 등의 1998년 논문은 손글씨 숫자(MNIST)를 읽는 LeNet-5 를 소개했습니다. 입력은 32×32 흑백입니다. 데이터의 숫자는 가장 커도 20×20 이고 28×28 칸 가운데에 놓여 있는데, 입력을 그보다 일부러 크게 잡았습니다(위 수용 영역 계산에서 마지막 층이 입력 32×32 전체를 보는 것과 맞물립니다).
- 구조: 합성곱(C1) → 서브샘플링(S2) → 합성곱(C3) → 서브샘플링(S4) → 합성곱(C5) → 완전 연결 → 출력. 입력을 빼고 7층입니다.
- 크기: 연결은 340,908개지만 학습하는 숫자는 약 6만 개입니다. 가중치 공유 덕분입니다.
- 결과(논문): MNIST 시험셋 오류율 0.95%. 학습 데이터 6만 장에 기하 변형(이동·확대·찌그러뜨리기·기울이기)으로 만든 54만 장을 더하자 0.8% 로 내려갔습니다.
이 논문이 보인 것은 「특징을 사람이 설계하지 않고, 합성곱 구조와 역전파로 처음부터 끝까지 배울 수 있다」는 것입니다. 그러나 1998년의 계산력과 데이터로는 손글씨처럼 작고 깨끗한 그림을 넘기 어려웠습니다.
6. AlexNet(2012): 같은 생각, 다른 규모
14년 뒤 Krizhevsky·Sutskever·Hinton 의 AlexNet 이 ImageNet 대회(ILSVRC, 1000개 클래스, 학습 그림 약 120만 장)를 큰 차이로 이겼습니다. 구조의 생각은 LeNet 과 같습니다. 바뀐 것은 규모와 몇 가지 학습 기법입니다.
| 항목 | AlexNet(논문) |
|---|---|
| 크기 | 파라미터 6,000만 개, 뉴런 65만 개, 합성곱 5층 + 완전 연결 3층 |
| 입력 | 224×224×3 |
| 학습 | 당시 데스크톱 GPU(메모리 3GB) 두 장에 망을 나눠 올려 5–6일, 120만 장을 약 90번 |
| ILSVRC-2012 시험 top-5 오류 | 15.3%(CNN 7개 앙상블) 대 2위 26.2%. 한 모델은 검증셋 18.2% |
| ILSVRC-2010 시험 | top-1 37.5%, top-5 17.0%(시험 때 조각 10개 평균) |
「top-5 오류」는 모델이 고른 상위 5개 답에 정답이 없는 비율입니다. 15.3% 가 앙상블 수치라는 점은 자주 빠지는 조건입니다.
무엇이 차이를 만들었는지 논문이 직접 잰 것들을 보면 「왜 이렇게 설계했나」가 보입니다.
- ReLU. 활성화 함수를 tanh 대신
max(0, x)로 바꾸자, 4층 CNN 이 CIFAR-10 에서 학습 오류 25% 에 도달하는 속도가 6배 빨라졌습니다(논문 그림 1). tanh 는 값이 크면 기울기가 0 에 가까워지지만 ReLU 는 양수 쪽 기울기가 늘 1 입니다. 큰 망을 제한된 시간에 학습하려면 이 차이가 결정적이었습니다. - 데이터 증강. 256×256 그림에서 224×224 를 무작위로 자르고 좌우로 뒤집어 학습 데이터를 사실상 2048배로 늘렸습니다. 색을 주성분 방향으로 흔드는 증강은 top-1 오류를 1% 넘게 줄였습니다. 증강이 없으면 6,000만 파라미터가 데이터를 외워 버린다고 논문은 설명합니다.
- 드롭아웃. 학습 중 완전 연결층 뉴런을 확률 0.5 로 끕니다. 뉴런들이 서로에게 기대지 못하게 해 과적합을 줄입니다. 대신 수렴에 걸리는 반복이 대략 두 배가 됐습니다.
- 겹치는 풀링(창 3, 보폭 2)은 top-1/top-5 오류를 0.4%/0.3%, 지역 응답 정규화는 1.4%/1.2% 줄였습니다. 지역 응답 정규화는 이후 배치 정규화(2편)에 밀려 거의 쓰이지 않습니다.
- GPU. 합성곱은 같은 계산을 수없이 반복하므로 GPU 의 병렬 연산과 잘 맞습니다. 메모리가 모자라 망을 두 GPU 에 반씩 나눠 올린 것도 이 논문의 유명한 대목입니다.
정리하면 AlexNet 의 교훈은 「새 아이디어 하나」가 아니라 큰 데이터 + 빠른 계산 + 큰 망을 학습 가능하게 만드는 기법들의 조합입니다. 이후 10년의 비전 모델은 대부분 이 공식 위에 있습니다.
7. 한계
- 위치를 잃는다. 풀링을 거듭하면 분류에는 좋지만 정밀한 위치가 흐려집니다(3편).
- 깊게 쌓기 어렵다. AlexNet 은 8층이었습니다. 더 깊게 쌓으면 오히려 학습이 안 되는 문제가 있었고, 이것을 푼 것이 ResNet 입니다(2편).
- 라벨이 많이 든다. ImageNet 처럼 사람이 이름표를 단 그림이 수십만~수백만 장 필요했습니다. 이름표 없이 배우는 길은 자기지도 학습을 다루는 자매 시리즈에서 다룹니다.
- 크기·회전에는 약하다. 합성곱은 위치 이동에는 강하지만 물체가 커지거나 돌아가는 것은 구조로 보장하지 않습니다. 그래서 증강으로 가르칩니다.
8. 우리 프로젝트와의 연결
TT Score 의 공 찾기 모델(WASB·BlurBall)은 2026년에도 합성곱 신경망입니다. 이유는 이 글의 내용 그대로입니다.
- 공은 작고(모델 입력에서 지름 3px 남짓) 빠르게 번집니다. 그런 무늬를 찾는 데는 「작은 창 + 가중치 공유」의 귀납 편향이 잘 맞습니다.
- 파라미터 150만 개 정도의 작은 망으로도 충분해서, 창 하나를 10.5ms 에 처리합니다(서버 GPU 실측). 실시간 판정에는 이 속도가 정확도만큼 중요합니다.
자세한 구조와 실측은 TT Score 모델 해부 2편: 공 찾기에 있습니다. 다음 글은 깊은 망을 학습 가능하게 만든 잔차 연결과 배치 정규화입니다.
티티 한마디. 필터한테 「세로 경계를 찾아」라고 말한 적이 없는데, 500걸음 만에 소벨 필터가 됐어요. 데이터가 원하는 모양으로 필터가 스스로 바뀌는 거예요.
참고 문헌
- LeCun, Y., Bottou, L., Bengio, Y., Haffner, P. (1998). Gradient-Based Learning Applied to Document Recognition. Proceedings of the IEEE, 86(11), 2278–2324. https://doi.org/10.1109/5.726791
- Krizhevsky, A., Sutskever, I., Hinton, G. E. (2012). ImageNet Classification with Deep Convolutional Neural Networks. NeurIPS 2012. https://papers.nips.cc/paper_files/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html
- 예제 코드와 출력: 이 폴더의
code/01_conv.py,code/01_conv.out.txt