본 글에서는 "모바일 및 임베디드 환경에서 CNN을 얼마나 가볍게 만들 수 있는가?"라는 주제를 중심으로,
모바일 환경에서의 활용을 위한 경량화를 목표로 하는 3가지 모델을 다뤄보고자 한다.
- SqueezeNet (2016)
- MobileNet (2017)
- ShuffleNet (2017)
0. 다양한 Convolution 구조들
위 모델들의 구조를 살펴보기 전에 다양한 convolution 구조에 대해 공부하면 모델의 구조를 이해하기 쉽다.
다음 링크에서 convolution 구조에 대해 잘 설명하고 있다.
링크의 글 중 특히 아래 적어 놓은 Convolution 구조들을 이해한 다음에 이어서 본 블로그의 글을 읽어보기 바란다.
- 1. Convolution
- 5. Depthwise Convolution
- 6. Depthwise Separable Convolution
- 7. Pointwise Convolution
- 8. Grouped Convolution
https://eehoeskrap.tistory.com/431
[Deep Learning] 딥러닝에서 사용되는 다양한 Convolution 기법들
기존 2차원 컨볼루션은 세가지 문제점이 존재한다. Expensive Cost Dead Channels Low Correlation between channels 또한, 영상 내의 객체에 대한 정확한 판단을 위해서는 Contextual Information 이 중요하다. 가령, 객
eehoeskrap.tistory.com
Convolution 구조를 이해했다고 가정하고 모델 아키텍처에 대한 설명을 시작하겠다.
1. SqueezeNet (2016)
: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
https://arxiv.org/abs/1602.07360
SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
Recent research on deep neural networks has focused primarily on improving accuracy. For a given accuracy level, it is typically possible to identify multiple DNN architectures that achieve that accuracy level. With equivalent accuracy, smaller DNN archite
arxiv.org
AlexNet이 등장한 이후 CNN 모델들의 성능은 매우 좋아졌지만, 모바일 환경에서 사용하기에는 모델의 크기가 너무 크다는 한계가 있었다. 이에, 모델의 크기를 줄이면서 모델의 성능을 보전하기 위한 고민에서 SqueezeNet이 등장했다.
SqueezeNet은 AlexNet과 비슷한 정확도를 가지지만 weight는 배 수준으로 상당히 가볍다.
SqueezeNet의 핵심 요소는 1x1 convolution filters 및 Fire Module의 활용이다.
먼저, SqueezeNet은 기존에 사용하였던 3 x 3 필터를 일부를 1 x 1 필터로 대체함으로써 일부 파라미터의 수를 로 줄였다.
어떤 식으로 3 x 3 필터를 일부를 1 x 1 필터로 대체했는지 살펴보자.

Fire module은 Squeeze layer와 Expansion layer 총 2개의 layer로 이루어져 있다. Squeeze layer가 먼저 나온 뒤 Expansion layer가 뒤따라 나오는 구조이다.
[Squeeze layer]
Squeeze layer는 1x1 convolution으로 이루어져 있다. 1x1 convolution은 input 데이터의 모든 channel을 하나로 합친 뒤 input channel의 수를 줄여서 다음 layer에 전달하는 역할을 한다. 간단하게 말하면 channel 수를 조절하는 역할이다.
[expansion layer]
1 x 1 convolution이 3 x 3 convolution과 섞인 형태이다. 1 x 1 convolution은 spatial structure를 감지하기 어렵지만 이전 layer의 channel들을 다양한 방법으로 결합시킨다. 3 x 3 convolution은 이미지 내의 structure를 잘 잡아낸다.
1 x 1 과 3 x 3 필터 사이즈의 convolution을 섞어서 사용함으로써 표현력이 증가하고 파라미터의 숫자도 동시에 줄일 수 있다. 이 때 주의할 점은, 1 x 1 convolution과 3 x 3 convolution 결과의 크기를 같게 하려면 적당히 padding을 잘 해주어야 한다는 것이다. 사이즈가 같아져야만 layer들을 쌓을 수 있기 때문이다.
또한, SqueezeNet은 downsampling을 네트워크의 후반부로 미루어 feature map의 공간 해상도를 오래 유지함으로써 정보 손실을 줄였다.

