[논문 리뷰] 이진화와 삼진화 (NEURAL NETWORKS WITH FEW MULTIPLICATIONS)
이 글은 여러분들의 이해를 돕기 위한 글쓴이의 개인적인 해석이 들어가 있기 때문에, 논문의 내용에는 없는 부가적인 설명이 대거 들어있음을 알려드립니다.
또한 논문이 나온 시점이 2015인 만큼, 현재의 모델과의 성능적인 차이가 있겠지만, 그 현대 모델들의 기반이 되는 글입니다.
원문: NEURAL NETWORKS WITH FEW MULTIPLICATIONS
ABSTRACT
대부분의 딥러닝은 학습 시 많은 시간을 사용합니다. 이 악명 높은 딥러닝은 대부분의 학습 시간을 부동소수점 연산(floating point computation) 그 중에서도 곱셈 연산에 사용합니다. 즉, 실수(부동소수점) 연산을 하는데 시간이 비교적 많이 걸린다는 거죠. 본 논문에서는 대부분의 부동소수점 곱셈 연산을 줄이는 시도를 합니다. 즉, 시간이 많이 소요되는 실수(부동소수점) 곱셈 연산을 줄임으로써 효율적인 연산을 시도하는 것입니다.
1 INTRODUCTION
대부분의 딥러닝은 수많은 부동소수점 곱셈 연산을 취하고, 이는 모델의 실행 속도를 늦추는 주된 원인입니다. 왜냐하면 부동소수점 곱셈 연산은 시간을 많이 소비하는, 흔히 말하는 **“값이 비싼 연산”**이기 때문입니다. 본 논문에서는 대부분의 곱셈 연산을 줄이고자 합니다. 이 연구는 여기 논문을 기반으로하고 있으며, 해당 논문은 forward, backward 시 가중치만을 이진화하여 곱셈 연산을 줄인다고 합니다. (정리된 글은 여기에 있습니다.)
이번 논문에서는 forward와 backward 두 부분에 적용될 수 있는 방법을 알아봅니다. forward 중에는 가중치 값들이 binary connect 또는 ternary connect(ternary는 삼진법을 의미)를 이용하여 확률적으로 이진화 됩니다. backward(backpropagation) 과정에서의 에러 즉, 기울기는 본 논문에서 새로 제시하는 quantized back propagation이라고 불리우는 방식을 이용합니다. Quantized back propagation은 곱셈 연산 대신 bit shift 연산을 사용한다고 합니다. (bit shift 연산은 어떤 수에 2를 여러번 곱하거나 나눈 것과 동일하지만, 연산 속도는 그냥 곱셈 연산보다 수십배 빠릅니다.)
2 RELATED WORK
딥러닝의 연산 시간을 줄이기 위해 여러 시도가 있었습니다. 2의 제곱으로 이뤄진 가중치들만 사용하면서 **multipication 대신 bit shift 연산을 취하는 시도도 있었습니다. 이 방식은 학습과 추론 과정에서 곱셈 연산을 하지 않아도 되는 장점이 존재하지만, 모델의 성능이 극심히 낮아지는 경향이 있으며, 모델이 제대로 학습하지 못한다는 단점이 있습니다. **여기는 boolean 형태(즉 1과 0으로 이뤄진) 네트워크를 도입했습니다. 시간적으로 이득이 있었으며, 또한 만족스러운 성능을 내기도 한다 합니다. 하지만 부동소수점 형태의 연산과 32bits가 학습 과정에 사용되어 학습 시에는 이득이 없다는 것이 단점이었습니다.
이 외에도 논문에서 언급되는 기법들이 있으니 원문을 보시기 바랍니다.
3 BINARY AND TERNARY CONNECT
Binary connect 다시 알아보기 binary connect는 이미 여기에서 소개되었으며, forward 시 가중치들을 이진화함으로써 multipication을 하지 않는 기법입니다. -1 또는 1를 가중치로 사용하기 때문에 곱셈 연산이 단순히 부호를 바꾸는 연산으로 바뀌게 되기에 곱셈 연산이 필요 없어지게 되는 것이죠. 즉 다음과 같은 행렬 연산에서
다음과 같은 연산으로 바뀌게 됩니다.
즉, x와 W의 부호가 같으면 +x, 다르면 -x로 바뀌게 되며 곱셈 연산을 없습니다.
W가 -1 또는 1이 되는 확률은 다음과 같습니다.
여기서 W_는 forward 시 이진화되기 전의 부동소수점 가중치이며, 다음과 같습니다.
Ternary Connect 대부분의 딥러닝에서, 가중치가 0으로 되거나 0에 매우 가까운 값으로 되는 경우가 있습니다. 따라서 단순히 가중치를 -1과 1로 나누는 것이 아닌, -1, 0, 1 세 개의 상태로 나누는 것이 이득입니다. 확률적으로 가중치를 -1, 0, 1로 설정합니다. 0이 추가되긴 했으나, x에 0을 곱하면 무조건 0이니, 곱셈 연산 없이 단순히 0을 연산의 결과로 지정하면 되기 때문에 이 또한 곱셈 연산이 필요 없습니다.
Ternary Connect에서 W의 확률분포는 다음과 같습니다.
4 QUANTIZED BACK PROPAGATION
3번에서 우리는 forward 연산 시 곱셈이 필요 없다는 것을 알 수 있었습니다. 여기서는 backward에서 곱셈이 어떤 방식으로 대체되는지 알아보겠습니다. (가중치 update를 말하는 것이 아닙니다. backward는 단순히 모든 가중치에 대해 기울기 값을 구하는 과정을 의미합니다.)
가중치와 bias의 변화량은 다음과 같습니다.
여기서 *는 외적(outter product)를 의미합니다.
eta(n 처럼 생긴 그리스 기호)는 학습률입니다.
$\delta$는 해당 층의 activation에 대한 cost function의 기울기로 다음과 같습니다.
위의 여러 식 중에서 델타와 h’(Wx+b) 그리고 x가 여러번 나오는 것을 알 수 있습니다. 즉, 이들 중에 양자화가 가능한 값이 있다면 양자화를 하여 연산량을 줄일 수 있다는 것이겠죠. 논문에서는 h’의 범위를 아는 것은 힘들다고 여기고 양자화를 하지 않습니다. 대신 x를 양자화합니다.
자세한 알고리즘은 논문을 참고하시기 바랍니다.
5 EXPERIMENTS
본논문에서는 Theano 프레임워크(tensorflow나 pytorch와 비슷한 프레임워크)를 사용하고, 테스트 데이터셋으로는 MNIST, CIFAR10 그리고 SVHN을 사용했습니다. %로 나타내진 값은 오차율입니다.
Binary connect Binary connect + Quantized backprop Ternary connect + Quantized backprop
MNIST | 12.3% | 1.29% | 1.15% |
CIFAR10 | 12.04% | 12.08% | 12.01% |
SVHN | 2.47% | 2.48% | 2.42% |
관련 글
https://pkr7098.tistory.com/m/241