97. 스트라이드 (Stride) - 필터/커널의 이동 보폭

⚠️ 이 문서는 딥러닝 이미지 인식(CNN) 모델이 합성곱 층(Convolution Layer)에서 $3 \times 3$ 돋보기(필터)를 사진 위에 올려놓고 특징을 스캔할 때, **이 돋보기를 '오른쪽으로 한 칸씩 촘촘히 옮길 것인지, 아니면 두 칸씩 듬성듬성 성큼성큼 건너뛰며 스캔할 것인지' 그 발걸음의 보폭(칸 수)을 결정하여 연산 속도와 결과물 지도의 크기(해상도)를 좌우하는 핵심 파라미터인 '스트라이드(Stride)'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 돋보기(필터)가 이미지 평면을 스윽 미끄러지듯 이동(Sliding Window)할 때, 한 번 도장을 꽝 찍고 다음 도장을 찍기 위해 이동하는 가로축, 세로축의 픽셀(칸) 단위 간격이다.
  2. 가치: Stride=1로 촘촘히 훑으면 이미지의 아주 미세한 테두리(특징)까지 다 잡아내지만 연산량이 폭발한다. 반면 Stride=23으로 듬성듬성 뛰며 훑으면 정보는 살짝 유실되지만, 뽑아져 나온 특성 맵(Feature Map)의 크기가 $1/2$이나 $1/3$로 팍 쪼그라들어 모델의 용량을 획기적으로 압축하고 연산 속도를 미친 듯이 끌어올릴 수 있다.
  3. 기술 체계: 풀링 층(Max Pooling)을 쓰지 않고도 돋보기의 보폭(Stride $\ge$ 2)을 크게 하는 것만으로 해상도(차원)를 줄이는 공간적 축소(Downsampling) 효과를 완벽하게 대체해 낼 수 있어, 최근의 모바일용 가벼운 딥러닝 아키텍처(ResNet 등)에서 맹활약하는 핵심 기법이다.

Ⅰ. 슬라이딩 윈도우(Sliding Window)와 돋보기의 걸음걸이

도장을 한 자리에 두 번 찍지 않기 위해 얼마나 겹쳐 걸을 것인가.

  1. 합성곱 스캔의 기본 (Stride = 1):
    • $10 \times 10$ 크기의 큰 강아지 사진이 있다. 여기에 '강아지 귀'를 찾는 $3 \times 3$ 크기의 돋보기(필터) 도장을 올려놓는다.
    • 맨 왼쪽 구석에 도장을 쾅 찍는다(첫 번째 연산).
    • Stride=1 이면, 돋보기를 딱 오른쪽으로 '1픽셀(1칸)'만 쓱 밀어서 다시 도장을 쾅 찍는다.
    • 이때 돋보기가 1칸만 움직였으므로, 첫 번째로 찍었던 픽셀 영역과 두 번째로 찍는 픽셀 영역이 무려 2칸이나 중복해서 겹치게(Overlap) 된다.
    • 특징: 데이터의 공간적 디테일(미세한 털의 결 등)을 한 땀 한 땀 전부 긁어모으므로 특징 보존율이 가장 높다. 하지만 $10 \times 10$ 사진에 무려 64번이나 도장을 찍어야 하므로 CPU/GPU가 엄청난 연산 노동(병목)에 시달린다.

📢 섹션 요약 비유: 넓은 해변에서 금속 탐지기(필터)로 동전을 찾습니다. Stride=1은 탐지기를 한 걸음씩 옮길 때, 아까 훑었던 모래밭을 또 겹쳐서 훑으며 1cm의 틈도 없이 초정밀 스캔을 하는 꼼꼼한 조사병입니다. 동전은 무조건 다 찾지만, 해변 하나 훑는 데 밤을 꼬박 새워야 합니다.


Ⅱ. 보폭 확장 (Stride = 2): 차원 축소 (Downsampling)의 마법

