SJ_Koding

ConvNeXt (A ConvNet for the 2020s, facebook) 논문 리뷰 본문

Deep Learning

ConvNeXt (A ConvNet for the 2020s, facebook) 논문 리뷰

성지코딩 2024. 4. 4. 13:46

- 부제: ConvNeXt 이해하기 최종 -

Image Classification model을 학습할 상황이 생겨서 ConvNeXt를 사용해봤는데 성능이 정말 좋게 나왔다.

대체 이 모델이 뭐길래? 하고 봤더니 Facebook이 발표한 논문이어서 흥미가 생겨 이 논문을 공부하게되었다.

논문을 읽으면서 정말 CNN에 대해 공부하기 좋은 논문이라는 생각이 들었다. 또, 논문구성이 정말 재밌다. 연구에 따른 성능 향상을 순차적으로 배치하여 마치 함께 연구를 한 것과 같은 느낌을 준다.

어떤 내용이길래?

extreme 요약: CNN계열 모델(ResNet50사용)을 최신에 알려진 기법을 적용하면서 극한으로 끌어올려보자~! 대신, pure CNN으로. 성공~!

Abstract

2020년대, Vision Task에서 Vision Transformer(ViT) 계열 모델이 모든 Task에서 SoTA를 달성하고 있다. 성능을 끌어 올리기 위해 CNN의 inductive bias를 사용하고자, ViT와 CNN을 결합하는 시도가 많이 이루어졌고 Facebook팀은 CNN의 성능을 극한으로 끌어내어 여전히 CNN은 강력하다라는 주장을 하고 있다.

계층적인 Transformers (예: Swin Transformers)가 다시 ConvNet의 여러 가정을 도입함으로써 Transformers를 일반 비전 백본으로 실용적으로 만들고 다양한 비전 작업에서 뛰어난 성능을 보여줬다. 즉, Transformer에도 CNN의 일부 기법과 가정을 도입하여 성능향상을 이끌어냈다는 것이다. Transformer, CNN이 서로 도움을 주고있다.

전형적인 ConvNet 모듈만으로 구성된 ConvNeXts는 정확도와 확장성 측면에서 Transformers와 유리하게 경쟁하며, 87.8%의 ImageNet top-1 정확도를 달성하고 COCO 탐지와 ADE20K 분할에서 Swin Transformers를 능가하면서도 표준 ConvNets의 단순성과 효율성을 유지한다.

ResNet의 큰 원이 ResNet-50, ConvNeXt의 가장 작은 원이 논문에서 제시한 변화된 성능 대상. SwinTransformer의 가장 작은 원이 논문에서 나오는 "Swin-T" 인 것을 알고가자.

Indroduction (주요내용만)

2020년에 Transformer의 매커니즘을 Vision분야에 적용한 Vision Transformer(ViT)이 발표되며, 이후 ViT의 quadratic complexity (이미지 사이즈에 따라 제곱으로 연산량이 증가하는 문제)를 해결한 Swin Transformer등 ViT계열 모델이 Vision의 모든 Task에서 SOTA를 달성하였다. 

그런데 이 SwinTransformer의 Sliding Window 매커니즘은 결국 CNN의 Convolution 연산에서 가져온 방법이기도 하고, CNN보다 모델 설계시에 많은 비용이 들어간다는 단점이 있었다. 

따라서 CNN으로 한계를 시험하기 위해, ResNet50을 base로 Swin Transformer와 같은 Hierarchical Transformer를 CNN으로 Modernize하여 점차 성능을 높인 ConvNeXt 라는 모델을 제안한다.

어떻게 성능을 높였나??

ConvNeXt는 총 5단계로 나뉘어진다.
1. macro design
2. ResNeXt
3. inverted bottleneck
4. large kernel size
5. various layer-wise micro designs

macro와 micro차이 (더보기 클릭)

더보기

"Macro"와 "Micro"는 다양한 분야에서 광범위한 관점과 세부적인 관점을 구분하는 데 사용되는 용어입니다. 컴퓨터 과학과 네트워크 아키텍처, 특히 딥 러닝 모델 설계의 맥락에서 이 용어들을 살펴보면 다음과 같은 차이점을 볼 수 있습니다:

