Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

ShuyaVision

[Quantization] A Survey of Quantization Methods for EfficientNeural Network Inference 정리 (Basic Quantization) 본문

plusAlpha

[Quantization] A Survey of Quantization Methods for EfficientNeural Network Inference 정리 (Basic Quantization)

Sangbro 2023. 8. 15. 00:55

Section A에서는, common notations 과 problem setup에 대해서 소개하고, B ~ F에서는 basic quantization concepts과 methods를 소개한다. 그리고 G에서는 fine-tuning methods를 소개하고, H에서는 stochastic quantization을 소개한다.

 

A. Problem Setup and Notations

 

신경망은 학습 가능한 매개변수를 갖는 L개의 층으로 구성되어 있다고 가정한다. 이러한 매개변수는 {W1, W2, ..., WL}으로 표시하며, θ는 이러한 모든 매개변수의 조합을 나타낸다.

L(θ) = 1/N ∑ Loss(xi, yi; θ)

여기서 (x, y)는 input data와 해당 레이블을 나타내며, Loss()는 손실 함수(MSE, CE) 등을 나타낸다. N은 전체 데이터 포인트 수이다. i번째 층의 입력 hidden activations은 hi라고 하고, 출력 hidden activations는 ai라고 한다.

Quantization에서는 매개변수 (θ)와 hi와 ai를 low-precision, 즉 값의 표현력을 낮추면서도, 모델의 성능에 미치는 영향은 가장 적도록 하는 것이 목표이다. 이를 위해서는 floating point를 quantized one으로 매핑할 수 있는 quantization 연산자를 정의해야 한다.

 

B. Uniform Quantization

일반적으로 Uniform Quantization을 하기 위해 선택되는 수식은 위와 같다.

여기서 Q는 quantization 연산자, r은 실수 입력값(활성화 또는 가중치), S는 실수 스케일링 인자, Z는 정수 제로 포인트이다. Int() 함수는 실수를 반올림 연산 (절삭할 수도 있음, 정의에 따라)을 통해 정수로 매핑한다. 이 함수는 본질적으로 실수 값 r을 정수로 매핑하는 것이다. 이 방법은 결과로 도출되는 양자화 들값이 균일하게 간격을 두고 있기 때문에 Uniform Quantization이라고 불린다.

 

C. Symmetric and Asymmetric Quantization

 

이 부분에서는 먼저, S 즉 scaling factor의 중요성에 대해서 강조한다. S는 주어진 실수 값의 범위 r을 여러 개의 파티션으로 나누는 역할을 한다.

여기서 [α, β]는 cliping 범위를 나타내며, 이는 실제 값이 cliping되는 경계 범위이고, b는 양자화 비트의 너비이다. 따라서 S, 스케일링 팩터를 정의하기 위해서는 먼저 [α, β]가 정의되어야 한다. 이러한 cliping 범위를 선택하는 과정을 calibration이라고 부른다.

[α, β]를 선택함에 있어서 가장 간단한 방법은 signal의 min/max를 선택하는 것이다. 이러한 접근 방법을 aysmmetric quantization이라고 부르며, 이 방식은 원점을 대칭으로 이루어지지 않을 가능성이 크기 때문에, 비대칭적이다. 이는 Figure 2의 오른쪽 그림의 경우이다. symmetric quantization은 -α == β로 만드는 방법이다. 일반적으로  max(-α, β)의 값을 활용하는 경우가 많다.

Asymmetric quantization은 symmetric quantization에 비해서 cliping 범위가 좁은 경우가 많다. 이는 ReLU와 같은 활성화 함수를 만나 ai(output activation values)들이 모두 non-negative가 되어 quantization을 해야하는 target 값들이 imbalance한 경우에 해당한다. 또한 Asymmetric quantization에서는 quantization 과정에서 생긴 차이가 offset 또는 zero point로 존재하게 되는데, 이러한 값들은 "static data independent term"으로 남아, 신경망에서 흔히 bias라 부르는 값에 흡수되거나, 다음 계산의 초기값으로 사용될 수 있다. 이로 인해 신경망의 성능을 유지할 수 있다.

