반응형

Update (2021.09.03): Github에 코드를 구현.

 

DoReFa-Net에서는 가중치, 활성화출력, 기울기를 양자화하는 기법을 소개한다. XOR-Net, BWN(Binary Weight Network) 는 가중치와 활성화출력을 양자화의 대상으로 삼았는데, 해당 논문은 기울기까지 양자화를 시도하게 된다.

 

기울기에 대해서는 양자화를 시도한 케이스가 없었는데, 그 이유는 기울기의 분포가 일정하지 않기때문이며 양자화 오류로 인하여 역전파를 할때 수렴하지 못하는 케이스가 발생할 수 있기 때문이다. 그래서 DoReFa-Net에서는 특별한 형태의 STE를 제안하여 이 문제를 해결했다고 주장한다.

 

STE(Straight-Through Estimator)

DoReFa-Net에서는 STE를 k-bit로 양자화 하기위해 ($Quantize_{k}$) 아래와 같이 정의하였다고 한다.

 

$$
Forward: r_{o} = \frac{1}{2^{k}-1}round((2^{k}-1)r_{i})\\
Backward: \frac{\partial c}{\partial r_{i}} = \frac{\partial c}{\partial r_{o}}\\
$$

 

이때 입력으로 받은 $r_{i}$는 [0, 1] 사이의 실수이고 $r_{o}$는 k-bit로 양자화된 [0, 1] 사이의 실수로 표현된다.

 

Weight Quantization

DoReFa-Net에서 사용하는 STE를 알아보았으니 이제 가중치부터 양자화를 진행을 시작해보도록 하자.

 

1-bit 양자화를 하기 위해 도입한 STE는 순전파를 진행할때 XOR, BWN과 마찬가지로 Sign 함수를 사용하고 역전파를 진행할때 Hard tanh의 도함수를 이용하였다.

 

$$
Forward: r_{o} = sign(r_{i}) \times E(|r_{i}|)\\
Backward: \frac{\partial c}{\partial r_{i}} = \frac{\partial c}{\partial r_{o}}\\
$$

 

Sign함수 뒤에 입력값들에 대하여 기대값을 곱하는 부분이 있다. 이것은 Scale Factor라고 부른다. 해당 인자를 곱함으로써 얻게되는 이점이 무엇인지는 XOR-Net에서 좀더 자세히 다루도록 하겠다.

 

2-bit 이상일때에는 아래와 같이 STE를 적용하였다.

 

$$
Forward: r_{o} = f^{k}{w}(r{i}) = 2quantize_{k}(\frac{tanh(r_{i})}{2max(|tanh(r_{i})|)} + \frac{1}{2}) - 1\\
Backward: \frac{\partial c}{\partial r_{i}} = \frac{\partial r_{o}}{\partial r_{i}}\frac{\partial c}{\partial r_{o}}\\
$$

 

여기서 $quantize_{k}$는 DoReFa-Net에서 정의된 STE를 뜻한다. 2-bit 이상일때는 tanh와 합성함수 형태로 존재하기 때문에 미분을 할때 Chain-Rule에 의해서 합성곱 형태로 나타나게 되는 특징이 있다.

 

$quantize_{k}$를 통해 양자화된 값은 [0,1] 사이의 값을 가지게 되는데, 2를 곱하고 1을 빼주는 행위를 함으로써(Affine transform) $r_{o}$의 범위를 [-1,1] 사이로 변환시키게 된다.

 

Activation Quantization

일반적으로 CNN에서는 이전 활성화 계층에서 나온 출력값을 Conv Layer와 연산하는 방식으로 진행된다. 때문에 Conv 연산을 최소화 시키기위해 활성화 출력을 양자화 하는것은 필수적이다.

 

$$
f^{k}{\alpha}(r) = quantize{k}(r)
$$

 

XOR-Net에서는 1-bit의 양자화를 진행하였는데, AlexNet 모델로 ImageNet에 적용하였을때 저조한 성능을 보였다고 한다. 그래서 활성화 출력에 대해서는 2-bit 이상의 양자화만 고려하였다.

 

Gradients Quantization

