Various Convolutions for model compression and acceleration

Jeeeun Song
KLleon
Published in
18 min readMay 30, 2022

Author : 송지은, 김채원

Introduction

Deep learning의 시대를 살고 있는 요즘, Deep learning은 Computer Vision, Natural Language Processing (NLP), Audio Processing, Speech Recognition, Information Retrieval 등 수많은 문제를 해결하고 있습니다. 이처럼 다양하고 복잡한 Task를 정확히 풀기 위해 위해 Deep learning 모델의 사이즈는 점점 더 커지고, 모델의 구조는 복잡해지고 있습니다.

예로, NLP 분야에서 다양한 task를 수행할 수 있는 GPT3 모델은 GPT1에 비해 1000배, GPT2에 비해 100배 큰 모델로 발전했습니다. Vision 분야에서는 정확도 향상을 위해 layer를 깊게 쌓는 방식으로 발전해 왔고, 최근에는 transformer 도입으로 모델의 크기는 더욱더 커지고 있습니다.

하지만 Model size가 커지면서 다음과 같은 문제점에 직면하게 됩니다.

  • Training Time 증가 : 방대한 양의 파라미터를 가지는 모델은 학습 시 많은 시간이 소요됩니다.
  • Inference Time 증가 : 크거나 복잡한 연산 구조를 가지는 모델은 inference 시간을 증가시킵니다.
  • Memory Usage 증가 : 대부분 사람들이 가진 device의 Computing resource는 제한적입니다. 많은 Computing resource를 요구하는 모델은 real-time application 또는 mobile device application에 적합하지 않게 되며 활용도가 낮아집니다.

위와 같은 문제점 때문에 모델의 확장성에 의문을 품고 연구하는 분야가 모델 압축 (model compression)입니다. 모델을 압축시키기 위한 방법들을 간단히 소개하면,

  • 가지치기(pruning) : 학습 후에 불필요한 부분들을 제거하는 방식입니다. 예컨대 작은 가중치 제거, 레이어 head 제거, attention 제거 등의 방법을 사용합니다. 딥러닝에서 dropout의 효과와 비슷합니다.
  • 가중치 분해 (weight factorization) : 말 그대로 가중치를 분해하여 두 개의 작은 행렬의 곱으로 근사하는 방법입니다. 행렬이 낮은 rank를 갖도록 low-rank 제약조건을 걸어줌으로써 경량화할 수 있습니다.
  • 가중치 양자화 (weight quantization) : 가중치 값이 더 작은 비트만 사용하게끔 부동 소수점 값을 잘라내는 방식입니다. 학습과정에서도, 학습 후에도 양자화를 할 수 있으며 이를 통해 리소스가 제한된 디바이스에 넣을 수 있습니다.
  • 가중치 공유 (weight sharing) : 모델의 일부 가중치들을 다른 파라미터들과 공유하는 방식입니다.
  • 지식 증류 (knowledge distillation) : 성능이 더 좋은 모델(teacher)로 부터 학습의 기준이 되는 모델(student) 에게 지식을 증류하는 방법입니다. 증류하는 방법은 두 네트워크 간의 softmax/feature map/similarity행렬 을 비슷하게 맞춰주는 방법들이 있습니다. 이렇게 하면 크기는 더 작지만 baseline 만큼 좋은 성능을 가진 가벼운 모델을 사용할 수 있게 됩니다.

이외에도 model 자체를 compression 하고자 하는 흐름도 있습니다. 처음부터 layer 자체를 효율적으로 설계하는 방식입니다. 특히 Vision에서는 효율적인 Convolution 연산들이 제안되었습니다.

오늘은 model compression 또는 Acceleration을 위해 고안된 다양한 Convolution 연산에 대해 살펴보도록 하겠습니다.

Various Convolutions for model compression and acceleration

1. Convolution