한편 Symmetric quantization을 사용하면 첫번째 식에서 Z를 0으로 만들어서 quantization 함수를 간소화 할 수 있다. 이 때문에 가중치를 quantization하는 데 있어서 널리 채택되고 있다. 또한 zero point를 제거함으로써 추론 중에 계산 비용 또한 줄일 수 있으며 구현 또한 간단하게 할 수 있다.

그래서, S 즉 scaling factor를 결정함에 있어서 2가지 방법이 있는 것이다. [-127, 127]을 사용함으로써 Z를 0으로 만들어 quantization 연산을 단순하게 만들 수 있지만, INT8 값을 최대한 활용하기 위해 [-128, 127]으로 하는 것이 정확도 향상에는 더 좋다.

 

Symmetric과 Asymmetric 방법 모두 아주 유명한 방법이지만, 데이터에 이상치가 있는 경우에 취약하다. 이 이상치들은 필요 이상으로 범위를 증가시키고, 결과적으로 quantization의 resolution을 줄일 수 있다. 이를 해결하는 한가지 방법은 신호의 max/min 값을 사용하는 대신 백분위 수를 사용하는 것이다. 말하자면, largest/smallest -> i-th largest / i-th smallest 값을 사용하는 것이다. 또다른 방법으로는 α, β를 선택할 때, real value와 quantized value 사이의 KL divergence를 최소화하는 값, 즉 두 값들의 분포가 가장 비슷하게 하는 값을 선택하는 것이다.

 

D. Range Calibration Algorithms: Static vs Dynamic Quantization

위에서는 [α, β]의 cliping 범위를 결정하는 calibration 방법에 대해 논의했다. Quantization 방법을 구분하는 또 다른 중요한 요소는, cliping 범위가 언제 결정되는 지이다.

Dynamic Quantization은 runtime 동안 각 activation map에 대해 동적으로 계산된다. 각 input에 대해 cliping 범위를 맞추어 계산하다보니, 정확도가 높을 수 있다. 하지만, 이 방법은 real-time으로 signal을 계산해야하므로 매우 높은 overhead를 가질 수 있어 선호되지 않는다.

 

이에 비해 Static Quantization은 cliping range를 선 계산하고, inference 때에는 고정 값으로 둔다. 이 방법은 다른 computational overhead를 가지지는 않지만 일반적으로 dynamic quantization에 비해 낮은 정확도를 가진다. 선 계산을 할 때, 이 범위를 학습 parameter로 하는 방법도 존재하고 보통 MSE loss function을 통해 가장 낮은 괴리율을 가지도록 하는 방법을 많이 사용한다.

 

E. Quantization Granularity

Figure 3에서 볼 수 있듯, computer vision tasks에서는 layer에 들어가는 activation input은 아주 다양한 convolutional filter들을 거치게 된다. 각 convolutional filter는 별개의 range를 가지게 된다. 이러하한 범위들을 모두 통합하여 quantization을 진행하는 것은 나쁜 결과를 초래할 수 있기 때문에, granularity, 즉 cliping range의 기본 단위를 얼마나 세밀하게 두느냐에 따라  결과가 변화할 수 있다.

a) Layerwise quantization
  이 방법에서는 Layer의  convolution filter에 있는 모든 가중치를 고려하여 cliping range를 정한다. 이 때, 해당 Layer의 모든 conv filter에 대해 같은 cliping range를 적용한다. 이 방법은 간단하지만, 각 conv filter의 범위가 많이 다를 수 있기 때문에 최적이 아닌 정확도를 초래할 수 있다. 예를 들어, 상대적으로 더 좋은 parameter를 가진 conv filter는 같은 Layer에서 더 넓은 범위를 가진 filter 때문에 해상도를 잃으 수 있다.

b) Groupwise quantization

  이 방법은 Layer에서 여러 다른 채널을 group화하여 cliping range를 계산한다. 이는 단일 conv 또는 activation function의 parameter의 분포가 크게 다르게 나타나는 경우에 도움이 될 수 있다.

