안녕하세요.
오늘은 기존의 Convolutional Neural Network의 구조를 조금 더 효율적인 작동 형태로 변화하는 것을 시도한 논문인 MobileNet V1 논문을 살펴보려고 합니다.
논문의 주소는 다음과 같습니다.
https://arxiv.org/abs/1704.04861
그럼 시작해보겠습니다.
Abstract
저자들은 본 논문에서 mobile과 embedding vision applications에서 사용할 수 있는 효율적 모델인 MobileNets를 제시합니다.
MobileNets는 가벼운 deep neural network를 만들기 위해 depth-wise separable convolution을 사용하여 간소화된 architecture를 기반으로 하고 있습니다.
저자들은 latency와 accuracy 사이의 trade-off를 조절하는 두 개의 간단한 global hyper-parameter를 도입합니다.
이러한 hyper-parameters는 model을 만드는 사람이 문제의 제약에 기반해서 적절한 사이즈의 모델을 선택할 수 있도록 도와줍니다.
저자들은 resource와 accuracy 사이의 tradeoff에 대한 광범위한 실험을 제시하고 있으며, ImageNet classification에서 유명한 다른 모델들과 비교했을 때 강력한 성능을 낸다는 사실을 보여줍니다.
그러고 나서 object detection, finegrain classification, face attribute, large scale geo-localization을 포함한 다양한 use case에서 MobileNet의 효과성을 검증합니다.
1. Introduction
AlexNet이 ImageNet Challenge인 ILSVRC 2012에서 승리한 이후로, computer vision 분야에서 Convolutional neural network는 아주 흔해졌습니다.
일반적인 경향은 더 높은 accuracy를 달성하기 위해서 더욱 deep 하고 복잡한 모델을 만드는 것이었습니다.
하지만, 이러한 accuracy에서의 진보는 네트워크를 size와 speed 측면에서 더욱 효율적이게 만들지 않습니다.
로보틱스나 자율주행차, 증강현실과 같은 현실 세계의 application에서는, recognition task가 연산적으로 한계가 있는 플랫폼에서 timely fashion으로 이루어질 필요가 있습니다.
본 논문에서는 mobile과 embedded vision application에서의 design requirement에 쉽게 매칭 될 수 있는 매우 작고, low latency를 가지는 모델을 만들고자 효율적인 네트워크 아키텍처와 두 개의 hyper-parameter를 제시합니다.
Section 2에서는 작은 모델을 만드는 것에 대한 선행 연구들을 리뷰하고, Section 3에서는 MobileNets을 더욱 작고 더욱 효율적으로 정의할 수 있는 width multiplier와 resolution multiplier와 MobileNet architecture를 제시합니다.
Section 4에서는 ImageNet에 대한 실험과 더불어 다양한 application과 use case에서의 실험을 제시합니다.
Section 5에서는 summary 및 결론으로 마무리합니다.
2. Prior Work
생략하고 넘어갑니다.
3. MobileNet Architecture
이번 section에서, 저자들은 첫 번째로 MobileNet을 만드는데 가장 중요한 layer인 depthwise separable filter에 대해서 설명합니다.
그러고 나서 MobileNet network structure를 설명하고, 두 개의 모델 shrinking hyper-parameter인 width multiplier와 resolution multiplier에 대해서 설명하고 마무리합니다.
3.1 Depthwise Separable Convolution
MobileNet model은 분리된 convolution의 한 형태인 depthwise separable convolution을 기반으로 하고 있으며, 이는 standard convolution을 depthwise convolution과 pointwise convolution이라고 불리는 1x1 convolution으로 분리합니다.
MobileNets에서 depthwise convolution은 하나의 filter를 각 input channel에 적용하게 됩니다.
Pointwise convolution은 그다음으로 depthwise convolution으로부터 나온 output을 결합하고자 1x1 convolution을 적용합니다.
Standard convolution은 filter를 적용하고, input을 새로운 일련의 output으로 결합하는 것을 하나의 step으로 적용합니다.
Depthwise separable convolution은 이를 filtering을 수행하는 별개의 layer와 combining을 수행하는 별개의 layer, 총 2개의 layer로 분리합니다.
이러한 분리는 computation과 model size를 과감하게 줄이는 효과를 가집니다.
Figure 2는 어떻게 standard convolution 2(a)이 depthwise convolution 2(b)과 1x1 pointwise convolution 2(c)으로 분리될 수 있는지를 보여줍니다.
Standard convolutional layer는 $D_F \times D_F \times M$의 사이즈를 가지는 feature map을 input으로 받고 $D_G \times D_G \times N$의 사이즈를 가지는 feature map을 output으로 만들어내게 됩니다.
여기서 $D_F$는 square input feature map의 spatial width, height이며, $M$은 input depth이고, $D_G$는 square output feature map의 spatial width, height, $N$은 output depth를 나타냅니다.
Standard convolutional layer는 $D_K \times D_K \times M \times N$의 사이즈를 가지는 convolution kernel $K$에 의해서 parameterized 될 수 있으며, $D_K$는 kernel의 spatial dimension이며 $M$은 input channel, $N$는 output channel을 나타냅니다.
Standard convolution의 computational cost는 다음과 같이 정의될 수 있습니다.
이를 통해, computational ocst는 input channel $M$, output channel $N$, kernel size $D_k \times D_k$, feature map size $D_F \times D_F$에 비례한다는 사실을 알 수 있습니다.
MobileNet은 depthwise separable convolution을 사용해서 output channel의 수와 kernel의 사이즈 간의 interaction을 끊는 작업을 진행하게 됩니다.
Depthwise separable convolution은 depthwise convolution과 pointwise convolution의 두 layer로 구성됩니다.
Depthwise convolution은 input channel 각각에 대해서 single filter를 적용하게 됩니다. (기존 standard convolution은 input channel 사이즈랑 동일한 사이즈의 filter를 적용했었죠.)
Pointwise convolution은 depthwise layer의 output의 linear combination을 만들기 위해서 단순한 1x1 convolution을 사용하게 됩니다.
MobileNet도 batchnorm과 ReLU는 동일하게 사용됩니다.
먼저 Depthwise convolution의 computational cost부터 살펴보겠습니다.
Input channel의 각각에 대해서만 filter를 적용하면 되기 때문에, 기존에 있던 $N$은 사라지게 됩니다.
따라서 kernel size인 $D_K$와 inputer feature size인 $D_F$, 그리고 input channel의 수인 $M$에 비례하게 됩니다.
다음으로는 Depthwise convolution을 통해 얻어지는 output을 1x1 convolution을 통해 linear combination 해야 하므로, 다음과 같은 연산량을 갖게 됩니다.
1x1xM 사이즈의 kernel을 $D_F \times D_F$만큼 돌고, 이것이 output의 1개의 channel만 만들어내게 되므로, $N$ channel의 output을 만들기 위해서는 이러한 filter가 $N$개가 존재해야 합니다.
따라서, 위와 같은 computational cost가 발생하게 됩니다.
Depthwise separable convolution을 기존 standard convolution과 비교하면 다음과 같습니다.
MobileNet이 3x3 depthwise separable convolution을 사용하므로, computation 관점에서 8~9배 정도 줄어든다는 사실을 확인할 수 있습니다.
연산량은 이렇게 줄어들지만, accuracy에서는 작은 감소만 있음을 Section 4에서 검증합니다.
지금까지는 논문에 나온 내용을 토대로 설명을 드렸는데, 혹시나 이 글을 읽고 이해가 되시지 않는 분들을 위해서 조금 더 간단한 예시로 부가설명을 추가해보겠습니다.
예를 들어서, 6x6x5 짜리 input이 존재하고, 이를 convolution 연산을 통해서 얻게 되는 output이 4x4x7이라고 가정해보겠습니다. (kernel size는 3x3, stride = 1로 고정합니다.)
먼저 standard convolution의 경우 kernel size는 3x3x5가 됩니다. 그리고 이러한 작업을 가로로 4번, 세로로 4번 진행하게 됩니다. 그리고 output의 channel이 7 이므로 kernel을 7개 가지고 있어야 합니다. 따라서 전체 연산량은 (3x3x5)[kernel size]x4[가로 이동]x4[세로 이동]x7[kernel 수]이 됩니다. 총 5040입니다.
이를 Depthwise separable convolution으로 푼다면 다음과 같습니다.
먼저 kernel size는 3x3x1이 됩니다. 그리고 이러한 kernel이 input channel의 수 만큼 존재하므로 5개가 존재하게 됩니다. 이를 가지고 sliding window 작업을 진행하면 가로로 4번, 세로로 4번 진행하게 되고 이를 통해 얻게 되는 output은 4x4x5가 됩니다. 이때 연산량은 (3x3x1)[kernel size]x4[가로 이동]x4[세로 이동]x5[kernel 수]가 됩니다. 총 720입니다.
이를 가지고 4x4x7짜리의 output을 만들어야 하므로, 1x1x5짜리 kernel을 가로 4, 세로 4만큼 이동하면서 4x4 짜리를 얻고 이를 7개의 kernel를 가지고 진행하여 4x4x7짜리를 얻게 됩니다. 이때 연산량은 (1x1x5)[kernel size]x4[가로 이동]x4[세로 이동]x7[kernel 수]가 됩니다. 총 560입니다.
두 단계를 더해주면 되므로, 총 1280의 연산량을 갖게 됩니다.
기존 방법론에 비해서 약 4배 정도의 연산량 감소가 있음을 확인할 수 있습니다.
제가 예시로 든 경우는 사이즈가 작기 때문에 연산량 감소가 적었지만, 사이즈가 커지면 커질수록 연산량 감소의 효과는 더 커지게 됩니다.
3.2 Network Structure and Training
MobileNet structure는 첫 번째 layer를 제외하고는 앞에서 언급된 depthwise separable convolution을 이용해서 구성됩니다.
MobileNet architecture는 Table 1에서 확인할 수 있습니다.
그리고 Figure 3에서 regular convolution, batchnorm, ReLU를 가지는 layer와 depthwise convolution, 1x1 pointwise convolution, bachnorm, ReLU를 가지는 layer를 비교합니다.
Downsampling은 depthwise convolution에 있는 strided convolution을 이용하여 처리되고요.
마지막 average pooling은 spatial resolution을 1로 줄이고, 이를 fully connected layer와 연결합니다.
MobileNet은 RMSprop을 사용해서 학습되었고, large model을 학습할 때와는 다르게 regularization과 data augmentation technique은 적게 사용하였습니다.
이는 small model이 overfitting을 겪을 가능성이 더 낮기 때문입니다.
추가적으로, depthwise filter에 매우 작은, 혹은 no weight decay (l2 regularization)을 적용하는 것이 중요하다는 사실을 확인하였고, 이는 여기에 작은 수의 parameter가 포함되어 있기 때문입니다.
3.3 Width Multiplier: Thinner Models
비록 base MobileNet architecture가 이미 작고 낮은 latency를 가지지만, 어떤 경우에는 모델이 더 작고 더 빠른 것을 요구하는 경우가 존재할 수 있습니다.
더 작고 연산량이 더 적은 모델을 만들기 위해, 저자들은 width multiplier라고 불리는 아주 작은 parameter인 $\alpha$를 도입하였습니다.
Width multiplier $\alpha$의 역할은 각 layer를 균일하게 더 얇게 만드는 것입니다.
Width multiplier $\alpha$가 주어졌을 때, input channel의 수 $M$는 $\alpha M$이 되고, output channel의 수 $N$는 $\alpha N$이 됩니다.
width multiplier $\alpha$를 도입한 경우 depthwise separable convolution의 computational cost는 다음과 같습니다.
$\alpha \in (0,1]$이고, $\alpha$는 1, 0.75, 0.5, 0.25로 setting 하게 됩니다.
Width multiplier는 computational cost와 number of parameter를 대략 $\alpha^2$만큼 감소시키는 효과를 가집니다.
3.4 Resolution Multiplier: Reduced Representation
neural network의 computational cost를 감소시키는 두 번째 hyper-parameter는 resolution multiplier $\rho$입니다.
저자들은 이를 input image에 적용시켰으며, 이를 통해 모든 layer의 internal representation이 감소되는 효과를 얻을 수 있었습니다.
width multiplier $\alpha$와 resolution multiplier $\rho$를 사용하였을 때 depthwise separable convolution의 computational cost는 다음과 같습니다.
$\rho \in (0, 1]$는 input image가 224, 192, 160, 128이 되도록 설정합니다.
다음 Table 3은 standard convolution과 depthwise separable convolution, 그리고 width multiplier, resolution multiplier를 적용했을 때를 비교한 표입니다.
standard conv과 depthwise separable conv 사이에도 큰 차이가 있지만, multiplier를 이용하면 연산량이 굉장히 감소하는 것을 확인할 수 있습니다.
4. Experiment
이번 section에서는 depthwise convolution의 효과와 network의 수를 줄이는 것이 아니라 network의 width를 줄이는 shrinking의 효과에 대해서 먼저 알아봅니다.
그다음으로는 width multiplier와 resolution multiplier의 기반해서 network를 줄이는 것에 대한 trade off를 보고, 여러 가지 유명한 모델과 성능을 비교합니다.
그러고 나서 MobileNet을 다양한 application에 적용할 수 있음을 알아봅니다.
4.1 Model Choices
첫 번째로 저자들은 full convolution을 사용한 모델과 depthwise separable convolution을 사용한 MobileNet을 비교한 결과를 제시합니다.
Table 4를 보면, depthwise separable convolution을 사용한 것이 Mult-adds와 parameters에서는 엄청나게 감소하였으나, accuracy에서는 1%만의 성능 감소가 있음을 확인할 수 있습니다.
다음으로는 width multiplier를 사용한 thinner model과 더 적은 layer를 사용하는 shallower 모델을 비교합니다.
MobileNet을 더 얕게 만들기 위해서, feature size 14x14x512를 사용하는 5개의 separable filter를 제거하였습니다.
Table 5는 유사한 정도의 computation과 parameter의 수를 가지고 있지만 얇은 MobileNet이 얕은 MobileNet보다 3% 정도 더 좋다는 것을 보여줍니다.
4.2 Model Shrinking Hyperparameters
Table 6은 width multiplier $\alpha$를 사용해서 MobileNet architecture를 shrinking 했을 때의 accuracy, computation, size trade off를 보여줍니다.
아키텍처를 너무 작게 만드는 $\alpha = 0.25$가 될 때까지 accuracy는 smoothly 하게 감소하는 것을 확인할 수 있습니다.
Table 7은 reduced input resolution을 사용했을 때 MobileNet을 학습하는 경우를 보여줍니다. resolution이 떨어질수록 accuracy가 감소하는 것을 확인할 수 있습니다.
Figure 4는 ImageNet Accuracy와 width multiplier $\alpha \in \left\{1, 0.75, 0.5, 0.25\right\}$, 그리고 resolution {224, 192, 160, 128}의 cross product를 통해 얻어지는 16개 모델에 대한 computation의 trade off를 보여줍니다. log linear 한 경향을 보여주고 있습니다.
Figure 5는 ImageNet Accuracy와 width multiplier $\alpha \in \left\{1, 0.75, 0.5, 0.25\right\}$, 그리고 resolution {224, 192, 160, 128}의 cross product를 통해 얻어지는 16개 모델에 대한 parameter의 수 간의 trade off를 보여줍니다.
Table 8은 original GoogleNet과 VGG16과 full MobileNet 간의 비교를 보여줍니다.
MobileNet은 VGG16만큼 정확하지만, 32배 더 작고 27배 더 적은 컴퓨터 연산량을 가지고 있습니다.
이는 GoogleNet보다는 더 정확하지만 모델이 더 작고 computation도 2.5배 더 작습니다.
Table 9은 width multiplier $\alpha = 0.5$, reduced resolution 160x160을 사용했을 때의 MobileNet과의 비교를 나타냅니다.
Reduced MobileNet은 AlexNet보다 4% 더 좋은 성능을 내지만 45배 더 작고 9.4배 더 적은 연산량을 가집니다.
이는 Squeezenet보다 4% 더 좋지만 유사한 사이즈를 가지고 있고 22배 더 적은 연산량을 가집니다.
4.3 - 4.7는 다양한 분야에서 MobileNet을 사용해본 예시로, 생략하겠습니다.
5. Conclusion
저자들은 depthwise separable convolution을 기반으로 하는 새로운 모델 아키텍처인 MobileNet을 제안합니다.
저자들은 중요한 design decision이 효율적인 모델을 만들어냄을 증명하였습니다.
저자들은 그다음으로 size와 latency를 줄이기 위해 합리적인 정도의 accuracy를 희생함으로써 width multiplier와 resolution multiplier를 사용하여 어떻게 더 작고 빠른 MobileNet을 만들어낼 수 있는지를 증명하였습니다.
저자들은 그 다음으로 잘 알려진 모델과 다른 MobileNet과의 비교를 통해서 size, speed, accuracy에서 우월하다는 것을 증명하였습니다.
마지막으로 MobileNet의 유효성을 다양한 task에 적용해봄으로써 검증하였습니다.
여기까지 MobileNetV1 논문을 정리해보았습니다.
크게 어려운 내용이 없이, 기존 conv를 새로운 방식으로 만들어 효율적인 구조를 만든 것이 주요한 내용이라고 보시면 될 것 같습니다.
다음 포스팅에서는 MobileNetV1의 code review를 진행해보겠습니다.
감사합니다.