본문 바로가기

갈아먹는 Image Classification [3] MobilenetV1

들어가며

이번에 살펴볼 논문들은 mobilenet v1입니다. 최근에는 NAS를 이용해서 더 가볍고 성능이 뛰어난 아키텍쳐들을 찾습니다. NAS는 크게 기본 블럭의 구조를 미리 설정하고, 이를 얼마나 깊고 넓게 쌓을 것인가를 강화학습 또는 유전 알고리즘으로 찾도록 동작합니다. 이 때 기본 블럭으로 많이 채택되는 것이 mobilenet v2에 제시된 블럭입니다. 이와 관련된 연구 흐름을 정리하면 아래와 같습니다.

 

 

먼저 mobilenet v1은 depthwise separable convolution 기법을 적용한 신경망 아키텍쳐를 제안합니다. mobilenet v2는 이 아키텍쳐를 기반으로 invertible bottleneck 이라는 개념을 추가하여 성능을 개선합니다. 이렇게 발견한 기본 블럭에 NAS를 적용하여 MNAS-NET이라는 아키텍쳐를 발견합니다. 여기에 compound scaling이라는 기법을 적용한 것이 현재 State of the Art인 EfficientNet입니다.

 

EfficientNet을 이해하기 위해 먼저 mobilenet v1부터 리뷰를 진행해볼까 합니다. 원래는 mobilenet 1, 2, 3를 하나의 포스팅에 묶어서 진행해볼까 했는데 생각보다 글이 길어져서 나눴습니다. ㅎㅎ

 

그럼 시작하겠습니다!

Motivation

mobilenet은 이름에서부터 알 수 있듯이 모바일 기기에서 동작하는 것을 목표로한 CNN 아키텍쳐입니다. 때문에 기존 아키텍쳐들보다 적은 파라미터와 연산량을 갖는 것이 중요하였습니다. 관련된 이 전 연구인 Xception이란 논문에서 연산량을 줄여주는 Depthwise Convolution이라는 개념이 제시되었는 데요, mobilenet은 이를 적절히 차용해와서 더 가볍고 성능이 뛰어난 아키텍쳐를 만듭니다.

Dethwise Separable Convolution

Depthwise Separable Convolution는 Depthwise Convolution(이하 dw conv)과 Pointwise Convolution(이하 pw conv)으로 구성됩니다. dw conv는 입력 이미지 혹은 피쳐맵을 각 체널별로 쪼개서 컨볼루션 연산을 적용하는 것입니다. 이렇게 되면 기존에 3차원이었던 필터가 2차원으로 줄어들 수 있게 됩니다. 이렇게 구한 피쳐맵을 concat 해줍니다. pw conv는 이렇게 만든 피쳐맵에 1x1 컨볼루션을 적용해서 차원을 줄어주는 것입니다. 이는 필터의 차원 수를 줄여서 파라미터의 수와 연산량을 획기적으로 감소시킵니다.

(a)는 기존 컨볼루션 필터를 시각화한 것이고 (b)는 Depthwise Separable Convolution의 필터를 시각화 한 것입니다. Dk는 컨볼루션 필터의 가로 세로 크기를 말하며 보통 3을 사용합니다. M은 input 체널 수, N은 아웃풋 체널 수, 혹은 필터의 개수를 의미합니다. 일반 컨볼루션 연산을 한번 적용하면 필요한 파라미터는 Dk * Dk * M * N이 됩니다.

 

반면에 Depthwise Separable Convolution에서의 필터는 2차원입니다. 이러한 2차원 필터를 각 체널마다 생성하는 것입니다. 그리고 1x1 컨볼루션을 output 체널의 개수만큼 수행해주게 됩니다. 따라서 Depthwise Separable Convolution을 한번 수행하기 위해서 필요한 파라미터의 수는 (Dk * Dk * M) + (M * N) = M * (Dk * Dk + N)이 됩니다.

 

예를 들어 112 × 112 × 32 크기의 피쳐맵에 각각 (3x3) 컨볼루션을 64개 적용해보겠습니다. 원래의 컨볼루션에서는 3x3x32x64=18432개의 파라미터가 필요하지만 Depthwise Separable Convolution에서는 32x(3x3+64)=2336개의 파라미터가 필요하여9배 가량 파라미터의 수가 줄어드는 것을 확인할 수 있습니다.

이러한 depthwise separable convolution은 사실 Xception이라는 이전 연구에서 제안된 바 있습니다. mobilenet은 이 개념을 가져와서 3x3 Depthwise Conv와 1x1 Conv 각각에 Batch Normalization과 ReLU를 끼워 넣습니다. 그리고 이렇게 구성한 Depthwise Separable Convolution Block을 쌓은 mobilenet 아키텍쳐를 제안합니다.

Architecture

mobilenet v1은 맨 처음 224x224 크기의 이미지에 일반 컨볼루션 연산을 적용합니다. 그 다음 Conv dw로 표기된 depthwise convolution을 수행합니다. 그리고 이어서 1x1 conv로 표기된 pointwise convolution을 수행하여 Depthwise Separable Convolution을 구현합니다. 여기서 stride 값을 1로 설정해준 블록과 2로 설정해 준 블록을 번갈아가며 쌓은 구조를 취합니다.

 

이렇게 완성한 모델을 저자들은 mobilenet baseline, 혹은 1.0mobilenet-224라고 표기합니다. 1.0이라 표기한 값은 각각의 블록들 사이에 전달해주는 체널 값의 크기를 의미합니다. 만약 0.75mobilenet으로 표기되었다면 이는 체널의 크기를 baseline에서 0.75배 해준 모델이라는 의미입니다. 뒷 부분의 224는 입력 이미지의 해상도를 의미하며, mobilenet-192는 입력 이미지의 해상도를 192x192 크기로 입력 받았다는 의미입니다. 저자들은 이처럼 모델의 크기와 입력 이미지의 해상도를 조절해가며 실험을 진행했습니다.

Experiment

먼저 mobilenet baseline 모델에 Depthwise Separable Convolution을 적용한 것과 적용하지 않은 것을 비교했습니다. 그 결과 imagenet top1 정확도는 1% 정도 밖에 감소하지 않았는데 연산량은 9배, 파라미터의 수는 7배 가량 감소하였습니다. 새롭게 State of the art를 갱신하지는 못했지만 모델의 크기를 획기적으로 줄이는데 의의가 있다고 볼 수 있습니다.

그 이외에 저자들은 모델의 크기를 줄이거나 입력 이미지의 해상도를 줄여가면서 실험을 진행했습니다. 당연하게도 모델을 줄일 수록, 입력 이미지의 해상도가 낮아질 수록 모델의 정확도가 감소하는 모습을 보여줍니다.

 

이 밖에도 저자들은 mobilenet 아키텍쳐를 다른 데이터 셋에 적용하여 모델 간에 비교를 하거나, Object Detction, Face Embedding과 같은 다양한 테스크에 적용하여 실험을 진행하였습니다. 궁금하신 분들은 원문을 참고해보시면 좋을 것 같습니다.

마치며

지금까지 새롭게 CNN의 표준으로 자리잡게 될 mobilenet의 초기 버전에 대해서 알아보았습니다. Depthwise Separable 연산이 참 개념적으로 간단한데 저는 왜 이런 생각을 못했을까요 ㅎㅎ 이제 막 EfficientNet을 리뷰하기 위한 첫 논문을 마쳤다고 생각하고 얼른 다음 포스팅 준비하도록 하겠습니다!

 

감사합니다.

Reference

[1] AG. Howard et al, MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications