도구스학업·수학

이산 합성곱(컨볼루션) 계산기

두 수열의 선형 합성곱과 순환 합성곱을 구하고 자리마다 어떤 곱이 더해졌는지 보입니다. 결과가 다항식 곱셈의 계수와 같다는 것을 검산으로 확인하고, full·same·valid 경계 처리로 CNN 출력 크기가 어떻게 정해지는지도 함께 봅니다.

쉼표나 공백으로 나눠 적습니다. 16개까지.

합성곱은 이쪽을 뒤집어 미끄러뜨립니다.

합성곱 (full (N+M−1))

4, 13, 22, 15

신호 3개와 커널 2개의 합성곱은 full로 4개입니다. 다항식 차수가 (N−1)+(M−1)이므로 항이 그보다 하나 더 많은 것입니다.

full (N+M−1)4개
same (N)3개
valid (N−M+1)2개

다항식으로 보면

A(x) = 1 + 2·x + 3·x^2

B(x) = 4 + 5·x

A·B = 4 + 13·x + 22·x^2 + 15·x^3

검산: x = 2에서 A(2)·B(2) = 238이고 (A·B)(2) = 238입니다. 합성곱이 맞다면 어떤 x에서도 두 값이 같아야 합니다. x^k의 계수를 모으려면 i + j = k인 항을 다 더해야 하는데, 그것이 바로 Σ a[i]·b[k−i]입니다.

자리마다 무엇이 더해졌나

k더한 곱c[k]
0a[0]·b[0]4
1a[0]·b[1] + a[1]·b[0]13
2a[1]·b[1] + a[2]·b[0]22
3a[2]·b[1]15

어느 줄에서나 두 색인의 합이 k입니다. a의 색인이 커지면 b의 색인이 작아지므로, b를 뒤집어 놓고 미끄러뜨리는 그림이 됩니다. 이 뒤집기가 합성곱과 상관을 가르는 유일한 차이입니다.

뒤집지 않으면 — 상관

합성곱 (뒤집음)4, 13, 22, 15
상관 (안 뒤집음)5, 14, 23, 12
두 결과가다릅니다

커널이 앞뒤 대칭이면 뒤집으나 마나 같습니다. 「미분 필터」 예제처럼 비대칭이면 달라집니다. 신호처리에서 「필터를 적용한다」는 것은 합성곱이고 「닮은 곳을 찾는다」는 것은 상관인데, 딥러닝의 컨볼루션 층은 사실 대부분 상관을 씁니다 — 가중치를 학습으로 정하니 뒤집으나 마나 표현력이 같아 그 단계를 뺀 것입니다.

순환 합성곱

선형 합성곱과 같아지려면 4 이상이어야 합니다.

순환 (N=3)19, 13, 22
선형과다릅니다 — 넘친 것이 앞으로 되돌아왔습니다

순환 합성곱은 신호가 주기적이라고 보고 끝에서 넘친 것을 앞으로 되돌립니다. 선형 합성곱 결과를 N마다 접어 더한 것과 정확히 같습니다. FFT로 합성곱을 빠르게 계산하면 나오는 것이 이쪽이라, 선형 합성곱을 원하면 0을 충분히 채워 N을 N+M−1 이상으로 만들어야 합니다. 이 0 채우기를 빼먹어 앞뒤가 섞이는 것이 FFT 합성곱의 1순위 사고입니다.

경계 처리가 결과 길이를 가릅니다. full은 바깥을 0으로 채워 N+M−1개, valid는 커널이 완전히 안에 든 자리만 남겨 N−M+1개, same은 가운데를 잘라 입력과 길이를 맞춥니다. CNN의 출력 크기 공식 ⌊(N−M+2P)/S⌋+1에서 패딩 0·보폭 1이면 valid이고, 패딩 (M−1)/2면 same입니다. 이미지 필터를 걸 때마다 그림이 조금씩 줄어드는 것이 valid이고, 줄지 않게 하려고 테두리를 채우는 것이 same입니다.

