HW Engineer 가 이야기하는 AI/01 설계에 필요한 AI 지식

[MobileNet v1] depthwise separable convolution (DW, PW)

반응형

Intro

CNN 에서의 연산량을 줄이기 위에서, Depthwise / Pointwise 를 이용한 Convoultion 기법이 나왔습니다.

바로, Depthwise Separable Convolution - A FASTER CONVOLUTION! 입니다 :)

mobile net v1에서 사용되었다고 전해집니다. (2017)

실제 구현을 위해서는 이런 Triky 한 기법이 필요하다고 생각합니다.

모든 자료는 다음 동영상을 참고합니다. 

https://youtu.be/T7o3xvJLuHk

기존의 Convolution 연산

기존 Convolution 은 다음과 같습니다.

그림이 복잡한데,

여기서, 수식으로 보면 simple 합니다.

Dk * Dk * M(#in_Channel) * N (#out_Channel) * DF * DF (input size) * DG * DG (output size)

즉, Convoultion 은 다음과 같은 parameter에 의해서, 연산량이 결정됩니다.

- in / out size (DF * DF, DG * DG)

- kenel size (Dk * Dk)

- # in / out channel (# 은 편의상 개수로 표현합니다.)

여기서, Mult 연산은 당연히, Add 연산보다 복잡합니다.

Mult 수를 줄이면서, Convolution 의 느낌? 은 살리는 그런 방법이 소개가 되었고,

그것이 바로 Depthwise Separable Convolution 입니다.

Depthwise Convolution

Depthwise Convolution 는 다음과 같습니다.

동일 channel 내에서만, Convolution 을 하게 됩니다. (Channel 사이는 independent 합니다.)

즉, #in_Channel == #out_Channel 의 관계가 성립되어야 합니다.

Out_channel 개수만큼 Kernel 이 생성됩니다. 그리고, Channel 간의 Dependency 가 없습니다. 그렇기 때문에, #in_channel 를 삭제할 수 있습니다.

Dk * Dk * M(#in_Channel) * N (#out_Channel) * DF * DF (input size) * DG * DG (output size)

Pointwise Convolution

Pointwise Convolution 는 다음과 같습니다.

channel 간에서만, 1x1 convolution 을 하게 됩니다.

이는 channel 의 수를 조절할 수 있는 특징이 있습니다. ( out channel 증가 / 감소 / 유지)

다음과 같이, kernel size 가 1x1 이 되기 때문에, 연산량이 감소합니다.

1 * 1 * M(#in_Channel) * N (#out_Channel) * DF * DF (input size) * DG * DG (output size)

Depthwise Separable Convolution

DC (Depthwise Convolution) + PC (Pointwise Convolution) 를 혼합해서 사용하여,

기존의 Convolution 연산을 대체하게 됩니다.

이 혼합 방법을 Depthwise Separable Convolution 이라고 부립니다.

다시 정리하면 , 기존 Convolution 연산 (1 Layer) -> DC (1 layer) + PC (1 layer) 로 대체합니다.

이렇게 하면 연산량이 줄어듭니다!! 하지만, 기존의 Convoltuion 보다 정확도 측면에서는 떨어지겠죠.

(Trade Off)

input size (DF * DF) 에 대한 내용은 배제합니다. (공통입니다.)

이제, 기존 Convolution 대비, Depthwise Separable Convolution 의 연산량을 비교하는 수식입니다.

N (# out_channel) 과, Dk * Dk ( kernel size) 만큼의 연산량 이득을 볼 수 있음을 확인할 수 있습니다.

위 N , Dk 의 예제로 보면, 약 89% 정도의 연산량 이득을 취했음을 확인할 수 있습니다.

적용 결과

여러 Application 이 동영상에서 소개되는데, 이중 3. MobileNet 결과가 인상적입니다.

정확도는 1% 정도 줄이지만, 필요한 Mult-Adds 수는 거의 90% 가까이 감소되었습니다.

결론은 다음과 같습니다.

마무리

논문을 보면, Network 에 기존 Conv 와 Depthwise Separable Convolution 을 혼용해서 사용하는 Network 가 대세인 것 같습니다. 그리고 Skip Network 도 빈번하게 보이구요. Skip Network 를 사용하려면, Sync 를 맞추기 위한 Memory 가 사용됩니다. 무조건 좋은건 아니죠.

어떻게 실생활에 적용할 수 있는 Network 를 만들 것인가가 문제인 것 같습니다. Network 많이 깔면 좋은건? 알고있죠. 이제는 어떻게 HW 로 잘/빠르게 만들어 낼거냐가 issue 라고 생각되네요. :)

반응형