아롱이 탐험대

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 분석 본문

study/paper reviews

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 분석

ys_cs17 2020. 9. 11. 14:57
반응형

해당 논문은 MNasNet의 저자인 Mingxing Tan과 Quoc V.Le가 쓴 논문이고, 2019년 CVPR에서 발표되었다.

 

ResNet의 residual block의 등장 이후로 CNN은 2가지 성향으로 발전하고 있다. 

이는 정확도만 높이는 방향과 비슷한 정확도를 가지고 효율성을 높이는 방향이다. 

 

EfficientNet은 네트워크의 이름과 마찬가지로 정확도와 효율성을 높인 놀라 온 네트워크이다.

EfficientNet은 ResNet기반이고, 정확히 말해 base network는 MNasNet을 사용한다.

 

모델의 구조를 설명하기에 앞서 네트워크의 성능을 높이는 방법은 크게 3가지이다.

 

1. Depth: layer의 수를 늘리는 방법

2. Width: network의 channel을 증가시키는 방법

3. resolution: 이미지의 차원을 늘리는 방법

 

이 중 resolution은 model과 상관이 없을 것 같지만, 이 논문의 저자는 주요 특성이라고 생각한다고 한다.

 

보통 기존 모델들을 보면 3개 중 1개에만 집중하여 향상을 해왔다. 하지만 논문의 저자는 이 3개 모두를 동시에 키우고 싶었다. 개념적으로는 쉬울 것 같지만 고려해야 되는 부분이 많았고, 구현의 문제와 무엇보다 성능이 더 향상되는지 확신이 없었다.

 

실험적인 결과로 이 3가지의 균형을 가지고 증가시키기에는 무리가 있다. 하지만 compound Scaling Method를 이용하여 constant ratio로 효율과 성능을 높일 수 있었다.

 

위 이미지를 보면 baselind은 기본적인 모델 구조,  width scaling는 layer를 더욱 wide 하게 하여 가로축인 channel을 늘린 모습 , depth scaling은 layer의 수를 증가시킨 모습,  resolution scaling은 input의 resolution을 늘린 것을 볼 수 있고, compound scaling은 이 3가지를 모두 합친 점을 볼 수 있다.

 

현재 state-of-art를 기록한 network들을 살펴보면 성능이 높아지면서 network의 규모가 매우 커지는 모습을 볼 수 있다.

gpipe도 많은 hardware를 사용하여 돌리게 되는데, 현재 기술력으로는 hardware의 한계가 존재하여 어차피 정확도를 더욱 높이고 싶으면 지금부터 효율성을 고려하며 network를 구상해야 더 큰 성능을 가지는 network가 많이 나올 것이다.

 

지금도 MobileNet, SqueezeNet, AutoML로 개발되어가고 있는 효율적인 network가 많긴 하지만 이 network들이 매우 큰 design space와 더 많은 expensive tuning cost에 적용시킬 수 있는지에 대한 의문점은 불명확하다.

 

한 마디로 정리하자면 작은 모델에서 적용시켰던 방식들을 큰 모델에 어떻게 적용할지가 큰 관문이다.

 

따라서 EfficientNet에서는 앞에서 언급한 Depth, Width, Resolution을 사용하여 이 문제를 해결하고자 했다.

하지만 이것 또한 약간의 cost가 발생하기 때문에 이를 해결하고자 어떻게 효율적으로 이 값들을 튜닝할지가 가장 중요한 문제이다.

 

CNN definition

CNN은 N(d, w, r)로 정의한다.

 F는 1개의 layer에 해당하는 function이다. X는 input tensor, Li는 한 스테이지에 이 function을 얼마다 반복할 것인지 결정한다. 이를 합성 함수를 사용하여 아래와 같이 CNN을 표현하였다.

 

전체적인 CNN을 표현한 수식

우리가 CNN을 디자인할 때에는 Fi를 변경시키는 것이다. 하지만 model scaling up을 할 때에는 Fi를 고정하고 depth, width, resolution을 변경시킨다.

 

해결해야 하는 문제에서는 Fi를 고정시키지만, design space 자체가 크기 때문에 어떻게 변화시킬지가 해결하기 어려웠다고 한다.

따라서 앞에서 정의한 model인 N을 기준으로 paramter를 d, w, r을 두었고, 이는 각 depth, width, resolution을 조절하는 paramter의 역할을 한다.

또한 memory와 flops의 값들은 효율성을 위해 target을 정하여 제한을 시켰고, d, w, r의 해당하는 값들은 실험을 통하여 지정하였다고 한다.

 

chage depth

depth 같은 경우에는 물론 depth가 깊어질수록 accuracy가 높아지긴 하지만 ResNet 같은 경우에는 1000개의 layer를 가지고 있는 model과 101개의 layer를 가지고 있는 model의 accuracy의 차이는 별로 없었다고 한다.

 

chage width

width 수를 늘렸을 때에도 Wide ResNet의 경우를 봐도 정확도가 좋아지는 모습을 볼 수 있다.

하지만 high level feature를 얻기가 힘들어지고, 마찬가지로 어느 정도 width를 키우다 보면 결국 accuracy 값이 수렴하게 되는 모습을 볼 수 있다.

 

change resolution

Resolution이 그나마 수렴이 적은 편이다. 기존까지의 network를 보면 resolution을 올림으로써 성능도 함께 올라가는 모습을 볼 수 있었다. 따라서 위 그래프를 보면 resolution이 커져가면서 accuracy가 상승하기는 하지만 여전히 변화폭이 줄어드는 모습을 볼 수 있다.

 

