반응형

XNOR-Net은 2016년에 출시된 논문으로 가중치 양자화에 대한 컨셉에 대해서 소개를 하는 논문이다. 이전에 소개했던 DoReFa-Net보다도 앞서 발표되었으며, 이후 QAT(Quantization Aware Training)계열의 양자화 기법에 개념적 부분으로 많이 사용되고 있다. 논문에서는 가중치를 1-Bit 양자화하는 BWN(Binary-Weight-Net)과 가중치와 활성화출력 두가지를 모두 1-Bit 양자화하는 XNOR-Net 두가지를 모두 소개하고 있다.

 

양자화를 시작해보자

 

Binary Weigth Network

이전 Feature Map에서 나온 입력값을 $I$라고 하고, 양자화 되기 전 Conv Layer를 $W$라 하자. 다음으로 가중치에 대하여 이진화된 Conv Layer를 $B$ 라고 해보자. 이진화에 사용되는 함수는 $Sign(x)$를 사용한다. 기존의 컨볼루션 연산은 $I \ast W$가 될것이며, 이진화된 가중치와 연산을 하게 되면 $I \ast B$가 되게 된다. 하지만 $I \ast W \neq I \ast B$가 아니다. 그래서 특정 Scaling Factor $\alpha$를 도입하면 아래와 같이 좌변과 우변의 값이 근사할 수 있을것이다.

 

$$
I \ast W \approx (I \oplus B)\alpha
$$

 

$\oplus$기호는 $B$는 이미 이진화가 된 값이기 때문에 Input과 곱하기 연산을 할 필요가 없는 컨볼루션 연산기호로 정의한다. 위 산식으로 부터 $W-\alpha B$의 차이가 양자화 오류라는것을 알 수 있을것이다. 이제 이 오류를 최소화 하는 지점의 $\alpha$를 찾기만 하면된다. 최소제곱법을 통해서 $\alpha$의 최적값을 추정해보면 가중치 절대값의 평균이 된다고 한다.

 

$$
\alpha^{*} = \frac{W^{T}sign(W)}{n} = \frac{\sum |W_{i}|}{n} = E(|W_{i}|)
$$

 

가중치의 업데이트는 양자화 되기 전 가중치인 $W$에 대해서 업데이트를 하게 된다. 따라서 앞쪽 레이어로부터 역전파된 $W$의 기울기를 알아야 한다. 하지만 순전파는 양자화가 된 상태이기 때문에 $B$의 기울기를 알게되는 셈이다. 즉, $B$와 $W$의 관계에 대해서 한번 더 전개를 해야한다.

 

$$
W^{t+1} = W^{t} - \eta \frac{\partial C}{\partial W^{t}} \
\frac{\partial C}{\partial W^{t}} = \frac{\partial C}{\partial \tilde W} \frac{\partial \tilde W}{\partial W^{t}} \
\frac{\partial \tilde W}{\partial W^{t}} = \frac{1}{n} + \frac{\partial sign(W_{i})}{\partial W_{i}}\alpha
$$

 

여기서 $\frac{\partial \tilde W}{\partial W^{t}}$는 $\frac{\partial \alpha B}{\partial W^{t}}$라고 할 수 있고, $\alpha B$에 대해서 미분을 진행하면 위와 같은 식을 얻을 수 있다. 아래는 순전파, 역전파 그리고 가중치 업데이트에 대한 순서를 적어둔 표이다.

 

 

XNOR_Network

BWN에서는 가중치만 양자화를 진행하였다면 여기서는 이전 Layer로 부터 받은 FeatureMap에 대해서도 양자화를 진행한다. 방법은 가중치를 양자화한 방법과 똑같이 진행이 된다. 여기에서 $\odot$은 Bit-Wise Operation을 의미한다.

 

$$
\alpha^{*} = \frac{W^{T}sign(W)}{n} = \frac{\sum \vert W_{i} \vert}{n} = E(\vert W_{i}\vert)
$$

 

논문의 저자는 여기서 연산에 대한 비효율성을 하나 발견하게 된다. 위 그림에서 (2)를 보면, Conv Layer가 설정된 Stride만큼 이동하면서 연산이 되는 영역을 각각 $X_{1}, X_{2}, ...$로 둔다. 연산이 되는 영역마다 양자화를 진행해주게 되므로, 양자화된 $H_{1}, H_{2}, ...$와 더불어 Scale Factor인 $\beta_{1}, \beta_{2}, ...$를 얻을 수 있다. 그런데 이 방법은 중간에 윈도우가 중첩되는 영역에서 양자화를 반복진행한다는 비효율을 발견한 것이다.

 

