[Paper Review] MobileNet v2: Inverted Residuals and Linear Bottlenecks

Abstract

 본 논문에서는 MobileNetV2를 통해서 mobile model들 중에서 SOTA를 이룩했고 Object detection, Semantic segmantation 과 같은 분야에서 효율적이고 좋은 성능을 보였다.
 MobileNetV2는 Inverted Residual 구조를 이용한 모델이다. 이는 얇은 bottleneck 레이어 사이의 shortcut을 이용하였고, 중간의 expansion layer에서는 depthwise convolution을 포함한다. 실험을 통해서 narrow layers(채널 수가 적은 레이어)에서는 non-linearity를 없애는 것이 representational power를 얻기 위하여 중요하다는 사실을 발견하였다.

Introduction

 현재 Neural Network는 Image recognition과 같은 분야에서 인간을 뛰어넘는 성능을 보인다. 그러나 이러한 성능을 보이기 위해서는 매우 높은 computational cost가 필요하여 mobile 상의 하드웨어에는 적합하지 않다.
 MobileNetV2는 이러한 점에서 착안하여 Mobile에 최적화하면서 성능은 그대로 유지하는 모델이다.

Preliminaries, discussion and intuition

  • Depthwise Separable Convolutions

 핵심 아이디어는 "Full convolutional operator를 factorize 해보자!" 인데, 첫번째 단계는 Depthwise Convolution으로, input channel별로 가벼운 filter로 convolution하는 것이다. 두번째 단계는 1 x 1 convolution으로, input channel들의 linear combinations로 output feature이 생성된다.
 Depthwise separable convolution을 통해서 computation을 K^2 배 줄이면서 성능은 조금 drop된다. 이 때, K는 depthwise convolution할 때 kernel의 크기이다.

  •  Linear Bottlenecks

  n개의 layer로 구성된 deep neural network를 떠올려보자. 이 때, Li는 hi x wi x di 크기의 activation tensor를 가지고 있다.
 Real image에 대해서 어떤 activation layer들은 "manifold of interest"를 만들어 낸다. 보통 manifold of interest는 낮은 차원의 subspace로 embedding될 수 있다고 가정되어왔다. 즉, Deep convolutional layer에서 d개 channel pixel들은 어떤 manifold안에 존재하는데, 이를 low-dimensional subspace로 나타낼 수 있다는 소리이다.
 처음에는 이러한 사실에 기반해서 단순히 channel 수를 줄이는 등의 시도를 해서 dimension을 줄였었다. 예를 들어 MobileNetV1에서는 width multiplier 를 사용했다. 
 그러나, ReLU를 고려했을 때는 이러한 직관이 통하지 않을 수 있다.
 Input x에 대해서 linear transformation B 을 적용하고 ReLU를 적용한 경우에 대해서 생각해보자. 만약 output S가 0이 아닌 값들을 가진다면 S에 있는 값들은 Linear transformation B에의해 만들어진 것이나 다름 없다. 즉, Deep netweork에서는 output domain의 non zero part인 부분
linear classifier에게 힘을 실어주게 되는 것이다.
 그러나 ReLU가 채널을 무너뜨리는 경우도 생기게 되는데, 이 때 channel에 있는 정보들이 손실될 수 있다. 그러나 많은 channel이 있으면 그 정보가 다른 채널에 존재할 수 있는 activation manifold가 존재한다. 
 Input manifold가 activation space의 매우 작은 dimensional subspace로 embed될 수 있다면 ReLU는 정보를 유지할 수 있을 것이라고 부록에서 근거를 들어서 설명하고 있다.
  Manifold of interest가 고차원의 activation space의 low dimensional subspace로 존재해야 한다는 사실을 두 가지 속성에 의거해서 말하고 있다.
 1. Manifold of interest가 ReLU이후에 non zero volume을 유지하고 있다면 linear transformation과 같다.
 2. Input manifold가 input space의 low dimensional subspace에 존재한다면 ReLU는 input manifold에 대한 정보를 보존할 수 있다.
 이러한 두가지 Insight를 가지고 Manifold of interest가 low dimensional이라고 가정하여 linear bottleneck layer를 고안하였다고 한다. 실험적으로, Linear layer를 넣는 것이 non-linearity가 너무 많은 정보를 손실시키는 것을 방지한다는 결과를 얻었다고 한다. 또한, 실험적으로 non-linear layer를 bottleneck에서 쓰는 것이 성능을 악화시켰다고 한다.

  • Inverted Residuals
  Bottleneck이 모든 중요한 정보들을 담고 있다는 사실과 Expansion layer는 단순히 뒤에 non-linear transformation을 수반한다는 점에서, bottleneck 사이에 shortcut을 두었다. 이를 그림으로 나타내면 아래와 같다.


 위의 그림에서,
