Intro
CNN 에서의 연산량을 줄이기 위에서, Depthwise / Pointwise 를 이용한 Convoultion 기법이 나왔습니다.
바로, Depthwise Separable Convolution - A FASTER CONVOLUTION! 입니다 :)
mobile net v1에서 사용되었다고 전해집니다. (2017)
실제 구현을 위해서는 이런 Triky 한 기법이 필요하다고 생각합니다.
모든 자료는 다음 동영상을 참고합니다.
기존의 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 라고 생각되네요. :)
'HW Engineer 가 이야기하는 AI > 01 설계에 필요한 AI 지식' 카테고리의 다른 글
CNN (Convolution Neural Network) 연산에 대해 이해해보자. (CNN Explainer) (0) | 2021.02.16 |
---|---|
Grouped Convolution, Dilated Convolution (0) | 2020.12.13 |
Meaning of Keyword for AI (0) | 2020.12.12 |