[PaperReview] Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

Han Sung Kang·2022년 11월 25일
0

PaperReview

목록 보기
2/3

abstract

모바일 장치의 인기가 많아지고 있지만, 딥 러닝 기반 모델은 압도적인 계산 비용이 요구되므로 장치 내에서 효율적이고 정확한 추론 방식이 요구된다.

Introduction

AlexNet의 등장으로 classification, detection task에서 CNN의 성능이 향상 되었지만, 모델 복잡도와 연산의 효율성이 고려하지 않은 채로 네트워크의 아키텍처가 발전해 왔다. CNN을 모바일 플랫폼에 성공적으로 배포하기 위해서는 장치의 제한적인 메모리 크기로 인하여 모델의 크기가 작아야 하고, 사용자들의 입장을 고려하여 짧은 지연 시간이 요구된다. 이러한 이유로 모델의 크기와 추론 시간을 줄이는 것이 연구의 주제로 떠올랐다.

방법으로는 새로운 네트워크 아키텍처를 디자인 하는 것과 CNN의 가중치와 중간 값을 양자화(Quantize)하는 방법이 있다. 양자화 방법은 32bit floting point를 낮은 bit로 표현하는 방법이기 때문에 정확도(accuracy)와 지연 시간(latency)에 트레이드 오프가 발생한다.

AlexNet, VGG, GoogleNet은 성능을 높이기 위하여 과도하게 파라미터화 되어 Quantization의 기법을 적용했을 때, 상당한 압축 률을 얻을 수 있지만 큰 의미가 없어 개념 증명 정도로 쓰일 수 있다. MobileNet과 같은 정확도와 지연시간의 트레이드 오프에 효율적인 모델 아키텍처를 양자화 하는 것이 앞선 예시보다 의미가 있을 것이다.

Equation


r=S(qZ)q=rS+Zr = S(q-Z) \\ q = {r \over S} + Z

S와 Z는 각각 Quantization parameter로 Scale과 Zeropoint를 의미한다. Scale은 FP32bit로 표현 된 수를 더 낮은bit수의 범주로 표현 하기 위하여 이웃 하는 값의 step size를 의미하며 값을 정수로 바꾸기 위해 필수적이다. Zeropoint도 다른 범주로 값을 mapping 시키게 될 때, FP 32bit 범위에서 숫자 0의 위치를 낮은 bit의 범위로 mapping 할 때의 0 값의 위치를 나타낸다.

[두 수평 선 그림 그린 후 맵핑 예시 그림.]

따라서 실수 값을 Scale 값으로 나눈 후, Zero point 값을 더 해주면 양자화 된 값을 얻을 수 있다.


rα(i,j)=Sα(qα(i,j)Zα)r^{(i,j)}_{\alpha} = S_\alpha(q^{(i,j)}_\alpha-Z_\alpha)

두 번째 수식은 첫 번째 수식은 단일 값에서 나타낸 수식을 matrix 상에 있는 값을 나타낸다.


S3(q3(i,k)Z3=j=1NS1(q1(i,j)Z1)S2(q2(j,k)Z2)S_3(q^{(i,k)}_3-Z_3=\sum^{N}_{j=1}S_1(q^{(i,j)}_1-Z_1)S_2(q_2^{(j,k)}-Z_2)
q3(i,k)=Z3+Mj=1N(q1(i,j)Z1)(q2(j,k)Z2)q^{(i,k)}_3 = Z_3 + M\sum^{N}_{j=1}(q^{(i,j)}_1-Z_1)(q_2^{(j,k)}-Z_2)

세 번째 수식은 input과 weight의 matrix multiplicate 연산을 한 후 값을 나타낸 후, 이항 시킨 후 이며 이 때 M값이 중요하다.


M:=S1S2S3M:={S1S2 \over S3}
M=2nM0M=2^{-n}M_0

M은 matrix multiplcate에 필요한 두 matrix와 결과로 나온 matrix의 scale 값을 사용하여 구해지는 값이다. M0M_0값은 fixed-point multiplication으로 구현된다. 이 값은 bit shift에 사용되므로 중요한 인자이다.


q3(i,k)=Z3+M(NZ1Z2Z1a2(k)Z2aˉ1(i)+j=1Nq1(i,j)q2(j,k))a2(k):=j=1Nq2(j,k)     aˉ1(i):=j=1Nq1(i,j)q_3^{(i,k)} = Z_3+M(NZ_1Z_2 - Z_1a_2^{(k)} - Z_2\bar a^{(i)}_1+\sum^N_{j=1}q_1^{(i,j)}q_2^{(j,k)}) \\ a_2^{(k)}:=\sum^N_{j=1}q_2^{(j,k)} \space \space \space \space \space \bar a_1^{(i)}:= \sum^N_{j=1}q_1^{(i,j)}

모든 계층의 연산을 이 수식에 따라 진행하면 된다.

profile
딥러닝을 딥하게 삽질하는 저장소

0개의 댓글