2D Convolution (https://thomelane.github.io/convolutions/2DConvRGB.html)
3D Convolution (https://thomelane.github.io/convolutions/3DConv.html)

먼저 제일 기본 Convolution 연산입니다. input 사이즈보다 작은 kernel 사이즈를 가진 filter와 element-wise product를 한 후 모든 element들을 더한 값을 출력으로 갖는 연산입니다. Convolution 연산에는 2D convolution, 3D convolution이 존재합니다.

첫 번째 그림은 2D Convolution을 나타내며, input의 height, width, 2 dimension 방향으로 kernel이 이동합니다.

두 번째 그림은 3D Convolution을 의미하며, input의 height, width, channel, 3 dimension 방향으로 이동하며 결과값을 얻습니다.

보통 3D convolution 연산의 경우, 연속되는 프레임의 temporal한 학습에 용이하지만 2D Convolution 연산에 비해 파라미터와 계산량이 훨씬 많아서 layer를 layer를 깊게 쌓기 힘들고 학습 진행이 어렵다는 단점들을 가지고 있습니다.

2. Dilated Convolution (Atrous Convolution)

Dilated Convolution (https://commons.wikimedia.org/wiki/File:Convolution_arithmetic_-_Dilation.gif)

Dilated convolution은 ‘구멍이 있는’이란 의미를 가진 Atrous convolution으로도 불립니다. 의미 그대로 receptive field에 구멍을 내어 사용하는 연산인데요. 확장된 convolution으로 사이사이에 공백 (실제 구현에서는 숫자 ‘0’)을 삽입하여 커널을 팽창시킵니다.

보통 pytorch 또는 keras에 conv2D 함수에 dilation 또는 dilation rate parameter를 입력으로 optional하게 받고 있습니다. 여기서 말하는 dilation 또는 dilation rate는 커널의 팽창 정도를 나타내게 됩니다.

Dilation rate (https://arxiv.org/pdf/1511.07122.pdf, Multi-Scale Context Aggregation by Dilated Convolutions, ICLR 2016 )

위 그림 (a),(b),©는 각각 dilation rate 1, 2, 4인 경우 receptive field를 나타냅니다.

그림에서 알 수 있듯이 dilated convolution은 추가적인 computational cost 없이 receptive field를 넓힐 수 있다는 장점을 갖고 있습니다.

즉, 그림 (b)의 경우 7x7 kernel, 그림 ©의 경우 15x15 kernel을 사용할 때보다 단순히 kernel을 팽창시키면서 계산 양을 줄이고, receptive field의 면적은 넓히는 효과를 얻을 수 있습니다.

3. Point-wise Convolution (1x1 convolution)

Point-wise convolution (https://iamaaditya.github.io/2016/03/one-by-one-convolution/)

Point-wise convolution 또는 1x1 convolution 연산은 kernel의 크기가 1x1로 고정되는 convolution 연산입니다. 보통 channel 수, 즉 dimension 축소를 위해 주로 사용되는 연산인데요. k (k > 1) kernel size를 갖는 Convolution 연산을 사용하여 channel 수를 줄이는 것보다 1 kernel size를 갖는 convolution인 point-wise convolution을 사용하면 연산량을 획기적으로 줄일 수 있습니다.

Point-wise convolution는 적은 연산량으로 dimension 축소가 가능하다는 장점도 있지만, convolution 연산 후 relu와 같은 비선형 활성화 함수를 추가하여 nonlinearity를 적용할 수 있다는 장점도 가지고 있습니다. 즉 비선형성을 통해 더 복잡한 task를 위한 네트워크 학습을 가능하게 합니다.

4. Grouped Convolution

2 groups convolution (https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215)

Group convolution은 input channel들을 group화하여 독립적으로 convolution 연산을 진행합니다.

AlexNet에서 병렬 처리를 위해 고안된 방식으로, 기존 Convolution 연산과 다르게 channel들을 group화하여 각 group에 해당하는 filter를 적용하여 convolution 연산을 진행합니다.

위 그림은 group 수가 2일 때를 나타낸 그림인데요. 파란색 input channel의 앞 부분, 즉 첫 그룹은 주황색에 해당하는 filter와 연산하고, 파란색 input channel의 뒷부분인 두 번째 그룹은 빨간색에 해당하는 filter와 연산합니다.

Group convolution은 각 그룹에 높은 correlation을 가지는 channel이 학습될 수 있고, 기본 convolution 연산보다 1/number of group 배의 연산량과 파라미터 개수를 가진다는 장점이 있습니다.

5. Depth-wise Convolution

Depth-wise convolution (https://medium.com/@zurister/depth-wise-convolution-and-depth-wise-separable-convolution-37346565d4ec )

Depthwise convolution은 각 채널만의 spatial feature를 추출하기 위해 고안되었습니다. 각 channel 마다 feature를 추출하기 위해 각 channel 마다 filter가 존재합니다.

개념은 이전에 설명하였던 group conovolution에서 group 수를 input channel 수만큼 설정한 경우와 동일합니다. 따라서 기존의 convolution 연산보다 1/number of channel 배의 적은 연산량과 파라미터 개수를 가지게 됩니다.

6. Depthwise separable convolution (Xception; eXtreme Inception)

Xception은 완벽히 cross-channel correlations와 spatial correlations를 독립적으로 계산하기 위해 inception 모듈을 고찰한 모듈입니다. Xception 모듈은 depthwise separable convolution을 수정하여 Inception 대신 사용합니다.

기존 Depthwise Separable Convolution은 1) Depthwise Convolution 이후에 2) Pointwise Convolution을 수행하는데

  1. Depthwise convolution은 입력 채널에 독립적으로 3x3 conv를 수행하고, 각각 입력값과 동일한 크기 feature map을 생성합니다. 그리고 각 feature map 을 연결하여 채널수만큼의 feature map 을 생성합니다.
  2. Pointwise convolution은 모든 채널에 1x1 conv를 수행하여 채널 수를 조정함으로써 연산량을 줄여줍니다.

수정된 depthwise separiable convolution은 연산의 순서가 다릅니다.

먼저, 1) Pointwise convolution 이후에 2) depthwise convolution을 수행합니다. 입력에 1x1 conv를 먼저 수행하여 채널 수를 조정한 뒤 채널 수는 n (hyperparameter) 개의 segment로 나눠지는데 각각에 대해 depthwise convolution 을 수행한 후 마지막에 concatenation 합니다.

추가적으로 1개의 채널을 사용하는 depthwise separable convolution를 수행할 때는 정보 손실 때문에 마지막에 비선형 함수(e.g. ReLU)를 사용하지 않는 게 효과적이라고 합니다.

7. MobileNet

MobileNet 역시 depthwise separable convolution을 쓰는데, Xception와 다른 점은 Xception은 shortcut이 있고, 1x1 → 3x3 conv를 사용하지만 MobileNet은 3x3 → 1x1 이 순서로 conv block을 구성하고 비선형 함수가 추가되었다는 점입니다.

Xception 과 또 다른 점은 논문에서 width Multiplier와 resolution multiplier 개념을 소개했다는 것입니다.

  1. width multiplier (0≤𝛼≤1) : input 채널 M과 output 채널 N에 𝛼를 곱해서 채널을 줄여준다. 이를 통해 연산량은 𝛼² 만큼 줄여줄 수 있다고 합니다.
  2. resolution multiplier 𝜌 : input의 가로 세로에 곱해줘서 크기를 줄여주는 역할을 합니다.

최종 연산량은 다음과 같습니다:

D_K * D_K : kernel size, D_F * D_F : input

8. Squeeze Net

Squeezenet 은 alexnet보다 50x 적은 파라미터 수로도 비슷한 정확도를 유지한 가벼운 모델입니다. 이러한 작은 모델은 세 가지 장점을 가지고 있습니다.

  1. 연산량이 적기 때문에 학습 속도가 빠릅니다.
  2. 실시간 정보 전달이 가능합니다.
  3. FPGA 임베디드 시스템에 적용이 가능합니다. 즉, 메모리가 제한된 분야에도 딥러닝을 적용할 수 있습니다.
Fire module 은 1x1 conv 으로만 이루어진 squeeze layer와 1x1 와 3x3 conv가 섞인 expand layer로 이루어져 있다. (squeeze layer의 채널수가 expand layer의 채널 수보다 작게 설정하면 b)를 만족할 수 있다.)

Squeezenet 은 8개의 fire module로 구성되어 있는데, fire module은 다음과 같은 전략을 사용하여 탄생되었습니다.

  1. 파라미터 수를 3x3 filter를 1x1 filter로 대체합니다. 1x1 filter는 3x3 filter 연산량보다 9배 적어서 이를 최대한 활용합니다.
  2. 3x3 filter의 conv layer 연산량은 줄이기 위해 입력 채널수를 감소시킵니다.
  3. Pooling layer를 최대한 늦게 배치하여 feature map의 크기가 감소하지 않고 큰 해상도를 가지도록 함으로써 정확도를 높여줍니다.

다른 model compression 기법들과도 비교했을 때 SqueezeNet의 파라미터 수가 가장 적고 AlexNet 보다 성능이 향상되었습니다. 또한 SqueezeNet에 Deep Compression을 적용시켜 더 압축시킬 수 있습니다.

9. Shuffled Grouped Convolution (ShuffleNet)

ShuffleNet은 기본적으로 MobileNet의 구조를 사용하고 grouped convolution을 통해 1x1 convolution을 더 줄여 연산량을 줄입니다. 우선 1x1 conv layer의 채널 일부를 고려한 뒤에 모든 채널을 고려하기 위해 중간중간에 채널들을 섞어(shuffle) 줍니다.

(a) input 이 들어오면 채널을 group으로 나눠주고 각 group마다 convolution을 진행(두번의 group convolution)합니다.

(b) 각 그룹별로 독립적인 학습을 하지 않도록 섞어주는 단계를 진행하는데, 무작위가 아니라 모든 그룹이 한 번씩 포함될 수 있는

(c) channel shuffle 방법을 사용합니다.

(a) Mobilenet에 residual connection을 추가한 형태입니다.

(b) 첫 레이어를 1x1 group convolution으로 바꿔주고 channel shuffle 을 해줍니다. 이때 1x1 group convolution 뒤에만 ReLU를 사용합니다.

(c)는 같은 형태지만 stride=2로 줘서 가로 세로 사이즈를 반으로 줄였다가 residual에서 3x3 average pooling과 concatenation 채널을 원상태로 돌려줍니다.

Conclusion

딥러닝 모델 서비스를 상용화하기 위해서는 최고 수준의 (State-of-the-art) 모델을 그대로 사용하는 것보다 성능을 조금 포기하더라도 모델을 경량화해야 하는 상황을 자주 맞닥뜨립니다. 이미 딥러닝 모델들의 성능이 아주 높은 수준에 달해있기 때문에, 성능을 더 높이는 것보다 가벼운 모델을 개발하는 것이 더 매력적이죠. 그리고 오히려 경량화된 모델이 학습 데이터에 대한 과적합을 개선하여 원치 않는 편향을 줄이는 긍정적 효과를 가져올 때도 많습니다.

저희 KLleon에서도 다대다 얼굴 변환, 비디오 화질 개선, 객체 탐지 및 분할을 실시간으로 하기 위해서 모델 경량화가 필수적입니다. 연산을 빠르고 정확하게 하기 위해서 KLleon에서는 다양한 경량화 방법을 도입하고 있는데요.

대표적으로는 파라미터 수를 줄이기 위해 네트워크 구조를 바꾸거나 가벼운 student model을 학습하여 사용하고 있습니다.

이상 모델 경량화에 대한 이론적인 소개를 마치겠습니다!

다음에도 더 다양하게 딥러닝 이론을 다루는 글로 돌아오겠습니다.

Reference

Menghani, Gaurav. “Efficient deep learning: A survey on making deep learning models smaller, faster, and better.” arXiv preprint arXiv:2106.08962 (2021).

Choudhary, Tejalal, et al. “A comprehensive survey on model compression and acceleration.” Artificial Intelligence Review 53.7 (2020): 5113–5155.

https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215

Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. “Imagenet classification with deep convolutional neural networks.” Advances in neural information processing systems 25 (2012).

Chollet, François. “Xception: Deep learning with depthwise separable convolutions.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.

Howard, Andrew G., et al. “Mobilenets: Efficient convolutional neural networks for mobile vision applications.” arXiv preprint arXiv:1704.04861 (2017).

Zhang, Xiangyu, et al. “Shufflenet: An extremely efficient convolutional neural network for mobile devices.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2018.

Iandola, Forrest N., et al. “SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size.” arXiv preprint arXiv:1602.07360 (2016).

--

--