Macro (매크로)

  • 전체적인 구조: 매크로 디자인은 모델이나 시스템의 전체적인 구조와 구성을 다룹니다. 이는 네트워크 아키텍처의 큰 그림, 블록의 배열, 다양한 모듈 간의 연결 방식 등을 포함합니다.
  • 주요 구성 요소: 네트워크의 주요 구성 요소와 그들의 상호 작용을 정의합니다. 예를 들어, ConvNet과 Transformer에서는 다양한 유형의 레이어(예: convolution, attention)와 이들이 전체 모델 구조 내에서 어떻게 배치되는지에 대한 결정이 포함됩니다.
  • 고수준의 성능 특성: 매크로 디자인은 모델의 전체적인 성능 특성(예: 계산 복잡도, 효율성, 확장성)과 관련이 있습니다.

Micro (마이크로)

  • 세부 구현: 마이크로 디자인은 모델이나 시스템의 세부적인 구현 사항을 다룹니다. 이는 개별 레이어나 모듈의 구체적인 구현 세부 사항, 활성화 함수의 선택, 정규화 기법 등을 포함합니다.
  • 구성 요소의 세부 사항: 각 구성 요소의 내부 작동 방식과 세부 파라미터 설정에 초점을 맞춥니다. 예를 들어, convolution 레이어에서 커널 크기, 스트라이드, 패딩 등의 세부 사항이 여기에 해당합니다.
  • 미세 조정과 최적화: 마이크로 디자인은 특정 작업에 대한 모델의 성능을 최적화하기 위한 미세 조정과 매개변수 튜닝에 관련이 있습니다.

따라서, 매크로 디자인은 "숲"을 보는 관점이라면, 마이크로 디자인은 "나무"에 집중하는 관점으로 이해할 수 있습니다. 매크로 디자인은 전체 구조와 전략적 방향을 결정하는 반면, 마이크로 디자인은 실제 구현과 세부적인 최적화를 다룹니다.

 

1. Macro design (78.8% --> 79.5%)

Swin Transformer의 macro network design을 살펴보자. Swin Transformer는 Hierarchical 설계를 사용하여 각 단계마다 feature map의 해상도가 다르다. 여기서 두 가지 주요 디자인 요소가 있다.

1) The Stage compute ratio
2) "Stem cell" structure.

Changing stage compute ratio (78.8% --> 79.4%)

ResNet에서 "res4" stage는 주로 object detection과 같은 downstream 작업과 호환되도록 많은 연산을 담당했다. Swin Transformer Tiny(Swin-T)는 비슷한 원칙을 따르되, stage 별 compute ratio를 1:1:3:1로 다르게 설정했으며 이 비율을 ResNet 50에 적용시켜 (3, 4, 6, 3) 비율에서 (3, 3, 9, 3)으로 각 stage의 블록 수를 조정하였다. 그 결과 모델 accuracy를 78.8%에서 79.4%로 향상시켰다. (이후 실험에도 해당 비율 고정)

* resnet 50 구조 

resnet 논문 Figure, 3 4 6 3에서 3:3:9:3 으로 변경했다는 뜻.

Changing stem to “Patchify” (79.4% --> 79.5%)

"Stem cell" 디자인은 네트워크 시작부분을 의미하며 결국 입력 이미지를 어떻게 처리할 것인지에 관한 부분이다. 일반적인 "Stem cell"은 표준 CNN와 Vision Transformer계열 모두에서 input image를 aggressive-downampling해 적절한 feature map 크기로 만든다. 

ResNet에서의 stem cell에는 stride 2를 가진 7x7 conv layer와 max pooling이 포함되어있어 4배만큼 downsample한다. 이에 더해 Transformer는 더욱 aggressive Patchify 전략이 stem cell로 사용되며 이는 큰 kernel size(k=14, 224이미지를 16개의 패치로 나눌경우)non-overlapping convolution(stride크기 == kernel size)를 사용했다.

ResNet50의 stem cell을 앞서말한 Patchify전략으로 변경한 4x4, stride4의 convolution layer로 대체했을 때 정확도가 79.4%에서 79.5%로 소폭 상승되었다. 여기서 성능향상에 중점이 두는게 아니라. CNN의 stem cell에 Patchify layer로 대체해도 유사한 성능을 얻을 수 있다는 것을 시사한다.
(이후 실험에도 Patchify 유지)

2. ResNeXt-ify (79.5% —> 80.5%)

저자는 ResNeXt의 아이디어(grouped convolution)를 pure resnet에 적용하였따. ResNeXt의 핵심 구성 요소는 grouped convolution이며, 여기서 convolution filter가 다른 group으로 나뉜다. 

group convolution에 관한 내용은 아래 포스팅을 참고하자.

 

Grouped convolution의 설명 및 PyTorch 예시

