논문명: A ConvNet for the 2020s
학회(출판연도): CVPR(2022)
연구분야: 컴퓨터 비전 백본 네트워크

✓ 의미론적 분할
이미지를 픽셀 단위로 분류하는 작업
사진 속 픽셀에 대해 “이 픽셀은 사람”, “이 픽셀은 도로” 와 같이 클래스 레이블 부여
→ 원본 이미지와 크기가 같은 “클래스맵(class map)” 만들어지고, 각 픽셀은 그 픽셀의 의미적 범주를 지님
⇒ 장면의 이해(자율주행, 의료 영상 분석, 위성 이미지 분석 등)에 많이 쓰임
✓ 범용 비전 백본(General-purpose Vision Backbone)
백본(backbone)
이미지에서 특징(feature)을 추출하는 기본 골격 네트워크
- 백본: 이미지 → 특성(feature) 추출을 담당하는 신경망 구조
- 특성맵: 백본이 이미지를 통과시켜 얻어낸 결과물
ex. ResNet, Swin-T
범용 백본
특정 작업에만 특화되지 않고, 분류·탐지·분할 등 다양한 비전 작업에 공통적으로 사용할 수 있는 구조
⇒ 한 번 학습된 백본을 가져다가(전이 학습) 다른 작업용 네트워크 입력으로 연결할 수 있도록
⇒ 현재는 Transformer가 우수하다는 인식이 강하지만, 순수 ConvNet 역시 뒤지지 않는 성능을 낼 수 있다!
: 본 논문의 저자는 ConvNeXt를 제안하며, 정확도와 확장성에서 Transformer와 견줄 뿐 아니라, 단순성과 효율성까지 유지함을 보여주려 한다.
→ 슬라이딩 윈도우(sliding window), 귀납적 편향(inductive bias), 이동 등변성(translation equivariance)
✓ 슬라이딩 윈도우(sliding window)
작은 크기의 필터(커널)를 입력 데이터(이미지)에 겹치면서 조금씩 이동시키며 연산하는 방식
CNN에서는 이 슬라이딩 과정에서 합성곱 연산이 이루어져 featuremap 만듦
→ 이미지 전체를 한 번에 보는 것이 아니라 “지역적 특징(local feature)”을 잡을 수 있음
→ 필터 가중치를 공유하므로 파라미터 수가 줄어듦
✓ 왜 파라미터 수가 줄어들까?
CNN의 합성곱층에서는
작은 필터(커널) 하나를 학습하고, 이걸 이미지의 모든 위치에 “공유(weight sharing)”해서 적용
ex. 3 x 3 크기, 채널 3개짜리 필터 → 가중치 개수는 3x3x3=27개 뿐
이 필터를 왼쪽 위, 오른쪽 아래 등 모든 위치에 같은 값으로 사용
⇒ 전체 픽셀 위치마다 다른 가중치(필터의 숫자)를 둘 필요가 없음(파라미터수 감소)
✓ 이렇게 해도 괜찮은가?
→ 이미지 특징은 위치에 상관없이 동일한 패턴으로 나타난다는 가정 때문
✓ 귀납적 편향(inductive bias)
모델이 학습할 때 데이터의 일반적인 규칙을 추론하기 위해 가지는 사전 가정
CNN의 경우
1️⃣ 지역성(locality): 중요한 특징은 국소 영역에서 나타난다
2️⃣ 가중치 공유(weight sharing): 같은 특징은 이미지 어디서는 동일하게 나타날 수 있다
3️⃣ 이동 등변성(Translation Equivariance): 물체가 위치를 옮겨도 그 특징은 그대로
⇒ 이러한 편향 덕분에 CNN은 이미지 인식에서 데이터가 적어도 잘 학습하고 연산량도 효율적
ViT의 주요 목표: 스케일링
→ 작은 데이터셋에서는 CNN이 더 우수하지만,
모델과 데이터셋이 충분히 크다면, ResNet보다도 뛰어난 성능을 낼 수 있음을 보여줌
✓ ViT의 주요 목표가 스케일링인 이유
CNN은 모델 크기를 무작정 키우면 성능이 일정 수준에서 멈추는 경향이 있음
ViT는 데이터와 파라미터를 계속 키워도 성능이 거의 선형적으로 증가
⇒ 큰 데이터+큰 모델 = 성능↑ 이 뚜렷하게 보이는 구조라, 대규모 학습에서 특히 강력!
한계 → CV에는 이미지 분류만 있는 것이 아니다!
귀납적 편향(inductive bias)가 없는 기본형 ViT
ViT는 CNN의 귀납적 편향(지역성, 가중치 공유, 이동 등변성)없이 완전히 데이터 기반으로 학습
→ 데이터가 적으면 성능이 떨어지고, 과적합이 쉬움
전역 self-attention의 이차적 복잡도
ViT의 핵심 연산인 self-attention은 모든 패치가 모든 다른 패치와 상호작용
패치수 = N 이면, 연산량은 N^2
→ 이미지가 커질수록 패치수 급증 → 계산량 폭발
[정리]
- ViT는 데이터와 모델이 클수록 CNN을 능가할 수 있다.
- 하지만 CNN처럼 범용 백본(backbone)으로 쓰이기엔 연산량과 구조상의 한계 존재
- 특히, 고해상도 입력에서 self-attention의 연산량이 너무 커짐
→ ViT의 한계(self-attenton, 귀납적편향X)를 해결하고자 등장
⇒ ConvNet 차용
[ImageNet-1K 분류 정확도와 연산량 비교]
✓ ImageNet-1K
- 1000개의 카테고리(classs)로 분류된 데이터셋
- 총 이미지 수: 120만 장
✓ ImageNet-22K
- 약 22,000개의 카테고리로 분류된 훨씬 더 큰 버전
- 총 이미지 수: 1,400만 장(훨씬 더 세분화된 분류; 개 → 품종 별 100종 이상)
✓ 파인 튜닝(fine-tuning)
- 이미 학습된 모델로 가져와서, 내가 원하는 데이터나 목적에 맞게 “마무리 학습”하는 과정

