본문 바로가기
Deep Learning/papers

[딥러닝 모델 경량화] ShuffleNet

by 룰루셩 2020. 8. 8.

[딥러닝 모델 경량화] ShuffleNet

 

안녕하세요! 오늘은 MobileNet에서 조금 발전된 형태의  ShuffleNet에 대해서 알아보도록 하겠습니다.

이번에도 PR12의 발표를 먼저 듣고 논문을 읽고 정리하였습니다!

 


Main Ideas of ShuffleNet

- Depthwise separable convolution

- Grouped convolution

- Channel shuffle

 

우선 ShuffleNet은 MobileNet의 구조를 기본적으로 사용합니다. 1x1 convolution이 거의 모든 연산량과 파라미터를 차지합니다. 이 연산량을 더 줄이기 위해서 1x1 convolution을 더 줄이려는 시도를 합니다. 그것이 바로 grouped convolution입니다. 1x1 convolution layer에서 채널 전체를 다 고려하는 것이 아니라 일부만 고려하고 모든 채널을 다 고려하기 위하여 중간중간에 채널들을 섞어줍니다.

 

이렇게 세가지의 main idea로 사용된 개념들에 대해 먼저 살펴본 후에 모델 구조에 대해서 알아보도록 하겠습니다.

 

Depthwise separable convolution과 Grouped convolution에 대한 설명은 아래를 클릭하시면 보실 수 있습니다.

 

2020/08/01 - [Deep Learning/papers] - [딥러닝 모델 경량화] 다양한 종류의 Convolution

 

 

 

Grouped Convolution & Channel Shuffle

 

그림 1 Grouped Convolution and Channel shuffle

위의 그림은 grouped convolution이 쌓인 것을 나타냅니다. (a)를 보면 input이 들어오면 그것의 채널들을 group으로 나눕니다. 그리고 나누어진 group마다 convolution을 진행하게 됩니다. 그런데 이 경우에는 나누어진 그룹에 해당하는 것만 학습하게 됩니다. 각 그룹별로 독립적인 네트워크를 학습시키는 것처럼 되어버립니다.

그래서 나누어진 그룹을 섞는 것이 필요합니다. 나누어진 그룹을 무작위로 섞는 것이 아니라 모든 그룹이 한번씩 포함할 수 있게 섞이게 됩니다. 그것을 설명해 놓은 그림이 (b)와 (c) 입니다.

 

이를 섞는 것을 파이썬 코드로 표현하면 다음과 같다고 합니다.

def channel_shuffle(name, x, num_groups):
	with tf.variable_scope(name) as scope:
		n, h, w, c = x.shape.as_list()     # n은 batchsize, c는 채널
		x_reshaped = tf.reshape(x, [-1, h, w, num_groups , c//num_groups])
		x_transposed = tf.transpose(x_reshaped, [0, 1, 2, 4, 3])
		output = tf.reshape(x_transposed, [-1, h, w, c])
		return output

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

 

 

ShuffleNet Units

그림 2 ShuffleNet units

먼저 (a)는 MobileNet에 residual connection을 추가한 형태라고 생각하면 좋습니다. Grouped convolution도 channel shuffle도 없습니다. 

(b)는 (a)의 첫번째 레이어를 1x1 Grouped convolution으로 바꿔주고 channel shuffle을 해줍니다. 그리고 이때 첫 레이어 뒤에만 ReLU를 사용하고 그 뒤의 3x3 DWconv에서는 사용하지 않습니다. 

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

 

 

Complexity

 

그림 3 은 이해하기 쉽게 표현이 되어있어서 PR12 발표에서 가져왔습니다.

 

그림 3 Complexity

다른 모델들과 비교했을때 SuffleNet의 계산량이 매우 작다는 것을 알 수 있습니다.

 

 

Architecture

그림 4 ShuffleNet Architecture

여기서 각 stage에서 Stride 2 라고 되어있는 건 SuffleNet unit (c)를 사용한 것이라고 보면 될 것입니다.

그리고 표 오른쪽에 Output channels 라고 되어있는 건 전체 계산 비용이 거의 변하지 않도록 출력 채널을 정해놓은 것입니다. 보면 그룹수가 많을수록 복잡성 제약에 대해 더 많은 출력 채널(convolutional filter)가 발생합니다. 즉, group을 많이 나누어서 연산량을 줄인만큼 출력 채널(convolutional filter) 수를 늘려줘서 일정한 complexity로 맞춰줍니다.

 

그림 5 classification error vs. number of groups g

ShuffleNet 뒤의 1x, 0.5x 는 채널(filter) 수를 scaling 해준 것입니다. 그래서 숫자가 작아질수록 채널 수가 적은 모델이 되는 것입니다. 복잡도도 낮아지고요! 그룹이 많을수록 성능이 좋아지는 것을 알 수 있습니다. 

그리고 더 작은 모델일수록 group에 따른 성능의 변화가 큽니다. 이는 작은 모델일수록 channel이 중요한 역할을 한다는 것을 뜻합니다.

 


 

이것으로  ShuffleNet에 대한 설명을 마치겠습니다.

제가 소개한 논문의 뒷부분에는 다양한 Experiment가 있지만 생략하도록 하겠습니다.

논문을 참고해주세요~

depth의 조건을 똑같이 해놓고 MobileNet과 비교, 다른 모델들(VGG, GoogLeNet, AlxNet, SqueezeNet) 과의 비교, 다른 task (object detection) 에 적용하는 등의 Experiment가 있습니다.

 

참고

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

[2] PR-054: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

[3] https://hichoe95.tistory.com/54?category=783893

 

댓글