c) Channelwise quantization

  각 convolution filter에 대해 cliping range를 계산하는 것으로 가장 일반적으로 많이 사용하는 방법이다. 일반적으로 좋은 성능을 보여주기는 하나, GPU와 같은 HW에서는 구현이 더 복잡할 수 있다. 왜냐하면 각 채널이 다른 scale factor를 가지게 되기 때문에, 각 채널에 대한 별도의 scale factor를 저장하고, 추론 시간에 해당 scale factor를 곱해야하기 때문이다.

d) Sub-Channelwise quantization

  이전 방법을 더 극단적으로 활용하면 channel 내를 더욱 미세한 단위로 확장하고, 각 채널 내의 sub group에 대해 cliping range를 결정할 수 있다. 이는 각각의 weight나 group별로 잘 표현될 수 있는 cliping range를 가지게 되어 정확한 결과를 얻을 수는 있지만, scaling factor 또한 증가하므로 overhead가 크게 증가할 수 있다.

 

F. Non-Uniform Quantization

  비 균일 양자화는 Quantization step과 Quantization level이 균일하게 배치되지 않도록 허용하는 방식을 뜻한다. Step과 Level은 이해하기 쉽게 생각하면, Step은 범위, Level은 가능한 수량을 의미한다. Step과 Level이 균일하다는 뜻은, quantization의 결과 값이 한 범위 내에서 일정한 간격을 가지고 나온다는 뜻이다. B 섹션의 식에서 Int가 반올림이고, 범위가 -1~1이라면, -1, 0, 1 이런 식의 값들만 남게 되는 것이다. 하지만 Non-Uniform Quantization은 Step과 Level이 균일하지 않기 때문에, -1, 0.2, 1. 이런 식의 값이 많이 나올 수 있다. 분포가 오른쪽으로 치우쳐있는 경우가 될 것이다. 따라서 분포에서 좀 더 중요한 부분을 더 명확히 표현할 수 있어, 정밀도를 향상시킬 수 있는 방법이다.  

  Non-uniform quantization의 종류로, binary-code-based quantization이 존재한다. 실수 r을 binary vector인 m으로 quantize하는 개념인데, 아래 식으로 표현할 수 있다. αi는 scaling factor이고 실수이다. bi는 {-1, +1}의 n제곱 형태로 이루어진다. 하지만 closed-form solution이 없기 때문에, 휴리스틱한 방법을 활용하거나 또는 최적화 문제로 공식화해서 경사 하강법 등의 방법으로 접근하는 경우도 존재한다. 이 방법은 αi를 최적화해서 양자화를 진행하며, αi의 값만 저장하기 때문에 기존 모델에 비해서 메모리 효율성이 좋고, binary vector를 사용하기 때문에 비트 연산을 통해 연산의 효율 또한 증가할 수 있다.