- 가로축
- 왼: ImageNet-1K로만 학습한 모델
- 오: ImageNet-22K로 사전학습 후, ImageNet-1K로 파인튜닝한 모델
- 세로축
- ImageNet-1K에서 Top-1 Accuracy(%)
- 버블크기
- 해당 모델의 연산량
- 색상
- 주황색: ViT, Swin-T
- 보라색: ConvNet 계열
기존 ResNet-50(큰 원)
→ 정확도는 낮지만, 효율성은 나쁘지 않다
Swin-T
→ Transformer 기반으로 정확도 향상
→ 다양한 CV 작업에 활용 가능
ConvNeXt
→ ResNet-50을 현대식으로 개량하여 Swin-T
보다 높은 정확도 달성
→ FLOPs 수준은 동일하지만, 구조가 단순하고
효율적
→ ConvNet도 여전히 최신 Transformer와 경쟁
가능하다는 것을 입증
✓ 많은 데이터로 학습하면 좋은 거 아닌가? 왜 22K에서 끝내지 않고 1K로 파인튜닝할까?
데이터가 많으면 일반적인 표현력은 좋아진다. 하지만, 모델의 “최종목적”이 중요한 것!
보통, 새로운 모델 성능을 비교할 때 “ImageNet-1K에서의 정확도” 사용
→ 목표가 1K 기준 평가라면 22K로 학습한 그대로 쓰면 라벨 체계가 맞지 않기 때문에, 라벨 매핑과 모델 조정이 필요하다
ex. 22K에서는 “비글 vs 포메” 라면, 1K에서는 “개” 로 분류해야 함
→ ResNet을 출발점으로 Transformer와 유사한 형태의 ConvNet으로 발전시켜보자!
→ 모델의 구조뿐만 아니라 학습방식도 성능에 큰 영향!
[1단계] ViT의 학습 절차를 적용하여 ResNet-50/200 학습 시킴
→ 둘 다 쓰는 이유는 50은 소형 비교군, 200은 대형 비교군
✓ ResNet-50 → 50개의 층(layer)
- 대략 50층의 연산 경로를 갖도록 설계
- 블록 구성(3,4,6,3)
- stage1: 3개 블록
- stage2: 4개 블록
- stage3: 6개 블록
- stage4: 3개 블록
✓ stage
CNN이나 ViT에서 해상도(특징맵 크기)가 일정하게 유지되는 구간
- 1x1, 3x3 같은 Conv 층을 합산해서 개수 계산
✓ 3x3 Conv → 공간적 특징 추출
- 3x3 필터는 주변 픽셀과의 관계(엣지, 패턴)을 잘 잡아냄
- 커널이 작아서 연산 효율이 좋고, 여러 층을 쌓으면 큰 수용영역 확보 가능
✓ 왜 커널이 작으면 연산 효율이 좋을까?
연산량 ∝ 커널 크기 ^2 × 출력 채널 수 × 출력 feature map 크기
→ 커널 크기를 키우면 연산량이 제곱으로 늘어남
→ 작은 커널이 계산량이 훨씬 적음
✓ 왜 여러 층을 쌓으면 큰 수용영역을 확보할 수 있을까?
수용영역 = 한 출력 픽셀이 참조하는 입력 이미지 영역 크기
한 층의 3×3 커널 수용영역 = 3×3
두 층을 연달아 쌓으면?
- 첫 번째 층이 만든 3×3 특징맵 위에서 또 3×3을 봄
- 입력 이미지 기준으로 보면 → 5×5 영역을 커버
세 층 쌓으면 → 7×7 영역
→ 층이 늘어날수록 수용영역이 커짐
⇒ 작은 커널: 계산량이 적고, 더 많은 층을 쌓아 복잡한 패턴 학습 가능
⇒ 여러 층: 수용영역이 커져서 더 넓은 문맥 정보 반영 가능
✓ 1x1 Conv → 채널(feature map) 조정
채널수 축소/확장에 사용(차원 변화)
공간의 크기는 유지하면서 “채널 간의 결합(정보 혼합)”을 수행
연산량이 매우 적어서 네트워크 폭을 유연하게 조절 가능
⇒ 1x1 Conv는 한 픽셀 위치에서 모든 채널 값을 가중합에 새로운 채널 만들어냄
✓ 정보혼합
서로 다른 특징을 합치고 조합하는 과정
→ (수평선+수직선+ 색상패턴,,,)
✓ ResNet-200 → 200개의 층(layer)
훨씬 깊은 버전, 더 많은 파라미터와 연산량
블록 구성(3,24,36,3)
- stage3의 블록 수가 매우 많아짐
→ 더 깊어서 성능은 높지만, 연산량(FLOPs)과 메모리 사용량도 큼
[2단계] ResNet 기본 학습 epoch수 90 → 300으로 학습 기간 연장
⇒ 강력한 데이터 증강 및 정규화 조합 + 대규모 모델을 사용하기 때문
⇒ 짧게 돌리면 잠재력을 다 못 끌어내고, 길게 돌려도 과적합 위험이 낮으므로 늘림
옵티마이저 : AdamW
데이터 증강 : Mixup, Cutmix, RandAugment, Random Erasing
정규화 : Stochastic Depth, Label Smoothing
✓ epoch
- 전체 학습 데이터셋을 한 번 모두 사용해 학습하는 주기
✓ 옵티마이저 → 가중치를 어떻게 조정할지 결정하는 “규칙” 또는 “알고리즘
- AdamW = Adam + Weight Decay(가중치 감쇠; 과적합 방지)
✓ 데이터 증강(입력 쪽 변화)
- 훈련 데이터를 인위적으로 변형 및 추가해서 데이터의 양과 다양성을 늘리는 기법
✓ 정규화(모델 쪽 변화)
- 모델이 과적합하지 않도록 학습과정이나 구조를 제약하는 기법
→ Swin-T의 매크로 네트워크 설계 분석
ㄴ ⭐ 1️⃣ 스테이지 연산 비율 + 2️⃣ 스템셀(stem cell) 구조
✓ 매크로 설계란? → 모델을 만들 때, 큰 틀을 먼저 잡는 것을 의미
모델 전반의 골격과 계층 구조를 설계하는 단계
ex. stage가 몇 개일지, 각 stage의 해상도와 채널 수, 어디서 다운 샘플링할 지 등
↔ 마이크로 설계(Micro)
✓ 스템셀(stem cell) 구조
- 이미지를 처음 받아서 특징 추출이 잘 되게 전처리하는 첫 레이어 집합
스테이지 연산 비율
ResNet: [Stage별 블록 개수] 3:4:6:3
→ 초반 Stage(고해상도)에도 블록이 많아 연산량이 큼
ConvNeXt: [Stage별 블록 개수] 1:1:3:1(→Swin Transformer 스타일)
→ 초반 Stage는 얕게, 중간 Stage(특히 Stage3)에 연산 집중
⇒ 연산의 효율성을 높이고, 중요한 중·후반부 특징 학습 강화!
스템셀 구조
ResNet Stem: 7x7 Conv(Stride=2) + 3x3 MaxPool(stride=2)
→ 2번의 다운샘플링으로 해상도 1/4로 축소
✓ Vision Transformer(ViT)의 패치화(Patchify)
입력 이미지를 일정 크기 “패치(조각)”으로 잘라서 Transformer에 넣음
→ 이때, 패치 생성은 비중첩(non-overlapping) 합성곱으로 구현 가능
ex. 16x16 커널, stride=16 → 이미지가 바로 16x16 크기 토큰들로 변환
✓ Swin Transformer의 Patchify
ViT처럼 단일 패치 크기가 16이 아니라 작은 패치(4x4)로 시작
→ Swin은 다단계 구조라서 초반에 해상도를 너무 줄이면 정보 손실이 커서, 처음에는 조금만
줄임
→ Stage를 거치며 점진적으로 다운 샘플링
ConvNeXt Stem(Patchify Stem): 4x4 Conv(stride=4) 한 번으로도 해상도 1/4 축소
→ Swin Transformer의 patch embedding과 유사
⇒ 초기 연산량을 감소하여, 이후 stage에 더 많은 연산 자원 배분 가능
⇒ 처음부터, 4x4 비중첩 패치화
⇒ ResNet에서도 복잡한 Stem 대신에 ViT, Swin 스타일의 Patchify Stem을 써도 성능 유지
[정리]
ConvNeXt 는
1️⃣ Stage 연산 비율을 Swin 스타일로 조정하고 2️⃣ Stem을 Patchify 방식으로 단순화하여
CNN을 현대화!⇒ ConvNeXt는 ResNet의 초반 구조(Stem)을 없애고, Swin처럼 4x4 (stride=4) patchify레이어로 시작해도 성능이 거의 떨어지지 않으니, 구조를 단순화하고 효율을 높였다는 뜻!
→ Depthwise Convolution(채널별 공간연산) 도입함으로써 FLOPs 절감
Grouped Convolution 사용
합성곱 필터를 여러 그룹으로 나눠서 각 그룹별로 합성곱을 수행 → 연산량(FLOPs) 감소
ex. 입력 채널이 64개, 그룹 수가 4개이면 그룹당 16 채널만 처리
‼️FLOPs가 줄어든 만큼 채널수를 늘려 모델의 표현력 손실 보완
Depthwise Convolution → Grouped Conv의 극단적인 경우
그룹 수 = 입력 채널 수
→ 채널마다 자기 채널만 따로 합성곱
공간적인 특징만 추출하고, 채널 간 결합은 없음 + 채널 결합은 1x1 Conv로 처리
[Grouped Conv vs. Depthwise Conv]
| Grouped Conv | Depthwise Conv | |
|---|---|---|
| 그룹수 | 지정 가능 (1~채널수) | 채널 수와 동일 |
| 채널 처리 방식 | 그룹 내 채널끼리만 처리 | 각 채널 독립 처리 |
| 채널 결합 | 가능(같은 그룹 내) | 없음 → 1x1 Conv 필요 |
| 연산량 절감 | O(1/그룹수) | O(1/채널수) → 가장 많이 절감 |

