2019.10.30 에 정리했던 글 입니다.
Intro
MobileNet v2 에 대해 정리하려고 합니다.
v3 는 HW 하는 사람이 보기보다는 알고리즘 하는 분에게 유익한 논문이라 생각합니다.
Neural Architecture Search 가 주요내용이다 생각합니다. 알고리즘 하는 분들이 앞으로 나아가야할 방향이라고 봅니다.
이야기를 짧게하자면, MobileNet 은 google 에서 만든 Network 입니다.
MobileNet v1 (April 2017), MobileNet v2 (2018-2019), MobileNet v3 (August 2019) 에 발표 되었습니다.
MobileNet 과 같은 Network에 대해 알아보는 이유는 HW 구현에서 필요한 내용들을 익히기 위해서 입니다.
하지만 실제 적용에 큰 괴리감이 있기도 합니다. :)
이전 논문들의 추세는 정확도 or 성능을 올리는데 중시하여 Bulky 한 Network 들이 많았다면, 최근 논문들은 Complexity or Performance 에도 초점을 둔 논문들이 발표 되고 있습니다.
실제로 ICCV (International Conference on Computer Vision) http://iccv2019.thecvf.com/ 같은 최고 수준의 학회에서도 이를 다루고 있습니다. GPU 의 Runtime 을 경쟁 요소로 사용하고 있죠.
기회가 되면, ICCV 2019 의 논문들도 review 를 해보도록 하겠습니다. (벌써 2020 까지 개최가 되었네요.)
(한국에서 개최되었습니다. 현재 글을 쓰는 시점에 서울 코엑스에서 진행중입니다. 필자는 참석하지 못했습니다.ㅠㅠ)
다시 본론으로 돌아가서! HW 연산량을 줄이면서 정확도는 크게 떨어뜨리지 않는 Network 를 만드는 것이 굉장히 중요한 시점이라 생각합니다.
MobileNet Target
- Sufficiently high accuracy
- Low computational complexity
- Low energy usage
- Small model size
본문
MobileNet v1
Mobile Net v1 은 다음 글을 참고합니다. 너무나 유명한 DW, PW 입니다. 굉장히 훌륭한 + 기초가 되는 테크닉 입니다.
https://blog.naver.com/chacagea/221582912200

MobileNet v2
Mobile Net v2 의 키워드를 먼저 정리하고 설명하도록 하겠습니다.
- Linear Bottleneck block
- ReLU6 activation (except projection layer)
- Inverted Residual connections
- SSD Lite
- Linear Bottleneck block
보통 논문에서 자주 등장하는,
#Kernel 3x3, #in_channel : 64 #out_Channel : 64 의 Layer 가 있다고 가정합니다.
Mobile Net v1 의 연산량을 살펴보면, (대략)
DW : 3*3*64 = 576
PW : 1*1*64*64 = 4096
일반적으로 PW 가 더 연산을 많이 필요로 함을 예상할 수 있습니다. 일반적으로 라는 표현에 주의하세요 :)
HW 로 개발을 하다보면 사실 DW 의 부분도 큰 area 를 차지하게 됩니다. (n*n Kernel 을 위한 data loading 에 의한 추가적인 Area)
MobileNet v2 는 PW 의 부담을 인식하고 DW 연산 비중을 올리는 테크닉을 사용하였습니다.
Expansion Layer, Projection Layer 가 추가되었고, 그 중간에 DW 가 존재합니다.
즉, Expansion Layer PW 에서 Channel 을 늘려준 상태에서, DW 를 합니다. Projection Layer 에서는 원래의 Channel 개수로 줄여주는 역할을 하게 됩니다. 즉, Channel 을 기준으로, Expansion 하고 Projection 한다 생각하면 되겠습니다.

다음 그림을 보시면 이해가 되실 겁니다.
Expansion factor : 6
여기서 Expansion

여기서 56x56 은 Feature map size 입니다. kernel 은 DW 3x3 을 사용하였습니다.
#Kernel 3x3, #in_channel : 144 #out_Channel : 144 의 Layer 가 있다고 가정합니다.
Mobile Net v1 의 연산량을 살펴보면, (가정)
DW : 3*3*144 = 1296
PW : 1*1*144*144 = 20736
DW+PW = 22,032
이를 Mobile Net v2 일때는,
Extention Layer : 1*1*24*144 = 3456
DW : 3*3*144 = 1296
Projection Layer : 1*1*144*24 = 3456
Sum = 8,208
즉, 기존대비 37% 의 연산으로 144 ch 의 DW 를 수행 할 수 있습니다. 여기서 키 포인트는 Bulky 한 Chanel 수의 DW 가 성능에 큰 도움이 된다는 점입니다. (만약에, 동일한 연산량으로 MobileNet v1 vs MobileNet v2 의 성능을 체크하면 v2 성능이 좋게 나올 것이다 라는 거죠?)
- ReLU6 activation (except projection layer)

