모바일 같은 저사양 디바이스에 딥러닝 모델을 탑재하기 위해서는 제한된 하드웨어의 computation power에 맞춘 딥러닝 모델의 경량화가 필수적입니다. 모델 pruning, low-bit representation 등의 다양한 경량화 기법 중에서 ShuffleNet은 convolution 모델의 효율적인 디자인을 통해 더 적은 연산 (FLOPS) 으로도 좋은 성능을 달성하는 성과를 이루어냈습니다.
ShuffleNet
그동안 학계에서는 convolution 연산을 효율화하기 위해 depthwise separable convolution이나 group convolution 등을 도입했습니다. ShuffleNet 의 주요 컨셉은 기존 Xception이나 ResNeXt의 비효율적인 pointwise convolution에 group convolution을 도입한 pointwise group convolution 과 group convolution에서 channel간의 상호작용을 모델링한 channel shuffle입니다.
Pointwise group convolution
Pointwise group convolution은 기존 경량화 모델이 3 x 3 convolution에만 group convolution을 사용하고 pointwise convolution에는 사용하지 않았던 것을 1 x 1 convolution에도 group convolution을 사용하자는 것입니다.
Pointwise convolution은 공간 방향의 convolution이 아닌 채널 방향의 convolution을 진행해서 채널 수를 조절하는 convolution으로 기본적으로 해당 픽셀마다의 fully connected layer와 동일하므로 연산량이 많습니다. 논문에서는 pointwise convolution의 많은 연산량으로 작은 모델에서의 feature 수를 제한하므로 1 x 1 convolution 에도 group convolution을 도입합니다.
Group convolution은 채널을 몇 그룹으로 나누어 그룹 별로 convolution을 따로따로 진행하는 개념으로 파라미터의 수와 연산량을 그룹 수만큼 줄일 수 있습니다. 하지만 group convolution을 지속적으로 진행하다 보면 아웃풋의 특정 채널은 인풋의 특정 채널로부터만 유도되므로 채널 그룹간의 정보 교환을 막고 딥러닝 모델의 표현력을 약화시킵니다. 이로 인해 논문에서는 channel shuffle 기법을 도입합니다.
Channel shuffle for Group Convolution
위에 언급한 group convolution의 부작용을 방지하기 위한 channel shuffle은 다음 그림과 같습니다.
GConv는 group convolution을 뜻하고 (a)는 기존의 group convolution 입니다. 각 그룹 별로 정보의 교환이 막혀있습니다. (b), (c)는 group convolution 이후에 channel shuffle을 도입하여 아웃풋의 각 그룹 별 채널을 섞어주어 아웃풋 채널이 인풋 채널 전체와 연관성을 가지도록 만들어줍니다. 이 때, 각 그룹을 몇 개의 subgroup으로 쪼개어 각 그룹의 subgroup을 합쳐 다음 layer의 인풋으로 집어넣는 과정으로 진행합니다.
Channel shuffle의 구현은 간단합니다. $g$개의 그룹이 각각 $n$개의 채널을 가지고 있을 때, 이를 [g, n] 차원을 가지는 텐서로 만든 후에 transpose하여 flatten하면 자연스럽게 각 그룹 별 채널이 섞이는 것을 구현할 수 있습니다.
[1,1,1,2,2,2,3,3,3] -> [[1,1,1], => [[1,2,3], -> [1,2,3,1,2,3,1,2,3]
[2,2,2], [1,2,3],
[3,3,3]] [1,2,3]]
Channel shuffle은 여러 group convolution이 있을 때 딥러닝 모델의 강력한 표현력을 유지시켜 주며 이는 실험에서도 살펴볼 계획입니다.
ShuffleNet Unit
기존 residual block에 pointwise group convolution과 channel shuffle을 적용한 ShuffleNet 유닛은 다음과 같습니다.
(a)는 기존 residual block이고 (b), (c)가 ShuffleNet 유닛입니다. (b)는 입력 사이즈가 유지되며, (c)는 입력 사이즈를 절반으로 줄일 때 사용됩니다. ShuffleNet은 (b), (c)의 유닛이 반복적으로 구성되어 이루어집니다.
- 기존과 마찬가지로 3 x 3 depthwise convolution을 bottleneck 중간에 사용했습니다.
- (b), (c)를 보시면 1 x 1 convolution에 pointwise group convolution을 적용한 것을 알 수 있으며 첫 번째 pointwise group convolution 이후에 channel shuffle을 진행합니다.
- Batch Normalization은 매 단계에서 적용하나 ReLU는 첫 번째 pointwisei group convolution에만 적용합니다.
- (c)의 경우 입력 사이즈가 반으로 줄기 때문에 shortcut path에 3 x 3 average pooling을 하여 원래 입력을 풀링하고, 다음 레이어의 채널 개수를 맞추기 위해 더하기가 아닌 concatenation (이어붙이기)를 사용합니다. 이는 채널의 수를 맞추고 더하기를 하는 것보다 연산량이 적기 때문에 사용합니다.
결과적으로 pointwise group convolution과 channel shuffle로 연산량을 줄일 수 있으므로 더욱 많은 feature를 사용할 수 있습니다. 기존 경량화 모델들이 반강제적으로 적은 feature를 사용할 수 없었던 점에 비하면 굉장한 이득이죠.
Network Architecture
전체 네트워크는 위 테이블과 같습니다. 매 stage마다 stride=2로 하여 입력 사이즈를 줄이면서 아웃풋 채널 크기를 늘려갑니다. 각 유닛의 bottleneck layer (인풋과 아웃풋 사이 layer들)의 채널 개수는 기존과 동일하게 아웃풋 채널의 1/4로 설정합니다. Complexity의 단위는 FLOPS (전체 곱하기와 더하기의 개수) 입니다.
또한, 실험에서 그룹의 개수의 영향을 알아보기 위해 complexity가 비슷하도록 그룹 별 채널의 개수를 조절하였습니다. 그룹 개수를 크게 잡을 수록 연산량이 감소하므로 상대적으로 큰 feature를 가져갈 수 있습니다.
실험
실험은 ImageNet 2012 classification dataset으로 진행되고 classification error를 통해 모델 성능을 비교합니다. 입력 사이즈는 224 x 224 이고 256 x 256 입력 이미지를 center crop한 validation 데이터 셋에 대해 모델 성능을 비교합니다.
Pointwise group convolution
Pointwise group convolution의 효과를 알아봅니다. 그룹의 개수가 1이라면 pointwise convolution이 되겠죠.
ShuffleNet 1 x 의 결과를 보시면 됩니다. 그룹의 개수가 8일 때 classification error가 제일 낮은 것을 확인할 수 있습니다. 이는 pointwise group convolution으로 제한된 연산량에서 더 큰 feature 개수를 사용 가능하여 표현력이 높아졌다고 해석할 수 있습니다.
ShuffleNet 뒤에 0.5 x 나 0.25 x 는 기존 ShuffleNet 1 x 에서 파라미터의 개수를 0.5배, 0.25배 줄인 모델입니다. 따라서 FLOPS가 주는 대신 classification error가 올라간 것을 확인할 수 있습니다.
Channel shuffle 효과
그룹의 개수에 상관없이 channel shuffle할 때 classification error가 더 낮아진 것을 확인할 수 있습니다. 특히, 그룹의 개수가 클 때 channel shuffle의 효과가 더 큼을 볼 수가 있습니다. Channel shuffle로 인한 그룹간 정보 교환이 효과 있음을 확인할 수 있네요.
실제 ARM 플랫폼에서의 구현
논문에서는 실제 arm 기반 모바일 디바이스에서 inference 속도를 비교했습니다. 이론상으로 그룹의 개수가 클 수록 성능이 더 좋아야하나 실제 구현에서는 그룹 개수가 3,4 정도가 제일 적당하다고 합니다. 실제 구현상에는 다양한 overhead가 존재하여 연산량이 준만큼 빨라지지는 않으나 기존 모델에 비해서 훨씬 빠른 결과를 얻을 수 있다고 합니다. 기존 AlexNet에 비하면 이론적으로는 18배 빨라여야 하나 13배 정도 빨라졌다고 합니다.
홍머스 정리
- 그룹의 수가 클수록 더 큰 feature 개수
- Pointwise group convolution, channel shuffle
참조
'Machine Learning Models > Covolutions' 카테고리의 다른 글
EfficientNet (0) | 2021.03.10 |
---|---|
DenseNet (0) | 2021.03.03 |
NASNet (0) | 2021.03.02 |
Xception (0) | 2021.02.28 |
ShuffleNet V2 (0) | 2021.02.27 |