TT Lab
요금제

한국어

시작하기
블로그

블로그

합성곱 신경망은 무엇을 배우나: 필터, 수용 영역, 역전파, 그리고 LeNet 과 AlexNet

상태: 초안 (2026-10-13), 일부 실측. 예제는 노트북 CPU(파이썬 3.9, numpy 2.0)에서 직접 돌린 값입니다. 코드는 이 폴더의 code/01_conv.py 에 있고 몇 초 안에 끝납니다. 논문 수치는 원문을 열어 조건과 함께 옮겼습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.

목차

1. 왜 그림에는 특별한 구조가 필요한가

휴대폰 사진 한 장은 수백만 개의 숫자(화소)입니다. 이것을 보통의 신경망, 곧 완전 연결층(모든 입력이 모든 출력과 연결된 층)에 넣으면 연결 수가 폭발합니다. 32×32 흑백 그림을 28×28 크기의 특징 지도 6장으로 바꾸는 층 하나만 보아도 그렇습니다.

방식 학습할 숫자(가중치)
완전 연결층 4,821,600개
5×5 합성곱 필터 6개 156개

(직접 계산, code/01_conv.py [5]. 합성곱은 필터 6개 × (25 + 편향 1).)

3만 배 차이가 나는 이유는 그림에 있는 두 가지 성질 때문입니다.

  1. 가까운 화소끼리 관계가 깊다(국소성). 공의 윤곽을 알아보는 데 반대편 구석 화소는 필요 없습니다.
  2. 같은 무늬는 어디에 있어도 같은 무늬다(위치 이동에 대한 같음). 화면 왼쪽의 공과 오른쪽의 공은 같은 방법으로 찾으면 됩니다.

합성곱은 이 두 가정을 구조에 박아 넣은 연산입니다. 작은 창만 보고(국소성), 같은 필터를 그림 전체에 돌려씁니다(가중치 공유). 이 「가정을 구조에 넣는 것」을 귀납 편향이라고 부르는데, 7편의 Vision Transformer 가 바로 이것을 버리면서 무엇을 대가로 치르는지 보게 됩니다.

2. 합성곱: 작은 창을 밀며 곱하고 더하기

합성곱: 3×3 창을 밀며 곱하고 더하기 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 입력 6×6 필터(학습) -1 0 1 -2 0 2 -1 0 1 0 4 4 0 0 4 4 0 0 4 4 0 0 4 4 0 출력 4×4 경계에서만 크다 창 9칸 × 필터 9칸을 곱해 모두 더하면 출력 한 칸 층을 쌓으면 한 칸이 보는 범위(수용 영역)가 넓어진다 3×3 한 층 3px 두 층 5px + 풀링(보폭 2) 6px 3×3 세 층 더 18px
그림: 입력 위를 3×3 창이 밀려가며 필터와 곱해 더하고, 층을 쌓을수록 한 칸이 보는 범위가 넓어지는 모습

계산은 단순합니다. 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 의 핵심은 필터의 숫자를 데이터에서 배운다는 것입니다. 배우는 방법은 세 단계입니다.

  1. 손실 함수: 지금 필터로 낸 출력이 정답과 얼마나 다른지 숫자 하나로 잽니다. 여기서는 오차 제곱의 평균(MSE)입니다.
  2. 역전파: 필터의 숫자 9개 각각을 조금 바꾸면 손실이 얼마나 바뀌는지(기울기)를 계산합니다. 합성곱의 경우 「출력 오차」와 「입력」을 다시 합성곱하면 필터의 기울기가 나옵니다.
  3. 경사 하강: 기울기의 반대 방향으로 필터를 조금 옮깁니다. 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 만 봅니다. 공 전체나 선수의 팔을 알아보려면 더 넓게 보아야 합니다. 방법은 둘입니다.

출력 한 칸이 입력에서 영향을 받는 범위를 수용 영역이라고 합니다. 층마다 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 전체를 보는 것과 맞물립니다).

이 논문이 보인 것은 「특징을 사람이 설계하지 않고, 합성곱 구조와 역전파로 처음부터 끝까지 배울 수 있다」는 것입니다. 그러나 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% 가 앙상블 수치라는 점은 자주 빠지는 조건입니다.

무엇이 차이를 만들었는지 논문이 직접 잰 것들을 보면 「왜 이렇게 설계했나」가 보입니다.

정리하면 AlexNet 의 교훈은 「새 아이디어 하나」가 아니라 큰 데이터 + 빠른 계산 + 큰 망을 학습 가능하게 만드는 기법들의 조합입니다. 이후 10년의 비전 모델은 대부분 이 공식 위에 있습니다.

7. 한계

8. 우리 프로젝트와의 연결

TT Score 의 공 찾기 모델(WASB·BlurBall)은 2026년에도 합성곱 신경망입니다. 이유는 이 글의 내용 그대로입니다.

자세한 구조와 실측은 TT Score 모델 해부 2편: 공 찾기에 있습니다. 다음 글은 깊은 망을 학습 가능하게 만든 잔차 연결과 배치 정규화입니다.

티티 한마디. 필터한테 「세로 경계를 찾아」라고 말한 적이 없는데, 500걸음 만에 소벨 필터가 됐어요. 데이터가 원하는 모양으로 필터가 스스로 바뀌는 거예요.

참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다