ReLU6 : y = min(max(x, 0), 6)
ReLU6 는 Positive Region 에 Maximum value 인 6 을 넘어서지 못하게 하는 Activation Function 입니다. (Saturated '6')
즉, 기존 ReLU 에서는 Positive Region 에 상한선이 없어서 이를 표현하기 위한 Bit 수 를 정할때 risk 가 있었습니다. 하지만 ReLU6 는 act 결과 값이 6 이하이기 때문에, integer 의 bit 를 3 bit 으로 고정 시킬 수 있습니다.
(This is useful in making the networks ready for fixed-point inference.)
https://stackoverflow.com/questions/47220595/why-the-6-in-relu6/47220765
MobileNet v2 의 Projection Layer 에서는 ReLU6 를 사용하지 않습니다.
- Inverted Residual connections

Inverted residual block 은 앞에서 설명한 Linear bottleneck block 의 연장선 입니다.
Residual 연산을 하기 위해서는 Delay Memory 가 필요합니다. 여기서 Channel 수가 클 수록 Memory size 또한 증가하게 됩니다. MobileNet v2 에서는 Expansion Layer, Projection Layer 존재하고 channel 의 수가 작습니다. 이 부분에 residual block 을 연결하게 되면 기존의 residual block 보다 적은 Delay Memory 를 사용하게 됩니다. 이것을 Inverted residual block 이라고 부릅니다.
- SSD Lite
기존의 SSD (Single Shot Detector https://arxiv.org/abs/1512.02325 ) 의 conv 연산을 depthwise separable layers (PW, DW) 로 교체한 Network 입니다.
MobileNet v2 는 다음과 같은 Network 로 구성되어 있습니다.

기존 MobileNet V1 과 비교 결과
http://machinethink.net/blog/mobilenet-v2/
“MACs” are multiply-accumulate operations. This measures how many calculations are needed to perform inference on a single 224×224 RGB image. (The larger the image, the more MACs are needed.)

FPS (Frame Per Second) 를 비교한 결과입니다.

Accuracy 를 비교한 결과입니다.

MobileNet V2 + SSDLite 한 결과가 정확도는 어느정도 유지하면서 #param 과 MAdd 의 수를 최소로 가져가는 구조임을 주장하고 있습니다. YOLOv2 보다 모든 면에서 좋다고 나오네요.

마무리
MobileNet V2 에 대해서 알아봤습니다. linear bottleneck 을 도입한 점이 가장 흥미로웠습니다.
하지만 실제로 구현해보면 DW 의 channel depth 를 늘리는 것이 과연 HW Area 관점에서 도움이 될까 싶기는 합니다.
개인적으로는 ASIC 이 Target 이라면 DW 의 risk 는 크다고 생각합니다.
하지만 FPGA 나 GPU 같은 Resouce 가 큰 녀석들 이라면 MobileNet v2 에서 제안한 방법은 충분히 좋다고 말씀드리고 싶습니다.
Network 의 Topology 를 어떻게 만드는가? 는 수학적인 생각 + 직관 + 그리고 실험 이렇게 3요소가 중요하다고 생각합니다.
General NPU 가 나오고 있지만 모든 Topology 를 Real time 으로 완벽하게 지원하기 어렵다고 봅니다. (아직은)
하지만 벌써부터 AI 를 이용한 서비스는 많이 상용화 된 것으로 알고 있습니다. (Edge Device 는 제외 입니다.)
그리고 상용화된 서비스의 Topology 는 공개하지 않죠. 노하우가 되었고 사업화가 되고 있습니다.
처음 AI 공부할때는 Layer 많이 쌓고 Kernel size 키우면 되겠네 생각했는데, 연구할 부분이 굉장히 많은 분야임에는 틀림없습니다.
굉장히 무지했던 과거였죠...
실제로 더 많은 상용화를 위해서는 Server 이건 Edge Device 이건 HW 설계도 같이 중요하다고 개인적으로는 생각하고 있습니다.
열공합시다 :)
'HW Engineer 가 이야기하는 AI > 02 재미난? 논문 리뷰' 카테고리의 다른 글
Fast Algorithms for Convolutional Neural Networks (0) | 2021.03.29 |
---|