- 부제: ConvNeXt 이해하기 4편 - 연산량 감소를 위한 다양한 convolution이 있다. 아래의 글 처럼 말이다. 1. 1x1 convolution (연산량 감소 기법에 정말 많이 사용되는 convolution 필터, 꼭 알아둬야 함) 1x1 convo

sjkoding.tistory.com

 

저자는 그룹의 수 == 채널의 수와 같은 grouped convolution인 depthwise convolution을 사용했다고 한다. depthwise convolution에 대한 내용은 아래의 포스팅을 참고하자. 이거때문에 공부했다.

 

Depthwise (Separable) Convolution의 설명 및 Pytorch 예시

- 부제: ConvNeXt이해하기 3편 - Xception에서 제시된 컨셉으로 유명해졌다. 쉽게 이해할 수 있다. 먼저 Depthwise convolution을 알기 전에 일반적인 Convolution 연산을 알아보자. 기본적인 개념으로 Input channel

sjkoding.tistory.com

 

여하간 Depthwise convolution의 사용으로 연산량을 줄이지만 accuracy도 줄여지기 때문에 ResNeXt에서 제안된 전략을 따라 네트워크의 width를 Swin-T와 같은 채널 수인 96으로 증가(64 to 96)시킨다.

이는 Flops가 증가(5.3G)했지만 성능을 80.5%로 끌어올렸다.

(이후 실험에도 Depthwise convolution 적용)

3. Inverted Bottleneck (80.5% —> 80.6%)

Transformer 블록의 주요 design중 하나는 inveted bottleneck 구조를 만드는 것이다. 실제로 Transformer의 MLP구조를 보면 inverted bottleneck 구조를 띄고있다. inverted bottleneck구조는 아래 포스팅을 참고하자.

 

manifold와 Inverted Bottleneck의 설명 및 PyTorch예시

