폭 넓은 문제의 분야에서 Neural Network 의 정확도는 필요 이상의 수 많은 파라미터들로 크게 개선되었다. 문제를 해결하는데 중점을 두어 모델의 복잡도와 계산 복잡도까지 고려를 해서 발달되지는 않은 것으로 해석 할 수 있을 것 같다.
NN이 개선되며 발달한 과정이 (highly over -parameterized models) 리소스 제약이 있는 애플리케이션에 배포할 수 없다. 또한 실시간 추론이 필요로 하는 것을 인지하게 만들었다. 실시간 추론은 리소스 제한적인 환경에서 적은 에너지 소비와 높은 정확도를 유지를 해야 한다.
Neural network 효율적으로 만든다는 것은 latency, memory footprint, energy consumtion 측면을 고려하여 만든다는 것이고, 정확도와 일반화는 trade-off 관계에 있기 때문에 몇 가지 카테고리로 크게 묶을 수 있다.
순방향 오류는 정확하거나 참인 답과 알고리즘에 의해 출력 된 것 사이의 차이를 알려준다. 역방향 오류는 우리가 실행한 알고리즘이 실제로 어떤 입력 데이터를 정확하게 해결했는지 알려준다
NN 추론과 학습 시 연산 집약적이다. 그래서 수의 표현을 효율적으로 하는 것이 특히 중요하다.
최근 NN 대부분은 아주 많은 파라미터화로 되어 있기 때문에, 정확도에 큰 영향 없이 bit precision을 줄 일 수 있다.
over-parameterization 되었다는 것은 자유도의 정도가 높다는 것으로 직결되며, 이는 한 메트릭을 최적화 하는 모델이 여러 개가 존재 할 수 있다는 것이다. 따라서 양자화 된 모델과 그렇지 않은 모델의 차이는 클 수 있지만, 매우 좋은 일반화 된 성능에 도달했다.
자유도는 앞선 고전적인 압축하는 기법들에서는 존재 하지 않았다. 오히려 신호를 너무 많이 바꾸지 않는 압축 방법을 찾거나 정확한 계산(origin model)과 이산 계산(quantized model)의 차이를 강력하게 제어하는 수치 방법을 찾는데 초점을 두었다.
⇒ 결과에 대한 값이 아니라 중간 과정 하나하나 값 자체를 중요하게 연구했던 것 같음.
이러한 현상(자유도&중간 값의 다른 정도)은 NN quantization을 하기 위한 새로운 기술을 연구하는데 충분한 이유가 되었다.
NN model의 계층화된 구조는 추가적으로 고려할 수 있는 대상으로 제공된다.
Neural Network 구성하는 서로 다른 계층은 loss function에 의해 다른 영향을 받는다. 이것이 mixed-precision quantization의 동기가 되었고 사용되어지고 있다.
Uniform quantization VS Non-uniform quantization
양자화 된 값과 값 사이의 거리가 같으면 uniform quantization 이고, 다양하면 non-uniform quantization이다.
Non uniform quantization은 값의 중요한 영역과 적절한 dynamic range에 중점을 두어 더 좋은 분포를 포착하여 fixed bit width에서 더 높은 정확도를 달성하게 해준다. 이 예시로 해당 메소드를 사용한 것들은 가중치와 중간 값 모두 long tail shape 을 가진 종 모양으로 분포를 가진다.
또, 일반적인 연산 장치에 효율적이게 배포하기 어려운 문제가 있다.
Symmetric Quantization VS Asymmetric Quantization
Symmetric Quantization은 range map을 엄격하게 [-127, 127]로 맵핑하여 Zeropoint도 0으로 두며, Asymmetric Quantization은 full range [-128, 127]로 맵핑하고 zeropoint 또한 상대적으로 위치 시킨다. 클램핑 하는 범위를 ‘calibration’ 언급한다.
위 두 방식 모두 min, max 라는 값을 사용하게 되는데 이럴 경우 outlier data에 취약하다는 문제가 있다. 이러한 문제를 해결 하기 위해 percentile 방법을 쓸 수 있다. 이 방법은 가장 크고 작은 값이 아니라, 파라미터를 이용하여 loss function 값을 최소화 하는 값으로 설정하여 quantization parameter를 구하는 범위를 설정 한다.
Range Calibration Algorithm: Static VS Dynamic Quantization
weight는 학습이 되어 있는 상태로 있기 때문에 범위를 구하는데 크게 상관이 없지만, activation은 매번 달라지는 input에 의존 되어 범위가 달라진다. Activation을 양자화 하는 방법은 크게 2가지로 나뉘고, static 방식과 dynamic 방식이 있다. dynmic은 작동하는 동안 매번 범위를 구하는 방식이고, static은 미리 범위를 지정하고 양자화 하는 방법이다. overhead 와 accuracy 측면에서 trade off에 놓여있다. static 한 범위를 지정하는 방법이 여러 방법이 있고 NN이 학습하는 동안 clipping range와 weight를 같이 최적화 하는 방법들이 있다.(EX. PACT)
대부분의 연구자들은 Static quantization을 사용한다.
Quantization Granularity
Layerwise Quantization
모든 convolution filter 들에 동일한 범위로 clipping 하는 방식. 값의 범위가 좁은 필터에 대해서는 상당한 정확도 손실이 발생하게 되는 문제가 있지만 구현이 쉽다는 장점이 있다.
Groupwise Quantization
한 계층 내에서 여러 개의 다른 채널 또는 중간 값을 그룹화 하여 클리핑 범위를 계산하는 방식이다. Fully connected layer에서 유용한 것으로 알려져 있다.
Channelwise Quantization
가장 흔히 채택되어지는 방식이며, 다른 채널과는 상관 없이 채널 별로 클램핑 시키는 방법이고 더 높은 정확도를 야기한다.
Sub-channelwise Quantization
Quantization Aware Training (QAT)
quantized parameter 사용하여 NN model 재 학습 시킴으로써, 파라미터에 작은 변화를 주는 방법이다. floating point의 모델이 Forward, Backward 거치며 학습을 하게 되며, gradient 업데이트 된 후에는 다시 양자화 된다. 이 때, weight update를 floating point precision로 수행하는 것이 중요한 부분인데, 그 이유는 quantized precision 일 때 gradient가 0이거나 아니면 더 큰 에러를 가진 gradient일 수 있기 때문이다.
Post-Training Quantization (PTQ)
오버헤드가 큰 QAT의 대체 방안으로 어떠한 fine-tuning 없이 quantization 수행하고 가중치를 조정한다. 데이터가 제한적이거나 라벨링이 되어 있지 않는 상황에서 적용할 수 있다는 장점을 가지고 있다. 당연히 Overhead가 무시할 정도로 작은 만큼 QAT에 비해 성능(정확도)가 떨어지고 더 낮은 precision quantization 일 때 이러한 양상이 더 크게 나타난다.
이러한 성능 저하의 폭을 개선 시키기 위해서 몇 가지 방법이 있다.
서로 다른 계층 또는 채널의 가중치 범위를 같게 하면 quantization error를 줄일 수 있다.
ACIQ는 최적의 범주로 클램핑을 하고, 채널 별로 bitwidth 다르게 한다. 하지만 이 방법은 채널 별로 acitvation 양자화를 사용해야 하기 때문에 성능 개선은 있으나, 하드웨어에 배포하기 어렵다.
OMSE는 이러한 배포 문제 때문에 channel-wise quantization on activation은 적용하지 않고 PTQ를 적용하고 L2 distance(FP tensor와 quantized tensor 사이의)로 최적화한다.
OCS(Outlier Channel Splitting)는 outlier data가 있을 경우, 따로 처리를 한다.
⇒ Post-Training과 QAT 학습 기법의 가장 큰 차이점은 Fine-tuning인지 아닌지 차이이다. 물론 추가 학습을 한다는 관점에서 모두 Fine-tuning 으로 볼 수 있겠지만, floating point 로 모델을 학습할 때 사용한 학습 데이터 셋을 모두 사용하여 재 학습(Re-training = Fine-tuning) 하면 QAT, 학습 데이터 셋의 일부분 만을 사용한다면 PTQ로 구분된다.
Zero-shot Quantization (ZSQ)
Stochastic Quantization
예시로는 QuantNoise가 있다. 매 forward(동일 의미로 iteration 도 됨) 마다 모델의 가중치의 일부분에 무작위로 선별하여 학습하여 비 편향(unbiased gradient)으로 않게 학습한다. 크게 정확도 손실이 일어나지 않는 다는 장점이 있지만, 확률을 이용하여 random subset 생성하는데 큰 오버헤드가 요구되어 실질적으로는 널리 쓰이지 않고 있다.
양자화 된 뉴럴 네트워크를 배포하는 방법에는 2가지 방법이 있는데,
‘Simulated quantization’(=fake quantization)과 ‘Interger-only quantization’(=fixed point quantization)이 있다.
Simulated quantization은 모델 파라미터를 low precision으로 저장하지만 matmul과 convolution 같은 operation은 floating point 연산을 한다. 그러므로 operation을 하기 전에 dequantize가 반드시 필요로 하다. 낮은 정확도를 사용했을 때 얻을 수 있는 이점을 완벽하게 얻을 수 없다.
Integer-only quantization은 정말로 효율적인 정수 연산만을 가지고 수행한다. 이 경우, lantency, energy consumtion, area efficiency 에서 이득을 얻을 수 있다.
Dyadic quantization은 Integer only quantization 중 하나로, scalig 을 두 가지로 수행한다. 이 scale은 2진수 방정식으로 이루어져 있기 때문에 정수로 더하고 빼고 비트 시프트만 필요로 한다.
💡 Bandwidth is money. The amount of data that can be pushed from one system to another across a connection.Latency is physics. The time it takes to send data from one system to another another, and typically requires a response back.
Bandwidth는 에스컬레이터 너비, Latency는 에스컬레이터 속도.
🚫 Latency Bound, Bandwidth Bound, Computational Bound 를 어떻게 비교해서 알아야 하나?너무 낮은 비트로 표현을 하려는 경우에 상당히 큰 정확도 손실이 발생한다. 상당히 낮은 비트로 표현을 하려는 이유는 압축 비율을 높이려는 이유이기 때문에 계층 별로 비트를 다르게 하여 정확도 손실이 거의 없고 압축 비율을 높이는 방법이다.
하지만, 계층의 지수 승만큼 경우의 수를 고려해야 하는 search problem이 발생한다.RL(Reinforcement Learning)을 사용하여 이 문제를 해결하였지만 여전히 많은 computational resource가 요구되고, 하이퍼 파라미터와 초기 값에 예민하다는 문제가 있다.
Searching Problem을 해결하기 위해서 HAWQ는 Hessian, mixed-precision activation quantization, Integer Linear Programming으로 해결하였다.
Quantization을 하는 목표 중 하나는 latency를 개선하기 위해서 이다. 하지만, quantization을 통한 latency 개선은 하드웨어에 의존적이다. memory, bandwidth, cache hiearachy 등이 양자화 속도에 영향을 준다. 그래서 하드웨어 친화적인 양자화가 중요하다.
계층마다 서로 다른 비트를 가지는 것을 룩업 테이블을 기반으로 hardware latency를 모방하는 방법이다. 하지만 이 방법은 어디까지나 모방이기 때문에 직접 양자화 연산까지 하드웨어에 배포하여 측정하는 것이 제일 정확하다.
1 bit precision으로 표현 할 경우, 요구되는 메모리 양이 로 줄어든다. bit-wise 연산으로 연산을 효율적으로 할 수 있으며, 높은 precision 보다 상당히 빨라진다. 하지만 이 방법은 엄청난 정확도 손실을 발생 시킨다.
이러한 문제를 해결하는 방법 중 하나의 예시인 ‘BinaryConnect’는 weight를 +1 or -1로 제한한다.
이 방법은 weight는 실제로 real value로 가지고 있지만, forward와 backward 때 binarization effect를 모방한다. 이 때 STE 학습 방법을 사용한다. FP matmul을 XNOR과 같은 bit-counting으로 대체하기 때문에 latency 측면에서 상당히 개선되는 장점이 있으나, 이 방법도 정확도 손실이 무시할 수 없는 크기로 발생하기 때문에 ‘Binary Weight Network’ 와 ‘XNOR-Net’는 +1, -1이 아닌 로 weight 표현한다.
이러한 방법이 가능한 이유는 실제로 학습된 가중치 값의 대부분은 0에 가까운 값을 가지기 때문이다. 하지만, ImageNet과 같은 복잡한 태스크에서는 상당한 정확도 손실이 발생하는데 개선하는 몇 가지 방법이 있다.
Quantization Error Minimization
실제 값과 양자화 된 값의 차이를 줄이는 것에 중점을 두는 방식. 예로 여러 matrix를 scale 값을 가진 binary matrix로 표현한다. EX)
Improved Loss function
Improved Training Method
STE와 같은 학습할 때 쓰이는 방법과 같은 것을 binary/ternary model 에 적합한 학습 방법을 찾는다.
Quantization은 ML에서 발견된 방법이 아니라, 정보 이론에서 연구 되던 분야이다. 정보 이론에서는 디지털 신호를 압축하는 분야로 연구되어 왔으며, 압축 전의 신호와 변화와 에러 양을 최소화 하는 것이 목표이다. 하지만, ML에서 Quantization은 표현하는 비트를 가능한 제일 작게 결정하는 방법이다. 그러므로 양자화 된 가중치와 중간 값은 그렇지 않은 값과 차이가 커도 된다. 이러한 이유로 ‘vector quantization’이 적용 될 수 있고 가중치를 다른 그룹으로 속하게 하여, 추론에 양자화 된 각 그룹의 중심 값을 사용한다. ‘product quantization’은 vector quantization 기반을 둔 방식이며, 가중치 행렬을 여러 서브 행렬로 나눈 뒤, 서브 행렬에 vector quantization을 적용하는 방식이다.
A. Straight-Through-Estimator (STE)