최대 풀링(Max Pooling)이란? AI에서 구역별 최댓값으로 특징 맵을 요약하는 방법
TL;DR
최대 풀링은 특징 맵의 작은 구역마다 최댓값 하나를 골라 공간 정보를 요약하는 연산입니다. 창을 크게 보거나 보폭을 늘리면 출력의 모양과 남는 정보가 달라집니다. 채널별로 따로 계산하며 일반적인 최대 풀링에는 학습할 필터 가중치가 없습니다. 가장 큰 반응이 중요한 의미까지 보장하지는 않으므로 작은 무늬의 손실·패딩·축 순서와 복원 한계를 함께 확인합니다.[1][2][5]
핵심 3줄 요약
- 핵심 1
창마다 최댓값을 고릅니다. 평균이나 절댓값이 아닌 원래 수치의 최댓값이며 채널끼리 섞지 않습니다. - 핵심 2
창 크기와 보폭은 다릅니다. 한 번에 볼 범위와 다음 창으로 이동할 간격을 나누어 출력 크기를 읽습니다. - 핵심 3
요약 뒤에는 정보가 사라집니다. 최대 위치를 기록해도 버린 값 전부를 되찾을 수 없고 작은 위치 변화에도 결과가 바뀔 수 있습니다.
이 글에서 다룰 내용
- 최대 풀링의 한 문장 정의
- 네 구역의 숫자로 이해하는 최댓값 선택
- AI 특징 맵에서 쓰는 이유와 작동 순서
- 창·보폭·패딩·채널 축과 출력 크기
- 평균 풀링·합성곱·전역 최대 풀링과의 차이
- 모델 구조 점검의 사용처와 체크리스트
- 이동 민감도·잡음·정보 손실·복원의 주의점
최대 풀링을 한 문장으로 정의하면 무엇인가요?
최대 풀링은 각 입력 채널에서 정한 창을 이동시키며 창 안의 최댓값을 출력 위치 하나에 기록하는 요약 연산입니다.
영문명은 Max Pooling이며 맥스 풀링이나 최댓값 풀링이라고도 부릅니다. 여기서는 이미지 특징 맵의 높이와 너비를 다루는 2차원 연산을 설명합니다. 입력은 사진의 밝기일 수도 있지만 보통은 앞선 층이 계산한 특징의 반응값입니다. 값이 크다는 사실과 중요한 물체라는 해석은 구별합니다.
PyTorch MaxPool2d 문서와 Keras MaxPooling2D 문서는 공간 창의 최댓값을 구하는 연산을 정의합니다. Dive into Deep Learning의 풀링 장은 채널마다 따로 계산하고 가중치 커널을 학습하지 않는다고 설명합니다. 창 크기를 정한다는 이유로 합성곱의 필터 가중치까지 생기는 것은 아닙니다.[1][2][5]
한 줄 정리: 최대 풀링은 각 구역의 가장 큰 반응을 남기는 연산입니다. 최종 범주나 물체 위치는 뒤의 예측 과정에서 결정합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 한 채널의 작은 특징 맵을 살펴본다고 가정해 보겠습니다. 네 행을 위에서부터 아래처럼 둡니다. 창은 2×2, 가로·세로 보폭은 2이며 패딩 없이 계산합니다.
- 첫째 행:
[1, 7, 2, 4] - 둘째 행:
[5, 3, 8, 6] - 셋째 행:
[9, 0, 2, 1] - 넷째 행:
[4, 3, 7, 5]
왼쪽 위 구역의 네 값은 1·7·5·3이므로 7을 남깁니다. 오른쪽 위에서는 2·4·8·6 중 8을 남깁니다. 아래쪽 두 구역도 같은 방법으로 계산하면 출력의 두 행은
[7, 8]
과
[9, 7]
입니다. 입력의 16개 값이 출력의 4개 값으로 요약됩니다.
창을 그대로 두고 보폭만 1로 바꾸면 이웃한 창이 겹칩니다. 같은 입력에서 출력의 세 행은
[7, 8, 8]
,
[9, 8, 8]
,
[9, 7, 7]
입니다. 한 입력값이 여러 창의 최댓값이 될 수도 있습니다. 창 크기가 같다고 출력 크기도 같지는 않습니다.
이 예시는 Python 표준 라이브러리로 직접 확인한 설명용 산술입니다. PyTorch나 Keras로 실제 모델을 실행한 결과는 아닙니다. 각 구역에서 고른 값과 출력 위치를 손으로 대조하는 데 목적이 있으며 인식 성능을 측정하지 않았습니다.
쉬운 예시: 구역별 기록판에서 가장 큰 숫자 하나를 옮겨 적는 방식과 비슷합니다. 기록판의 나머지 숫자나 최댓값 주변의 배열까지 함께 보존하지는 않습니다.
왜 AI에서 최대 풀링이 중요한가요?
뒤쪽 층이 다룰 공간 크기를 줄입니다
보폭을 늘린 풀링은 특징 맵의 높이와 너비를 줄이는 데 쓰입니다. 위 예시는 채널 수를 바꾸지 않고 공간 값의 개수만 줄였습니다. 뒤층이 받는 지도의 크기가 달라지므로 모델 구조표에서 입력·출력 모양을 추적할 때 자주 만납니다. 실제 처리 속도는 전체 모델과 실행 환경에서 따로 측정합니다.[1][5]
작은 구역의 강한 반응을 요약합니다
같은 창 안에서 강한 반응의 위치가 조금 옮겨져도 그 최댓값이 유지될 수 있습니다. 이 성질은 작은 위치 변화의 영향을 줄이는 데 도움이 됩니다. 다만 창의 경계를 넘거나 경쟁하는 반응이 달라지면 출력도 바뀝니다. 이동에 완전히 불변인 표현이라고 확대하지 않습니다.[5]
핵심 인사이트: 최대 풀링은 강한 반응을 보존하는 선택 규칙입니다. 잡음도 큰 값이면 남으므로 가장 크다는 이유만으로 유용한 단서라고 판단하지 않습니다.
최대 풀링은 어떤 순서로 작동하나요?
1. 표본과 채널을 나누어 봅니다
한 이미지의 각 채널에서 독립적으로 계산합니다. 서로 다른 사진의 값을 한 창에 모으거나 여러 채널의 최댓값 하나로 합치지 않습니다. 배치와 채널 수는 유지하고 공간 축만 요약하는 것이 이 글의 일반적인 2차원 최대 풀링입니다.[1][2][5]
2. 창의 크기와 이동 간격을 정합니다
창은 한 출력값에 참여할 입력 범위를 정하고 보폭은 다음 출력 창의 시작 위치를 정합니다. PyTorch의
kernel_size
와 Keras의
pool_size
가 창 크기입니다. 보폭을 생략하면 각각 창 크기를 사용하므로 서로 겹치는 창을 원하면 보폭도 명시합니다.[1][2]
3. 창 안에서 수치가 가장 큰 값을 남깁니다
음수가 있어도 같은 비교 규칙을 씁니다. 예를 들어
[-5, -2, -3, -4]
의 최댓값은 -2입니다. 절댓값이 가장 큰 -5를 고르거나 음수를 무조건 0으로 만드는 계산이 아닙니다. 앞에 ReLU가 있는지에 따라서 입력의 범위가 달라질 수 있으므로 층 순서도 함께 기록합니다.
4. 남은 값으로 새 특징 맵을 만듭니다
창마다 구한 값을 출력 행과 열에 배치합니다. 보폭·패딩·끝부분 처리에 따라 창이 놓이는 위치와 출력 크기가 달라집니다. 출력 모양이 예상과 같아도 다른 창을 비교했다면 숫자는 달라질 수 있으므로 모양과 실제 숫자를 따로 검사합니다.[1][2]
실전 팁: 작은 배열에 서로 다른 숫자를 넣어 창의 이동을 확인하세요. 입력이 모두 같은 숫자라면 축이나 시작 위치의 오류를 발견하기 어렵습니다.
주요 설정과 결과는 어떻게 읽나요?
패딩과 끝부분의 창을 구별합니다
PyTorch MaxPool2d는 패딩을 음의 무한대로 취급합니다. 음수 입력의 가장자리에서 0을 채우면 원래 값보다 0이 더 커져 다른 결과가 되므로, 0 패딩 설명을 그대로 가져오지 않습니다.
ceil_mode=True
는 출력 크기 계산과 끝부분 창의 허용 규칙을 바꾸며 오른쪽 패딩 영역에서 시작하는 창은 제외합니다.[1]
Keras는
padding="valid"
와
padding="same"
을 안내합니다. 이름에 same이 있어도 보폭이 2면 입력과 공간 크기가 같다는 뜻은 아닙니다. 공식 출력식에 따르면 한 축 길이가 5이고 보폭이 2인 same 출력의 길이는 3입니다. 창 정렬까지 확인하지 않고 PyTorch의 ceil 설정과 같은 옵션으로 대응시키지 않습니다.[1][2]
축 순서와 창 내부 간격을 확인합니다
PyTorch의 배치 입력은
(N, C, H, W)
순서입니다. Keras는
data_format="channels_last"
에서
(N, H, W, C)
를 사용하며 channels_first도 지원합니다. 같은 네 숫자의 모양을 넘겨도 어느 축이 채널인지 잘못 지정하면 다른 계산이 됩니다.[1][2]
PyTorch의
dilation
은 창 내부에서 비교할 지점 사이의 간격입니다. 창 전체의 이동 간격인 stride와 다릅니다. 여기서 확인한 Keras MaxPooling2D 인자 목록에는 같은 dilation 인자가 없으므로, 다른 라이브러리로 옮길 때 이름이 비슷하다는 이유로 설정을 복사하지 않습니다.[1][2]
선택 위치와 원본 복원은 다릅니다
PyTorch는
return_indices=True
로 최대 위치도 반환합니다. MaxUnpool2d 공식 문서는 그 위치에 값을 놓고 나머지를 0으로 채우는 부분 역연산을 설명합니다. 비최댓값은 이미 사라졌으므로 원본을 완전히 복구하지 못합니다. 서로 다른 입력 크기가 같은 풀링 출력 크기로 이어질 때는 목표 출력 크기도 필요할 수 있습니다.[1][3]
최대 풀링과 헷갈리는 용어는 무엇이 다른가요?
평균 풀링·보폭 합성곱과의 차이
평균 풀링은 창 안의 값을 평균냅니다. 최대 풀링은 가장 큰 값 하나를 고릅니다. 두 방식은 같은 크기의 출력을 만들어도 반응의 의미가 다릅니다. 한 점만 큰 구역에서는 평균이 그 반응을 희석하고 최대는 그 값을 그대로 남깁니다. 어느 쪽이 나은지는 업무의 오류와 같은 평가 자료로 비교합니다.[5]
보폭이 있는 합성곱도 공간 크기를 줄일 수 있지만 입력에 학습한 가중치를 적용합니다. 일반적인 최대 풀링은 가중치 합을 배우지 않고 고정된 최댓값 규칙을 씁니다. 기존 CNN 글은 전체 신경망 구조와 풀링의 위치를 설명합니다. 이 글은 창별 실제 값 선택과 출력 계약을 살펴봅니다.[5]
전역 최대 풀링·단순 펼치기와의 차이
Keras GlobalMaxPooling2D 문서는 각 채널의 공간 전체를 요약합니다. 기본 출력은 표본마다 채널별 값 하나이며
keepdims=True
면 공간 축을 길이 1로 남깁니다. 작은 창을 여러 위치에 놓아 공간 격자를 남기는 국소 최대 풀링과 구분합니다.[4]
펼치기는 값을 일렬로 다시 배치하는 형태 변환입니다. 최댓값을 고르지 않으므로 그 단계만으로 값의 개수가 줄지는 않습니다. 반면 최대 풀링은 여러 입력을 하나의 출력으로 요약하면서 비최댓값과 세밀한 위치 정보를 버립니다. 출력 모양만 보고 두 단계를 같은 압축이라고 부르지 않습니다.
비교 정리: 국소 최대 풀링은 창별 최댓값, 평균 풀링은 창별 평균, 전역 최대 풀링은 채널 전체의 최댓값입니다. 보폭 합성곱은 학습된 가중치를 사용합니다.
실전에서는 어디에 쓰이나요?
CNN 구조와 특징 맵의 크기를 점검합니다
이미지 분류 모델의 구조를 읽을 때 풀링 앞뒤의 높이·너비·채널 수를 기록합니다. 두 라이브러리에서 같은 구조를 재현하려면 기본값 대신 창·보폭·패딩·축을 명시하고 작은 입력의 출력을 대조합니다. 모양이 맞는다는 사실만으로 같은 모델이 재현됐다고 보고하지 않습니다.
정보를 줄여도 되는 지점을 비교합니다
분류용 특징 요약과 가는 글자·작은 물체의 위치를 남기는 작업은 요구가 다릅니다. 풀링을 넣은 모델과 기준 모델을 비교할 때 전체 정확도뿐 아니라 작은 대상의 누락과 위치 오차를 따로 봅니다. 이는 활용·평가 제안이며 이 글에서 실제 모델 성능 향상을 측정한 결과는 아닙니다.
최대 풀링을 적용할 때 어떤 순서로 확인하나요?
1. 입력과 설정을 고정합니다
표본·채널·높이·너비가 어느 축인지 적고 입력의 수치 범위를 확인합니다. 창 크기, 보폭, 패딩과 구현이 지원하는 끝부분 규칙을 함께 남깁니다. 학습한 모델의 층을 바꾼다면 단순한 이미지 크기 조정이 아니라 모델 구조 변경으로 기록합니다.
2. 작은 배열과 경계 사례를 시험합니다
서로 다른 값의 배열에서 손계산과 비교한 뒤 홀수 길이 입력과 음수 입력도 확인합니다. 강한 반응이 창 경계를 넘는 경우를 따로 만드세요. 이 글의 보폭 2인 설명용 계산에서도 한 칸 옮긴 반응이 출력
[9, 0]
에서
[0, 9]
로 이동했습니다. 작은 이동이 언제나 같은 출력을 낳지는 않습니다.
3. 전체 모델의 비용과 실패를 비교합니다
같은 학습·검증 기준으로 후보를 비교하고 최종 평가는 설정 선택에 쓰지 않은 자료에서 확인합니다. 작은 물체·가는 획·튀는 잡음이 포함된 사례를 별도로 검토합니다. 크기가 줄었다는 계산 결과와 실제 지연 시간·메모리·예측 성능은 구분해 기록합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 정보 손실을 되돌릴 수 있다고 생각하지 않습니다. 선택 위치를 알아도 버린 수치 전부를 알 수는 없습니다. 원본 특징이 필요한 작업이라면 앞 단계의 값이나 다른 연결 경로가 필요한지 별도로 설계합니다. 언풀링을 원본 복원 증거로 쓰지 않습니다.[3]
둘째, 큰 잡음도 선택된다는 사실을 확인합니다. 최댓값을 고르는 연산은 그 값이 물체 단서인지 센서 오류인지 판별하지 않습니다. 한 점의 큰 반응이 주변의 작은 유용한 단서를 가릴 수 있으므로 정상 사례와 잡음 사례를 함께 봅니다.
셋째, 위치 변화에 강하다는 표현을 제한합니다. 같은 창 내부의 이동과 창 경계를 넘는 이동은 다릅니다. 입력을 조금 옮긴 비교 사례에서 출력 맵과 최종 예측을 각각 확인하세요. 풀링 하나가 회전·크기·촬영 조건의 변화까지 해결하지는 않습니다.[5]
넷째, 기본값과 이름을 섞지 않습니다. PyTorch의 padding·ceil_mode와 Keras의 same은 같은 이름의 설정 묶음이 아닙니다. 축과 경계 정렬, 입력·출력 모양과 실제 숫자를 확인한 뒤 대응시킵니다. 학습 때와 배포 때의 모델 설정도 일치시킵니다.[1][2]
주의: 작아진 특징 맵이 더 정확한 표현이라는 보장은 없습니다. 최댓값·출력 크기·인식 오류·원본 복원 가능성을 서로 다른 항목으로 확인합니다.
자주 묻는 질문
Q1. 최대 풀링의 필터도 학습하나요?
일반적인 최대 풀링은 창 안의 최댓값을 고르는 고정 연산이며 학습할 필터 가중치가 없습니다. 창 크기와 보폭은 구조 설정입니다. 그 앞뒤 합성곱 층이 학습하는 가중치와 구분합니다.[5]
Q2. 창이 2×2면 출력은 언제나 절반이 되나요?
아닙니다. 출력 크기는 보폭·패딩·입력 길이와 끝부분 처리에도 달려 있습니다. 위 예시에서도 같은 창으로 보폭을 2에서 1로 바꾸면 2×2 출력이 3×3으로 달라집니다.[1][2]
Q3. 채널이 여러 개면 가장 큰 채널만 남기나요?
이 글의 일반적인 2차원 최대 풀링은 채널별로 공간 창을 처리합니다. 입력 채널 수를 그대로 유지하며 여러 채널 중 하나를 골라 삭제하는 연산이 아닙니다. 채널 축을 잘못 지정한 입력과 혼동하지 않습니다.[1][2][5]
Q4. Keras의 same이면 입력과 출력 크기가 같나요?
보폭까지 함께 봐야 합니다. 공식 출력식에서 한 축의 입력 길이가 5이고 보폭이 2면 출력 길이는 3입니다. same이라는 이름만 보고 모든 보폭에서 입력 길이를 유지한다고 해석하지 않습니다.[2]
Q5. 최대 위치를 저장하면 원본을 되찾나요?
완전한 복원은 아닙니다. MaxUnpool2d는 선택한 위치에 남은 값을 놓고 다른 위치를 0으로 채웁니다. 비최댓값이 사라졌다는 한계는 그대로이며 필요한 출력 크기도 별도로 지정할 수 있습니다.[3]
출처
마무리
최대 풀링은 각 채널의 작은 구역에서 최댓값 하나를 남기는 요약 연산입니다. 학습된 필터와 채널 혼합 없이 공간 표현을 바꾸며 창 크기·보폭·패딩·축 순서가 실제 출력을 결정합니다. 요약한 값과 그 값이 업무에 도움이 되는지는 별개의 질문입니다.
처음 확인한다면 작은 배열의 네 구역부터 계산해 보세요. 보폭을 바꾸고 음수·홀수 크기·창 경계 이동을 시험합니다. 선택 위치를 보관해도 원본의 모든 값이 복구되지는 않는다는 점을 기억하고, 전체 모델의 비용과 작은 대상의 누락을 기준 모델과 비교합니다.