계산 방법

  1. 1신호 a와 커널 b를 쉼표나 공백으로 나눠 적습니다.
  2. 2경계 처리를 고릅니다. full·same·valid에 따라 결과 길이가 달라집니다.
  3. 3「자리마다 무엇이 더해졌나」에서 두 색인의 합이 언제나 k인 것을 확인합니다.
  4. 4「뒤집지 않으면 — 상관」에서 비대칭 커널일 때 결과가 갈리는 것을 봅니다.
  5. 5순환 합성곱의 주기 N을 줄여 넘친 값이 앞으로 되돌아오는 것을 확인합니다.

자주 묻는 질문

c[k] = Σ a[i]·b[k−i]입니다. 두 색인의 합이 k가 되는 곱을 모두 더합니다. b의 색인에 마이너스가 붙어 있어서, a의 색인이 커지면 b의 색인이 작아집니다 — 그래서 b를 뒤집어 놓고 a 위로 미끄러뜨리는 그림이 됩니다.

한쪽을 뒤집느냐 아니냐만 다릅니다. 합성곱은 c[k] = Σ a[i]·b[k−i]로 커널을 뒤집고, 상관은 r[k] = Σ a[i]·b[i+k]로 그대로 미끄러뜨립니다. 커널이 앞뒤 대칭이면 결과가 같고 비대칭이면 다릅니다. 신호처리에서 「필터를 적용한다」는 것은 합성곱, 「닮은 곳을 찾는다」는 것은 상관입니다.

대부분 아닙니다. CNN의 컨볼루션 층은 커널을 뒤집지 않으므로 엄밀히는 상관입니다. 가중치를 학습으로 정하기 때문에 뒤집으나 마나 표현력이 같아 그 단계를 뺀 것입니다. 이름만 합성곱으로 굳었습니다.

다항식 곱셈의 차수를 생각하면 바로 나옵니다. 계수가 N개인 다항식은 차수가 N−1이고, M개짜리는 M−1입니다. 둘을 곱하면 차수가 (N−1)+(M−1)이 되므로 항의 개수는 그보다 하나 많은 N+M−1입니다. 실제로 두 다항식을 곱한 계수가 정확히 합성곱입니다.

커널이 신호 끝을 벗어나는 자리를 어떻게 하느냐입니다. full은 바깥을 0으로 채워 N+M−1개를 모두 내고, valid는 커널이 완전히 안에 든 자리만 남겨 N−M+1개, same은 가운데를 잘라 입력과 길이를 맞춰 N개를 냅니다. CNN 출력 크기 공식 ⌊(N−M+2P)/S⌋+1에서 패딩 0·보폭 1이면 valid, 패딩 (M−1)/2면 same입니다.

FFT로 합성곱을 빠르게 계산할 때 나옵니다. FFT는 신호를 주기적이라고 보므로 끝에서 넘친 것이 앞으로 되돌아옵니다. 선형 합성곱을 원한다면 0을 충분히 채워 길이를 N+M−1 이상으로 만들어야 하며, 이 0 채우기를 빼먹어 앞뒤가 섞이는 것이 FFT 합성곱의 가장 흔한 사고입니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 다항식 값으로 했습니다. c가 a와 b의 합성곱이면 어떤 x에서도 C(x) = A(x)·B(x)여야 하므로, 무작위 수열 500벌을 여러 x에서 대조했습니다. 계수를 직접 비교하는 것과 달리 유도가 다른 검산입니다.
  • 교환·결합·분배법칙이 성립하는지, 단위 신호와의 합성곱이 원래 신호인지, 지연된 단위 신호가 신호를 그만큼 미는지도 확인했습니다.
  • 순환 합성곱이 선형 합성곱을 주기마다 접어 더한 것과 정확히 같은지 무작위 입력 300벌로 대조했습니다. 0을 덜 채우면 넘친 값이 앞으로 되돌아오는 것도 구체적인 값으로 고정해 두었습니다.
  • same 모드에서 커널이 짝수 길이일 때 어느 쪽으로 치우칠지는 규약이 갈립니다. 여기서는 넘파이와 같게 앞쪽을 ⌊(M−1)/2⌋만큼 버립니다.
  • 단계별로 더한 곱의 합이 결과와 맞는지, 두 색인의 합이 언제나 k인지도 무작위 입력으로 확인했습니다.
  • 수열은 각각 16개까지 다룹니다. 자리마다 더한 곱을 모두 보이는 것이 목적이라 그보다 크면 화면이 읽히지 않습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.