eehoeskrap / PaperReview

꾸준희의 꾸준하게 논문 읽기 프로젝트 ✨
9 stars 0 forks source link

RepVGG: Making VGG-style ConvNets Great Again #13

Open eehoeskrap opened 1 year ago

eehoeskrap commented 1 year ago

GitHub : https://github.com/DingXiaoH/RepVGG Paper : https://arxiv.org/abs/2101.03697

오늘 리뷰할 논문은 CVPR 2021에 채택된 "RepVGG: Making VGG-style ConvNets Great Again" 라는 논문 입니다. 참고로 이 논문에서 제안된 Re-parameterization 방법은 MobileOne backbone에서 채택되기도 했습니다! RepVGG는 structural re-parameterization 방법을 제안하여 inference time 및 train time에서 각 사용하는 모델 구조를 다르게 하여 정확도와 속도 사이의 trade-off를 해결합니다. 즉 학습 할 때는 multi branch 구조를 가진 모델을 사용하여 정확도를 달성할 수있도록 하고, 추론할 때는 3x3 conv + ReLU stack으로 이루어진 구조를 사용하여 속도를 높입니다. NVIDIA 1080Ti GPU에서 ResNet-50 모델보다 83% 더 빠르고, 더 높은 정확도를 달성합니다.

image

Introduction

image

RepVGG의 장점

Building RepVGG via Structural Re-param

Simple is Fast, Memory-economical, Flexible

따라서 RepVGG에서는 multi-branch 구조가 학습 시에는 이점이 있으므로 학습 시에만 사용합니다.

Training-time Multi-branch Architecture

여기서 핵심은 두가지 입니다.

image

위 예시에서 그림 (A)의 초록색 3x3 conv는 kernel size=3, stride=1, padding=1인 일반적인 3x3 conv이고, 초록색 빗금 처리된 것은 3x3 conv에 해당하는 BN 입니다. 그림 (B)에서는 가중치가 각 커널에 꽉 채워져있습니다. 그 다음 주황색 1x1 conv는 kernel size=1, stride=1, padding=1인 1x1 conv 이고, 그리고 이 1x1 conv는 zero padding이 들어간 3x3 conv로 대체할 수 있습니다. 그림 (B)에서 주황색 1x1 conv의 가중치 주변에 점선으로 padding이 들어가 3x3 conv 모양이 된 것을 볼 수 있습니다. multi-branch의 가장 바깥쪽인 identity 부분은 residual connection 처럼 input 값을 그대로 더하되, BN을 통과하게 됩니다. 이는 dentity matrix(단위 행렬)을 커널로 갖는 1x1 conv로 대체할 수 있다고 합니다. identity layer는 원본 feature map이 커널을 거칠 때 커널 자체에도 채널이 있고 그 채널 수는 인풋 feature map 갯수와 똑같게 된다고 하네요. 여기에 이 1x1 conv에 zero padding을 함으로써 3x3 conv를 만들 수 있습니다.

그 다음 conv + BN 조합을 conv + bias로 바꾸어야합니다. 3x3 conv + BN, 1x1 conv + BN, identity layer + BN를 모두 3x3 conv + BN으로 바꾸면, 3x3 conv + BN을 3x3 conv + bias 형태로 바꿀 수 있고, 3x3 conv + bias를 모두 fusion 할 수 있다고 합니다.

학습된 모델은 각 가중치가 커널에 저장되어있고, 각 conv는 relu를 거치지 않으므로 서로 선형적으로 단순히 가중치를 더할 수 있다고 합니다.

Architectural Specification

image

RepVGG 모델은 RepVGG-A와 RepVGG-B 총 두 가지 모델로 설계되었습니다. A 모델은 ResNet18/34/50을 포함한 lightweight 모델 및 middleweight 모델과 경쟁하고, B 모델은 heavy 모델(e.g. RegNet, ResNeXt)과 경쟁합니다.

총 5개의 stage로 이루어져있으며, 모두 3x3 conv로 이루어져 있습니다. 이때 pooling을 위해서 각 stage의 첫 레이어는 stride=2인 3x3 conv로 이루어져 있습니다. Max Pooling 레이어 등을 따로 쓰지 않는 이유는 모델의 feature 추출하는 모든 부분을 3x3 conv로 구성해서 fusion 할 수 있게 만들기 위함이라고 하네요. 그리고 본 논문에서는 이미지 분류를 위해서 global average pooling을 fully connected layer 뒤에 붙입니다.

Experiments

성능 테스트는 conv + BN을 3x3 conv + bias로 바꾼 뒤, inference mode로 측정합니다. 우선 1080Ti 환경에서 batch size 128로 ImageNet에서 120 epoch으로 학습한 결과는 아래와 같습니다. Table4를 보면, 특히 비슷한 성능이거나 더 나은 성능일 때, RepVGG는 ResNet 계열들보다 속도와 파라미터 수 두 관점에서 모두 우수합니다. 다만 VGG 구조를 따른다는 점 때문에 RegNet, ResNeXt, EfficientNet 같은 최신 모델들에 비해선 파라미터 수가 꽤 많다는 단점 또한 확인할 수 있습니다.

image

200 epoch으로 학습하여 Autoaugment, label smoothing, mixup을 적용한 결과는 아래와 같습니다.

image

표6은 identity branch와 1x1 branch가 모두 있는 경우 성능은 제일 좋지만 추론 시 속도는 가장 느리고, 모두 없는 경우 성능은 제일 안 좋지만 속도는 가장 빠른 것을 확인할 수 있습니다. 이 때 추론 속도는 re-parameterization 과정 없이 측정한 것입니다.

image