안녕하세요. 지난 포스팅의 [IC2D] Selective Kernel Networks (CVPR2019)에서는 InceptionNet에서 아이디어를 얻어 multi-path 기반의 non-linear aggregation을 수행하는 SK 합성곱 연산과 이를 기반으로 SKNet에 대해 소개하였습니다. 오늘도 multi-path 기반의 efficiency를 강조한 Big-Little Net에 대해서 소개하도록 하겠습니다.
Background
현재 Computer Vision 분야에서 영상 분류 (Image Classification) 및 객체 탐지 (Object Detection)은 Convolutional Neural Network (CNN)의 활약으로 엄청난 성과를 이루고 있습니다. 대표적으로 ResNet과 Mask-RCNN 등이 있죠. 뿐만 아니라, Speech Recognition 분야에서도 CNN의 활약은 매우 지대합니다.
하지만, 여전히 높은 성능을 위해 모델을 복잡하게 설계하는 것은 높은 복잡도와 계산능력을 필요로 하기 때문에 real-time inference가 필요한 분야인 자율 주행 자동차와 로보틱스 분야에서 사용하기 어렵다는 문제점이 있습니다. 이러한, 문제를 해결하기 위해 성능을 어느정도 포기하더라도 효율적인 모델을 만드는 것을 목표로 해왔습니다. 대표적으로 Pruning, Quantization, Low-rank Factorization 등과 같은 방법이 제안되어왔죠. 저희는 그 중에서도 MobileNet, ShuffleNet과 같은 모델들에 대해서 소개하는 시간을 가졌습니다. 이러한 모델들은 실제로 효율적인 계산능력으로 소형 칩에 가용할 수 있게 되었지만 정보손실에 대한 문제점은 끊임없이 제기되어 왔습니다. 특히, 위 방법들은 모두 Single-Scale만 고려하였기 때문에 줄어드는 scale에 대한 정보손실을 방지할 수 없죠.
그럼에도 불구하고 Multi-Scale representation을 위한 효율적인 학습 방식이 제안되어 오지 않았습니다. 본 논문에서는 이러한 문제에 주목하였죠. 한편, MobileNet에 따르면 CNN의 복잡도를 줄이는 한 가지 방법은 입력 영상의 해상도를 줄이는 것입니다. 실제로 절반 정도 줄이면 75%의 연산량이 감소하는 것으로 알려져있죠. 하지만, 해상도를 줄이게 되면 성능이 하락하게 됩니다. 본 논문은 이 문제를 해결하기 위한 Big-Little Net을 제안합니다.
Method
1). Big-Little Net
그림1은 Big-Little Net (bL-Net)의 전체적인 그림을 블록 다이어그램으로 보여주고 있습니다. 잘 보시면 bL-Net은 Big-Little Module이 여러 개 쌓여서 만들어진것을 볼 수 있습니다. 이는 $\mathbf{x}_{i}$를 입력 특징 맵으로 받아 $\mathbf{x}_{i + 1}$를 출력 특징 맵으로 내보내는 모듈입니다. 처음에 말씀드렸다싶이 low-scale 영상은 높은 복잡도를 가지는 branch로 보내주면 효율적이고 보다 정확하게 계산할 수 있습니다. 반대로 high-scale 영상은 적은 복잡도를 가지는 branch로 보내주면 덜 정확하지만 효율적으로 계산할 수 있죠. 이와 같은 각 branch를 Big branch 그리고 Little branch라고 두어 두 개를 동시에 사용하는 것이 Big-Little Module입니다.
bL-Net은 근본적으로 InceptionNet의 명맥을 따르고 있습니다. 즉, multi-path 기반이라는 뜻이죠. 저희는 최근 2개의 multi-path 기반 합성곱인 OctConv과 SK Conv를 보았습니다. 각각 주파수 그리고 kernel size를 기준으로 입력 특징 맵을 multi-branch로 split하는 연산이 존재하죠. Big-Little Module은 scale을 기준으로 branch를 생성합니다. 어떻게 보면 OctConv의 Scale Representation과 어느정도 유사하다고 볼 수 있겠네요. 이를 표현하기 위해 $K$개의 branch에는 각각 대응되는 $K$개의 scale $[1, \frac{1}{2}, \frac{1}{4}, \dots, \frac{1}{2^{K - 1}}]$로 구성된다고 가정하겠습니다. 그리고 각 branch에 입력되는 특징 맵은 입력 특징 맵 $\mathbf{x}_{i}$에서 $K$번째 branch에 대응되는 scale만큼 downsample한 특징 맵이라고 가정하겠습니다. 이를 $\mathbf{x}_{i}^{k}$라고 하죠.
이제 $K$개의 branch를 하나로 fusion하는 방식에 대해서 생각해봐야합니다. 일단, 저희는 여러 개의 branch에 대해서 전부 scale이 다르기 때문에 이를 맞춰주기 위해서는 다시 $2^{k - 1}$만큼 upsample 시켜줘야하겠죠. 또는, 각각의 채널 개수가 다를 수도 있기 때문에 $1 \times 1$ 합성곱 연산을 적용하여 채널의 개수도 맞춰줘야할 수도 있습니다. 이 연산을 $S^{k}$라고 할 때 저희는 fusion operation을 다음과 같이 정의할 수 있습니다.
$$\mathbf{x}_{i + 1} = F (\sum_{k = 0}^{K - 1} c^{k}S^{k}(f_{k}(\mathbf{x}^{k}_{i})))$$
이때, $f^{k}$는 $k$번째 branch의 합성곱 연산입니다. 그리고 $c^{k}$는 각 branch의 가중치로 해당 값을 기준으로 weighted-addition을 수행합니다. 본 논문에서는 모든 branch에 대해 $c^{k} = 1$로 두어 단순 합 연산을 수행하게 됩니다. 다음으로 Big-Little Module에는 2개의 하이퍼파라미터인 $\alpha$와 $\beta$가 존재합니다. $\alpha$는 Little Branch의 입력 특징 맵 해상도를 조절하고 $\beta$는 Little Branch의 채널 개수를 조절해주게 됩니다. 따라서, 높은 $\alpha$와 $\beta$는 보다 효율적인 모델을 만들 수 있지만 성능이 살짝 떨어질수도 있다는 점에 유의해야합니다.
2). Big-Little Net Architectures
표4는 bL-Net을 ResNet-50에 적용했을 때 모습을 보여주고 있습니다.
Experiment Results
1). Object Recognition
본 논문에서는 먼저 적절한 $\alpha$와 $\beta$ 값을 결정하기 위한 ablation study부터 수행합니다. 총 4개의 조합으로 실험하는 것을 볼 수 있죠. 결과적으로는 $\alpha = 2$ 그리고 $\beta = 4$로 했을 때 기존 ResNet-50과 성능 차이가 거의 나지 않기 때문에 해당 값을 default 값으로 다음 실험을 진행합니다.
이번에는 더욱 다양한 ResNet-like 모델들 (ResNet, ResNeXt, SEResNeXt)에 Big-Little Module을 적용하여 비교를 진행합니다. 실험결과는 성능도 모두 약간 오른 것을 볼 수 있죠. 하지만 FLOPs는 높으면 2배 적으면 1.4배까지 감소하여 연산량이 크게 감소한 것을 볼 수 있습니다. 뿐만 아니라 입력 영상을 256으로 맞추면 기존 모델보다 성능 향상도 되지만 FLOPs도 적은 것을 볼 수 있죠.
다음으로 ResNet 그리고 ResNeXt를 포함하여 효율적인 모델들 사이의 비교를 진행합니다. 가장 아랫줄의 파란색 선과 주황색 선이 각각 ResNet과 ResNeXt에 Big-Little Module을 적용했을 때 얻은 성능입니다. 다른 모델들에 비해 훨씬 오류율이 낮은 것을 볼 수 있죠.
다음으로 다양한 SOTA 모델들과의 성능도 비교해봅니다. 성능으 좀 낮더라도 기존 모델들보다 훨씬 낮은 FLOPs와 GPU Speed를 가지고 있음을 볼 수 있죠.
2). Speech Recognition
마지막으로 Speech Recognition에서도 성능을 비교해보았을 때 모두 성능이 향상된 것을 볼 수 있습니다.