티스토리 뷰

들어가며

본 글은 논문 DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING을 리뷰한 글입니다.

 

더불어 TinyML에 관련된 논문과 프로젝트를 아카이빙해놓은 좋은 깃허브 레포지토리를 찾았기 때문에 공유합니다.

https://github.com/gigwegbe/tinyml-papers-and-projects

기존 모델들의 문제

 딥러닝이 최근 컴퓨터 비전 분야에서 SOTA를 달성하는 강력한 성능을 보여주지만 가중치의 수가 너무 커 상당한 저장공간과 메모리 대역폭을 소비한다. (카페모델 기준 AlexNet > 200MB, VGG-16 > 500MB)

 

 에너지 소비량도 상당한데, 45nm CMOS 환경에서 32 bit 부동소수점에서 덧셈 연산시 0.9pJ을 소비하고, 32 bit SRAM 캐시에 접근시 5pJ, 32 bit DRAM에 접근시 640pJ을 소비한다. 큰 모델은 더 많은 저장공간을 요할테니 DRAM 접근시 더 비쌀 것이다. 10억개의 연결을 가진 신경망의 경우 20fps 연산시 DRAM 접근에 (20Hz)(1G)(640pJ)로 12.8W를 소비한다.

 

※ CMOS [Complementary Metal Oxide Semiconductor, 상보형 금속 산화 반도체] 마이크로프로세서나 S램 등 디지털 회로를 구성하는데 사용되는 집적회로의 한 종류.

 

Deep Compression

 저장 공간과 에너지의 요구를 줄여 거대한 모델을 모바일 장비에 배포할 수 있도록 하기 위해 Deep Compression을 제안한다. 이는 Fig. 1에서 보이는 것처럼 3 단계의 파이프라인으로 구성되어 있다.

 

  1. 네트워크의 불필요한 연결은 제거하고 가장 중요한 연결만 유지하는 가지치기(prune)을 한다.
  2. 가중치를 양자화(quantize)하여 여러 연결들이 같은 가중치를 공유하도록 한다.
    • 이 덕분에 효과적인 가중치를 의미하는 코드북과 색인만 저장하면 된다.
  3. 허프만 코딩으로 코드북의 편향된 분포의 이점을 취한다.

 

Network Pruning

다음 그림에서 볼 수 있듯 가지치기는 세 단계로 구성된다.

 

  1. 신경망의 연결을 보통 학습하듯 학습시킨다.
  2. 작은 가중치의 연결을 가지치기한다.
    • 임계값보다 작은 가중치 연결은 네트워크에서 제거
  3. 희소 연결을 유지하기 위해 최종 가중치를 재학습한다.

가지치기로 AlexNet에선 9배, VGG-16에선 13배 더 파라미터의 수를 줄였다.

 

 여기서 희소 구조는 CSR(Compressed Sparse Row)나 CSC(Compressed Sparse Column) 형식을 사용하여 정리된 결과로 저장한다. 이는 0이 아닌 값의 수를 \(a\), 행과 열의 수를 \(n\)이라 할때, \(2a+n+1\)개를 요한다.

 

※ CSR : 가로의 순서대로 재정렬하는 방법으로 행에 관여하여 정리 압축한 것을 CSR이라고 한다. 세로 순서대로 하면 CSC이다. 예시)

 

 이를 더욱 압축하기 위해서 색인을 절대 위치 대신 상대 위치로 저장한다. 그리고 이는 conv layer의 경우 8bit, fc layer의 경우 5bit로 인코딩한다. 만약에 인덱스의 수가 비트 수를 넘어가면 제로 패딩을 하여 해결한다.

 

Trained Quantization and Weight Sharing

 신경망 양자화와 가중치 공유는 가지치기 된 네트워크를 각 가중치를 표현할 비트 수를 줄여서 네트워크를 더욱 압축시킨다. 또 여러 연결들(multiple connections)이 같은 가중치를 공유하게 하여 효과적인 가중치(코드북을 의미하는 것 같음)의 수를 제한하고 이런 공유 가중치를 파인튜닝 한다.

 

 Fig. 3에서 나타난 대로 예시를 들어보자. 4개의 입력 뉴런과 4개의 출력 뉴런, 가중치는 4×4 행렬이 있다고 하자. 그림에서 가장 왼쪽 위의 4×4 가중치 행렬이고 왼쪽 아래 4×4 경사 행렬이다. 가중치는 4개의 색깔로 구별되듯 4개의 구간(bin)으로 양자화된다. 그리고 같은 구간에 있는 모든 가중치는 같은 값을 공유한다. 이 덕분에 공유 가중치 테이블에 작은 인덱스만 저장하면 된다.

 

 업데이트 되는 동안 모든 경사는 같은 색깔별로 그룹화 되고 그의 합으로 압축된다. 학습의 마지막 반복에서 이에 학습률을 곱하고 공유된 중심(shared centroids)과 뺄셈연산한다.

 

 가지치기 된 AlexNet의 경우 conv layer는 8-bit (256개의 공유된 가중치)로, fc layer는 5-bit (32개의 공유된 가중치)로 아무론 정확도의 손실 없이 양자화할 수 있다.

 

압축률을 계산하여보자. \(k\)개의 클러스터가 있을 때, 이 색인을 인코딩하기 위해선 \(log_{2}(k)\) bit만 있으면 된다. 또한 보통 \(n\)개의 연결이 있고 각 연결은 \(b\) bit로 표현되는 신경망의 경우 연결이 \(k\)개의 공유 가중치만 갖도록 제한하면 다음과 같은 압축률을 얻을 수 있다.

\[r=\frac{nb}{nlog_{2}(k)+kb}\]

