공돌이 공룡의 서재

[논문 리뷰] XNOR - Net : classification using Binary CNN 본문

딥러닝

[논문 리뷰] XNOR - Net : classification using Binary CNN

구름위의공룡 2021. 9. 14. 22:51

XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks

https://arxiv.org/pdf/1603.05279.pdf

 

Quantization의 아버지 격 되는 논문이다. 인용수가 3천을 넘어간다. 아이디어 자체는 간단해서 수식적인 부분 외에는 수월하게 읽혔다.


<1.> Introduction

CNN 기반 모델들은 memory나 computational power가 많이 필요하다. 빠른 속도를 내려면 GPU 가 필요하기도 하고, 핸드폰이나 임베디드 전자 제품 같은 작은 기기들에는 적합하지 않다. 논문에서는 이에 대한 예시로 AlexNet과 VGG의 parameter 수와 메모리 크기를 설명하고 있다.

 

이 논문에서는 이에 대한 해결책으로 weight나 input을 binary하게 나타냄으로써 간단하고 효율적이면서도, 정확도를 어느 정도 유지할 수 있는 방법을 제시한다.

 

크게 두 가지 방법이 있는데 첫 번째는 layer들의 input을 binary로 나타내는 것이다. 기존 방법보다 크기가 32배 더 작고, 속도도 2배 더 빠르다. 두 번째 방법이 이제 논문 제목과 같은 XNOR-Net이다. weight와 input 둘 다 binary value로 approximate 하는 방법이다. convolution 연산 전체가 binary 하게 이뤄지므로, XNOR 연산과 bitcounting operation으로 처리가 된다. 이렇게 구성함으로써 CPU만으로도 58배 빠른 속도를 낼 수 있다.

 


<2.> Binary Convolution Neural Network

 

이후에 나올 Notation에 대해 정의하고 넘어간다.

  • I : input tensor
  • W : filter의 weight tensor
  • K : weight filter의 수

[Binary-Weight-Network]

실제 값 weight filter W를 binary filter B (값이 1과 -1로 구성됨.) 와 scaling factor 2개를 이용해서 근사한다.

여기서 $$ \oplus $$ 는 곱셉없이 이뤄지는 convolution를 의미한다. 곱셈 없이 덧셈과 뺏세요으로 만 이뤄지게 된다는 것은 B가 +1과 -1로만 이뤄져 있어서, input value들을 더하고 빼는 것과 같다는 의미다. 이렇게 사용했을 경우 메모리 사용이 32배 줄었다.

 

 

Estimating binary weights

Binary weight를 추론하는 과정은 다음의 식을 최소화하는 문제랑 같다.

여기서 J안에 있는 식을 간략하게 풀어서 쓰면, $$ W^TB $$ 를 최대화하는 식과 같다. 이 때 B는 W의 값이 양수면 +1, 음수면 -1을 갖는 방식으로 풀리고, 따라서 $$ B= sign(W) $$ 가 최적의 solution이라 한다.

 

scaling factor를 찾는 방법은 위에서 구한 solution을 J에 대한 식에 넣고 이 factor에 대해 미분했을 때 결과로 나오는 값인데, 추가적인 전개를 거치면 weight value의 절댓값 평균과 같게 된다.

 

 

Training Binary-Weights-Networks

모델 학습은 각 iteration마다 forward, backward, parameter update로 이뤄지는데, binary weight를 얻기 위해선 forward와 backward할때만 weight를 binary로 만든다. 학습률이나 weight 값들을 고려했을 때 매 iteration마다 변화의 값 자체는 작은데 update 또한 binary 하게 한다면 잘 안 이뤄지기 때문이다. 알고리즘은 다음과 같다.

 

실제 inference할 때는 학습이 끝난 모델의 weight를 binarize 된 값을 사용하면 된다.

 


[XNOR-Net]

 

Convolution operation을 shift 와 dot-product(element-wise operation)의 반복으로 정의하고 있다. filter가 stride 하면서 어떤 위치에 filter가 있을 때 filter 안에 들어오는 input의 값들과 각각 곱하기 때문이다. 여기서 input과 weight 값 둘 다 binary 하다면, XNOR-Bitcounting operation으로 구현할 수 있게 되는 것이다.

 

앞에서 보았던 식에서 input에 대한 것을 바꿔서, binarized 된 input을 H라 두고, 다음의 식을 최소화하는 문제를 푸는 상황이 된다.

sign 함수에 대한 여러 수식이 있는데, 어쨌든 결과적으로 input 또한 weight를 binarize 할 때와 같이, $$ sign(X) $$ 라는 결론이 나오게 된다.

 

그림으로 간단하게 보면 위와 같다.

 

K 라는 matrix가 있는데, sub-tensor (그림에서 예시로 X1, X2를 들음)에 대한 계산이 겹치는 부분들 때문에 불필요한 계산들이 많아지는 것을 해결하기 위해 도입된 값이다.

 

Training XNOR-network

 

이 당시 주로 사용했던 CNN block에서는 batch normalization을 convolution layer를 통과시키고 나서 사용했는데, XNOR-net에서는 정보 손실을 줄이기 위해 순서를 맨 앞으로 옮겼다.

 

BinActiv는 binary activation layer로, weight value를 +1 또는 -1로 바꿔주는 과정과 K를 구하는 과정에 해당한다. BinConv는 이들을 사용해서 convolution 하는 과정이다. block에는 없지만 ReLU 같은 nonlinear activation function을 Pooling전에 넣어줄 수 있다.

 

Binary Gradient

forward pass에서와 비슷하게, input에 대한 gradient를 binarize할 수 있다는 아이디어다. 학습 과정을 굉장히 효율적으로 만들 수 있다.

 

 


<3.> Experiment

 

VGG, ResNet, AlexNet에 적용했을 때 결과다. CPU로 사용했음에도 엄청 빠른 속도를 보여주고 있음을 알 수 있다.

위 사진은 정확도에 대한 비교다. 속도와 정확도의 trade-off가 있음을 알 수 있다. Quantization에 대한 최신 논문은 이보다 더 좋은 결과를 보이지 않을까 기대해본다.

 

다음은 ablation study 중 다음 내용이다.

기존 CNN block과 구성이 달라진 점에 대해 실험을 통한 근거를 제시하고 있다.

Comments