위 표를 보면, AlexNet 대비 모델의 크기가 1/50로 작아졌지만 비슷한 성능을 유지하고 있음을 확인할 수 있다.
2. MobileNets (2017)
: Efficient Convolutional Neural Networks for Mobile Vision Applications
https://arxiv.org/abs/1704.04861
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
We present a class of efficient models called MobileNets for mobile and embedded vision applications. MobileNets are based on a streamlined architecture that uses depth-wise separable convolutions to build light weight deep neural networks. We introduce tw
arxiv.org
MobileNet은 모델의 연산량을 줄이는 데에 초점을 둔 모델이다.
MobileNet의 핵심은 Depthwise separable Convolution이다.

Depth-wise Separable Convolutions은 필터의 채널과 공간 차원을 분리할 수 있다는 생각에서 비롯됐다.
일반적인 컨볼루션에서는 채널 방향과 공간 방향의 컨볼루션을 동시에 수행한 반면, Depth-wise Separable Convolutions은
공간 방향의 depth-wise 컨볼루션과 채널 방향의 pointwise convolution을 따로 수행하여 합치는 방식을 사용한다.
이 방식은 연산량을 크게 줄여주는데, 아래에서 일반 CNN 연산과 모바일넷 연산을 비교해보겠다.
커널 사이즈가 2이고 입력 채널수가 64인 CNN의 연산량은 다음과 같이 계산될 수 있다.
O2DGNN = 2*2 * H * W * 64 * Cout
반면, 모바일 넷 구조에서는 다음과 같이 계산될 수 있다.
Depthwise Convolution: Odepthwise = 2*2 * H * W * 64
Pointwise Convolution: Opointwise = 1*1 * H * W * 64 * Cout
MobileNet = Odepthwise + Opointwise = 2*2 * H * W * 64 + 1*1 * H * W * 64 * Cout
예시에서 본 바와 같이 일반 CNN의 연산량에 비해 모바일넷의 연산량이 적다고 할 수 있다.
3. ShuffleNet (2017)
: An Extremely Efficient Convolutional Neural Network for Mobile Devices
https://arxiv.org/abs/1707.01083
ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
We introduce an extremely computation-efficient CNN architecture named ShuffleNet, which is designed specially for mobile devices with very limited computing power (e.g., 10-150 MFLOPs). The new architecture utilizes two new operations, pointwise group con
arxiv.org
앞서 설명한 MobileNet 아키텍처를 보면, 대부분의 연산량이 1x1 conv에서 나온다. 따라서 Shufflenet은 이 부분에서 들어가는 계산 비용을 줄이고자 했다. 그렇게 연산량이 줄어들면, 줄어든 연산량 만큼 channel 수를 늘릴 수 있게 되고, 더 많은 channel 수는 더 많은 information을 가지게 되는 것을 의미한다.
ShuffleNet은 pointwise group convolution과 channel shuffle을 통해 연산량은 줄이고 높은 성능을 유지했다.
[Pointwise Group Convolution]
Pointwise Group Convolution에 앞서 기본적인 Group Convolution에 대해서 잠시 이야기하자면, Group Convolution을 사용한 모델 중 유명한 모델은 AlexNet이다. 당시에는 모델의 성능을 위해 그룹지었다기보다는, GPU의 성능이 그리 좋지 않아서 channel 을 나누어 학습했는데, 연산량도 줄고 성능이 더 좋게 나와서 2개의 group으로 나누어 학습을 시키게 된 것이다. Shufflenet에서도 이 방법을 사용하여 연산량도 줄이면서 Mobilenet보다 더 좋은 성능을 내고자 하였다.

