728x90
반응형

Paper : https://arxiv.org/abs/2305.12972

GitHub : https://github.com/huawei-noah/VanillaNet

 

GitHub - huawei-noah/VanillaNet

Contribute to huawei-noah/VanillaNet development by creating an account on GitHub.

github.com

 

오늘 리뷰할 논문은 얼마 전 등장한 VanillaNet 입니다. (참고로 Vanilla 라는 뜻은 without any customization 이라는 의미를 가지고 있습니다. default, ordinary, basic의 의미라고 보시면 됩니다.) 원래 backbone의 정설은 레이어가 복잡하고, 깊을 수록 좋은 성능을 낸다는게 정설이였는데요, 이 논문에서는 network 구성을 간단히 구성해도 성능을 그만큼 달성 해낼 수 있다는 것을 보여준, 기존의 틀을 깬 논문입니다. 저는 이렇게 기존의 틀을 깨는 논문이 좋더라구요. 저자는 Huawei 연구기관에 소속되어있는 Yunhe Wang  입니다. 모바일 쪽에서 사용되고 있는 GhostNet의 저자이기도 합니다. 논문을 정말 많이 내셨네요! Adder Neural Networks 라는 논문도 경량화 측면에서 읽어볼만 한 것 같습니다. 

 

아래 내용은 VanillaNet의 내용을 arXivGPT가 요약해준 내용입니다. 즉, VanillaNet은 high depth, shortcuts, self-attention과 같은 복잡한 작업이 필요 없고, 유명한 network와 동등한 성능을 제공하는 backbone 입니다. 이는 리소스가 제한된 환경에서 모델을 효율적으로 배포할 수 있다고 하네요. 

 

 

 

Contribution

 

VanillaNet의 주요 contribution은 다음과 같습니다.

 

  • 간단한 신경망 조합으로도 ResNet과 비슷한 성능을 낼 수 있다는 것을 제안 
  • deep training strategy, activation function stacking 제안

 

 

 

 

VanillaNet Architecture 

 

 

stem은 stride 4인 4 x 4 x 3 x C conv layer를 활용하여 3개의 채널이 있는 이미지를 C 채널이 있는 feature에 매핑 시키고, 1~3 단계 에서는 stride가 2인 max pooling layer를 이용하여 크기와 feature map 크기를 줄이고 채널 수를 2 씩 늘립니다. 4단계에서는 average pooling layer를 따르며, 채널 수를 늘리지 않습니다. 마지막 laye는 classification 결과를 출력하는 FC layer로 구성됩니다. activation function은 각 1 x 1 conv layer 이후에 적용되며, training 과정을 쉽게 하기 위해 batch normalization도 각 layer 뒤에 추가 됩니다. VanillaNet은 shorcut 과정이 없습니다. 이는 성능이 거의 향상되지 않는다고 하네요. 그리고 SE block 과 같은 과정이 없기 때문에 구현하는게 굉장히 쉽다고 합니다. 이러한 구조가 non-linearity 하다는 특징이 있기 때문에 이러한 문제를 해결하기 위해 deep training technique을 제안합니다. 

 

 

 

Deep Training Strategy

 

Deep training strategy의 주요 아이디어는 training 시작 할 때 single conv layer 대신 2개의 conv layer와 actavation function을 적용하여 학습하는 것입니다. activation function은 epoch 수가 증가함에 따라 identity mapping으로 점차 감소하게 됩니다. 학습이 끝나면 두 개의 conv layer를 하나의 conv layer로 병합하여 inference time을 줄일 수 있다고 하네요. 이런 idea는 CNN 계열 논문에서 널리 사용된다고 합니다. 

 

  • Acnet: Strengthening the kernel skeletons for powerful cnn via asymmetric convolution blocks.
  • Diverse branch block: Building a convolution as an inception-like unit.
  • Scaling up your kernels to 31x31: Revisiting large kernel design in cnns.
  • Repvgg: Making vgg-style convnets great again.

 

activation function은 다음과 같이 정의됩니다. 여기서 λ는 non-linearity의 균형을 맞추기 위한 하이퍼파라미터입니다. 이 값은 총 epoch 수가 E이고 현재 epoch 수가 e 이면 λ = E/e 로 설정한다고 하네요. 그래서 이 값이 0이 되면 강한 non-linearity 값을 가진다고 합니다. 학습이 수렴되면 activation이 없으니까 A(x) = x 가 된다고 하네요 

 

 

 