이것을 해결하기 위해 (3)과 같이 입력 FeatureMap에 대해서 양자화를 진행한후 모든 값을 더하여 채널갯수만큼 나누어 준다($\frac{\sum|I_{:,:,i}|}{c}$). 이렇게 만들어진 FeatureMap을 $A$라고 한 후, Conv Layer의 width, height의 크기를 가진 filter $k$를 만들어준다. $k$가 가지는 값을 $\frac{1}{w \times h}$로 설정하게되면, $A \ast k = K$로 표현할 수 있다. $K$는 중복되지 않은 연산을 하기위한 $\beta$의 또다른 표현이다. 이제 최종적으로 (4)와 같이 계산을 해주면 된다. $\circledast$는 XNOR Bitcount Operation을 의미하며, $\odot$은 행렬의 내적을 의미한다.

 

$$
I*W \approx (sign(I) \circledast sign(W)) \odot K\alpha
$$

 

XNOR-Net의 의미는 여기서부터 유래했다. 맨 위의 그림에서 보듯이 컨볼루션 연산은 +, x 로 이루어져 있는반면, Feature Map과 Conv Layer가 모두 이진 양자화 되어있기 때문에 XNOR 연산을 한다는 뜻이기 때문이다. 저자가 주장하기를 양자화하기 전 컨볼루션 연산대비 약 58배 가량 속도개선이 있었다고 한다.

 

학습을 진행할때는 이것뿐만 아니라 Block 내부의 Layer순서에 따라 매우 결과가 다르게 나타난다고 한다. 위 그림의 왼쪽처럼 일반적인 CNN구조에 XNOR-Net을 적용하게되면, Activation을 거쳐 나온 FeatureMap을 양자화 진행한 후 Max-Pooling을 하는 형태가 된다. 이러한 구조는 상당히 많은 정보의 손실을 초래하게 된다. 그래서 저자는 이러한 정보손실을 최소화 하고자 Conv Layer를 Pooling Layer 앞으로 배치하였다고 한다.

 

Layer 순서에 따라 정보손실률이 다르다

 

Result

실험은 BWN, XNOR-Net을 적용한 AlexNet 모델과 ResNet모델 2가지로 ImageNet 데이터셋으로 실험을 진행하였다. 메모리 사용량과 속도적인 측면에서 FP32에 비해서 약 80배정도 메모리 사용량을 절감하는 효과를 가져왔다고 한다. 속도개선에 대해서는 채널수, Conv Layer의 크기에 따라서 실험을 진행했을때 약 58x 속도 향상이 있었다고 한다. BWN와 XNOR-Net과의 비교는 없어서 아쉬운 부분이 있다.

 

 

아래 그림의 파란색선을 살펴보면 XNOR-Net의 결과보다는 BWN의 결과가 더 좋은것을 알 수 있다. 해당 XNOR-Net은 FeatureMap에 대해서도 양자화를 진행하기 때문에 양자화 오류가 더 발생해서 생긴 정확도 손실임을 알 수 있다. 메모리 사용량이 얼마만큼 절감되는지는 체크를 해보아야겠으나, 개인적인 생각으로는 BWN 대비 XNOR-Net의 정확도 손실률이 너무 크다고 보여진다.

 

 

XNOR-Net에서 Block구조에 따라서도 실험을 진행하였을때, Conv Layer가 처음있던경우에는 Top-1 30.3%, 3번째로 옮긴경우 44.2%로 매우 큰 차이를 보였다. 양자화오류를 고려한 네트워크 설계가 중요하다는것을 보여주는 사례이다.

 

 

Conclusion

1-Bit 양자화는 양자화 오류가 상당하기 때문에 연구적인 성격으로만 남아있으며 실사용으로는 거의 사용되지 않는 추세이다. 실사용을 위한 양자화는 경량화 대비 정확도 손실이 가장적은 8-Bit 양자화가 대세를 이뤄나가고 있다. 하지만 1-Bit 양자화의 연구는 지속적으로 이어지고 있으며 XNOR-Net은 그 연구의 시작점에 있기에 꼭 알아두도록 하자.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기