Deep Learning study

ShuffleNet : An Extremely Efficient Convolutional Neural Network for Mobile Devices 본문

AI/papers

ShuffleNet : An Extremely Efficient Convolutional Neural Network for Mobile Devices

HwaniL.choi 2019. 8. 15. 11:34
반응형

오늘은 MobileNet을 이어 ShuffleNet!

드디어 이까지 왔네요 .. 그럼 살펴보도록 할까요

 

Introduction

 

ShuffleNet은 MobileNet과 마찬가지로 prameter수와 computational cost를 줄여 매우작은 모델을 만드는것이 목적입니다. 따라서 여기에는 효율적인 연산방법이 필요함과 동시에 성능도 잘 나와야 합니다.

 

이 전의 MobileNet에서의 핵심이 Depthwise separable convolution이였다면, 여기서는 그것 이외에도 2가지의 스킬이 더 있습니다.

  1. (Pointwise) Group convolution
  2. channel shuffle

 

1. (pointwise) Group convolution

 

이것은 전의 포스팅에서 한 번 설명을 했었습니다. 그럼 왜 group conv를 사용하게 되었는지 조금 알아볼까요.

 

이 group conv를 먼저 사용한 모델이 있었습니다. 바로 그것은 AlexNet인데, 사실 모델의 성능을 위해서라기보다는,  그 당시에는 GPU의 성능이 그리 좋지 않아서 channel 을 나누어 학습 할 수 밖에 없었다고하죠. 여튼 이렇게 했더니 연산량도 줄어들고 의외로 성능이 더 좋게 나와서 2개의 group으로 나누어 학습을 시키게 된 것입니다.

 

그래서 shufflenet에서도 이 방법을 사용하게 됩니다. 연산량도 줄이면서 Mobilenet보다 더 좋은 성능을 내보자는 것입니다.

MobileNet에서 보면 ,  대부분의 연산량이 1x1 conv에서 나오게됩니다. 따라서 이 부분에서 들어가는 계산 비용을 조금 줄이자는 것 입니다. 그렇게 연산량이 줄어들면, 줄어든 연산량 만큼 channel수를 늘릴 수 있게 되고, 더 많은 channle수는 더 많은 information을 네트워크가 가지게 된다는 것이죠.

(논문에서 말하기를 작은 네트워크일수록 많은 feature map 수가 중요하다고 하니, 이 점을 많이 신경쓴것 같네요.)

 

위의 그림은 group conv를 표현한 그림입니다. Input이 들어오면 그 channel들을 group 의 수 만큼 나누어줍니다. 그렇게해서 나누어진 group들마다 각각 Conv를 진행하게 됩니다.

 

하지만 이렇게 단순하게 group이 나누어진 상태에서 계속 진행하다보면 한 가지 문제점이 생기게 됩니다.

 

어떤 문제인가하면, 각 group사이의 교류(cross talk)가 없다보니 해당 group들 사이에서만 정보가 흐르게되고 그것은 결국 representation을 약화시키게 되는 것이죠.

다르게 보자면 각 group별로 독립적인 network를 학습시키는 것 처럼 돼버리는것입니다. 결국 더 적은 channel을 가지는 네트워크 여러개를 학습시키는 방법이 되어버릴 수 있는것입니다. 즉, ensemble 비슷하게 되는것입니다.

 

그래서 이런 문제를 해결하기 위해서 사용하는 방법이 channel shuffle 입니다.

 

 

2. channel shuffle

 

무슨 말 인가하니, 그냥 말 그대로 받아들이면 됩니다. 각 group들에 있는 channel들을 shuffle해 버려서 input 과 output의 channel 들이 fully related, 즉 모두 관계를가지도록 만드는 것 입니다.

 

위의 그림은 channel shuffle과정을 그림으로 나타낸 것입니다. Channel shuffle은 각 group의 channel들을 다시 subgroup으로 나누게 됩니다. 위의 자잘한 사각형들이 subgroup들을 의미하죠! 그런다음 channel shuffle을 통해서 각 group별 channel들이 섞이게 되는것 입니다.

 

(Channel들의 shuffle operation은 g x n개의 channel들을 (g,n)으로 reshape후에 transepose를 하고 다시 flatening을 한 후 다음 input으로 넣어주게 됩니다.)

 

 

ShuffleNet Unit

 

ShuffleNet역시 다른 모델들과 같게(MobileNet 구조를 변형시킨것 이므로..), 같은 구조를 반복시켜 이어나가는 구조로 만들어져있습니다.

