1. Convolution Layer란?
Convolution Layer(합성곱 층)는 딥러닝 모델, 특히 CNN(Convolutional Neural Network)에서 사용하는 층입니다.
주요 역할은 “입력 데이터(예: 이미지, 시계열 데이터)에서 중요한 특징(feature)을 뽑아내는 것”입니다.
—
1.1. 작동 원리
- 작은 필터(또는 커널)을 가지고 입력 데이터 위를 쓱쓱 움직이며(슬라이딩)
- 겹치는 부분끼리 곱하고 더해서 하나의 값을 만듭니다.
- 이걸 반복해서 하나의 feature map(특징 맵)을 만듭니다.
즉,
"필터 × 입력 데이터" → "특징 추출"
—
특징
- 파라미터 수가 적습니다. (전체 입력을 연결하는 Fully Connected Layer보다 훨씬 적어요.)
- 지역적인 패턴(부분 특징)을 잘 포착합니다.
- 스트라이드(몇 칸씩 이동할지), 패딩(입력을 둘러싸는 여백) 등을 조절해서 다양한 크기의 출력을 만들 수 있습니다.
- 여러 개의 필터를 사용하면 여러 특징을 동시에 추출할 수 있어요!
—
그림으로 보면 이런 느낌이에요:
(필터) × (입력 조각) → (출력 값 하나)
→ 이렇게 해서 전체 feature map을 채워 나갑니다.
2. Convolution layer 예시 I
1D Convolution
에서 입력 채널이 3개인 경우 어떻게 연산되는지 간단한 예제를 하나 보여드릴게요.
조건
- 입력: (채널 수 = 3, 길이 = 5)
- 커널: (입력 채널 = 3, 커널 크기 = 3)
- 출력 채널 수: 1개
- 스트라이드: 1
- 패딩: 없음
입력 텐서 (3채널)
Input[0] (채널 0): [1, 2, 3, 4, 5]
Input[1] (채널 1): [5, 4, 3, 2, 1]
Input[2] (채널 2): [1, 1, 1, 1, 1]
커널(weight) (입력 채널마다 따로 있음)
Weight[0] (채널 0용): [1, 0, -1]
Weight[1] (채널 1용): [0, 1, 0]
Weight[2] (채널 2용): [1, 1, 1]
연산 방법 요약
1. 각 채널별로: 입력에 해당 채널의 커널을 1D 컨볼루션 (dot product) 적용합니다.
2. 채널별 결과를 합산합니다.
3. (옵션) bias 추가 (지금은 생략할게요.)
Step-by-Step 계산
첫 번째 위치 (Input index 0 ~ 2)
- 채널 0: (1×1) + (2×0) + (3×-1) = 1 + 0 - 3 = -2
- 채널 1: (5×0) + (4×1) + (3×0) = 0 + 4 + 0 = 4
- 채널 2: (1×1) + (1×1) + (1×1) = 1 + 1 + 1 = 3
합산: (-2) + 4 + 3 = 5
두 번째 위치 (Input index 1 ~ 3)
- 채널 0: (2×1) + (3×0) + (4×-1) = 2 + 0 - 4 = -2
- 채널 1: (4×0) + (3×1) + (2×0) = 0 + 3 + 0 = 3
- 채널 2: (1×1) + (1×1) + (1×1) = 1 + 1 + 1 = 3
합산: (-2) + 3 + 3 = 4
세 번째 위치 (Input index 2 ~ 4)
- 채널 0: (3×1) + (4×0) + (5×-1) = 3 + 0 - 5 = -2
- 채널 1: (3×0) + (2×1) + (1×0) = 0 + 2 + 0 = 2
- 채널 2: (1×1) + (1×1) + (1×1) = 1 + 1 + 1 = 3
합산: (-2) + 2 + 3 = 3
최종 출력
[5, 4, 3]
정리
- 입력 3채널 각각에 대해 컨볼루션 결과를 구한 다음,
- 같은 위치끼리 더해서 하나의 출력값으로 만듭니다.
- 따라서 최종 결과는 (출력 채널 수, 길이) = (1, 3)이 됩니다.
3. Convlution layer 예시 II
1D Convolution에서 입력 길이와 출력 길이를 같게 만들고 싶으면
"padding"을 적절히 설정하면 됩니다.
—
조금 자세히 설명하면:
1D convolution의 출력 길이 공식은 이렇습니다:
Output Length=⌊StrideInput Length+2×Padding−Kernel Size⌋+1
여기서
- stride = 1
- padding을 잘 설정하면
→ 입력 길이 = 출력 길이 가 됩니다.
—
예시
- 입력 길이: 5
- 커널 크기: 3
- stride: 1
- padding: 1
계산해보면:
Output Length=⌊15+2×1−3⌋+1=(5)+1=6
어? 6이네요. 입력이 5였는데 6이 됐습니다.
→ padding을 약간 다르게 잡아야 해요.
—
정확히 입력과 출력 길이를 같게 만들려면
padding은 이렇게 설정해야 합니다:
Padding=2Kernel Size−1
즉, 커널 크기가 홀수여야 (예: 3, 5, 7) padding을 정확히 나눌 수 있어요.
- 커널 크기 3이면 padding=1
- 커널 크기 5이면 padding=2
- 커널 크기 7이면 padding=3
이렇게 하면 입력 길이와 출력 길이가 똑같아집니다.
—
정리
- stride = 1
- 커널 크기 = 홀수 (3, 5, 7, …)
- padding = (커널 크기 - 1) / 2
이렇게 세팅하면 됩니다!