G. Fine-tuning Methods

  Quantization을 한 후에, 더 정확한 결과를 위해서 fine-tuning을 하는 경우가 많다. QAT와 PTQ가 가장 대중적인 방법이다.

  G-1 QAT

  QAT는 pre-trained 된 모델을 retraining하면서 최적의 quantization model을 찾는 방법이다. 먼저, floating point를 가지고 Forward pass를 수행한 후에, backward pass를 통해 계산된 Loss를 가지고 weight를 업데이트 한다. 이 때, weight는 floating point로 업데이트 된다. 다음으로 업데이트 된 가중치를 quantize한다. 다으음으로 다시 Forward pass를 수행할 때에는 quantization 된 값으로 수행한 후에, Loss를 계산한다. 계산된 Loss로 backward pass를 수행하면서 weight를 업데이트 하는데, 이 때 floating point로 계산한다. 이러한 방식을 여러번 반복하면서 Loss가 가장 적은 weight를 찾아 quantization을 진행하는 방법이다. 이 때, floating point로 weight를 업데이트 하는 것이 매우 중요한데, int 값을 가지고 계산을 하다보면 zero-gradient 값이 나올 확률이 높기 때문이다.

  STE(Straight-Through Estimator)는 신경망에서 gradient를 계산할 때 미분 불가능한 함수에 대한 대처 방식이다. quantize된 값들은 zero-gradient와 같이, 미분 불가능한 함수의 형태를 띄는 경우가 발생하기 때문에, 이에 대한 대처가 필요하다. 기본적인 STE는 미분 불가한 함수를 단순히 항등함수로 취급하고, 나머지 gradient를 계산한다. 하지만, 종종 zero gradient가 꽤 많은 비율로 발생하는 경우 성능에 문제가 생길 수 있다. STE를 대체하기 위해 Non-STE 방법이 있고, 논문에서는 ProxQuant, GQ(Gradient Quantization), ADMM, LSQ 등을 소개한다.

 

  G-2 PTQ

  QAT는 re-training을 하기 때문에, 상당히 큰 overhead를 가지게 된다. 이러한 overhead를 대체하기 위해 만들어진 기법이 PTQ, Post-Training Quantization 이다. PTQ는 re-training을 하지 않는다. PTQ는 pre-trained 된 모델에 calibration을 위한 data를 넣어서 각 Layer 또는 Channel 별로 어떠한 숫자들이 결과로 나오는지 수집한다. 이것이 위 그림의 calibration이 되며, 이 데이터를 기반으로 range와 cliping width 등을 정해 quantization을 수행한다.이에 따라, re-training을 위한 데이터를 필요로 하지 않으며, 데이터의 라벨이 없는 경우에도 활용할 수 있다. 하지만, QAT에 비해 정확도가 떨어지는 경우가 다수 존재한다. 

  이러한 문제점을 해결하기 위해, quantization 후 가중치 값의 평균과 분산에 내재된 bias를 관찰하여 bias를 수정하거나 또는 다른 layer나 channel 간의 weight의 범위를 균등하게 하여 quantization error를 줄이는 방법을 채택할 수 있다. ACIQ는 PTQ를 위한 최적의 cliping 범위와 channel 별 bit-width 설정을 분석적으로 계산한다. OMSE 방법은 quantization tensor와 floating tensor 간의 L2 거리를 최적화함으로써 PTQ를 수행한다.

 

  G-3 Zero-shot Quantization

   Quantization의 성능을 높이기 위해서는 일반적으로, 기존에 훈련에 사용했던 data를 활용하는 것이 효과적이다. 첫째로, calibration을 위해서, 둘째로는 quantized model은 fine-tuning을 통해 성능을 보완하기 위해서 필요하다. 그러나, training data가 너무 크거나 접근 불가능한 경우 또한 존재하기 때문에, 이를 극복하기 위해 Zero-shot Quantization을 활용하는 경우가 존재한다.

  Level1 : No data and no finetuning(ZSQ + PTQ)

  Level2 : No data but requires finetuning(ZSQ + QAT)

  Level1의 경우, finetuning 없이 더 빠르게 quantization을 수행할 수 있도록 한다. 이에 비해 Level2는 finetuning이 정확도 저하를 회복하는데 큰 도움을 줄 수 있어 보다 높은 정확도를 보여준다. ZSQ에서는 pre-trained된 모델을 discriminator로 활용해서 GAN을 구성하고, image를 생성해 이를 활용하는 분야가 존재한다.

 

H. Stochastic Quantization 

  

 

  QAT의 weight update가 너무 적은 경우에, quantization 과정에서 변화량이 없을 수 있고, 이에 따라 학습이 멈출 수 있다.( rounding methods를 활용했을 때, 같은 weight가 나오는 경우) 따라서 위의 식처럼 weight update를 수정하여 update하면 이러한 문제를 해결할 수 있다고 한다. 하지만, 이러한 stochastic한 방법은 random number를 모든 하나의 epoch 마다 수행해야 하다보니, overhead가 존재해 많이 사용하는 추세는 아니라고 한다.