위 그림 중 (a)는 group conv를 표현한 그림이다. Input이 들어오면 그 channel들을 group 의 수 만큼 나누어준다. 그렇게해서 나누어진 group들마다 각각 Conv를 진행한다. 하지만 이렇게 단순하게 group이 나누어진 상태에서 계속 진행하다보면 한 가지 문제점이 생긴다. 각 group사이의 교류(cross talk)가 없다보니 해당 group들 사이에서만 정보가 흐르게되고 그것은 결국 representation을 약화시키게 되는 것이다.
다르게 보자면 각 group별로 독립적인 network를 학습시키는 것처럼 되는 것이다. 이는 결국 더 적은 channel을 가지는 네트워크 여러개를 학습시키는, ensemble과 같은 방법이 될 수 있다. 이런 문제를 해결하고자 channel shuffle이 등장했다.
[Channel Shuffle]
앞서 말했듯, Pointwise Group Convolution을 사용하면, 3x3 conv가 입력 채널 그룹에 대해서만 연산을 수행하고, 그에 관련된 정보만 출력한다. 채널 간의 정보 교환을 막기 때문에 많은 정보를 이용할 수 없다. 따라서 표현력이 약해지게 되어,이 문제를 해결하기위해 Channel Shuffle이 등장했다.

위 그림의 (b)와 (c) 부분에서 ShuffleNet에서 구현하는 Channel Shuffle을 확인할 수 있다. 구체적인 shuffle 방법은 다음과 같다. 1x1 conv layer에서 m개의 채널을 g그룹으로 분할해 하나의 그룹에 n개의 채널을 포함한다고 가정하겠다. 1x1 conv는 gxn개의 채널을 출력하고, 이 출력값은 (g, n)으로 reshape 한다. 이것을 transposing 하고 flattening하여 다음 레이어의 인풋으로 전달한다.

위 표는 shuffle을 사용했을 때와 안했을 때의 성능 차이를 비교한 표인데, shuffle을 했을 때 성능이 더 좋음을 확인할 수 있다.

위 그림은 shuffle unit의 구조를 보여준다. (a)는 Depthwise convolution을 사용하는 BottleNeck 구조이다. (b)와 (c)는 ShuffleNet에서 사용하는 unit이다. (c)는 down sampling을 할때 사용되며, 3x3 DWConv에서 stride=2를 사용하여 피쳐맵 크기를 반으로 감소시킨다. 보통 피쳐맵 크기를 감소할 때, 채널수를 두 배로 해주는데, SuffleNet에서는 conv 연산으로 채널 수를 확장하지 않고, short cut과 concatenation 하는 방식으로 채널 수를 확장하고 있다. short connetion에서도 입력값의 크기를 감소하기 위해 stride=2인 3x3 AVG Pool을 사용한다.
이처럼 ShuffleNet에서는 1x1 pointwise group convolution을 활용해서 연산량에서도 이점을 가지면서, channel shuffle을 사용하여 다양한 그룹의 채널 정보를 활용하여 3x3 group convolution으로 연결될 때의 cross talk 문제점을 해결했다.

위 표는 ShffleNet Architecture이다. 여기서 각 stage에서 Stride 2 라고 되어있는 건 SuffleNet unit (c)를 사용한 것이다. 그리고 표 오른쪽에 Output channels 부분은 전체 계산 비용이 거의 변하지 않도록 출력 채널을 설정한 것이다. 그룹 수가 많을수록 복잡도를 유지하기 위해 더 많은 convolutional filter이 설정되어 있다. 즉, group을 많이 나누어서 연산량을 줄인만큼 출력 채널(convolutional filter) 수를 늘려줘서 일정한 complexity로 맞춰준다.

위 표는 연산량이 같을 때, group 수를 바꾸면 Classification Error가 어떻게 변하는지 실험한 결과이다. 그룹이 많을수록 성능이 좋아지는 것을 확인할 수 있다. 또한 더 작은 모델일수록 group에 따른 성능의 변화가 큰 것을 확인할 수 있다.

위 표는 ShuffleNet과 MobileNet의 성능을 비교한 표이다. 비슷한 complexity를 맞추어 실험했을 때 MobileNet에서보다 ShuffleNet에서 더 좋은 성능이 나타남을 확인할 수 있다.
참조 :
https://ctkim.tistory.com/entry/%EB%AA%A8%EB%B0%94%EC%9D%BC-%EB%84%B7#google_vignette
https://gaussian37.github.io/dl-concept-mobilenet-and-squeeznet/