(a)는 channel shuffle이 없는 unit입니다. (b)는 channle shuffle을 추가했고, (c)는 output의 크기가 절반으로 줄어드는 연산을 하고있기때문에 AVG pool 을 통해 shortcut path 의 크기를 조절해주고, channel concat을 통해서 channel dimension을 키우고있습니다.

 

그렇다면 이렇게 만들어진 ShuffleNet은 다른 모델들과 비교했을때 그 연산량이 얼마나 차이나는지 알아봅시다!

 

먼저input size c x h x w, bottleneck channel의 수는 m 이라고 합시다.

 

  ResNet ResNeXt ShuffleNet
Computational cost(FLOPs) hw(2cm + 9m2) hw(2cm + 9m2/g) hw(2cm/g + gm)

그렇다면 위의 표 처럼 나오게됩니다.

계산 방법은 여기의 포스팅에서 설명했지만 ResNet과 ShuffleNet만 한 번 계산해 보겠습니다.

 

ResNet

위의 그림은 ResNet의 구조입니다. input이 h x w x c이고 bottleneck이 m이라 했으므로 , 첫 1x1 conv에서는 hwcm이 되고, 비슷하게 마지막단의 1x1 conv에서는 input channel이 m이고 shortcut connection을 위해서 다시 최초의 input의 channel과 맞춰야하기 때문에 output channel의 수가 c이므로 hwmc가 됩니다. 따라서 여기까지는 2hwcm이 됩니다.

그렇다면 중간의 3x3 conv에서는 input이 h x w x m 이고 bottleneck이 m이므로 연산량은 32hwm2이 됩니다.

 

따라서 최종적으로 두 cost를 더해주면 hw(2cm + 9m2)이 됩니다.

 

ShuffleNet

 

위의 shuffleNet unit의 (b)그림입니다.

 

먼저 나눈 group의 수를 g라고합시다. 그렇다면 첫 1x1 GConv(group convolution)에서는 hwcm/g 가됩니다. ResNet과 비슷하게 마지막 1x1 GConv도 역시 hwmc/g가 되죠!  여기까지 2hwmc/g가 됩니다.

그럼 남은것이 channel shuffle과 3x3 DWConv(depthwise conv)인데, channel shuffle은 위에서 말한 operation은 거의 영향을 주지 않기 때문에 포함하지 않습니다.

그렇다면 마지막으로 3x3 DWConv는 32mhw가 됩니다.

 

따라서 두 cost를 더해주면 hw(2cm/g + 9m)이 됩니다.

 

 

계산은 이정도로 해 보았고 , 수식으로만 보아도 ShuffleNet의 연산량이 확실히 적은것을 볼 수 있습니다.

 

 

 

Network Architecture

 

위의 표는 group의 수 별로 나타낸 표 입니다. complexity를 보면 모두 비슷하게 맞추어져 있습니다. 즉 group의 수를 늘리면서 얻어진 이득(연산량 감소)에 따라 그만큼 channel 수를 늘린 것입니다.

당연한 말이겠지만 , group이 많을수록 channel수도 많아지게 되죠. 역시 그에따라서 많은 feature를 가지게 되므로 더 많은 정보를 가지게 된다고 볼 수 있습니다.

 

 

Experiments

 

위의 표를 봅시다. (ShuffleNet 뒤의 1x, 0.5x... 등은 channel 수를 scaling한 것 입니다. 즉 숫자가 작을수록 channel의 수가 적은 모델이 되는것 입니다.)

비록 예외도 있긴하지만 group의 수가 많아질 수록 성능이 좋아지는것을 알 수 있습니다.

또한 더 작은 모델일수록 group=1 일때와 group이 늘어날때의 성능차이가 커지게 됩니다. 이 말은 작은 모델일수록 channel의 수가 중요하다는 말로 생각될수 있습니다.

 

위의 표는 어찌보면 당연한 말을 해놓은것이지만, 당연히 shuffle을 한 것이 안한것보다 성능이 좋다는것을 나타냅니다.

 

이 것은, MobileNet과 complexity를 비슷하게 맞추어놓고 실험했을때 , 더 좋은 성능을 가졌다라는것을 말하고 있네요 .

 

 

이 뒤에도 몇가지 실험이 더 있긴하지만, 이전의 다른 모델들보다 빠르고 , 성능이 좋았다는 이야기 이므로 패스하겠습니다. 

 

다음엔 또 다른 논문으로 찾아올게용 !

 

Reference

[1] ShuffleNet : An Extremely Efficient Convolutional Neural Network for Mobile Devices

반응형
Comments