[ConvNeXt 설계]
: (a) → (b) → (c) 변화가 모두 순차적으로 적용됨

Depthwise Conv 연산량은 증가 → 채널 확장 때문
BUT! 다운샘플링 residual 블록의 shortcut 1x1 Conv 연산량이 크게 감소
[정리]
- ConvNeXt는 MobileNet V2:Transformer에서 차용한 Inverted Bottleneck을 활용하여
- 표현력 강화: 더 많은 채널에서 공간 정보 처리
- 효율성 유지: FLOPs 감소
- 공간 채널 분리 처리 + inverted bottleneck 구조 공유
- ConvNeXt는 “Transfromer가 전역 시야를 갖는 이유”를 ConvNet 방식으로 흉내낸 것
- 블록 앞쪽의 대형 커널의 Depthwise Conv를 넣어, 적은 채널로 넓은 영역의 공간 정보를 보고,
이후에
1x1 Conv에서 채널을 넓혀 세부처리를 하는데,,⇒ 7x7에서 성능이 가장 잘 나오더라~
→ ConvNeXt가 블록 내부 세부 설계(layer 수준)를 Transformer 스타일에 맞게 수정하면서 성능 높이자!


⇒ 부드러운 비선형성을 가져오지만 성능 차이는 미미
BN: ConvNet에서 표준, BUT 배치 크기에 민감하고 복잡
LN: Transformer에서 주로 사용, 배치 크기 무관, 더 단순
⇒ 배치 크기에 덜 민감하고 Transformer와 일관성 있는 구조로 만들기 위함
✔️ 기존의 ResNet에서 BN → LN 직접 교체 시 성능 저하
✔️ ConvNeXt는 앞선 구조 변경과 학습 기법 덕분에 LN 사용 가능!
| BN (Batch Normalization) | LN (Layer Normalization | |
|---|---|---|
| 정규화 기준 | 배치 내 채널 별 평균/분산 | 샘플 내 전체 피처 평균/분 |
| 배치 크기 영향 | 있음(작아지면 성능 저하) | 없음 |
| 주 사용 분야 | CNN(이미지), 대규모 배치 학습 | RNN, Transformer, NLP |
| 계산 위치 | 채널별 | 전체 피처별 |
✓ 샘플
- 데이터 1개 의미
✓ 배치
- 여러 샘플을 묶어서 한 번에 학습시키는 단위
- 배치크기: 한번에 처리하는 샘플 개수
비유하자면, BN은 반 전체 평균 / LN은 각 학생 자기 점수 평균
[정리]