- 부제: ConvNeXt이해하기 5편- (본 포스팅은 https://gaussian37.github.io 김진솔 연구원님의 MobileNet V2 블로그 글을 적극 참고하였습니다.) 일반적인 Bottleneck구조는 아래 포스팅에서 다뤘다. Bottleneck 구조(

sjkoding.tistory.com

 

해당 Transforemer 디자인은 ConvNets에서 사용되는 4의 expansion ratio (t)를 가진 inverted bottleneck 디자인과 연결되어있다. 해당 아이디어는 MobileNetV2에 의해 대중화되었다.

따라서 이 아이디어를 적용해 위 그림의 (c)에서 (b)로의 구성으로 변경했으며, 채널이 확장되었으므로 Depthwise convolution 레이어의 FLOPs가 증가했음에도 downsampling residual block에서 상당한 FLOPs감소를 보이므로 전체 네트워크의 FLOPs를 4.6G로 줄였다. 또한 성능도 미세하게 향상되면서 연산량과 성능 두마리 토끼를 모두 잡았다.

4. Large Kernel Sizes (성능 유지)

ConvNets에서 큰 커널크기가 사용되기는 했지만 VGG때 부터 3x3의 작은 kernel 사이즈를 통해 layer를 쌓는것이 표준으로 여겨졌다. Swin-T는 비록 self-attention 블록에 local window를 도입했지만,  window size는 최소 7x7로, ResNet의 3x3 kernel 크기보다 상당히 크다. 따라서 저자는 다시 과거로 돌아가 큰 kernel 크기의 convolution을 사용하여 실험해보았다.

Moving up depthwise conv layer (FLOPs감소에 따른 79.9%)
상위 그림에서 (b) to (c)와 같이 depthwise convolution layer의 위치를 상위로 이동하는 것인데, 이는 Transformer에서 볼 수 있는 설계(Multi-head Self-Attention블록이 MLP레이어들보다 앞에 배치)로, 해당 디자인을 접목시킨다.

이 중간 단계는 FLOP을 4.1G로 감소시켜 결과적으로 일시적으로 성능이 79.9%로 저하된다.

Increasing the kernel size (79.9% --> 80.6%, FLOPs 유지)

큰 kernel size를 갖는 convolution을 채택하는 것은 상당한 이점이 있다고 주장한다. 여러 kernel size를 실험(3, 5, 7, 9, 11)했고 7x7일때 80.6%로 성능이 향상되었으며 FLOPs는 거의 유사하게 유지되었다고 한다. 또한 7x7이상의 kernel size에서는 더 이상 이득을 보지 않았다고 한다. 

지금까지 Macro scale에 대한 검토를 마쳤으며 이 과정에서 Vision Transformer에서 취한 상당 부분의 설계가 ConvNet 인스턴스로 매핑될 수 있다는 점이 흥미로웠다고 한다.

 

4. Micro Design (80.6% --> 82.0%)

Replacing ReLU with GELU 

ReLU는 ConvNets에서 광범위하게 사용되었고 Gaussian Error Linear Unit(GELU)는 최신 Transformers나 BERT, GPT등에 사용되었다. 저자들은 ConvNet에서도 ReLU를 GELU로 대체할 수 있으나 정확도는 변하지 않은 것을 확인했다. 하지만 GELU는 유지했다.

Fewer activation functions (80.6% --> 81.3%, Swin-T와 동률)

Transformer와 ResNet block사이의 작은 차이점 중 하나는 Transformer가 더 적은 activation function을 가지고 있다는 것이다. (절대적인 개수가 아닌 VGG처럼 레이어마다 ReLU등을 통과시키지 않았다는 의미)

예를 들어, Transformer 블록에는 Key, Query, Value linear embedding layer, projection layer, MLP내의 두 개의 linear layer가 있으며, MLP블록 내에는 단 하나의 activation function(GELU)만 존재한다.

 

앞서 말했듯 ConvNets는 1x1 convolution layer를 포함해 활성화 함수를 추가하는 것은 일반적인 관행이었는데 아래 사진을 보자.

위 그림 처럼 1x1 convolution이후에 GELU를 적용시켰을 때, accuracy가 무려 0.7% 향상되었다고 한다. (여기서 조금 놀라웠다. CNN의 일반적인 관행을 깨부셨다.) 이때부터 Swin Transformer Tiny의 성능과 동일해졌다.

Fewer Normalization layer (81.3% --> 81.4%)

Transformer 블록은 일반적으로 더 적은 Normalization layer를 가지고 있다. 여기서 두 개의 Batch Normalization(BN) layer를 제거하고, 1x1 convolution layer전에 하나의 BN layer만 남길 경우 성능을 81.4%로 향상시켰다.

 

Substituting BN with LN (81.4% --> 81.5%)

Batch Normalization은 모델의 성능에 해로울 수 있는 많은 복잡성을 가지고 있는 반면, 더 단순한 Layer Normalization(LN)은 Transformer에서 사용되어 다양한 응용 시나리오에서 좋은 성능을 보여주었다. 따라서 BN대신 LN을 사용하여 실험한 결과 81.5%로 성능이 올랐다.

 

Separate downsampling layers (81.5% --> 82.0%)

ResNet에서는 각 stage 시작에서 residual block을 통해 3x3 convolution(stride 2)와 shortcut 연결에서의 1x1 convolution(stride 2)를 사용하여 spatial downsampling이 이루어진다. 반면, Swin Transformer에서는 stage사이에 separate downsampling layer가 추가된다. 저자도 stride2의 2x2 convolution layers를 사용하여 spatial downsampling을 위한 유사한 전략을 탐구했으나, Loss가 발산해버렸다고 한다.

실험 끝에 spatial resolution이 변경되는 곳 마다 normalization layers를 추가하는 것이 training을 안정화하는 데 도움이 되는 것을 발견하였다. 이에는 Swin Transformers에서도 사용되는 여러 LN layers가 포함되며, 각 downsampling layer 전, stem 후, 그리고 최종 global average pooling후에 각각 하나씩 위치한다. 이러한 조정을 통해 모델의 성능을 82.0%로 개선하여 Swin-T의 81.3%를 상회하는 성과를 달성했다. 

 

저자의 Closing remarks.

" 지금까지 논의한 모든 design 선택은 Vision Transformers에서 적용된 것임에 주목할 가치가 있다. 이러한 design들은 ConvNet에서 새로운 것이 아니며 지난 십 년간 별도로 연구되었지만 집단적으로 연구되지는 않았다. 우리의 ConvNeXt모델은 Swin Transformer와 대략적으로 동일한 FLOPs를 가지고 있지만 Shifted window attention 혹은 relative position biases등의 특별한 모듈을 요구하지 않는다. "

 

Result

위 실험 테이블을 보면 유사한 FLOPs를 보면 거의 ConvNeXt의 성능이 가장 높은 것을 볼 수 있다. 또한 충분한 데이터셋에서도 Swin Transformer의 성능을 넘어섰다는 건, inductive bias가 크더라도 큰 데이터셋에 대한 성능이 떨어지지 않는다는 것을 위의 표에서 보여주고있다.