위에서도 말했듯이 기울기를 양자화 하는것은 꽤 신중한 작업이다. 그래서 가중치나 활성화출력을 양자화 하는것처럼 결정론적(Deterministic) 양자화를 진행하지 않고 확률적(Stochasic) 양자화를 진행한다. 확률적 양자화를 적용하기위해 노이즈 함수인 $N(k)=\frac{\sigma}{2^{k}-1}$을 적용한다. 이때 $\sigma$는 균일분포(-0.5, 0.5)를 따르는 확률분포로 정의한다.

 

또한 가중치를 양자화 할때 사용한 STE와 유사한 형태를 지닌 STE를 사용하게 된다.

 

$$
Forward: r_{o} = r_{i}\\
Backward: \frac{\partial c}{\partial r_{i}} = f^{k}{\gamma}(\frac{\partial c}{\partial r{o}})\\
f^{k}_{\gamma}(dr) = 2max_{0}(|dr|)\left[quantize_{k}[\frac{dr}{2max_{0}(|dr|)} + \frac{1}{2} + N(k)] - \frac{1}{2}\right]\\
$$

 

Algorithm for DoReFa-Net

 

순전파, 역전파, 업데이트의 알고리즘

 

수식이 즐비하여 어려워보여도 차근차근 이해해보면 큰 부담은 없다. 우선 순전파를 진행하는 순서는 다음과 같다.

 

  1. 초기화된 가중치를 양자화 진행한다.
  2. 이전 Layer로부터 양자화된 출력값을 양자화된 가중치와 순전파를 진행한다.
  3. ReLu와 같은 활성함수를 통과시켜준다.
  4. 활성함수를 통과한 FeaturMap을 양자화 시켜준다.

 

순전파가 끝났으니 이제 역전파를 진행한다.

 

 

  1. 목적함수로부터 미분된 값을 양자화 진행한다.
  2. 양자화된 미분값을 통해 역전파될 입력값의 미분값을 구해준다.
  3. 양자화된 미분값을 통해 역전파될 가중치의 미분값을 구해준다.

 

역전파를 통해 획득한 2개의 값중 입력값의 미분값은 앞쪽 계층의 기울기가 되어 다시 1번을 수행하게 된다. 그리고 가중치의 미분값은 기존 양자화가 되기 전 가중치를 업데이트를 하게 된다.

 

 

  1. $W^{t+1}{k} = W^{t}{k} - \eta * g_{W^{b}{k}} * \frac{\partial W^{b}{k}}{\partial W_{k}}$

 

위 알고리즘을 순서대로 적용하게 되면 가중치, 활성화출력, 기울기에 대한 모든값에 대해서 양자화가 진행되어 연산이 이루어진다.

 

First and Last Layer

양자화를 할때 첫번째와 Layer는 조금 곤란한 부분이 있다. 해당 Layer는 입력을 uint8 타입인 이미지가 들어오게 된다. 가장 많은 정보를 가지고 있는 이미지를 바로 양자화를 하기에는 상식적으로도 합리적이지 않아보인다. 또한, 신경망의 모든 계층을 통틀어서 첫번째 Layer는 가장 적은 채널로 구성되어있다.

 

논문에서도 실험을 진행하였는데, 첫번째 Layer에서 양자화를 진행할 경우 정확도가 상당히 손실되었다고 하였다.

마찬가지로 마지막 Layer에 대해서도 양자화를 진행하지 않았다고 한다. Class 갯수가 적은경우에 잠재적인 예측정확도 저하가 우려되었기 때문이라고 한다.

 

Result

논문에서는 AlexNet 모델을 이용하여 ImageNet과 SVHN 데이터셋으로 실험을 진행하였다.

 

(좌) SVHN 데이터셋 결과, (우) ImageNet 데이터셋 결과

 

저자에 따르면 정확도 대비 추론복잡도를 고려하였을때 (W,A,G)=(1,2,6)이 가장 효율적인 양자화 Bit라고 말하고 있다. DoReFa-Net의 어원이 여기서 시작되었다. (1,2,6)을 음계로 치환하였을때 도,레,파 가 되기 때문이라고 한다.

 

Conclusion

2021년 1월 기준 인용지수가 약 900회 정도로 나름 괜찮은 논문이다. 사실 이전에 XOR-Net이라는 내용이 있기는 하지만 DoReFa-Net이 해당 내용을 커버하고 있으면서 양자화의 컨셉이 잘 설명되있어 배경지식을 쌓기위한 진입점으로 딱 좋다고 생각한다.

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