Observation 1

지금까지 설명한 depth, width, resolution 각각의 값을  scaling up을 진행하게 된다면 accuracy가 향상되지만 이에 반해 model이 커지면서 정확도의 상승폭이 줄어들게 된다.

따라서 compound scaling을 통해 3가지 모두 동시에 scale up을 진행하였다.

 

직관적으로 생각을 해보면 image가 커지게 되면 그만큼 receptive field가 커지게 되고, 이에 따라 layer의 수가 증가하게 된다. 또한 channel의 수도 증가하게 된다. 따라서 resolution을 키우게 된다면 depth도 커져야 되고, width도 더 커야 될 것이다. 이를 증명해보기 위해 실험을 하였다고 한다.

 

실험 결과 그래프를 보면 depth와 width 이 2가지를 키우는 게 훨씬 좋은 성능을 보인다.

 

Observation 2

하지만 depth, width, resolution을 효율적으로 결정하기가 힘들다. 이를 해결하기 위해 아래의 수식을 사용한다.

 

pie는 유저가 조절을 하는 hyper parameter이다. 또한 alpha, beta, gamma를 곱한 값을 2와 유사하게 고정을 시킨다. 2로 고정시키는 이유는 network를 2의 지수승으로 키우기 용이하게 만들려고 한 것 같다.

 

왜 beta와 gamma는 제곱을 취할까? channel이나 resolution은 layer를 2배로 키우게 된다면 연산량은 4배가 된다. channel의 같은 경우 한 layer에서 출력으로 나갈 때 2배가 되고, 그다음 layer에서 출력이 될 때 또 2배가 되어 최종적으로 4배가 된다. resolution은 가로, 세로가 2배씩 늘어나기 때문에 총 4배가 된다.

 

따라서 FLOPs를 정의하게 되면 2의 pie승이 된다.

 

이제 중요한 것은 alpha, beta, gamma의 값을 어떻게 고정시킬지이다. basenet의 같은 경우에는 AutoML과 유사하게 MNasNet을 사용하였다.

 

optimization goal

최적화의 목표는 위 수식이다. MNasNet과의 차이점은 latency가 존재하지 않는 점이다. 그 이유는 특정 hardware를 기준으로 실험을 진행하지 않기 때문이다.

 

 

basenet structure

basenet의 구조에서 MBConv는 inverted bottleneck 구조를 가지고 있는 MobileNetV2에서 사용된 기본적인 module을 사용하고 있다.

이 module들이 1개씩이 아닌 맨 오른쪽 layer의 개수만큼 반복되어 구성되어 있다.

 

실험에서는 pie를 우선 1로 설정하여 총 scale을 2배로 정의를 하였다. 그 결과 가장 좋은 성능의 parameter를 grid search를 사용하여 찾게 되었다.

 

alpha: 1.2

beta: 1.1

gamma: 1.15

 

그다음에는 각 alpha, beta, gamma를 고정시킨 후 pie값을 조절하여 더 큰 network로 키우는 방식으로 실험을 진행하였다.

pie의 값을 높일 때마다 alpha, beta, gamma를 변동시키지 않은 이유는 계산량이 매우 커서 힘들었기 때문이다.

따라서 alpha, beta, gamma를 고정하고 pie를 키우는 방식의 실험을 진행하였다.

 

result

실험의 결과를 보면 compound scale을 할 때 각 mobilenetv1, mobilenetv2, resnet50에서 성능이 좋아지는 모습을 볼 수 있었다.

 

imagenet을 기준으로 비슷한 accuracy를 갖는 model들이 얼마나 비효율적인지 실험을 통해 보여주는 결과이다.

EfficientNet-B7을 기준으로 보면 같은 accuracy를 같은 GPipe이지만 paramter에서 약 8.4배 차이가 난다.

 

Flops vs ImageNet ACC

각 Flops를 기준으로 그린 그래프이다. 성능적인 면에서 확실히 효율적인 모습을 보여준다.

 

각 parameter를 기준으로 그린 그래프에서도 매우 효율적인 모습을 보인다.

 

또한 아까는 latency를 추가하지 않았기 때문에 추가한 후 다음 실험을 진행하였다.

비교를 하면 같은 accuracy를 같지만 latency는 차이가 많이 난다. 따라서 network의 scale을 줄이고, 연산량을 줄인다고 해서 항상 속도가 빨라지지는 않는다.

 

그다음은 transfer learning에 대한 학습 결과이다.

parameter에서 차이가 많이 나고, 각 data마다 다른 모델이 성능이 더 좋은 경우도 있다.

 

compound scaling을 진행하지 않고, 따로 scale up을 하면 좋아지지 않는지에 대해 실험을 진행하였다고 한다.

위 그래프를 보는 바와 같이 compound scaling이 훨씬 좋은 성능의 모습을 볼 수 있다.

 

마지막으로 class activation map을 보았을 때 이를 visualize 해보면 weight들이 더욱 train data에 알맞게 학습이 되고 있는 모습을 볼 수 있다.

따라서 굉장히 안정적으로 효율적인 학습을 하고 있는 모습을 볼 수 있다.

 

Reference

https://arxiv.org/pdf/1905.11946.pdf

https://www.youtube.com/watch?v=Vhz0quyvR7I

 

반응형
Comments