[논문 리뷰] QNN (Quantized Neural Network)
이번 논문은 DoReFaNet 이후에 나온 논문입니다. 상당 부분이 DoReFaNet과 심히 유사하여 이것이 과연 새로운 모델이나 기법인지는 저로서는 모르겠습니다...
원문: https://arxiv.org/pdf/1609.07061.pdf
Abstract
QNN은 가중치와 activation에 1bit만 사용합니다. forward 동안, QNN은 굉장히 적은 양의 메모리를 소모하며, 대부분의 연산들이 bit 단위로 이뤄지기 때문에 연산 속도의 향상을 기대할 수 있습니다. 논문에서는 새롭게 고안된 binary GPU kernel을 이용하면 MNIST dataset에서 7배 향상된 연산 속도를 보여준다고 합니다.
1. Introduction
QNN은 딥러닝에서 사용되는 multiply-accumulate operations (MACs)를 비트단위의 XNOR과 population count로 대체합니다. 여기서 multiply-accumulate operations은 가중합을 의미하며, 여러 뉴런들의 출력에 가중치를 곱(multiply)하고, 이들의 합(accumulation)을 다음 레이어의 입력으로 사용한다는 의미에서 multiply-accumulate operations이라고 부릅니다. XNOR은 bit-wise operation으로 여러분들이 알고 있는 xnor 연산과 동일합니다. population count는 이진수로 표현된 어떤 데이터에서 1의 개수를 세는 것을 의미합니다. (즉, 01101이라는 데이터에서 population counting은 3입니다. 1이 3개 있으니까요.)
QNN은 낮은 해상도의 가중치와 activations을 사용하는데, 극단적으로 1bit만 사용할 수도 있습니다.
6 bits만 사용해도 정확도 상에 차이는 적다고 합니다.
2. Binarized Neural Networks
여기서는 논문 저자들이 고안한 binarization function을 알아보고, 어떻게 gradients를 구하는지 그리고 구한 gradients로 backpropagation을 하는지 알아보겠습니다.
Binarization
binarization 자체는 BinaryConnect 방식과 동일하며 자세한 설명은 여기 2.2 section에 나와있습니다.
Gradient Computation and Accumulation
binary weight와 activations은 이진화되어 있지만, gradients를 계산할 때는 부동소수점 연산을 취한다고 합니다. SGD 연산이 원활하게 이뤄지기 위해서 부동소수점 연산을 사용한다고 합니다. SGD에서 가중치나 bias들이 미세한 학습률로 학습되기 때문에 그리고 gradients가 누적되기 때문에 높은 해상도를 사용할 수밖에 없다고 합니다.
Propagating Gradients Through Discretization
QNN에서 사용되는 sign 함수의 미분 값은 대부분 0이기 때문에 원활한 backpropagation이 불가능했습니다. 하지만, Hinton’s lextures에서 소개된 “straight-through estimator” 즉, STE 기법을 사용한다면, 학습이 가능합니다. 여기서는 기존의 STE를 변형시켜 saturation 효과를 이용합니다. 원래는 sign 함수를 activation 함수로 사용하지만, STE에 saturation 효과를 넣기 위해 hard tanh 함수를 activation function으로 사용합니다. hard tanh 함수는 [-1, 1]에서는 선형으로 동작하며, 그 외의 범위는 -1 또는 1로 saturation시킵니다. hard tanh의 미분은 [-1, 1]에서는 1, 그 외의 범위에서는 0입니다.
Shift-based Batch Normalization
많이 사용되는 Batch Normalization(BN)은 수많은 곱셈 연산을 동원합니다. 논문에서는 곱셈 연산이 많은 BN 대신, BN과 비슷한 성능의 shift-based batch normalization (SBN)을 사용합니다. SBN은 BN과 성능이 비슷하면서도 곱셈 연산이 거의 없습니다. SBN을 위한 연산인 AP2(x)는 x와 비슷한 2의 제곱의 지수를 반환합니다. 즉, 5는 2^2와 유사하기에 AP2(5)는 2, 10은 2^3과 유사하기에 AP2(10) = 3을 반환합니다. <<와 >>는 C언어에서 사용되는 bit wise shift operator입니다. SBN은 대부분의 곱셈 연산을 다음과 같이 바꿉니다.
간단히 말하자면, x곱하기 y의 결과가 가장 가까운 2의 제곱수로 표현한다고 생각하시면 될 것 같습니다. (그럼에도 AP2를 사용하는 이유는 대부분의 MCU나 Microprocessor가 AP2를 명령어 하나로 처리하기 때문입니다.)
BN과 마찬가지로 SBN도 분산을 구하기 위해 루트를 사용합니다. 루트 연산은 곱셈 연산과 연산 시간이 비슷하고, 그냥 루트 연산을 사용하는 것이 효율적이라 그대로 사용한다고 합니다.
SBN은 실험적으로 BN과 비교했을 때 정확도 측면에서 큰 차이는 없다고 합니다.
Shift Based AdaMax
Adam optimizer 자체도 곱셈 연산을 많이 동원하기 때문에 저자들은 shift-based AdaMax를 사용하는 것을 추천한다고 합니다. Adam을 사용했을 때와 Shift Based AdaMax를 사용했을 때 정확도 면에서 큰 차이는 없다고 합니다.
3. Quantized Neural network - More than 1-bit
논문에서는 두 가지 방법의 양자화 기법이 나왔습니다.
첫 번째 방법은 DoReFaNet에서도 나온 방식이고, 두 번째 방식은 여기서 나온 방식입니다. minV와 maxV는 각각 scale range라고 합니다. QNN은 위의 양자화 방식을 weights, activations, gradients에 사용한다고 합니다.
4. Benchmaek Results
Relaxing “hard tanh” boundaries
Hard tanh 함수의 범위를 -1, 1이 아닌 더 넓은 범위를 취하여 1.5%의 정확도 향상을 기대할 수 있었다고 합니다. 기울기 값의 수용 범위가 늘어나니 당연한 결과일 수 있습니다.
Language Models
저자들은 1bit의 양자화로는 RNN에서 만족스러운 성능을 얻기 힘들다고 했습니다. 저자들은 LSTM 모델에 2bits 이상의 양자화를 도입하여 float32과 유사한 성능을 얻었다고 합니다. 하지만 Table 4를 보았을 때는 대략 4bits는 사용해야 만족스러운 유사도가 나오지 않나 싶습니다.
6. Seven Times Faster on GPU at Run-Time
논문에서는 단순히 비트 연산을 빠르게 하기 위해 이진 데이터를 비트 단위로 연속적으로 배열하고 GPU의 SIMD 명령어를 사용하여 popcount와 xnor 연산을 빠르게 수행시킨다곡 합니다.