팽창 합성곱(Dilated Convolution)이란? AI에서 필터의 점 간격을 넓혀 주변 문맥을 보는 방법
TL;DR
팽창 합성곱은 필터 안의 계산 지점 사이 간격을 벌려 더 넓은 입력 범위를 살피는 합성곱입니다. 같은 크기의 가중치 배열로 떨어진 위치를 조합합니다. 창 전체의 이동 간격인 보폭이나 채널 연결을 나누는 깊이별 합성곱과 다릅니다. 적절한 보폭·패딩을 함께 쓰면 공간 크기를 유지하며 문맥을 모을 수 있지만, 범위 안의 모든 점을 직접 보거나 정확도·속도를 보장하지는 않습니다.[1][2][5]
핵심 3줄 요약
- 핵심 1
필터 내부 간격을 바꿉니다. 팽창률 2는 이웃 가중치가 입력에서 두 칸 간격의 위치를 읽는 설정입니다. - 핵심 2
가중치 수와 보는 범위는 다릅니다. 3×3 필터에 팽창률 2를 쓰면 5×5 범위의 아홉 지점을 계산합니다. - 핵심 3
보폭·패딩도 함께 봅니다. 출력 크기와 경계값은 별도 설정에 좌우되며 간격만 늘려 해상도가 자동 유지되지는 않습니다.
이 글에서 다룰 내용
- 팽창 합성곱의 한 문장 정의
- 일곱 숫자와 세 가중치로 보는 간격 계산
- AI에서 문맥을 넓히는 이유와 작동 순서
- 팽창률·유효 크기·보폭·패딩·입력 축
- 일반·깊이별 합성곱·풀링·픽셀 셔플과의 차이
- 모델 구조 점검과 작은 배열 체크리스트
- 빠지는 위치·가장자리·실제 성능의 주의점
팽창 합성곱을 한 문장으로 정의하면 무엇인가요?
팽창 합성곱은 필터 가중치에 대응하는 입력 위치를 일정한 간격으로 띄워, 가중치 배열의 크기를 늘리지 않고 더 넓은 공간 범위를 계산하는 연산입니다. 영문명은 Dilated Convolution이며 확장 합성곱 또는 Atrous Convolution이라고도 부릅니다.[1][2]
여기서 팽창은 입력 이미지를 확대하거나 새 픽셀을 만드는 일이 아닙니다. 필터가 읽는 위치 사이의 간격을 바꿉니다. 팽창률이 1이면 일반적인 촘촘한 합성곱이고, 2이면 가중치 사이마다 입력 한 칸을 건너뜁니다. 값이 놓인 위치와 가중치의 대응이 달라지는 설정입니다.[1][2]
딥러닝의 합성곱 층은 보통 필터를 뒤집지 않는 교차상관을 계산합니다. 이 글도 그 관례를 따릅니다. atrous라는 이름이 웨이블릿 분해의 à trous 알고리즘과 연결되지만, 원 논문은 팽창 합성곱 연산 하나와 분해 알고리즘 전체를 구별합니다.[1][5]
한 줄 정리: 가중치의 개수를 늘리는 대신, 그 가중치가 닿는 입력 위치를 더 멀리 벌립니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 원리를 보려고 한 줄짜리 설명용 입력
[1,2,3,4,5,6,7]
과 필터
[1,2,3]
을 준비했다고 가정하겠습니다. 보폭은 1, 패딩은 없고 편향과 활성화 함수도 제외합니다. 이미지에서는 같은 규칙을 높이·너비 양쪽에 적용합니다.
팽창률 1의 첫 계산은 연속된 세 값에 필터를 곱한
1*1+2*2+3*3=14
입니다. 창을 한 칸씩 옮기면 전체 출력은
[14,20,26,32,38]
입니다. 입력 일곱 칸에서 세 칸짜리 창이 들어가는 다섯 위치를 계산했습니다.
팽창률을 2로 바꾸면 첫 위치에서
[1,3,5]
를 읽어
1*1+3*2+5*3=22
를 얻습니다. 다음 위치는
[2,4,6]
, 그다음은
[3,5,7]
을 읽습니다. 전체 출력은
[22,28,34]
입니다. 가중치는 여전히 세 개지만 필요한 입력 범위가 다섯 칸으로 넓어져 출력 위치는 줄었습니다.[1][2]
같은 입력에 팽창률 1과 보폭 2를 쓰면
[14,26,38]
입니다. 팽창률 2의
[22,28,34]
와 출력 개수는 같아도 값은 다릅니다. 창을 옮기는 거리와 한 창 안에서 읽는 거리의 차이를 숫자로 확인할 수 있습니다.
이 계산과 뒤의 크기·위치 예시는 Python 표준 라이브러리로 직접 검산한 교육용 산술입니다. PyTorch·TensorFlow·Keras의 연산을 호출하거나 모델을 학습한 결과는 아닙니다. 필터도 계산을 드러내려고 직접 정했으며 실제 학습 가중치가 아닙니다.
쉬운 예시: 세 손가락으로 숫자를 짚되 손가락 사이를 벌리는 일입니다. 손 전체를 다음 위치로 옮기는 보폭과는 따로 생각합니다.
왜 AI에서 팽창 합성곱이 중요한가요?
공간 위치를 남기면서 문맥을 모읍니다
픽셀마다 범주를 정하는 이미지 분할에서는 주변 문맥과 세밀한 위치를 함께 살핍니다. Yu·Koltun 원 논문은 풀링이나 서브샘플링 없이 팽창률을 조합하는 문맥 모듈을 제시합니다. 해상도를 계속 줄이는 설계와 다른 선택지를 설명한 연구이며 모든 모델에서 성능 향상을 보장한다는 뜻은 아닙니다.[5]
필터 크기와 수용 영역을 나누어 읽습니다
수용 영역은 한 출력에 영향을 줄 수 있는 입력 위치의 범위입니다. 단일 층의 3×3 필터에 높이·너비 팽창률 2를 주면 5×5 범위를 가로지르지만 직접 읽는 공간 위치는 아홉 개입니다. 같은 범위의 촘촘한 5×5 필터가 갖는 스물다섯 가중치와 다릅니다. 채널 연결은 같다고 가정한 비교입니다.[1][2]
핵심 인사이트: 넓게 본다는 말과 범위 안을 빠짐없이 본다는 말은 다릅니다. 한 층의 아홉 지점과 여러 층을 거친 원본 입력 범위를 나누어 봅니다.
팽창 합성곱은 어떤 순서로 작동하나요?
1. 필터와 읽을 위치의 간격을 정합니다
필터 크기와 각 공간 축의 팽창률을 정합니다. 세 가중치의 상대 위치가 팽창률 1에서
[0,1,2]
라면 팽창률 2에서는
[0,2,4]
입니다. 기준 입력 위치를 더하면 실제로 읽을 좌표가 됩니다. 높이와 너비의 간격은 서로 다르게 지정할 수도 있습니다.[1][3]
2. 떨어진 입력과 가중치의 곱을 합칩니다
선택한 위치마다 입력값에 대응 가중치를 곱해 더합니다. 일반 채널 연결이면 여러 입력 채널의 기여도 합칩니다. 팽창률은 공간 간격 설정이므로 채널별 독립 계산까지 자동으로 켜지지는 않습니다. 채널의 연결 범위는 groups 같은 별도 설정을 확인합니다.[1][4]
3. 보폭에 따라 다음 출력 위치를 계산합니다
한 출력을 구한 뒤 기준 위치를 보폭만큼 옮깁니다. 바깥 입력이 필요하면 패딩 규칙을 적용합니다. TensorFlow 문서는 필터 사이에 0을 끼운 촘촘한 필터로도 같은 계산을 설명하지만, 실제 구현에서 반드시 그 큰 배열을 저장하지는 않습니다. 연산의 동등성과 구현 방법을 구별합니다.[2][5]
실전 팁: 기준 위치·보폭·필터 내부 간격을 따로 표시하세요. 출력 한 칸이 어떤 입력 좌표를 읽었는지 적으면 두 간격을 혼동하기 어렵습니다.
주요 설정과 결과는 어떻게 읽나요?
dilation과 유효 필터 크기를 구별합니다
한 축에서 필터 크기를 k, 팽창률을 d라고 하면 유효 범위의 길이는
d*(k-1)+1
입니다. k가 3일 때 d가 1·2·3이면 각각 3·5·7칸입니다. d가 2라는 말은 두 칸을 건너뛴다는 뜻이 아니라 두 칸 간격으로 읽는다는 뜻이므로 사이에 빠지는 칸은 하나입니다.[1][2]
PyTorch는
dilation
, Keras는
dilation_rate
, ONNX Conv는
dilations
라는 이름을 씁니다. 확인한 문서에서 기본 간격은 각 축에서 1입니다. TensorFlow의
atrous_conv2d
는 두 공간 축에 같은 정수 rate를 적용하는 호환용 래퍼이며, 문서는 더 일반적인
tf.nn.convolution
도 안내합니다.[1][2][3][4]
보폭과 패딩으로 출력 크기를 확인합니다
PyTorch의 한 축 크기식은 정수 패딩 p와 보폭 s에 대해
floor((L+2*p-d*(k-1)-1)/s+1)
입니다. 앞 입력처럼 L이 7, k가 3, d가 2, s가 1이고 패딩이 없으면 출력 길이는 3입니다. 양쪽에 0을 두 칸씩 붙이면 길이는 7로 유지되지만 경계 계산에는 추가한 0이 들어갑니다.[1]
Keras의
padding="same"
과 보폭 1은 입력 공간 크기를 유지합니다. PyTorch의 문자열 same도 보폭 1만 지원합니다. Keras는 보폭이 1보다 큰 설정과 팽창률이 1보다 큰 설정을 함께 허용하지 않습니다. 이를 모든 합성곱 라이브러리에 공통된 수학적 금지처럼 옮겨 말하지 않습니다.[1][3]
입력 축과 가중치 모양을 함께 봅니다
배치 입력에서 PyTorch Conv2d는 채널이 공간 축 앞에 오고, TensorFlow atrous_conv2d는
[배치,높이,너비,채널]
을 받습니다. Keras는 data_format을 명시해 구별합니다. 같은 숫자 배열도 축의 의미가 다르면 다른 계산이므로 입력과 필터의 축 순서를 각각 확인합니다.[1][2][3]
ONNX에서는 간격과 패딩 배치를 확인합니다
ONNX Conv는
dilations
와
strides
를 공간 축마다 기록하고 채널 연결은
group
으로 정합니다.
pads
는 각 축의 앞쪽 값들을 먼저 놓고 뒤쪽 값들을 이어 적습니다.
auto_pad
의 SAME_UPPER와 SAME_LOWER는 홀수 패딩의 추가 한 칸을 붙이는 쪽이 다릅니다. 변환 뒤 크기뿐 아니라 경계값도 대조합니다.[4]
팽창 합성곱과 헷갈리는 용어는 무엇이 다른가요?
일반 합성곱·큰 필터와의 차이
팽창률 1은 촘촘한 일반 합성곱과 연결됩니다. 팽창률 2의 3×3 필터와 촘촘한 5×5 필터는 바깥 범위가 같아도 읽는 위치와 학습 가중치 수가 다릅니다. 큰 필터의 모든 가중치를 팽창 필터에 그대로 담을 수 있다고 보지 않습니다.[1][2]
깊이별 합성곱·풀링과의 차이
깊이별 합성곱은 채널마다 전용 필터를 적용하는 연결 방식이고 팽창 합성곱은 공간에서 읽는 간격을 정하는 방식입니다. 둘은 함께 사용할 수도 있습니다. 기존 깊이별 합성곱 글은 채널 배수와 독립 계산을 다루며, 이 글의 입력 위치·유효 범위·건너뛰는 점 계산과는 검색 질문이 다릅니다.[1]
최대 풀링은 창 안에서 최댓값을 고릅니다. 팽창 합성곱은 가중합을 계산합니다. 두 연산에 dilation이라는 인자가 있더라도 결과를 만드는 규칙까지 같아지지는 않습니다. 보폭으로 공간 크기를 줄이는 효과와 필터 안의 간격도 구별합니다.
픽셀 셔플·입력 확대와의 차이
픽셀 셔플은 채널의 값을 공간 위치로 재배치합니다. 팽창 합성곱은 입력 좌표를 띄워 읽어 가중합을 만들며 채널 값을 공간으로 옮기는 연산이 아닙니다. 입력의 해상도를 보간으로 높이지도 않습니다. 넓은 문맥을 읽는 일과 출력의 픽셀 수를 늘리는 일을 나누어 봅니다.
비교 정리: 팽창은 공간 간격, 깊이별은 채널 연결, 보폭은 출력 위치의 이동, 픽셀 셔플은 값의 재배치입니다. 이름보다 입력에서 출력으로 무엇이 바뀌는지 확인합니다.
실전에서는 어디에 쓰이나요?
이미지 분할 모델의 문맥 모듈을 읽습니다
원 논문은 공간 해상도를 줄이지 않는 다중 규모 문맥 집계에 팽창 합성곱을 사용합니다. 구조표에서 필터 크기만 보지 않고 층별 간격과 보폭을 함께 적으면 어느 범위를 조합하는지 살필 수 있습니다. 논문의 실험 결과는 해당 데이터와 학습 조건의 결과이며 자신의 업무 성능으로 대체하지 않습니다.[5]
모델 이식 전후의 공간 대응을 점검합니다
같은 필터 가중치라도 dilation·패딩·입력 축이 달라지면 출력값이 달라집니다. 프레임워크나 ONNX로 옮길 때 작은 배열과 경계 위치부터 비교하는 용도로 원리를 활용합니다. 저장 형식의 변환 성공과 같은 수치·같은 인식 결과의 검증은 별개입니다.[1][3][4]
팽창 합성곱을 적용할 때 어떤 순서로 확인하나요?
1. 입력과 모든 공간 설정을 기록합니다
입력 높이·너비·채널 수와 축 순서, 필터 크기·보폭·팽창률·패딩을 적습니다. 채널 연결과 편향·활성화 유무도 따로 남깁니다. 먼저 한 층의 출력 크기를 계산하고 실제 모델에서는 앞선 층의 보폭까지 포함해 원본 입력을 기준으로 범위를 확인합니다.
2. 작은 배열로 간격과 경계를 대조합니다
서로 다른 숫자를 넣어 팽창률 1과 2를 비교합니다. 같은 출력 개수가 나오는 보폭 변경도 시험해 값이 다른지 확인합니다. 2차원에서는 선택되는 위치와 선택되지 않는 위치에 각각 한 점만 크게 넣어 출력의 영향을 살핍니다. 패딩을 켠 경우 가운데와 가장자리를 따로 비교합니다.
3. 전체 모델의 오류와 실행 비용을 측정합니다
필터 간격을 바꾸면 보던 패턴과 경계 입력이 달라집니다. 기존 모델을 그대로 교체해도 된다고 가정하지 않습니다. 같은 평가 자료에서 작은 대상·경계·범주별 오류를 살피고 실제 기기의 지연 시간과 메모리도 측정합니다. 이 글의 산술 예시는 그런 성능 평가를 대신하지 않습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 넓어진 범위 안의 빈틈을 확인합니다. 같은 간격을 반복하면 일부 입력 위치가 특정 출력으로 연결되지 않을 수 있습니다. 3개짜리 필터를 간격 2로 두 번 적용하는 한 줄 예시에서는 한 출력이 참조하는 상대 좌표가
[0,2,4,6,8]
뿐입니다. 범위는 아홉 칸이지만 홀수 좌표는 빠집니다.
둘째, 층을 쌓은 범위에 단일 층의 크기식을 그대로 쓰지 않습니다. 보폭 1인 3개짜리 필터의 간격을 1·2·4로 쌓은 설명용 경우에는 원본 기준 범위가 3·7·15칸으로 늘어납니다. 앞 층의 출력이 이미 이웃을 모았기 때문입니다. 이 조합을 모든 네트워크의 보장으로 일반화하지 않습니다.[5]
셋째, 같은 공간 크기를 정보 보존과 같게 보지 않습니다. 패딩으로 출력 길이를 유지해도 값은 가중합으로 바뀝니다. 가장자리는 실제 입력 대신 채운 값을 읽을 수 있습니다. 경계 효과와 세밀한 무늬의 누락은 실제 영상에서도 따로 점검합니다.
넷째, 같은 가중치 수를 같은 실행 시간으로 보고하지 않습니다. 위치별 곱셈 수가 같아도 전체 출력 개수, 메모리 접근, 구현과 하드웨어에 따라 비용은 달라집니다. 다른 다운샘플링 구조와 비교한다면 중간 특징 맵 크기까지 포함합니다. 필터의 범위가 넓어진다는 사실만으로 속도나 정확도가 개선됐다고 쓰지 않습니다.
주의: 팽창률은 보는 위치를 바꾸는 설정입니다. 더 큰 숫자를 고르는 것만으로 문맥 이해·경계 복원·인식 성능이 좋아지는 것은 아닙니다.
자주 묻는 질문
Q1. 팽창률 2는 두 칸을 건너뛰나요?
아닙니다. 선택 지점 사이의 간격이 두 칸입니다. 그 사이에서 빠지는 입력은 한 칸입니다. 상대 좌표
[0,2,4]
를 적어 보면 간격과 건너뛴 개수를 구별하기 쉽습니다.[2]
Q2. 팽창 합성곱이면 이미지가 커지나요?
입력을 확대하는 연산이 아닙니다. 패딩이 없으면 넓어진 유효 범위 때문에 출력이 더 작아질 수 있습니다. 공간 크기 유지는 보폭과 패딩까지 함께 정한 결과입니다.[1]
Q3. 3×3에 팽창률 2면 가중치는 25개인가요?
한 입력·출력 채널의 연결에서 공간 가중치는 아홉 개입니다. 5×5는 가로지르는 범위입니다. 전체 가중치 수에는 입력·출력 채널 연결과 그룹을 따로 반영합니다.[1][4]
Q4. atrous와 dilated는 서로 다른 합성곱인가요?
TensorFlow 문서는 같은 연산의 이름으로 설명합니다. 다만 웨이블릿 분해의 à trous 알고리즘 전체와 합성곱 한 번까지 같은 처리라고 부르지는 않습니다.[2][5]
Q5. 깊이별 합성곱과 함께 사용할 수 있나요?
두 설정은 다른 축의 문제입니다. 깊이별은 채널 연결을 제한하고 팽창은 공간 간격을 정합니다. 함께 쓸 때도 해당 API의 보폭·간격 제한과 가중치 모양을 확인합니다.[1]
Q6. 기존 필터에서 dilation만 키워도 되나요?
가중치 배열의 모양은 같을 수 있지만 읽는 입력 위치가 달라져 출력은 달라집니다. 모델 변경으로 다루고 경계값·업무 오류·실행 비용을 다시 확인합니다. 학습된 모델과 같은 동작을 보장하는 단순 저장 방식 변경은 아닙니다.
출처
마무리
팽창 합성곱은 같은 필터의 계산 지점 사이를 벌려 더 넓은 입력 범위를 조합합니다. 필터 크기·유효 범위·보폭·채널 연결을 구별하면 구조표에 적힌 간격이 실제로 어떤 위치를 읽는지 이해하기 쉽습니다.
처음에는 일곱 숫자와 세 가중치 예시부터 확인해 보세요. 그다음 작은 이미지에서 읽는 좌표와 가장자리를 대조합니다. 실제 모델에서는 넓어진 범위만 보지 말고 빠지는 위치와 업무 오류, 측정한 지연 시간까지 보고 설정을 선택합니다.
