오늘 리뷰할 논문은 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% 더 빠르고, 더 높은 정확도를 달성합니다.
Introduction
고전적인 ConvNet, VGG와 같은 모델에서는 단순히 conv, ReLU, Pooling 과정으로 구성
연구가 발전하면서 Inception, ResNet, DenseNet, AutoML 기반 모델과 같은 복잡한 Conv 구성을 가지는 신경망들이 등장
이러한 방식들은 높은 정확도를 달성하지만 아래와 같은 단점을 가짐
복잡한 multi-branch 설계는 구현이 어려움
customize 하기 힘듦
inference time이 느림
memory utilization이 좋지 않음
Xception의 depthwise conv, MobileNets, ShuffleNet 같은 구조들은 memory access cost를 증가시키며, 다양한 기기에서 지원되지 않음
추론 속도에 영향을 미치는 요소들이 너무나 많아서 FLOPs(Floating-point operation)은 실제 속도를 정확하게 반영하지 않음
일부 새로운 모델은 VGG, ResNet18/34/50 보다 FLOPs가 낮지만, 추론속도가 빠르지 않음
RepVGG의 장점
일반 VGG와 유사한 토폴로지를 갖음, 즉 모든 레이어는 이전 레이어의 출력을 다음 레이어의 입력으로 사용
모델의 body는 오직 3x3 Conv 및 ReLU로 이루어짐, 즉 GPU와 같은 일반 컴퓨팅 장치에서 속도가 빨라짐 (경제적인 memory unit)
Building RepVGG via Structural Re-param
Simple is Fast, Memory-economical, Flexible
Fast
RepVGG에서 오직 3x3 Conv만 사용하는 이유는 NVIDIA cuDNN, Intel MKL과 같은 라이브러리에서 3x3 conv layer가 최적화 되어있기 때문
똑같은 배치 사이즈와 인풋/아웃풋 채널 갯수를 가졌을 때 각 커널 사이즈에 따른 속도 비교를 한 표
Theoretical FLOPs : memory access delay, address generation delays 같은 사소한 overhead가 없다고 가정할 때의 FLOPs
Time usage : 실제 러닝 타임
Theoretical TFLOPs(Tera FLoating-point Operations Per Second) : computational density를 측정한 결과
computational density 값이 클 수록 계산 효율성이 좋은 것
Memory-economical
multi-branch 구조는 branch의 결과가 add 또는 concatenation 될 때 까지 feature들을 유지해야 하므로 메모리 비효율적
아래 그림에서도 하나의 feature를 나중에 더하기 위해 갖고 있어야하므로 중간에 계속 2배의 메모리를 차지하게 됨
Flexible
multi-branch 형태의 모델은 구조적으로 여러가지 제약이 존재
ResNet의 residual block의 마지막 conv는 input으로 들어온 tensor와 똑같은 모양의 tensor를 출력해야한다는 제약이 존재
또한 channel pruning을 할 때도 residual connection 등이 있으면 pruning을 적용 어려움
따라서 RepVGG에서는 multi-branch 구조가 학습 시에는 이점이 있으므로 학습 시에만 사용합니다.
Training-time Multi-branch Architecture
여기서 핵심은 두가지 입니다.
1x1 conv와 identity conv를 모두 3x3 conv로 대체
conv + BN을 conv + bias로 바꾸는 것
위 예시에서 그림 (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
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 같은 최신 모델들에 비해선 파라미터 수가 꽤 많다는 단점 또한 확인할 수 있습니다.
200 epoch으로 학습하여 Autoaugment, label smoothing, mixup을 적용한 결과는 아래와 같습니다.
표6은 identity branch와 1x1 branch가 모두 있는 경우 성능은 제일 좋지만 추론 시 속도는 가장 느리고, 모두 없는 경우 성능은 제일 안 좋지만 속도는 가장 빠른 것을 확인할 수 있습니다. 이 때 추론 속도는 re-parameterization 과정 없이 측정한 것입니다.
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% 더 빠르고, 더 높은 정확도를 달성합니다.
Introduction
RepVGG의 장점
Building RepVGG via Structural Re-param
Simple is Fast, Memory-economical, Flexible
Fast
Memory-economical
Flexible
따라서 RepVGG에서는 multi-branch 구조가 학습 시에는 이점이 있으므로 학습 시에만 사용합니다.
Training-time Multi-branch Architecture
여기서 핵심은 두가지 입니다.
그 다음 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
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 같은 최신 모델들에 비해선 파라미터 수가 꽤 많다는 단점 또한 확인할 수 있습니다.
200 epoch으로 학습하여 Autoaugment, label smoothing, mixup을 적용한 결과는 아래와 같습니다.
표6은 identity branch와 1x1 branch가 모두 있는 경우 성능은 제일 좋지만 추론 시 속도는 가장 느리고, 모두 없는 경우 성능은 제일 안 좋지만 속도는 가장 빠른 것을 확인할 수 있습니다. 이 때 추론 속도는 re-parameterization 과정 없이 측정한 것입니다.