위 그림의 예시의 경우 \(16*32/(4*32+2*16)=3.2\)의 압축률을 갖는다.

 

Weight Sharing

 학습된 신경망에서 각 레이어의 공유된 가중치를 식별하기 위해 k-means 클러스터링을 이용한다. 여기서 같은 클러스터라고 판단된 모든 가중치는 서로 같은 가중치를 공유한다. 가중치는 레이어별로 독립적이다.

 

 \(n\)개의 원본 가중치 \(W=\left\{w_{1},w_{2},…,w_{n}\right\}\)를 \(k\)개의 클러스터 \(C=\left\{c_{1},c_{2},…,c_{k}\right\}\), \(n \gg k\)로 만들고 이는 within-cluster sum of squares (WCSS)를 최소화한다.

 

Initialization of Shared Weights

 중심(Centroid) 초기값은 클러스터링 품질에 영향을 미치고 이는 네트워크의 예측 정확도에까지 영향을 미친다. 그래서 Forgy(random), Density-Based, Linear, 세 가지 초기화 방법을 평가한다.

 

 Fig. 4에는 AlexNet의 conv3 레어어의 원래 가중치의 분포(CDF는 파랑, PDF는 빨강)가 그려져 있다. 가지치기 이후엔 가중치는 쌍봉 분포를 이룬다. 그리고 그래프의 아래엔 서로 다른 3 가지의 초기화 방법의 효과적인 가중치(중심)를 그린 것이다.

 

Forgy (random)은 데이터셋에서 $k$개의 관측을 무작위로 선택하고 이를 초기 중심값으로 사용한다. 그래프에서 노란색 점이다. 쌍봉 분포엔 두 봉우리가 있기 때문에 Forgy 방법은 두 봉우리에 집중되는 경향이 있다.

 

Density-based 은 가중치의 CDF의 y 축에 선형적으로 배치하여 이의 x 축 값을 중심값으로 사용한다. 이는 그래프에서 파란색 점이다. 이는 중심값이 두 봉우리 사이에 밀집되지만 Forgy보단 흩어져 있다.

 

Linear 은 원래 가중치의 [min, max] 사이에 선형적으로 배치한다. 이는 가중치 분포에 invariant하며 위 두 방법에 비해 가장 흩어져 있다.

 

 

Learning both Weights and Connections for Efficient Neural Networks(2015)에 따르면 더 큰 가중치가 더 작은 가중치에 비해 더 중요한 역할을 한다고 한다. 그러나 큰 가중치는 상대적으로 적다. Forgy와 Density-based 초기화 방법은 절댓값이 큰 중심값을 조금만 갖기 때문에 이런 조금 있는 거대한 가중치에 대해 나쁜 표현력을 갖는다. Linear 초기화 방법은 이런 문제를 겪지 않는다. Fig. 8에서도 이런 주장과 같이 uniform(Linear)가 가장 높은 정확도를 갖는다.

 

 

Feed-Forward and Backpropagation

1차원 k-mean 클러스터링의 중심은 공유 가중치이다. 가중치 테이블을 조회하는 순전파 단계와 역전파 단계 동안 간접 참조를 한다. 공유 가중치 테이블에 대한 인덱스는 각 연결에 대해 저장되고, 역전파 중에 각 공유 가중치에 대한 기울기가 계산되어 공유 가중치를 업데이트 한다. 이 과정은 Fig. 3에 나와있다.

 

\(L\)을 손실, 열을 \(i\), 행을 \(j\)라 표현할 때 가중치는 \(W_{ij}\), 가중치 요소의 중심값 인덱스는 \(I_{ij}\), 레이어의 \(k\)번째 중심값은 \(C_{k}\), 그리고 지시함수 \(\mathbb{1}(.)\)으로 중심의 경사는 다음과 같이 계산된다.

 

Huffman Coding

허프만 코딩은 비손실 데이터 압축에 자주 쓰인다. 이는 소스 심볼을 인코딩하기 위해 가변 코드 단어를 사용한다. 테이블은 각 심볼의 발생 확률에서 구해지며 더 자주 사용되는 심볼은 더 적은 비트로 표현된다. Fig. 5는 AlexNet의 마지막 완전 연결층의 양자화된 가중치와 희소 행렬의 인덱스의 확률 분포를 보여준다.를 보여준다. 각 분포는 각각 두 개의 봉우리와 20 미만으로 편향되어 있다. 실험에선 이 허프만 코딩이 이 균일하지 않은 분포로 저장 공간을 2~30% 절약한다는 것을 확인할 수 있다.

 

 

실험

가지치기, 양자화, 허프만 코딩은 총 4개의 신경망에 적용하였고, 두 개는 MNIST, 두 개는 ImageNet 데이터셋에 적용하였다. 압축 파이프라인은 네트워크 용량을 정확도 손실 없이 35~49배 절약하였다. AlexNet의 경우 240MB에서 6.9MB까지 줄어 SRAM에 올릴 수 있을 정도로 작아졌다.

 

 

아래 Fig. 6은 양자화와 가지치기를 같이 하였을 때 정확도 손실이 3%대에 시작되어 둘이 합쳐졌을때 상당히 효과적인 것을 볼 수 있다.

 

Fig. 7은 FC layer, Conv layer, all layer에서 비슷한 모습을 보이는 것으로 보아 가지치기가 양자화와 잘 잘동하는 것을 보여준다.

 

다음 테이블에선 8/4 bit까지는 0.01%의 무시해도 될만큼 적은 에러 증가를 보였고 4/2 bit에서야 1.99%와 2.60%의 정확도 손실이 일어났다고 한다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함