듬성듬성 뛰면 지도의 크기가 4분의 1로 압축된다.

  1. 성큼성큼 걷기 (Stride = 2):
    • 이번엔 Stride=2를 설정했다. 돋보기가 한 번 도장을 쾅 찍은 뒤, 오른쪽으로 '2픽셀(2칸)'을 한 번에 건너뛰고 다음 도장을 찍는다.
    • 이렇게 되면 아까 64번 찍어야 했던 도장 횟수가 약 16번 정도로 확 줄어든다. 스캔(연산) 속도가 4배 이상 빨라진다.
  2. 특성 맵 (Feature Map)의 강제 압축:
    • 이 보폭 확장의 가장 위대한 마법은 **'해상도의 축소'**다.
    • 도장을 듬성듬성 찍었으므로, 뽑아져 나온 결과물(Feature Map 요약 지도)의 가로세로 길이도 원본 사진에 비해 정확히 절반($1/2$)으로 쪼그라든다 (면적은 $1/4$로 압축).
    • "어? 그럼 픽셀 1칸의 틈새(유실)가 생겨서 고양이 귀를 못 찾는 거 아냐?" $\rightarrow$ 신기하게도 $3 \times 3$ 돋보기가 2칸을 뛰면 여전히 1칸이 겹치기(Overlap) 때문에, 약간 뭉뚱그려지긴 해도 고양이 귀의 대략적인 '위치와 윤곽'이라는 핵심 거시적(Macro) 정보는 충분히 살아서 뇌로 전달된다.

📢 섹션 요약 비유: Stride=2는 징검다리를 건너듯 큼직하게 두 걸음씩 껑충껑충 뛰며 해변을 탐지하는 날렵한 요원입니다. 모래알 하나하나의 디테일(미세한 픽셀)은 놓칠 수 있지만, 우리가 찾는 건 모래알이 아니라 거대한 보물상자(고양이의 형체)이기 때문에 듬성듬성 스캔해도 100% 찾아냅니다. 그 결과, 엄청나게 방대했던 해변의 지도(고해상도 이미지)를 손바닥만 한 '핵심 보물 위치 약도(압축된 특성 맵)'로 순식간에 팍 쪼그라뜨려 뇌(다음 층)의 암기 부담을 덜어주는 놀라운 압축 기술입니다.


Ⅲ. 수식과 아키텍처에서의 위상 (Pooling 대체재)

크기를 줄이는 데 꼭 가위를 쓸 필요는 없다. 보폭만 넓히면 된다.

  1. 특성 맵 크기(출력 해상도) 계산 공식:
    • 딥러닝 엔지니어가 밥 먹듯 쓰는 공식이다. 사진 크기($N$), 필터 크기($F$), 패딩 덧댐 횟수($P$), 스트라이드 보폭($S$)일 때, 나오는 특성 맵의 한 변의 길이는 다음과 같다.
    • 출력 크기 = $\frac{N + 2P - F}{S} + 1$ (이 결과는 무조건 정수로 딱 떨어져야 한다. 안 떨어지면 에러가 나며 돋보기가 사진 바깥으로 삐져나가 추락한다.)
    • 수식을 보면 분모에 스트라이드($S$)가 있다. 즉, 보폭($S$)을 2배, 3배로 늘릴수록 결과물 지도의 크기는 반비례하여 기하급수적으로 팍팍 작아진다.
  2. Max Pooling 층의 해고와 Strided Convolution의 승리:
    • 과거(VGGNet 등)에는 해상도를 줄일 때, 일단 촘촘히 훑은 뒤(Stride 1)에 뒷단에 '풀링 층(Max Pooling)'이라는 가위질 담당을 세워 억지로 $2 \times 2$ 픽셀을 하나로 깎아버렸다 (연산 낭비).
    • 현대의 진보된 아키텍처(ResNet, MobileNet 등)에서는 무식한 풀링 가위질을 아예 층에서 뽑아버린다(퇴출). 대신 그냥 돋보기 층 자체에서 Stride=2를 먹여버려(Strided Convolution), 특징 추출과 해상도 축소를 단 한 번의 연산으로 한 큐에 끝내버리는 초효율 모델이 대세를 장악하게 되었다.

📢 섹션 요약 비유: 옛날 모델은 일단 카메라 필름으로 4K 초고화질 사진을 찰칵 찍고 난 뒤(Stride=1), 포토샵을 열어서 억지로 깍두기처럼 화질을 뭉개어 용량을 줄이는(Max Pooling) 쓸데없는 2중 노동을 했습니다. 현대 모델은 아예 처음 사진을 찍을 때부터 카메라 렌즈 설정에 '저해상도 요약 모드(Stride=2)'를 걸어두어, 셔터를 누름과 동시에 완벽히 압축된 가벼운 섬네일 사진이 바로 튀어나오게(Strided Convolution) 뜯어고쳐 연산 전기세(병목)를 극단적으로 절약한 것입니다.