RepVGG: Making VGG-style ConvNets Great Again (CVPR, 2021)
- GitHub - DingXiaoH/RepVGG: RepVGG: Making VGG-style ConvNets Great Again
Abstract
본 논문에서는 training 시에는 ulti-branch 토폴로지를 갖지만, inference 시에는 3x3 convolution과 ReLU의 stack으로만 구성된 CNN 아키텍쳐 RepVGG를 제안한다. structural reparameterization을 multi-branch 구조를 plain 3x3 conv로 변환한다.
Introduction
많은 복잡한 CNN 모델들은 높은 정확도를 달성하지만, 명확한 단점이 있다.
1. ResNet의 residual addition과 Inception의 branch-concatenation와 같이 복잡한 multi-branch 구조는 모델을 구현이 어렵고, 인퍼런스 시 비효율적이다.
2. Xception과 MobileNets의 depthwise conv와 Shufflenets의 channel shuffle은 메모리 접근 비용을 증가되거나 다양한 디바이스에서 지원이 되지 않는다.
이러한 이유로 실제 현장에서는 최근 모델이 아닌 ResNet, VGG 모델이 여전히 사용된다.
RepVGG는 다음과 같은 이점을 가진다.
- plain VGG의 구조를 따른다. (multi-branch를 가지지 않는다.)
- 모델은 오직 3x3 convolution과 ReLU를 가진다.
- 이러한 구조는 automatic search, manual refinement, ompound scaling 등의 방법을 전혀 쓰지 않고 구현된다.
Building RepVGG via Structural Re-param (structural reparameterization)
structural reparameterization은 크게 2가지 과정으로 나눌 수 있다.
1. conv + BN → Conv + bias
2. 1x1 Conv, Indentity mapping → 3x3 Conv
Conv + BN → Conv + bias
batch normalization의 파라미터는 %\nu, \sigma, \gamma, \beta%가 존재한다.
%\nu%는 평균이고 %\sigma%는 표준편차, %\gamma%는 scaling parameter이고 %\beta%는 shift parameter이다.
배치정규화는 데이터에서 평균을 빼고 표준편차로 나눈 다음, scaling parameter를 곱하고 shift parameter를 더해준다.
이를 수식으로 정리하면 다음과 같다. 여기서 M은 입력 영상이다.
이 파라미터를 weight와 bias에 다음과 같이 적용하면 별도의 레이어 없이 배치정규화를 수행한 효과를 볼 수 있다.
이는 다음과 같이 나타낼 수 있다.
%M^{(1)}%은 입력이고, %M^{(2)}%는 출력이다. W는 weight를 의미한다.
%W, \nu, \sigma, \gamma, \beta%는 윗첨자 3은 3x3 conv의 파라미터, 1은 1x1 conv의 파라미터, 0은 identity mapping의 파라미터이다.
이러한 변환을 통해 배치정규화 레이어를 3x3 conv로 변환시킬 수 있다.
1x1 Conv, Indentity mapping → 3x3 Conv
convolution parameter 수를 세는 방법은 다음과 같다.
%(K*K)(C_{in}*C_{out}+C_{out}%
K는 커널 수, %C_{in}%은 입력 채널 수, %C_{out}% 출력 채널 수를 의미한다.
아래 그림으로 예를 들어보자.
여기서 %C_{in}%은 2, %C_{out}%은 2이다.
녹색은 커널 크기가 3이기에, 파라미터 수는 3x3x2x2 = 18,
주황색은 커널 크기가 1이기에 1x1x2x2 = 4 가 나오게 된다.
이때 1x1 conv의 파라미터에 패딩을 추가하면 3x3 크기로 1x1 conv의 파라미터를 적용한 효과를 볼 수 있다.
그리고 identity mapping은 단위 행렬을 커널로 가지도록 구성하면 된다.
그리고 1x1 conv와 마찬가지로 패딩을 추가하면 다음과 같다.
이렇게 구해진 파라미터를 다 더하면 한 번의 3x3 convolution을 통해 3x3, 1x1 conv 와 identity mapping을 적용한 것과 같아진다.
이를 통합하면 다음과 같다.
Experiments
Multi-barnch
multi-branch를 사용하면 성능이 올라간다.
RepVGG for ImageNet Classification
아키텍쳐 명세는 생략...
비슷한 성능의 RepVGG-B2와 ResNeXt-101을 비교하였을 때, 성능이 더 좋은데 속도도 더 빠르고, FLOPs도 더 높다. (Wino MULs는 잘 모르겠다..) Params가 더 많은 이유는 RepVGG-B2의 구조가 ResNeXt-101 모델의 보다 더 크기 때문이다.
논문에는 아키텍쳐 명세에 RepVGG 모델들에 대한 구조를 설명하였는데 이 구조들은 실험에 비교된 기존 아키텍쳐와 동일한 경우는 없는 것 같다. 그래서 비슷한 성능의 모델의 스피드와 FLOPs 를 비교하는 것 같다.
결론
multi-branch를 사용하면 성능이 올라간다. 그러나 인퍼런스 시에는 비효율적이다.
따라서 structal re-parameterization을 통해 multi-branch를 plain convolution으로 decoupling하였다.