그 다음 모든 batch normalization layer와 이전 conv layer를 single conv layer로 변환합니다. 

 

 

 

그럼 아래와 같이 나타낼 수 있습니다. 여기서 x, y는 각각 input, output feature를 나타냅니다. 

 

두 conv layer의 weight matrix를 $W^1$과 $W^2$로 나타내면, activation function이 없는 두 함수는 아래와 같이 나타낼 수 있습니다. 이렇게 연산하게되면 inference time을 늘리지 않을 수 있습니다. 

 

 

Series Informed Activation Function

여태 많은 activation function이 제안되었지만, 단순하고 얕은 신경망의 경우 제한된 표현력은 깊고 복잡한 신경망과 달리 non-linearity가 좋지 않기 때문에 연구가 잘 안되었다고 합니다. 그래서 신경망의 non-linearity를 개선하는 방법이 두 가지가 있는데 non-linear layer를 쌓거나, 각 activation layer의 non-linearity을 높이는 방법입니다. 기존 연구들은 전자를 선택하는데 이렇게 될 경우 parallel computation ability이 초과되면 latency가 생깁니다. 그래서 간단한 아이디어는 activation function을 동시에 stacking 하는 것 입니다. 즉, concurrently stacking은 다음과 같이 나타낼 수 있습니다. 

 

여기서 n은 누적된 activation function의 개수를 뜻하며, $a_i$와 $b_i$는 단순 누적을 피하기 위한 activation function의 scale, bias 입니다. activation function의 non-linearity는 concurrently stacking을 통해 크게 향상 시킬 수 있습니다. approximation ability을 향상시키기 위해 neighbor의 input을 변경하여 series 기반 feature가 global feature를 학습할 수 있도록 합니다. input feature x (여기서 H, W, C는 폭, 높이 채널)가 주어지면 activation 함수는 다음과 같이 정의할 수 있습니다. 또한 이 논문에서 ReLU를 사용한다고 하네요. 일반적인 activation function도 적용 가능하다고 합니다. 

 

 

computation complexity를 계산한 결과는 다음과 같습니다. 결론적으로 VanillaNet-B 구조의 4-stage 같은 경우 $C_{out}=2048$, k=1, n=7이면 ratio 는 약 84 입니다. 즉, activation function의 계산 비용은 conv layer 보다 훨씬 낮습니다. 

 

 

 

Experiments

 

activation function 개수에 따른 실험결과 입니다. 본 논문에서는 정확도와 속도 측면의 균형에서 n=3 값이 적절하여 이 값을 사용했다고 합니다. 그리고 n=0 일 때는 ImageNet의 결과가 60.53% 정도라 실제로 사용하지 못할 수준이라고 하네요. 확실히 activation function을 stacking 하는 것이 성능면에서 좋은 듯 합니다. 

 

확실히 deep training 기법과 activation function을 쌓은 series를 이용했을 때 성능이 좋습니다. AlexNet, ResNet-50과 견줄 만큼요. 

 

그리고 shortcut layer는 사용을 안하는게 제일 낫네요. 원래대로라면 신경망에서 shortcut을 추가하는게 학습도 쉬워지고 성능도 향상되지만, VanillaNet에서는 shortcut을 추가한다고해도 성능이 오히려 하락되네요. 본 논문에서 제안하는 VanillaNet의 bottleneck은 identity mapping이 아니라, non-linearity이기 때문에 shortcut을 추가하는 것이 정답이 아니라고 말하고 있습니다. 즉, 이렇게 shortcut을 추가한다고 해도 activation function을 건너 뛰어버리게 되면 non-linearity가 더 감소되어 성능이 저하되는 것이죠. shortcut 같은 개념은 충분히 많은 표현력을 담고 있는 무거운 신경망에 적용하는 것이 좋아보입니다. 

 

 

ResNet의 결과와 비교한 자료입니다. 확실히 activation이 잘되네요. 

 

다른 모델과 비교한 결과는 다음과 같습니다. 

 

 

728x90
반응형

'AI Research Topic > Backbone' 카테고리의 다른 글

[Backbone] DreamTeacher: Pretraining Image Backbones with Deep Generative Models  (0) 2023.07.17
[Backbone] ResNet  (7) 2023.04.14
[Backbone] VGGNet  (0) 2023.04.14
[Backbone] AlexNet  (0) 2023.04.14
[Backbone] LeNet-5  (0) 2023.04.13