Input size = h x w
expansion factor = t
kernel size = k 
input channel = d'
output channel = d''
라고 할 때 mutliply add의 개수는 h * w * d' * t (d' + k^2 + d'')이다.
이는 단순한 depthwise separable convolution보다는 계산량이 많기는 하지만 더 작은 input output dimension을 사용할 수 있도록 해준다. 
위 그림에서 볼 수 있듯이, Input/output 의 dimension이 작기 때문에 상대적으로 Memory requirement가 다른 모델에 비해 작은 것을 볼 수 있다.

모바일넷 v2 의 구조는 아래와 같다.

Implementation Notes

 Memory efficient inference
  Inverted residual bottleneck layer는 memory efficient한 implementation을 가능케한다. Caffe와 Tensorflow과 같은 프레임워크가 Inference때 standard하게 사용하는 방법은 directed acyclic compute hypergraph G를 생성하는 것이다. G에는 operation과 node를 나타내는 edge로 구성되어있고 중간의 computation결과로 나온 tensor node로 구성되어 있다. Memory에 저장되어야 하는 tensor의 개수를 최소화 하기 위해서 computation order가 정렬된다. 구체적인 알고리즘은 아래와 같다.
 R(i, pi, G)는 pi(i)에 연결된 모든 intermediate tensor를 나타낸다. |A|는 tensor A의 size를 나타내고 size(i)는 operation i 를 수행하는데 필요한 memory storage 크기를 의미한다. 
 위의 수식을 직관적으로 해석해보면, 각 node pi를 계산하는데 필요한 intermediate tensor의 크기의 합에 최대값을 취했을 때 이들에 대해서 최소값을 취하고 이를 그 노드만을 계산하는데 필요한 size와 더해준다. 이 최종 값을 최소화 시키는 순서로 G를 재구성하게 된다. 
 Residual connection과 같은 trivial한 parallel structure를 가지는 graph같은 경우 오직 하나의 computation order밖에 없으므로 inference시에 필요한 memory는 아래와 같이 간단히 나타낼 수 있다.
 즉, 모든 operation에 대해서 input과 output 사이즈를 더하여 최대값을 취해준 것이다. 
 Bottleneck residual block은 single operation으로 취급될 수 있으며 따라서 inference memory는 bottleneck tensor에 대한 비율이 상당히 크고 그 안의 tensor에 대해서는 비율이 작다. 
 Bottleneck Residual Block
 Bottleneck block operator F(x)는 아래와 같이 나타내질 수 있다. 

A는 s x s x k 차원에서 s x s x n으로 차원으로  바꿔주는 linear transformation이고,
N는 s x s x n 에서 s' x s' x n 으로 바꿔주는 non-linear per-channel transformation이다.
B는 A와 마찬가지로 s' x s' x k'로 바꿔주는 linear transformation이다.

 메모리 효율적으로 F(x)를 계산하기 위해서, 아래와 같이 중간 tensor 계산을 split하여 나중에 concat하는 방식으로 연산한다. 즉, n개의 텐서를 각각 n/t 만큼의 사이즈를 가지도록 잘라서 operation하고 나중에 concat해주도록 하는 것이다. 

 실험적으로, t =n으로 했을 때는 성능이 낮아졌고, t를 2 ~ 5로 했을 때 성능이 괜찮게 나왔다고 한다. 






댓글