*본 내용은 논문의 상세한 분석이 아닌, 간단한 복기용 정리입니다.
Introduction
MobileNet의 핵심 아이디어는 Depthwise Separable Convolution입니다. 이 개념은 Depthwise Convolution과 Pointwise Convolution을 조합하는 방법으로 이루어집니다.
Background
1. Standard Convolution
일반적인 Convolution 먼저 설명하겠습니다.
일반적인 Convolution에서는 Input 채널 개수 만큼 Filter의 채널도 3개가 있어서, Convolution 연산을 하면 하나의 채널의 output을 가집니다.
2. Depthwise Convolution
그런데 Standard와는 다르게, Depthwise Convolution은 채널마다 따로 필터를 연산합니다.
그렇기 때문에 input과 output의 채널의 수가 동일해집니다. 즉, 차원 감소가 일어나지 않습니다.
Depthwise Convolution의 연산량은, 위에 보이시는 것처럼 "filter 사이즈 x 채널수 x 이미지 사이즈" 입니다.
3. Pointwise Convolution
다음 연산인 Pointwise Convolution은 filter의 크기가 1x1로 고정된 Convolution 연산을 말합니다.
Filter의 크기가 1x1이기 때문에 input에 대한 공간적인 정보는 추출하지 않은 채로 각 채널에 대한 연산만 수행합니다.
Output의 사이즈는 변하지 않고 채널의 수만 자유롭게 바꿀 수 있습니다.
차원 축소가 가능하기 때문에 연산량을 줄여주는 데에 많이 쓰입니다.
Pointwise Convolution의 연산량은 filter 사이즈가 1이기 때문에 연산량 증가에 영향을 주지 않고, "채널수 x filter 수 x image 사이즈" 입니다.
4. Depthwise Separable Convoution
위 1~3에서 설명한 Depthwise와 Pointwise를 더해서 Depthwise separable convolution을 구할 수 있습니다.
Depthwise Separable Convolution은 채널과 공간을 분리해서 계산할 뿐이지, 채널과 공간 모두 고려하기 때문에 기존 Convolution과 유사한 성능을 내지만, 연산량은 훨씬 적어집니다.
위 그림에 보이는 연산량을, 기존의 Standard Convolution 연산량으로 나누면, 아래의 보이는 식이 나오는데요.
위 수식을 약분하면,
우리가 일반적으로 filter size를 3x3을 사용하니까 약 9배 정도의 computing 효율이 나는 것을 알 수 있습니다.
Method
이제 MobileNet의 구조를 보시면, 왼쪽 그림은 기본 Convolution 과정입니다.
그냥 3x3 Convolution 연산하는 반면,
MobileNet은
- Depthwise convolution 하고,
- pointwise Convolution 따로 해주는 식으로 진행합니다.
오른쪽 표 보시면, 맨 처음엔 그냥 Convolution을 합니다.
처음부터 바로 Depthwise 하면 정보 손실이 너무 커서, 맨 처음에는 feature 선택을 충분히 이루어지게 합니다. (다음 게시글인 GhostNet에서 자세히 설명합니다.)
그 다음부터는 depthwise와 1x1 convolution 번갈아가면서 총 28 layer 연산을 취합니다.
Experiment
실제 ImageNet 실험 결과를 보면,
그냥 Convolution에 비해 Depthwise Seperable Convolution을 사용한 MobileNet이, 아무래도 정확도는 차원축소도 거치고 정보 손실이 일어나면서 줄어듭니다.
그런데 정확도는 아주 약간 줄었지만 파라미터 수는 약 9배가 줄어든 것을 볼 수 있습니다. 위에서 이전에 예상한 결과와 같습니다.
위 표는 MobileNet의 전체 연산량에서 해당 연산량이 차지하는 정도를 보여줍니다.
- 위 표에서 DW는 depthwise Convolution를 의미합니다. 3프로 밖에 차지하지 않았습니다.
- MobileNet 구조 맨 처음에 수행하는 convolution 3x3은 1프로 정도이고,
- 마지막 Fully Connected Layer는 0.18프로 밖에 차지 안 하는데,
- 중간중간 계속 발생하는 1x1 pointwise Convolution이 전체 연산의 95프로를 차지합니다.
나머지 부분에서는 좋은 연산량을 보여주었지만, "Conv 1x1"에서 Feature map을 1x1 연산을 전부 수행해주기 때문에 어쩔 수 없이 이렇게 큰 연산량을 가집니다.
이러한 1x1 pointwise Convolution에서의 큰 연산량의 해결방안으로 나온 것이 GhostNet입니다. 다음 게시글에서 설명하겠습니다.