AND THE BIT GOES DOWN: REVISITING THE QUANTIZATION OF NEURAL NETWORKS
작성자 리뷰
네트워크의 사이즈를 줄이기 위해 codebook 형태로 weight를 압축합니다. 압축하는 방법에 있어 실제 weight 자체의 값을 복원하기 보다 output을 잘 표현 할 수 있는 weight로 재구성하는 아이디어가 독특했습니다.
ABSTRACT
본 논문의 목표는 CNN 네트워크의 사이즈를 줄이는 것입니다. 그에 대한 방법론으로 vector quantization을 사용합니다. 이 때 quantization은 네트워크의 weight 값을 그대로 복원하는 것에 목표가 있는 것이 아닌, 네트워크의 output 값을 복원하는 것에 목표를 둡니다. 또한 알려지지 않은 데이터는 제외한 채 주어진 데이터(in-domain inputs) 안에서 output을 잘 반영할 수 있는 vector quantization을 목표로 합니다. 논문의 방법은 unlabelled data만 있으면 quantization을 할 수 있습니다.
Preliminaries
논문을 리뷰하기 앞서 몇 가지 단어들에 대해 알아보고자 합니다.in-domain inputs
in-domain inputs 이란 주어진 데이터를 뜻합니다. 논문에서는 주어진 데이터 내에서 성능을 높이는 의미를 표현하기 위해 사용되었습니다.
위 그림은 고양이와 강아지를 분류하는 분류기의 예시입니다. 이미지의 input은 pixel의 모든 조합을 space로 가지고 있습니다. ϕ_standard는 고양이와 강아지를 비롯하여 알지 못하는(e.g. 흑백의 노이즈 이미지) 이미지까지 모두 분류를 합니다. 반면 ϕ_activations는 주어진 데이터에만 관심을 가지고 분류합니다.
Quantization
Quantization is the process of constraining an input from a continuous or otherwise large set of values (such as the real numbers) to a discrete set (such as the integers). -wiki-Quantization은 continuous한 값을 discrete한 set에 맵핑 시키는 과정입니다. 논문에서는 연속적인 값(weight)를 이산적인 집합(codebook)으로 맵핑 한다는 의미로 사용하고 있습니다.
Our Approach
지금부터 어떻게 weight를 quantize 하는 지 살펴보겠습니다. 논문에서는 이해를 돕기 위해 Product Quantization, FC layer에서의 quantization, CNN 에서의 quantization 순으로 설명합니다.Product Quantization
출처 - https://www.jeremyjordan.me/scaling-nearest-neighbors-search-with-approximate-methods/ |
Quantization은 차원이 높아질수록 많은 양의 데이터와 많은 양의 centroid를 필요로 합니다.
Product Quantization은 이 문제를 해결하기 위해 vector를 slice하여 낮아진 차원의 subvector들을 quantize 하고 이를 다시 concat하여 사용하는 방법입니다.
위 예시를 보면 8차원의 vector를 2차원의 subvector 4개로 slice합니다. 이 후 각 subvector를 quantize하고 다시 concat 하여 원래 차원의 vector로 복원합니다.
Product Quantization은 적은 수의 데이터와 centroid로도 할 수 있습니다. 만약 vector를 subvector k개로 slice하고 subvector에 centroid가 m개 만큼 있다면, k^m 개 만큼의 vector quantization을 할 수 있습니다.
Quantization of a Fully-Connected layer
FC layer에서의 Quantization입니다. 왼쪽 그림에서 FC layer에 들어가는 input 노드의 개수를 C_in이라 하고, output 노드의 개수를 C_out이라 합니다.
layer의 weight는 두 번째 그림과 같이 C_in * C_out행렬로 표현 할 수 있습니다. 이 때 행렬의 열은 output 하나에 해당하는 weight vector입니다. 이 vector를 Product Quantization 합니다.
만약 d가 2차원이라면, 최종적으로 오른쪽 그림과 같이 표현 됩니다. 그림에서 검은색 점이 subvector들이고 빨간색 x가 centroid 즉 codebook이 됩니다.
이 때 codebook을 구하는 방법은 다음의 두 단계를 반복적으로 진행합니다. 기본적으로 k-means와 같습니다.
- E-step (cluster assignment)
subvector들을 centroid에 할당하는 단계입니다.
- M-step (codeword update)
centroid를 업데이트 하는 단계입니다.
다음으로 centroid를 찾기 위한 vector간의 거리(유사도)를 어떻게 정의 하는지 살펴보겠습니다.
- W : 기존 네트워크의 weight vector W_hat : quantization으로 재구성 된 weight vector
- y : 기존 네트워크의 output y_hat : quantization으로 재구성 된 ouput
- x : 네트워크의 input
- w_j : W의 subvector
- q(w_j): quantize된 subvector (할당 된 centroid)
논문에서는 오른쪽 수식으로 vector간의 거리(유사도)를 결정합니다. 이 때 수식에 input(x) 값이 들어가기 때문에 in-domain에 최적화 된 quantization이 되는게 아닐까 싶습니다.
Convolutional layer
CNN도 FC layer와 동일합니다. 하지만 weight의 차원이 다르기 때문에 reshape이 필요합니다.
가장 왼쪽 그림은 CNN filter를 나타낸 것입니다. input channel이 C_in, output channel이 C_out인 layer의 filter입니다. 논문에서는 quantization을 위해 3차원의 filter를 1차원의 weight vector로 표현하고 subvector로 나누길 원합니다.
filter를 reshape할 때 subvector가 의미를 내포하길 원합니다. 따라서 논문에서는 subvector를 위 그림에서 색으로 칠해진 것과 같이 나누었습니다. 이렇게 나누면 각 input channel의 activation map을 convolve하는 공간적인 의미를 내포하도록 subvector를 표현할 수 있습니다.
subvector의 차원은 kernal size * kernal size가 됩니다.
3차원의 weight를 reshape한 후에 FC-layer에서 한 것과 동일하게 codebook을 찾습니다.
Network Quantization
지금까지 하나의 Layer에 대해서 어떻게 Quantization을 진행하는지 살펴봤습니다. 이를 바탕으로 다층의 Layer가 있는 네트워크를 Quantization 하는 방법입니다.Learning the codebook
다 층의 Layer 중 하나를 예시로 생각해보면, 이전 Layer의 activation이 현재 Layer의 input이 됩니다. 이전 Layer의 activation을 구하는 방법은 2가지가 있습니다.- 실제 weight를 통해서 구해진 activation
- quantization 이후에 다시 재구성 한 weight를 통해 구해진 activation
결국 전체 네트워크의 Quantization은 input layer부터 Quantization을 진행합니다. 즉 재구성된 weight를 통해 나온 activation 값으로 다음 Quantization을 진행하는 sequential한 구조입니다.
Finetuning the codebook
Quantization을 진행한 후 codebook을 finetuning 해줍니다. codebook으로 재구성 된 weight로 만들어진 output(현 Layer를 거쳐 나온 activation)과 기존 네트워크의 output은 유사 해야합니다. 이를 위해 distillation 방법을 차용해 fintuning을 합니다.- y_s : student network output (Quantization 된 네트워크)
- y_t : teacher network output (기존 네트워크)
- b_p : codeword c 에 속하는 subvector (codeword c로 quantize 되는 subvector)
0 개의 댓글