2020. 6. 14. 00:20ㆍResearch
MobileNet 논문의 제목인 "MobileNet: Efficient Convolutional Neural Networks for Mobile Vision Applications"과 ShuffleNet 논문 제목이 상당히 비슷한 것을 보면 알 수 있듯, ShuffleNet 역시 MobileNet처럼 보다 가벼운 모델을 만드는 데 중점을 두고 있으며 MobileNet 보다 뛰어난 성능을 보인다.
MobileNet이나 GoogLeNet에서는 1x1 convolution(pointwise convolution)이 연산량과 파라미터 수를 줄이는데 효율적이어서 적극적으로 활용되었다. 하지만 Xception이나 ResNeXt의 op별 연산량을 살펴보면 1x1 conv에서 매우 많은 시간을 소요하고 있다는 사실을 발견할 수 있다. (ResNeXt의 경우 matmul-add 연산의 93.4%가 1x1 conv에서 이루어진다.) 즉, 3x3 conv와 같은 경우엔 연산량이 많이 들 것을 알기 때문에 group conv, 또는 depthwise conv로 처리하여 효율성을 확보하였으나 정작 연산량이 적을 것이라 생각한 1x1 conv에서 생각보다 많은 시간이 소요되고 있는 것이다.
이와 같은 문제를 해결하기 위하여 ShuffleNet에선 다음 두 가지 operation을 제안한다.
- Pointwise Group Convolution
- Channel Shuffle
Group Convolution이란?
Pointwise group convolution을 설명하기 앞서 기본적인 group convolution을 먼저 이해해야 한다.
MobileNet 포스팅에서 depthwise conv, pointwise conv, depthwise separable conv에 대해서 살펴 보았는데, group conv는 depthwise conv를 떠올리면 쉽게 이해할 수 있다. 위의 그림에선 2개의 그룹을 사용하였고($g=2$), 이에 따라 좌측의 input feature map의 채널 수 $c_1$과 우측의 output feature map의 채널 수 $c_2$가 2등분 된다. 이렇게 2개로 나뉘어진 그룹에서 독립적으로 convolution이 이루어진다. 좀 더 쉽게 설명하자면, $c_1$개의 input feature map 중 $1$~$c_1/2$번째 채널의 feature map들은 $1$~$c_2/2$번째 필터들을 통해 $1$~$c_2/2$ 번째 output feature map들로 mapping 되고, $c_1/2-1$~$c_1$번째 채널의 inpute feature map들은 $c_2/2-1$~$c_2$번째 필터들을 통해 $c_2/2-1$~$c_2$ 번째 output feature map으로 mapping 된다. MobileNet에서 사용한 depthwise conv는 $g = c_1$인 group conv와 동일하다고 생각하면 된다.
Group conv를 사용하면 다음과 같은 효과를 거둘 수 있다[1].
- 병렬처리에 효율적
- 파라미터 수 감소 (채널 방향의 연산이 줄어들기 때문)
- 각 channel group 마다 높은 coorelation을 갖는 feature들이 학습된다.
위 세 가지는 모두 장점 같아 보이지만 3번 특징으로 인해서 문제가 발생한다. Channel group 마다 독립적으로 convolution 연산이 수행되기 때문에 서로 다른 group에 있는 채널끼리는 feature 정보가 교환되지 못하고 막혀있다. 이는 분명 유의미한 feature 추출에는 방해가 되는 요소이다. ShuffleNet에서는 이 문제를 channel shuffle 연산을 통해서 해결한다.
Channel Shuffle for Group Convolutions
(a)는 3개의 channel group을 통한 group convolution의 모습을 묘사하고 있다. 그림에서도 보이듯이 빨간색 그룹, 초록색 그룹, 파란색 그룹 간에 독립적으로 convolution이 이루어지므로 다른 channel group 간엔 정보가 막혀있는 상태이다. 이를 해결하기 위해 (b)와 같이 각 채널 그룹 내의 채널들을 한 번 더 3등분 하여 sub-group을 만들고 이를 각 channel group끼리 교환한다. 그 결과 (c)와 같이 채널 간의 정보가 고루 섞인 모습이 된다. Channel shuffle의 또 다른 장점은 미분가능하기 때문에 gradient를 구할 수 있고 E2E로 학습가능하다는 것이다.
ShuffleNet Unit
앞서 ShuffleNet에선 1x1 Conv의 오버헤드를 줄이는 것이 주요한 목적이라 하였다. 위의 그림을 보면 ShuffleNet에서 어떻게 오버헤드를 줄였는지 알 수 있다.
(a)에선 MobileNet에서 처럼 1x1 Conv를 하고 3x3 depthwise conv를 수행하고 있다(depthwise separable convolution). 여기에서 1x1 Conv의 오버헤드를 줄이기 위해서 (b)와 같이 1x1 Conv를 group conv로 처리하고, 그 뒤에 channel shuffle 연산을 하여 효과적인 feature 추출을 보장하도록 한다. 두 번째 1x1 GConv에선 channel shuffle을 따로 하지 않고 있는데, 그 이유는 channel shuffle을 빼더라도 성능상의 손실이 없었기 때문이라고 한다. 마지막으로 (c)는 convolution에서 1보다 큰 stride가 사용되는 경우에 쓰이는 모듈 구조이다. 3x3 DWConv에서 stride가 2이기 때문에 차원을 맞추기 위해서 shorcut connection 부분에 stride 2짜리 AVG Pool을 넣어준다.
이렇게 pointwise group convolution을 적용한 결과 연산량이 상당히 줄어들게 된다. 입력 데이터의 크기가 $c \times h \times w$, bottleneck channel 개수가 $m$, channel group 개수가 $g$일 때 ResNet, ResNeXt, SqueezeNet의 FLOPs를 비교하면 다음과 같다.
- ResNet: $hw(2cm + 9m^2)$ FLOPs
- ResNeXt: $hw(2cm + 9m^2/g)$ FLOPs
- SqueezeNet: $hw(2cm/g + gm)$ FLOPs
Network Architecture
Pointwise group convolution을 통해 상당히 큰 연산량의 감소가 이루어졌기 때문에 동일한 computation budget이 주어진다면 SqueezeNet은 남는 budget을 더 큰 feature map을 만드는 데 사용할 수 있다. 일반적으로 작은 네트워크일수록 효율적으로 feature를 뽑아내기엔 채널 수가 부족하기 때문에 이는 상당히 큰 이득이라 할 수 있다.
아래의 표를 보면 연산 모든 옵션에 대해서 complexity는 140 MFLOPs 정도로 맞춰져 있는데, $g$가 커질수록 더 많은 수의 채널을 사용한 것을 볼 수 있다. 즉, group convolution을 통해 절약한 computaion budget을 channel 수를 늘리는 데 사용한 것이다.
전체적인 네트워크 구조를 보면 3개의 stage들로 구성이 되어 있고, stage가 넘어갈 때마다 channel 수가 2배가 된다. 그룹 개수인 $g$는 pointwise convolution의 connection sparsity를 결정하는 하이퍼파라미터이며, $g$가 증가함에 따라 연산량이 줄어들어서 줄어든 만큼의 computation budget을 channel 수를 늘리는 데 활용할 수 있다.
논문에 제시된 실험 결과를 보면 보통 $g$를 어느정도 높게 잡았을 때 성능이 더 좋은 것을 알 수 있다. (아래의 표에서 각 숫자는 classification error를 나타낸다.)
위의 표를 보면 "ShuffleNet 1X", "ShuffleNet 0.5X"와 같이 뒤에 어떤 scale factor 값이 붙어 있는데 이는 computation complexity에 대한 것이다. 즉, "ShuffleNet $s$X"는 "ShuffleNet 1X"에서 사용한 필터의 $s$배만큼의 필터를 사용했다는 의미이며, $s$배 만큼의 필터를 사용했기 때문에 complexity는 약 $s^2$배가 된다.
ShuffleNet에서 한 가지 더 주목할 점은 3x3 depthwise convolution을 오직 bottleneck block에서만 사용했다는 점이다. DWConv는 MobileNet에서 말하듯이 이론상으로는 연산 cost가 크지 않지만 low-power mobile device에서 이를 실제로 사용하는 경우엔 상당히 비효율성이 크다.
Reference
[1] https://hichoe95.tistory.com/48