아래 내용은 개인적으로 공부한 내용을 정리하기 위해 작성하였습니다. 혹시 보완해야할 점이나 잘못된 내용있을 경우 메일이나 댓글로 알려주시면 감사하겠습니다.
지난 글에서는 Xception 논문에서 제안한 Depthwise Separable Convolution에 대해 살펴봤습니다.
Xception에서는 Inception 모듈의 가정인 Convolution의 공간정보와 채널정보는 분리 가능하다를 극단적으로 적용하여 Convolution Filter를 공간정보를 분석하는 depthwise convolution과 채널정보를 분석하는 pointwise convolution으로 분리했습니다.
이전까지는 ResNet과 같이 네트워크의 크기를 키워서(파라미터 수를 늘려서) 성능을 높이는 방법에 주력했다면 Xception은 파라미터를 효율적으로 활용하여 성능을 높이는 방법에 집중했습니다.
MobileNet은 Xception에서 사용된 Deepthwise Separable Convolution이 연산효율이 좋은점에 집중하여 모바일 기기에서 동작 가능 할 정도로 경량한 네트워크를 설계하는데 집중했습니다.
이번 글에서는 MobileNet이 어떻게 경량화된 네트워크가 되었는지 살펴보겠습니다.
Mobilenet은 효율적인 연산을 위해 Depthwise Separable Convolution을 적절히 활용한 경량화 네트워크 입니다.
Xception과 MobileNet은 모두 Depthwise Separable Convolution을 활용한 효율적인 네트워크라는 공통점이 있습니다. 하지만 Xception은 높은 정확도를 위해 depthwise separable convolution을 활용했고, MobileNet은 모바일 기기에서 돌아갈 수 있을만큼 경량한 구조를 설계하는데 집중했다는 차이점이 있습니다.
일반적인 Conv layer와는 다르게 Depthwise separable convolution은 depthwise/pointwise convolution으로 분해되어 있습니다. 이러한 높은 연산효율을 갖는 장점이 있습니다.
: input의 width/height
: input의 채널 수
: kernel size
: output의 채널 수
일반적인 Convolution layer에서 연산량은 입력해상도와 커널의 크기, 입/출력 채널을 모두 곱한 횟수만큼의 연산이 필요합니다.
Depthwise Convolution을 할 때는 각 output이 1이기 때문에 연산량을 계산하면 다음과 같습니다.
먼저 공간에 대한 분석인 depthwise convolution의 경우 각 채널별로 출력된 featuremap의 크기가 1이므로 아래 수식과 같은 연산량을 갖습니다.
다음으로 채널에 대한 분석인 pointwise convolution의 연산량은 입력/출력 채널 수에 입력 feature map의 해상도를 곱한 값 입니다.
최종적으로 depthwise separable convolution의 연산량은 depthwise와 pointwise convolution의 연산량을 합한 결과와 같습니다.
이 때 Convolution과 Depthwise Separable Convolution의 연산량 감소율은 다음과 같이 계산할 수 있습니다.
정리한 식에서 Depthwise Separable Convolution의 연산량 감소율은 출력되는 feature map의 채널 수와 커널 크기에 의해 결정나는것을 알 수 있습니다. 커널 크기가 3인 경우를 예로 들면 연산량이 약 8~9배나 줄어듭니다.
MobileNet은 일반적인 convolution과 depthwise separable convolution 섞어서 하나의 네트워크를 구성했습니다.
위 그림의 왼쪽은 MobileNet을 구성할 때 사용한 Convolution의 구조입니다. 왼쪽의 검은 박스 안에는 다른 네트워크에서도 많이 사용된 Conv-BN-ReLU 순서의 블록으로 오른쪽 표에서 Conv로 나타낸 layer를 의미합니다. 파란색 박스 안에 있는 Depthwise Separable Convolution은 오른쪽 표의 Conv dw로 나타낸 layer입니다.
MobileNet에서는 convolution에 stride를 줘서 해상도를 줄여나갑니다. 오른쪽 표에서 s로 표시한게 stride 값을 나타냅니다.
특이한점은 Xception에서 소개된 내용과는 다르게 depthwise와 pointwise convolution의 각각 뒤에 Batch normalization과 ReLU를 붙여주는 점 입니다. 이 차이점은 MobileNet 논문에서는 자세히 다루지 않고 그저 아래 그림의 형태로 사용했다고만 쓰여있습니다.
MobileNet 네트워크를 구성할 때 연산 효율에 집중했습니다. 행렬 연산에 최적화된 GEMM과 같은 함수는 행렬값을 메모리에 복사하는 과정이 필요합니다. 하지만 1x1 Convolution을 연산할 땐 메모리 복사과정이 필요하지 않습니다.
MobileNet의 구조에서는 1x1 Convolution은 전체 연산의 약 95%를 차지하며, 파라미터 비율은 전체에서 약 75%정도를 차지합니다. 따라서 MobileNet은 연산효율이 매우 높은 장점이 있습니다.
MobileNet은 그 자체로도 이미 경량화 되어 있지만 상황에 따라 더 경량화된 네트워크가 필요할 수 있습니다. MobileNet에서는 이러한 경우 두 개의 hyper-parameter 활용해 네트워크 크기를 더욱 줄일 수 있게 만들었습니다.
MobileNet에서는 네트워크의 채널 수를 줄이는 Width Multiplier()와 해상도를 줄일 수 있는 Resolution Multiplier() 두 개의 Hyper-parameter를 활용합니다.
먼저 Width multiplier는 라는 값을 활용해 모델의 채널 수를 줄입니다.
수식에서 살펴보면 입력 채널 수인 과 출력 채널 수인 의 값이 만큼의 비율로 줄어듭니다. 따라서 연산 횟수와 파라미터 수를 만큼 줄이는 역할을 합니다.
값의 범위는 이며 논문에서 실험할 땐 1, 0.75, 0.5, 0.25의 값을 사용했다고 합니다. 이 때 가 1인 경우가 MobileNet 기본 형태 입니다.
다음으로 Resolution Multiplier는 네트워크 입력의 해상도를 줄이는 hyper-parameter 입니다.
수식에서는 입력 해상도에 해당하는 에 곱해져 연산횟수를 줄입니다.
또한 의 범위를 가지며, 실험에서 해상도를 224, 192, 160, 128로 조절했다고 합니다.
먼저 depthwise separable convolution을 사용했을 때얼마나 효율적인지 실험했습니다.
실험방법은 MobileNet 구조에서 dwpthwose separable convolution을 모두 일반 convolution으로 교체한 비교군Conv MobileNet을 만들고 나서 MobileNet과 비교했습니다. 성능평가는 ImageNet dataset에 대해 수행했습니다.
실험 결과 Depthwise separable convolution을 사용한 MobileNet이 파라미터 수와 연산 횟수가 압도적으로 적지만 성능은 약 1%정도 떨어지는것을 볼 수 있습니다.
다음으로 살펴본건 얇은 모델(채널 수가 적은 모델)과 얕은 모델(네트워크의 layer개수가 적은 모델)의 성능을 비교했습니다.
얇은 모델은 Width multiplyer()를 0.75로 설정한 모델이며, 얕은 모델은 네트워크 구조 중간에 크기의 feature map을 처리하는 5개의 depthwise + pointwise filter를 제거했습니다.
실험결과 얇은(채널 수가 적은) 모델이 파라미터 수가 더 적으나 3% 높은 성능을 보여주었습니다.
이 실험으로 부터 채널 수 보다는 layer 수가 많은 네트워크가 연산량은 많지만 파라미터 수가 적으며 성능향상에 유리한것을 알 수 있습니다.
다음으로 살펴본 내용은 Width()/Resolution() Multiplier 설정값에 따른 성능변화 입니다.
실험은 와 를 각각 1.0, 0.75, 0.5, 0.25로 바꿔가며 MobileNet의 성능을 살펴봤습니다.
실험결과 와 모두 값이 작아질수록 성능이 낮아지지만 연산량과 파라미터 수 또한 부드럽게 줄어드는것을 알 수 있습니다.
위 결과를 연산량과 파라미터 수에 따른 성능으로 다시 정리하면 다음과 같습니다.
연산량과 성능 사이의 상관관계는 로그선형 형태를 보여줍니다. 다만 채널 수가 매우 적은 일 때는 점프하는 형태를 보여줍니다.
해상도와 성능 사이의 상관관계 또한 선형적인 모습을 보여줍니다.
위 결과로부터 두 hyper-parameter 와 가 성능과 연산량/파라미터 수 사이의 Trade off를 적절하게 수행함을 알 수 있습니다.
다음으로 다른 유명한 네트워크들과 성능을 비교했습니다.
MobileNet은 VGG-16보다 32배나 가벼우며 27배나 연산량이 적지만 성능은 0.9%만 차이가 납니다. 심지어 연산량과 파라미터 수가 더 많은 GoogLeNet보다 높은 성능을 보여줍니다.
다음으로 MobileNet에 , 입력 이미지 해상도가 160로 설정한 네트워크를 상대적으로 작은 모델인 SqueezeNet, AlexNet과 비교했습니다.
MobileNet은 SqueezeNet보다 22배 연산량이 적고 AlexNet보다 45배 가볍지만 두 모델보다 4%정도 높은 성능을 보여주었습니다.
앞에서 수행한 성능평가는 모두 ImageNet 데이터셋을 Classification하는 평가만 이뤄졌습니다.
MobileNet이 다른 데이터와 도메인에서도 좋은 성능을 보여주는것을 확인하기 위해 다른 여러 성능평가를 수행했습니다.
Fine-Grained Recognition은 보다 세밀한 classification입니다. 가장 유명한 Fine-Grained recognition 데이터인 Standford Dogs dataset을 예로들면, 강아지이미지가 주어졌을 때 Dog classs인지 뿐만 아니라 어떤 품종(허스키인지 푸들인지)인지까지 맞추는 분야 입니다.
Standford Dogs dataset에서 Inception V3 모델과 MobileNet을 비교한 결과 아래와 같습니다.
결과를 살펴보면 MobileNet 기본형(와 가 모두 1)이 Inception V3와 유사한 성능을 보여주면서 연산량과 파라미터 수를 엄청나게 줄인것을 볼 수 있습니다.
Im2GPS dataset은 아래 그림과 같이 지구를 여러 개의 Cell로 나눈 뒤 이미지가 어느 위치에서 촬영했는지 구분(classification)하는 데이터 입니다.
MobileNet 논문 발표 당시 Im2GPS에서 가장 좋은 성능을 보여주던건 데이터셋과 동명의 Img2GPS를 이기고 더 좋은 성능을 보여주던 PlaNet인데, PlaNet은 feature map을 뽑아내는 CNN Network로 Inception V3를 활용한 네트워크 입니다. (PlaNet자체는 Inception모듈과 LSTM을 합친 복잡한 구조의 네트워크 입니다.)
실험에서는 PlaNet을 MobileNet 구조로 다시 학습한 뒤 원래의 PlaNet과 비교했습니다.
실험 결과 PlaNet의 연산량이나 파라미터 수가 월등히 작은 MobileNet버전 PlaNet이 원본 PlaNet과 거의 유사한 성능을 보여줍니다.
MobileNet을 평가한 또 다른 딥러닝 도메인은 Face Attribute(얼굴 속성) 분류 입니다. 이 때 Knowledge transfer (지식 전파 : 더 크고 좋은 모델이 작은 모델을 학습)를 활용해 MobileNet을 학습을 했습니다. 그리고 그 결과를 확인하여 MobileNet과 distillation사이의 시너지를 확인했습니다.
평가에 사용된 데이터셋은 YFC100M이며, 파라미터 수가 7500만개, 연산량이 16억인 큰(large) 네트워크를 Teacher 모델로 활용했습니다.
학습된 MobileNet은 Baseline대비 훨씬 적은 연산량과 파라미터 수를 갖지만 보다 향상된 성능을 보여줍니다.
Object detection은 이미지 안에서 물채를 찾아내고 그 물체가 어떤 class에 속하는지까지 분류하는 문제입니다. Object detection을 위한 네트워크로 Yolo, SSD, Faster-RCNN등이 있습니다.
Object detection을 위한 네트워크는 크게 세 부분으로 나뉘며, ①Feature map을 추출하는 CNN Network인 Backbone과 ②Backbone에서 나온 feature map을 정제하는 Neck, 그리고 ③ 물체의 위치를 찾는 Head로 이루어져 있습니다.
MobileNet이 Object detection에서도 좋은 성능을 보여주는것을 확인하기 위해 입력해상도가 300인 SSD, 입력 해상도가 300과 600인 Faster-RCNN 총 세 가지 네트워크에 대해 실험했습니다. 실험은 Backbone을 VGG, Inception V2, MobileNet으로 바꿔가며 COCO dataset에 대해 평가했습니다.
실험 결과를 살펴보면 MobileNet은 모든 경우에 더 적은 파라미터와 연산량을 사용하지만 다른 Backbone과 어느정도 유사한(하지만 낮은) 성능을 보여줍니다.
마지막으로 살펴볼 도메인은 Face embeedding 입니다. 얼굴인식(Face Recognition)은 실생활에서 가장 많이 쓰이는 딥러닝 기술중 하나입니다. 주로 현관문 등 보안이 필요한 장소에 많이 활용되며, 카드나 지문등으로 개인을 인식하는 대신 얼굴 이미지를 활용해 개인을 인식하는 방식으로
Face embeeding은 classification과 유사하지만 마지막에 누구인지 구분하는 부분에서 차이가 있습니다.
아래 그림에서 붉은 점선 왼쪽은 이미지의 특징을 추출하는 부분으로 image classification과 face embeeding이 동일합니다.
Image classification의 경우 붉은 점선 오른쪽에 구분하려는 class의 개수만큼을 출력으로 하는 FC layer가 많이 사용됩니다.
얼굴인식에서는 등록된 인원 외에 등록되지 않은 인물도 분류해야 합니다. (Classification을 예를들면 고양이와 강아지라는 class가 있을 때 class에 없는 너구리가 들어오는 경우가 있을 수 있습니다.)
이러한 경우를 대응하기 위해 얼굴인식에서는 해당 클래스일 확률을 뽑는것이 아닌 추출된 feature map인 embeeding vector를 뽑습니다. 그리고 이 embeeding vector활용해 등록된 사람고 그렇지 않은 사람을 구분해 냅니다.
얼굴인식에 대한 자세한 내용은 조만간 별도의 글로 다루겠습니다.
다시 MobileNet으로 돌아와서, triplet loss를 loss function으로 활용하는 FaceNet을 MobileNet과 비교했습니다.
평가결과 중 오인식률(인물 B 가 A로 오인식될 확률) 0.01%일 때 성능을 살펴봤을 때 MobileNet이 FaceNet보다 약간 낮은 성능을 보여주었 MobileNet이 훨씬 더 적은 연산량과 파라미터를 사용하는것을 볼 수 있습니다.
MobileNet은 Depthwise Separable Convolution의 연산효율을 활용해 설계된 경량화된 네트워크 입니다. Convolution과 Depthwise Separable Convonlution을 쌓아 올려가는 단순한 구조에, 네트워크의 크기를 조절할 수 있는 hyper-parameter까지 제안하여 하드웨어 환경이 열악한 모바일 기기에서도 유연하게 적용할 수 있는 네트워크 입니다.
성능평가에서 연산량과 파라미터 수는 적지만 다른 큰 네트워크 대비 유사한 또는 더 좋은 성능을 보여줍니다. 또, 평가결과를 정리하여 hyper-parameter를 조절해 연산량과 성능 사이의 trade-off가 잘 이뤄짐을 보여주었습니다.
마지막으로 다른 데이터셋과 도메인에서 평가했을 때도 매우 경량화 되었지만 어느정도 성능을 보여주었습니다.
전체적으로 연산량과 파라미터 수가 엄청나게 줄었지만 어느정도 좋은 성능을 보여주는 효율적인 네트워크 즉, 모바일 환경에 최적화된 네트워크라는 느낌입니다.
MobileNet은 이후에도 MobileNet V2, V3로 발전해 가며 대표적인 경량화 네트워크로 자리잡게 됩니다.
Xception 논문
MobileNet 논문
hoya님 블로그
Atul Pandey 블로그
빛나는나무님 블로그
Im2GPS 논문
PlaNet 논문