반응형

MobileNet은 이름처럼 모바일 환경에 최적화된 모델이며 17년 v1을 시작으로 19년 11월 v3 까지 모두 Google 연구원들에의해 발표가 되었다. 모델 아키텍쳐가 결정된 후 경량화 하는 기법인 Quantization, Prunning, Knowleage Distilation과 같은 방법론이 아니라 신경망 자체를 경량화한 방법론으로써 사용되는 설계기법은 이후 연구에 많은 영향을 주었다. 그럼 각 Version별 메인 아이디어를 살펴보도록 하자.

 

MobileNet-V1

ResNet이후 출시된 모델들에서는 신경망이 깊어지면서 Layer당 차지하는 채널수가 급증하게 되었다. 이에따라 곱하기와 더하기(Mult-Add)로 이루어진 Convolution Operation은 점점 더 많은 연산비용(Expensive)을 차지하게 되었다. 이는 학습/추론 시간의 증가, Memory I/O 증가, 전력낭비 등 필연적인 문제를 가지고 있다. MobileNet-V1에서는 이러한 연산의 비효율성에 초점을 두고 Convolution Operation의 구조적 변경을 제안하였다.

 

Depthwise Convolution

채널별 Convolution을 수행한다

 

Depthwise Convolution은 Feature Map을 채널별로 쪼개서 따로따로 Convolution Operation을 진행하는 형태이다. 위 그림에서는 입력 채널이 3개이므로 3x3크기의 Convolution Filter가 3개 존재한다. 각 Filter는 채널에 1:1 대응이되어 Convolution Operation을 진행하게된다. 이것을 Depthwise Convolution이라고 부른다.

 

Pointwise Convolution

 

Pointwise Convolution은 1x1크기의 Convolution Filter가 입력된 채널의 갯수만큼 존재한다. 간단하게는 모든 채널에 대해서 더하기(Add)를 해주는 개념이다. 무엇보다 Pointwise Convolution의 주된 목적은 Output채널의 수를 늘리거나(Expand) 줄이는(Squeeze)것에 있다. 즉, 쉽게말해서 1x1 Convolution을 Pointwise Convolution이라고 한다.

 

Depthwise Separable Convolution

위에서 소개한 두가지 Convolution 방법들이 연속적으로 등장하였을 때(순서: Depthwise->Pointwise) Depthwise Separable Convolution이라고 불린다. 줄여서 Separable Convolution이라고도 하는경우도 있지만 가능한 Full-name을 불러주도록 하자.

 

Separable이라는 단어는 분리된 이라는 뜻을 가지는데, Inception에서 사용된 FeatureMap을 Nx1, 1xN으로 쪼개는 과정도 Separable이라 불리기 때문이다. 참고로 Xeception에서 사용되는 방법은 순서가 Pointwise -> Depthwise로 바뀌었으며 Modified Depthwise Separable Convolution라고 불린다.

 

Operation Cost & Accuracy

기존 Convolution에서 Depthwise Separable Convolution으로 변경하였을때 연산량이 얼마만큼 차이가 나는지 알아보도록 하자.

 

  • FeatureMap size: (32, 244, 244) (in_channel, height, width)

  • Convolution Filter: (32, 64, 3, 3) (in_channel, out_channel, height, width)

  • Convolution: 3x3x32x64x224x224 = 924,844,032

  • Depthwise Separable Convolution: (3x3x32+32x64)x224x224=117,211,136

 

얼핏봐도 약 9배정도의 연산량이 감소한것을 확인할 수 있다!! v1에서는 일반 Convolution과 Depthwise Separable Convolution을 비교 테스트 하였을때 약 1%가량 정확도 손실이 있다고 밝혔다. 하지만 연산량과 정확도 사이의 Trade-Off를 비교해보면 Depthwise Separable Convolution을 사용하는것이 엄청난 이득임을 알 수 있으며, EfficientNet은 이 방법을 차용하고 있으면서 아직까지도 SOTA의 반열에 있다.

 

MobileNet-V2

v1에서의 문제점은 Pointwise Convolution을 진행하면서 Output 채널수를 확장하게 되는데 다른 Convolution Filter보다 많은 가중치들이 몰려있다는점이다.

 

1x1에 모든 연산이 몰빵되어있다

 

Inverted Residual Block

v2에서는 이러한 문제를 해결하기위해서 Inverted Residual Block이라는 방법을 도입한다. ResNet에서 사용된 Residual Block을 잠시 떠올려보면 FeatureMap의 채널을 Pointwise Convolution을 통해 축소시킨 후 3x3 Convolution을 통해 FeatureMap을 추출하고 다시 Pointwise Convolution을 통해 채널을 확장시킨다(순서: 확장 -> 축소 -> 확장). v2에서는 v1에서 사용한 Depthwise Separable Convolution을 그대로 계승하며 Residual Block의 과정을 완전히 반대로 수행한다(순서: 축소 -> 확장 -> 축소).

 

 

이전 Layer로부터 건너온 FeatureMap에 대해서 Pointwise Convolution을 수행하여 채널수를 확장한다. 그리고 Depthwise Convolution을 수행한 후 다시한번 Pointwise Convolution을 사용하여 채널수를 축소한다. 만약 축소했을때 채널수가 초기 FeatureMap의 채널수와 같다면 Connection을 맺어주고, 채널수가 다르다면 그냥 다음 Layer로 전달된다.

 

Depthwise Convolution 영역에서 확장된 채널에 대해 연산이 이루어지기 때문에 Pointwise Convolution 영역에 집중되었던 파라미터수와 연산을 분산시키는 효과가 있다. 또한 FeatureMap이 축소된 상태로 다음 Layer에 전달되기 때문에 파라미터수가 상당히 감소한다는 특징이 있다.

 

Linear Bottlenecks

이제는 거의 관습처럼 사용되어지는 순서인 Convolution -> BN -> ReLU 라는 방법에 대해서 잠시 언급을 해야한다. 여기에서 ReLU는 비선형함수면서 연산속도도 매우 빠르기 때문에 일반적으로 사용하고 있다. 하지만, 필연적으로 음수가 되는 뉴런들은 0으로 비활성 시켜버리기 때문에 Information Loss가 발생하게된다. 이때, low-dimension(적은 채널수)에서 ReLU를 사용하는것은 큰 문제를 초래하게된다.

 

 

 

위 그림의 Input은 n차원 공간에서의 나선형 배열을 좌표계에 그림이다. 그리고 오른쪽에 나열되어있는 그림들은 특정 dim으로 차원축소를 한 후 ReLU를 적용 후 다시 n차원 공간으로 복원시킨것이다. 2-dim에서 ReLU를 적용한것은 엄청나게 정보손실이 잃어났음을 알 수 있다. 반면 30-dim에서 ReuLU를 적용한것은 완벽하지는 않지만 Input과 유사한 그림을 그려낸것을 확인할 수 있다.

 

위 사례를 Inverted Residual Block에 적용해보면, 채널을 축소한 후 ReLU를 적용했을때 엄청난 정보손실이 일어난다는것을 추론해볼 수 있다. 따라서 이러한 정보손실을 피하기 위해서 Linear Bottlenecks를 도입한다. 말이 거창해서 그렇지 단순히 ReLU를 사용하지 않는다는것 뿐이다. 위 그림에서 FeatureMap에 하얀색으로 빗금이 그려진 영역이 이것에 해당한다.

 

MobileNet-V3

2019년 Google이 집중한 연구분야중 NAS(Network Architecture Search)인데, 이 방법을 모바일에 적용한 MNAS를 통해 v3의 신경망을 디자인하였다. NAS에 대해서는 여기서 설명하기 어렵기 때문에 해당 부분을 제외한다.

 

Squeeze and Excite(SE)

v2에서 소개했던 Inverted Residual Block에 SE모듈을 추가한것이다. Depthwise Convolution이 수행된 이후 FeatureMap을 GAP(Global Average Pooling)을 진행한다. 그리고 FC, ReLU의 과정을 수행하여 채널수를 압축(Squeeze)하여 해당 정보를 reshape하여 기존의 FeatureMap에 곱해준다.

 

 

SE 모듈이 추가되는 방식

 

자기자신의 정보를 자기자신에 곱해주는 과정을 통해 자극(Excite)해주기 때문에 self-Attention라고 볼 수 있다. 약간의 연산량이 증가하지만 정확도와의 Trade-off를 따져봤을때, 몇개의 Block에서 SE모듈을 삽입하였더니 아주 좋은 효과가 나타났다고 한다.

 

Inverted Residual Bloack과 SE모듈을 추가한 방법은 MNAS-Net에서 먼저 사용되었다. v3에서는 이것을 Building Block으로 NAS를 사용했다는 점에서 차이가 있다.

 

Hard-Swish

v2에서 사용한 활성함수는 ReLU를 모두 사용하였다. 해당 함수를 Swish라는 활성함수로 변경하였다.

 

$$
swish = x \cdot \sigma(x) \\ Where \; \sigma \; is \; Sigmoid
$$

 

변경후 정확도에 향상을 보여주었으나 모바일 환경을 고려해보면 Sigmoid 연산을 하는것은 매우 연산비용이 높다는 단점이 있다. 그래서 해당 Sigmoid를 ReLU로 대채하여 swish에 매우 근사한 Hard-Swish를 사용한다.

 

$$
h-swish = x \frac{ReLU6(x + 3)}{6}
$$

 

Hard-Swish는 양자화를 할 때에도 매우 유연하게 사용이 가능하다.

 

Redesigning Layers

NAS를 통해 찾아낸 신경망의 디자인을 살펴보니 마지막 Block이 뚱뚱하다는것을 발견하고 아래 그림과 같이 해당 부분을 사람이 직접 Redesign 하였다. 해당 작업을 통해 7ms의 속도 개선과 30M의 연산량 절감을 이뤄냈다고 한다.

 

 

Conclusion

지금까지 MobileNet의 기술적 특징들의 발전 과정을 살펴보았다. 이름부터 Mobile이 들어간 만큼 실제 모바일 Device에서도 잘 작동을 한다고 한다. COCO 데이터같은 General Dataset에서는 무리일지도 모르겠으나 일부인(OCR), Face Recognition과 같이 특정 Task에서는 아주 좋은 퍼포먼스를 보여줄 수 있을것이라고 기대한다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기