Ch.06
Swin 트랜스포머: 전역 어텐션에서 계층적 윈도 구조로
Swin Transformer
패치 머징
패치는 이미지 칸, 윈도는 attention 범위입니다. 고정 창 방식은 창 안에서만 보고, 이동 창 방식은 창을 옮겨 이웃 칸과도 연결합니다. 머징은 해상도는 줄이고 채널은 늘립니다.
패치 4개를 합쳐 채널을 잠시 로 만든 뒤, LayerNorm → Linear로 로 압축합니다. 결과적으로 해상도는 줄고 채널은 깊어집니다.
Chapter 05에서 배운 ViT(비전 트랜스포머)는 이미지 픽셀 전체가 한 번에 토론하는 '초대형 마을회관 대토론회(전역 어텐션)'였습니다. 성능은 좋지만 참석자(해상도)가 늘어나면 메모리 비용이 기하급수적으로 폭발()하는 치명적인 단점이 있었죠.
이를 해결한 Swin 트랜스포머(Shifted Window Transformer)는 매우 영리합니다. 처음에는 '작은 소회의실(Window)' 안에서만 대화하게 하고, 다음 층에서는 '회의실 칸막이를 슬쩍 옮겨서(Shift)' 옆 부서와 정보를 섞습니다. 그리고 점차 4명의 사원을 1명의 대리로 합치며(Patch Merging) 전체 그림을 봅니다. 이 챕터에서는 이 똑똑한 '분할 정복' 비유가 수학적으로 어떻게 연산량을 획기적으로 줄이는지 알아봅니다.
수식, 이렇게 읽으면 됩니다 (Swin 핵심)
1) W-MSA (소회의실 법칙): 윈도 한 변이 이면, 한 윈도에서 다루는 관련도는 대략 규모입니다. 즉 전체가 한 번에 떠드는 전역 회의 대신, 작은 방 단위로 계산을 쪼개 계산량을 통제합니다.
2) SW-MSA (칸막이 이동): 다음 블록에서 윈도를 만큼 이동(shift)시키고, 어텐션 마스크로 유효한 쿼리-키 연결만 남깁니다. 덕분에 이웃 방 정보가 자연스럽게 섞이면서도 엉뚱한 연결은 차단됩니다.
3) 패치 머징 (정보량 보존 관점):
① 의 4패치(각 채널)를 모아 한 위치로 Concat하면 일시적으로 가 됩니다(정보를 버리지 않고 '두껍게 쌓음').
② 이후 Linear가 핵심만 압축해 로 줄입니다.
즉 해상도는 로 줄지만, 채널을 늘려 정보 손실을 완화합니다.
4) 왜 해상도↓ 채널↑ 인가? (조금 더 깊게):
① 정보량 보존 관점
딥러닝 텐서의 '표현 용량'은 직관적으로 로 볼 수 있습니다. 패치 머징으로 공간을 로 줄이면 공간 항은 1/4이 됩니다. 이때 채널까지 그대로 두면, 한 단계에서 담을 수 있는 표현력이 너무 급격히 줄어 중요한 디테일이 쉽게 사라집니다. 그래서 채널을 늘려(일시적 , 최종 ) 공간 축소에 따른 손실을 완충합니다.
② 연산량-표현력 균형 관점
채널을 무한히 늘리면 비싸고, 해상도를 유지하면 더 비쌉니다. Swin은 먼저 공간을 줄여 토큰 수를 낮추고(메모리/속도 이득), 대신 채널을 늘려 의미 밀도를 높입니다. 즉 '토큰 수는 줄이고, 토큰당 의미는 진하게' 만드는 균형점입니다.
③ 수용영역(문맥) 관점
깊은 층으로 갈수록 모델은 미세 텍스처보다 큰 구조(형태, 배치, 객체 관계)를 봐야 합니다. 해상도 감소는 더 넓은 문맥을 보게 만들고, 채널 증가는 그 문맥을 다양한 관점(엣지, 질감, 패턴 조합, 클래스 단서)으로 인코딩할 공간을 제공합니다.
④ 실무 관점 한 줄 정리
해상도만 줄이면 '기억 상실', 채널만 늘리면 '연산 폭증'이 됩니다. Swin의 해상도↓ 채널↑는 이 둘 사이에서 정보 손실을 막으면서 계산량을 통제하는 엔지니어링 타협점입니다.
Swin 트랜스포머: 직관과 수식이 만나는 교차점
1. 윈도우 어텐션 (W-MSA): 소회의실에서 연산량 다이어트
비유: 수만 명이 한 번에 떠들면(ViT) 귀가 아픕니다. 대신 이미지를 7x7 크기의 '소회의실(윈도우)'로 쪼개고, 오직 같은 방 안의 픽셀들끼리만 대화(어텐션)하게 만듭니다.
핵심 수식: 전체 패치 수가 , 윈도우의 한 변 길이를 이라 할 때, ViT의 연산량은 으로 폭발합니다. 하지만 W-MSA는 이 됩니다. 은 7이라는 고정된 작은 숫자이므로, 전체 계산량이 에 비례하는 착한 선형 복잡도 로 뚝 떨어집니다!
2. 시프트된 윈도우 (SW-MSA): 칸막이를 비틀어 소통하기
비유: 평생 자기 방(윈도우) 사람들과만 대화하면 우물 안 개구리가 됩니다. 그래서 다음 층(Layer)에서는 사무실 칸막이를 오른쪽 아래로 반 칸씩 이동(Shift)시킵니다. 어제는 남이었던 옆방 패치들이 오늘은 같은 방이 되어 정보를 교환합니다.
핵심 수식: 수학적으로는 윈도우를 패치만큼 이동시킵니다. 이때 삐져나오는 자투리 방들은 텐서를 통째로 이어 붙이는 기법(Cyclic Shift)과, 엉뚱한 정보가 섞이지 않게 가려주는 어텐션 마스크(Attention Mask) 수식을 통해 부가적인 메모리 없이 우아하게 해결합니다.
3. 패치 병합 (Patch Merging): 사원 4명을 대리 1명으로
비유: 위로 올라갈수록 실무자(작은 픽셀)들의 자잘한 의견을 합쳐서 팀장급의 넓은 시야(거시적 맥락)를 만들어야 합니다. 인접한 (총 4개)의 패치를 하나로 묶어버립니다.
핵심 수식: 4개가 하나로 합쳐지니 해상도는 반토막()이 납니다. 하지만 4배로 뚱뚱해진 정보(채널 차원 )를 선형 층(Linear Layer)이라는 압축기에 넣어 로 만듭니다. 결론적으로 층을 지날 때마다 해상도는 배로 줄고, 채널(정보의 깊이)은 배로 늘어나는 다중 스케일 피라미드가 완성됩니다.
4. 2연속 블록 (Two-Successive Blocks): 항상 세트로 움직인다
개념: Swin 트랜스포머는 항상 (일반 윈도우 시프트 윈도우)가 한 쌍으로 묶여 2단 콤보로 작동합니다.
* : 1단계, 자기 방에서 대화하기
* : 2단계, 칸막이 옮겨서 대화하기
왜 중요한지
무거운 수학()을 피하는 엔지니어링의 승리
ViT는 해상도가 256x256만 넘어가도 연산량이 제곱으로 뛰어 일반적인 GPU에서는 학습이 사실상 불가능해집니다. Swin은 이 연산량을 (선형 복잡도)으로 꽉 묶어버림으로써, 자율주행차의 4K 블랙박스 영상이나 수만 픽셀에 달하는 암세포 조직 슬라이드(WSI) 같은 초고해상도 기가픽셀급 데이터도 '메모리 터짐(OOM)' 없이 부드럽게 학습할 수 있는 길을 열어주었습니다.
밀집 예측(Dense Prediction) 생태계의 패러다임 전환
단순히 '사진 속에 개가 있냐 고양이가 있냐(이미지 분류)'를 맞히는 것은 ViT로도 충분합니다. 하지만 사진 속 수많은 자동차와 보행자의 정확한 위치에 박스를 치고(객체 탐지), 픽셀 단위로 차선과 도로를 색칠하는(시맨틱 세그멘테이션) 문제에서는 화면 안의 물체 크기가 제각각이므로 '피라미드 구조(다중 스케일)'가 필수적입니다. Swin은 패치 병합을 통해 '초기엔 세밀하게, 후반엔 거시적으로' 보는 이 구조를 트랜스포머에 완벽히 이식하여, 오랜 기간 왕좌를 지키던 CNN(ResNet 등)을 밀어내고 비전 AI의 새로운 황제로 등극했습니다.
비전 모델의 '범용 뼈대(Backbone)' 통일화
과거에는 '분류는 ViT, 탐지는 ResNet' 식으로 태스크마다 모델을 따로 썼다면, Swin 트랜스포머 이후로는 이미지 분류, 탐지, 분할 등 거의 모든 비전 태스크의 밑바탕 뼈대(Backbone)를 Swin 하나로 통일할 수 있게 되었습니다. 이는 산업계 입장에서 모델 유지보수와 연구 비용을 극적으로 낮춰주는 혁명적인 변화입니다.
어떻게 쓰이는지
1. 디버깅 1순위: 해상도는 반드시 '32의 배수'로 맞출 것
실무에서 Swin 코드를 돌릴 때 가장 먼저 마주하는 에러는 '텐서 차원 불일치(Shape Mismatch)'입니다. Swin은 모델 내부에서 패치 병합을 기본적으로 5번 정도 반복합니다. 즉, 층을 통과할 때마다 해상도가 로 계속 반토막이 납니다. 따라서 내가 네트워크에 밀어 넣으려는 원본 이미지의 가로세로 크기가 무조건 32의 배수(예: 224, 256, 512, 1024)로 딱 나누어떨어져야 합니다. 규격이 1픽셀이라도 어긋난다면 제로 패딩(Zero-Padding)을 추가하거나 이미지를 리사이즈(Resize)해야 연산 톱니바퀴가 헛돌지 않고 제대로 맞물려 들어갑니다.
2. 실무는 100% 파인튜닝(Fine-Tuning)으로 시작한다
이 거대하고 복잡한 모델을 회사에서 수집한 몇천 장의 데이터만으로 처음부터(From scratch) 학습시키는 것은 시간 낭비이자 과적합(Overfitting)의 지름길입니다. 실무 엔지니어는 Hugging Face(허깅페이스)나 MMDetection 같은 라이브러리에서 구글이나 마이크로소프트가 수백만 장의 이미지로 며칠 동안 미리 똑똑하게 학습시켜 둔 뼈대 가중치(Swin-T, Swin-B)를 무료로 다운로드합니다. 그리고 우리 회사의 서비스 목적에 맞게 맨 마지막 머리(Head) 부분만 살짝 떼어내어 새로 붙인 뒤, 가볍게 미세조정(Fine-tuning)하는 방식이 업계의 표준 프로세스입니다.
3. 메모리가 터질 때(OOM)의 실전 생존 가이드
아무리 선형 복잡도()를 달성했다고 해도 Swin은 여전히 무거운 딥러닝 모델입니다. 학습 도중 GPU 메모리가 터졌다면(Out of Memory) 당황하지 말고 다음 3단계를 순서대로 적용하세요.
1. Batch Size 조절: 한 번에 학습하는 배치 사이즈를 절반으로 줄입니다. (가장 즉각적인 효과)
2. 입력 해상도 타협: 를 넣고 있었다면, 로 한 단계 낮춥니다.
3. 윈도우 크기() 축소: 모델 설정 파일에서 윈도우 크기를 에서 등으로 줄여, 소회의실의 규모 자체를 축소시킵니다. (추가 꿀팁: 코드 설정에서 `gradient_checkpointing=True` 옵션을 켜면 속도는 조금 느려지지만 메모리를 획기적으로 아낄 수 있습니다.)
요약
Swin 트랜스포머는 이미지를 작은 창(윈도) 단위로 나눠 계산해 연산량을 줄이고(W-MSA), 다음 블록에서 창 위치를 옮겨 이웃 정보를 섞어(SW-MSA) 전역 문맥 손실을 보완합니다. 이후 패치 머징으로 해상도는 줄이고 채널은 늘려, 깊은 단계로 갈수록 다중 스케일 표현을 만들며 고해상도 비전 작업에 유리한 구조를 갖습니다.
실무에서는 입력 크기를 병합 단계에 맞게 정리(보통 32 배수)하고, 사전학습 가중치 기반 파인튜닝으로 시작하는 것이 안정적입니다. OOM이 발생하면 배치 크기 → 입력 해상도 → 윈도 크기() 순으로 조정하면 대부분 해결에 도움이 됩니다.
문제 풀이를 위한 설명
먼저 이렇게 읽고 시작하세요 (아주 짧게)
- 이 문제가 묻는 축이 무엇인지 먼저 구분: W-MSA / SW-MSA / Patch Merging
- 계산 문제면 단위부터 고정: 토큰 , 윈도 크기 , 채널 , 해상도
- 머징이 나오면 기본 변환을 바로 적용: 공간 , 채널
예시 (개념형)
"Swin의 핵심이 아닌 것은?"
① 항상 전역 어텐션
② 윈도+시프트+머징
③ 계층 구조
→ 정답
①
왜? Swin의 핵심은 전역 고정이 아니라 윈도 기반 + 시프트 + 패치 머징입니다.
예시 (O/X형)
"패치 머징은 공간 해상도를 올린다"
→ 정답 0(틀림)
왜? 머징은 보통 공간을 줄이고(가로·세로 1/2), 채널을 늘려 정보를 유지합니다.
문제 유형별 예시 + 정답 근거
예시 (시나리오형)
"고해상도에서 OOM이 났다. 가장 먼저 할 조치는?"
① 배치 증가
② 배치/해상도/윈도 조정
③ 전역 어텐션 추가
→ 정답
②
왜? 메모리 사용량을 직접 줄이는 선택이 우선입니다.
예시 (선다 계산형)
"일 때 전역 어텐션의 는?"
① 200
② 300
③ 400
→ 정답
③(400)
왜? .
예시 (누적 계산형)
"패치 머징 3회 후 해상도는?"
→ 정답:
왜? 1회마다 한 변이 1/2이므로 3회면 .
예시 (구성/개수형)
"한 변 윈도 8개 정사각 격자의 총 윈도 수는?"
→ 정답 64
왜? .
예시 (종합 추론형)
"입력 , 패치 , 머징 1회 후 토큰 수는?"
1) 초기 토큰:
2) 머징 1회 후:
→ 정답 784
왜? 2×2 머징 1회는 토큰 수를 1/4로 줄입니다.