conv_img = [[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]]
conv_ker = [[1,0,1],[0,1,0],[1,0,1]]
conv_fmap = [[4,3,4],[2,4,3],[2,3,4]]
conv_steps = {
const img = conv_img, ker = conv_ker;
const steps = [];
for (let r = 0; r < 3; r++) {
for (let c = 0; c < 3; c++) {
const prods = [];
let sum = 0;
for (let kr = 0; kr < 3; kr++)
for (let kc = 0; kc < 3; kc++) {
const v = img[r+kr][c+kc] * ker[kr][kc];
prods.push(v);
sum += v;
}
steps.push({step: r*3+c, row: r, col: c, result: sum, products: prods});
}
}
return steps;
}8 콘볼루션 연산
8.1 콘볼루션이란?
8.1.1 왜 콘볼루션인가?
Ch05에서 완전연결 신경망의 두 가지 문제를 확인했다: 공간 정보 손실과 파라미터 폭발.
이 두 문제를 동시에 해결하는 연산이 콘볼루션(Convolution)이다. 핵심 아이디어는 이미지 전체를 한 번에 처리하는 대신, 작은 창(커널)으로 이미지를 훑으면서 국소적 패턴을 감지하는 것이다.
8.1.2 커널 (Kernel)
예를 들어, 다음은 \(3 \times 3\) 커널이다:
\[\mathbf{K} = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}\]
이 커널은 이미지에서 대각선 패턴에 반응한다 — 대각 위치(1이 있는 곳)의 밝은 픽셀이 많을수록 큰 값을 출력한다.
8.2 콘볼루션 연산 과정
8.2.1 단계별 수행
콘볼루션은 커널을 이미지의 왼쪽 위부터 오른쪽 아래 방향으로 한 칸씩 이동하면서, 겹치는 영역의 원소별 곱의 합(element-wise product → sum)을 계산하는 연산이다.
위 예시에서 9개 스텝이 완료되면 \(3 \times 3\) 특성 맵(Feature Map)이 만들어진다.
\[\text{Feature Map} = \begin{bmatrix} 4 & 3 & 4 \\ 2 & 4 & 3 \\ 2 & 3 & 4 \end{bmatrix}\]
8.2.2 특성 맵의 의미
커널이 다르면 포착하는 특성도 달라진다:
| 커널 종류 | 효과 |
|---|---|
| 선명화(Sharpen) | 경계를 강조하여 이미지를 또렷하게 |
| 에지 검출(Edge Detect) | 밝기가 급변하는 경계선만 추출 |
| 블러(Blur) | 주변 픽셀의 평균으로 이미지를 부드럽게 |
8.2.3 손계산 예시 — 에지 검출 커널
“커널이 패턴을 감지한다”를 눈으로 확인해 보자. 왼쪽 절반은 밝고(\(10\)) 오른쪽 절반은 어두운(\(0\)) 이미지에, 세로 에지 검출 커널을 적용한다.
\[\text{이미지} = \begin{bmatrix} 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 0 & 0 & 0 \end{bmatrix}, \qquad \mathbf{K}_{\text{edge}} = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix} \quad\Longrightarrow\quad \text{특성 맵} = \begin{bmatrix} 30 & 30 & 0 \\ 30 & 30 & 0 \\ 30 & 30 & 0 \end{bmatrix}\]
맨 왼쪽 위 칸의 계산을 직접 따라가면 (패치의 각 열 값: \(10, 10, 0\)):
\[\underbrace{(10 \times 1 + 10 \times 0 + 0 \times (-1))}_{\text{1행}} + \underbrace{(\cdots)}_{\text{2행}} + \underbrace{(\cdots)}_{\text{3행}} = 10 \times 3 = 30\]
특성 맵을 읽어 보자. 값이 큰 곳(30)은 밝음→어두움의 경계가 지나가는 위치이고, 밝기가 균일한 오른쪽 영역(0)에서는 커널이 반응하지 않았다. “왼쪽은 밝고 오른쪽은 어두운 곳”이라는 패턴을 이 커널이 정확히 감지한 것이다.
핵심: 옛날 컴퓨터 비전에서는 이런 커널을 사람이 직접 설계했다. CNN의 혁신은 커널의 값을 학습 데이터로부터 자동으로 학습한다는 것이다 — 어떤 패턴이 유용한지를 데이터가 스스로 결정한다.
8.2.4 여러 커널 = 여러 특성
하나의 커널은 하나의 특성만 감지한다. 이미지에서 다양한 특성을 동시에 포착하려면, 여러 개의 커널을 같은 이미지에 적용한다.
\[\text{이미지} \overset{\text{커널}_1}{\longrightarrow} \text{특성 맵}_1, \quad \text{이미지} \overset{\text{커널}_2}{\longrightarrow} \text{특성 맵}_2, \quad \cdots\]
\(K\)개의 커널을 사용하면 \(K\)개의 특성 맵이 생성된다.
8.3 Ch05의 두 문제는 어떻게 풀렸나
이 장 첫머리에서 콘볼루션이 FC의 두 문제를 해결한다고 했다. 이제 확인할 수 있다.
8.3.1 문제 1 해결 — 가중치 공유 (Weight Sharing)
위의 단계별 인터랙티브를 다시 보자. 커널이 9번 이동하는 동안, 커널 안의 9개 값은 한 번도 바뀌지 않았다.
Ch05의 “같은 패턴, 다른 위치” 실험에서 FC는 패턴이 한 칸만 이동해도 전혀 다른 노드·가중치가 처음부터 다시 배워야 했다. 콘볼루션은 정반대다 — 같은 가중치(커널)가 모든 위치를 순회하므로, 왼쪽에서 학습한 패턴 감지기가 오른쪽에서도 그대로 작동한다. 패턴이 어디에 있든 같은 방법으로 찾는 것이다.
8.3.2 문제 2 해결 — 파라미터 절약
커널 하나의 파라미터 수는 커널 크기가 전부다: \(K \times K \times C + 1\) (가중치 + 편향 1개). Ch05에서 본 FC와 직접 비교해 보자 (입력: \(224 \times 224 \times 3\) 컬러 이미지).
| 방식 | 구성 | 첫 층의 파라미터 수 |
|---|---|---|
| FC | 입력 150,528 노드 → 은닉 256 노드 | $150{,}528 + 256 = $ 약 3,850만 개 |
| 콘볼루션 | \(3 \times 3 \times 3\) 커널 32개 | $(3 + 1) = $ 896개 |
약 4만 배 차이다. 게다가 콘볼루션의 파라미터 수는 커널 크기와 개수로만 결정되므로, 이미지가 아무리 커져도 늘어나지 않는다.
커널 안의 각 값은 Ch02 퍼셉트론의 가중치 \(w\)와 완전히 같은, 학습되는 파라미터다. 콘볼루션은 “작은 영역만 보는 퍼셉트론 하나를 모든 위치에서 재사용하는 것”이라고 요약할 수 있다.
8.4 콘볼루션 파라미터
8.4.1 출력 크기 공식
콘볼루션의 출력(특성 맵) 크기는 세 가지 파라미터에 의해 결정된다.
\[\text{출력 크기} = \left\lfloor \frac{N - K + 2P}{S} \right\rfloor + 1\]
- \(N\): 입력 이미지 크기
- \(K\): 커널 크기
- \(P\): 패딩 (Padding)
- \(S\): 스트라이드 (Stride)
8.4.2 커널 크기 (Kernel Size)
커널이 패턴을 얼마나 넓은 영역에서 감지할 것인가를 결정한다.
| 5×5 이미지 | 커널 크기 | 특성 맵 크기 |
|---|---|---|
| 5×5 | 2×2 | 4×4 |
| 5×5 | 3×3 | 3×3 |
| 5×5 | 4×4 | 2×2 |
커널이 클수록 넓은 영역의 패턴을 감지하지만, 출력 크기는 줄어든다.
8.4.3 스트라이드 (Stride)
8.4.4 패딩 (Padding)
8.5 3차원 이미지의 콘볼루션
8.5.1 컬러 이미지와 3D 커널
Ch05에서 컬러 이미지는 \(H \times W \times 3\) (RGB)임을 배웠다. 3차원 이미지에 콘볼루션을 적용하려면 커널도 3차원이어야 한다.
\[\text{이미지}: 5 \times 5 \times 3 \quad \overset{3 \times 3 \times 3 \text{ 커널}}{\longrightarrow} \quad \text{특성 맵}: 3 \times 3 \times \mathbf{1}\]
핵심: 커널의 채널 수 = 입력 이미지의 채널 수
연산 과정:
- R 채널: 이미지의 R 채널과 커널의 R 채널로 콘볼루션 → \(3 \times 3\) 결과
- G 채널: 이미지의 G 채널과 커널의 G 채널로 콘볼루션 → \(3 \times 3\) 결과
- B 채널: 이미지의 B 채널과 커널의 B 채널로 콘볼루션 → \(3 \times 3\) 결과
- 세 결과를 원소별로 합산 → 최종 \(3 \times 3 \times 1\) 특성 맵
핵심: 하나의 3D 커널은 하나의 2D 특성 맵을 만든다. \(K\)개의 커널을 사용하면 출력은 \(3 \times 3 \times K\)가 된다.
8.5.2 출력 채널 수 = 커널 개수
| 입력 | 커널 구성 | 출력 |
|---|---|---|
| \(5 \times 5 \times 3\) | \(3 \times 3 \times 3\) 커널 1개 | \(3 \times 3 \times \mathbf{1}\) |
| \(5 \times 5 \times 3\) | \(3 \times 3 \times 3\) 커널 2개 | \(3 \times 3 \times \mathbf{2}\) |
| \(5 \times 5 \times 3\) | \(3 \times 3 \times 3\) 커널 32개 | \(3 \times 3 \times \mathbf{32}\) |
이렇게 만들어진 출력은 다시 다음 콘볼루션 층의 입력이 된다. 이것이 CNN에서 층을 깊이 쌓을 수 있는 원리다.
8.6 정리
| 핵심 내용 | 요약 |
|---|---|
| 콘볼루션 | 커널을 이미지 위에서 훑으며 원소별 곱의 합을 계산하는 연산 |
| 커널 | 특정 패턴을 감지하는 작은 가중치 행렬 (학습으로 결정) |
| 특성 맵 | 콘볼루션의 출력 — 값이 클수록 해당 패턴과 일치 |
| 출력 크기 | \(\lfloor(N - K + 2P) / S\rfloor + 1\) |
| 3D 콘볼루션 | 채널별로 콘볼루션 후 합산 → 1개 커널 = 1개 특성 맵 |
다음 장 예고: 콘볼루션 층에 활성화 함수, 풀링, 완전연결층을 결합하여 완전한 CNN(Convolutional Neural Network)을 구성하고, 대표적인 CNN 아키텍처들을 살펴본다.