이 논문(Deep Compression, Han·Mao·Dally, ICLR 2016)은 정확도를 거의 그대로 유지하면서 신경망 모델의 용량을 수십 배 줄이는 3단계 압축 파이프라인을 제안합니다.

  1. 가지치기(Pruning) - 영향이 적은 연결을 제거해 파라미터 수를 9~13배 줄입니다.
  2. 양자화/가중치 공유(Quantization & Weight Sharing) - 비슷한 가중치들을 k-평균으로 묶어 적은 수의 값(코드북)만 저장하고, 각 연결은 그 값을 가리키는 인덱스만 저장합니다.
  3. 허프만 코딩(Huffman Coding) - 남은 값과 인덱스의 편향된 분포를 활용해 한 번 더 압축합니다.

이 세 단계를 합쳐 AlexNet은 240MB→6.9MB(35배), VGG-16은 552MB→11.3MB(49배)로 줄였는데, 정확도 손실은 거의 없습니다. 모델이 이렇게 작아지면 에너지 소모가 큰 DRAM 대신 온칩 SRAM에 올릴 수 있어, 모바일·임베디드 기기에서 신경망을 더 빠르고 적은 전력으로 돌릴 수 있게 됩니다.

이 논문은, 이후 모바일/엣지 AI 분야에서 표준처럼 쓰이는 "가지치기 + 양자화" 압축 파이프라인의 기본 틀을 제시했고, 실제로 EIE 같은 전용 하드웨어 가속기 연구로까지 이어진 영향력 큰 논문입니다.


Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding

Song Han, Huizi Mao, William J. Dally (Stanford University / Tsinghua University / NVIDIA)
Published as a conference paper at ICLR 2016 (arXiv:1510.00149v5)

Abstract (초록)

신경망(Neural Network)은 연산량과 메모리 사용량이 모두 크기 때문에, 하드웨어 리소스가 제한된 임베디드 시스템(embedded system)에 배포하기 어렵습니다. 이 문제를 해결하기 위해 저자들은 "Deep Compression"이라는 3단계 파이프라인(pipeline)을 제안합니다. 이 파이프라인은 가지치기(pruning), 훈련된 양자화(trained quantization), 허프만 코딩(Huffman coding)으로 구성되며, 이 세 단계가 함께 작동하여 정확도 손실 없이 신경망의 저장 용량을 35배에서 49배까지 줄여줍니다.

전체 과정은 다음과 같습니다.

  1. 먼저 중요한 연결(connection)만 학습하여 네트워크를 가지치기(prune)합니다.
  2. 다음으로 가중치(weight)를 양자화(quantize)하여 가중치 공유(weight sharing)를 적용합니다.
  3. 마지막으로 허프만 코딩(Huffman coding)을 적용합니다.

앞의 두 단계를 거친 뒤에는 남은 연결과 양자화된 중심값(centroid)을 재학습(retrain)하여 미세 조정(fine-tune)합니다.

  • 가지치기(Pruning)는 연결 수를 9배에서 13배까지 줄여줍니다.
  • 양자화(Quantization)는 이후 각 연결을 표현하는 비트 수를 32비트에서 5비트로 줄여줍니다.

ImageNet 데이터셋에서, 제안한 방법은 AlexNet의 저장 용량을 35배 줄여 240MB에서 6.9MB로 만들었으며 정확도 손실은 없었습니다. VGG-16의 경우 49배를 줄여 552MB에서 11.3MB로 만들었고, 이 경우에도 정확도 손실은 없었습니다. 이를 통해 모델을 온칩(on-chip) SRAM 캐시에 올릴 수 있게 되어, 에너지 소모가 큰 오프칩(off-chip) DRAM 메모리에 의존할 필요가 없어집니다. 이 압축 방법은 애플리케이션 크기와 다운로드 대역폭이 제한된 모바일 애플리케이션에서 복잡한 신경망을 사용할 수 있게 해줍니다. CPU, GPU, 모바일 GPU에서 벤치마크한 결과, 압축된 네트워크는 레이어 단위(layerwise)로 3배에서 4배의 속도 향상(speedup)과 3배에서 7배의 에너지 효율(energy efficiency) 향상을 보였습니다.

1. Introduction (서론)

심층 신경망(Deep Neural Network)은 컴퓨터 비전(computer vision) 분야에서 최신 기술(state-of-the-art)로 발전해 왔습니다. 그러나 이러한 신경망은 매우 강력한 만큼, 막대한 수의 가중치가 상당한 저장 공간과 메모리 대역폭(memory bandwidth)을 소비합니다. 예를 들어 AlexNet의 Caffemodel은 200MB가 넘고, VGG-16의 Caffemodel은 500MB가 넘습니다. 이는 심층 신경망을 모바일 시스템에 배포하기 어렵게 만드는 주요 원인입니다.

이 논문은 신경망을 모바일에 배포할 때 발생하는 두 가지 핵심 문제를 짚습니다.

 

첫 번째 문제: 저장 공간(storage)

Baidu, Facebook과 같은 모바일 중심 회사들은 다양한 앱스토어(App Store)를 통해 앱을 업데이트하는데, 이때 바이너리(binary) 파일의 크기에 매우 민감합니다. 예를 들어 App Store는 "100MB가 넘는 앱은 Wi-Fi에 연결해야 다운로드할 수 있다"는 제한을 두고 있습니다. 따라서 바이너리 크기를 100MB 늘리는 기능은 10MB 늘리는 기능보다 훨씬 더 엄격한 검토를 받게 됩니다. 심층 신경망을 모바일에서 구동하면 더 나은 프라이버시(privacy), 적은 네트워크 대역폭 사용, 실시간(real-time) 처리 등의 장점이 있지만, 막대한 저장 공간 부담이 이를 가로막습니다.

 

두 번째 문제: 에너지 소비(energy consumption)

대형 신경망을 구동하려면 가중치를 가져오기 위한 많은 메모리 대역폭과, 내적(dot product) 연산을 위한 많은 계산이 필요하며, 이는 상당한 에너지를 소모합니다. 모바일 기기는 배터리 제약이 있기 때문에, 신경망처럼 전력을 많이 소모하는 애플리케이션은 배치하기 어렵습니다.

에너지 소비는 주로 메모리 접근(memory access)에 의해 좌우됩니다. 45nm CMOS 공정 기준으로, 32비트 부동소수점 덧셈(add)은 0.9pJ, 32비트 SRAM 캐시 접근은 5pJ, 32비트 DRAM 메모리 접근은 640pJ를 소비합니다. 즉 DRAM 접근은 덧셈 연산보다 무려 3자릿수(order of magnitude)나 더 많은 에너지를 소비한다는 뜻입니다. 대형 네트워크는 온칩(on-chip) 저장 공간에 들어가지 못하기 때문에 더 비용이 큰 DRAM 접근이 필요합니다. 예를 들어 10억 개의 연결(connection)을 가진 신경망을 20fps로 구동한다면, $(20\text{Hz})(1\text{G})(640\text{pJ}) = 12.8\text{W}$ 가 오직 DRAM 접근에만 소요되며, 이는 일반적인 모바일 기기의 전력 한계를 훨씬 초과합니다.

 

Deep Compression의 목표와 3단계 파이프라인

이 논문의 목표는, 대형 신경망을 모바일 기기에 배포할 수 있도록 추론(inference)에 필요한 저장 공간과 에너지를 줄이는 것입니다. 이를 위해 저자들은 원래의 정확도를 유지하면서 신경망에 필요한 저장 공간을 줄이는 3단계 파이프라인인 "Deep Compression"을 제안합니다.

  1. 가지치기(Pruning): 중복된 연결을 제거하고, 가장 정보량이 많은 연결만 남깁니다.
  2. 양자화(Quantization): 가중치를 양자화하여 여러 연결이 같은 가중치를 공유(weight sharing)하도록 만듭니다. 이렇게 하면 코드북(codebook, 즉 유효 가중치들의 집합)인덱스(index)만 저장하면 됩니다.
  3. 허프만 코딩(Huffman coding): 유효 가중치(effective weight)들의 분포가 편향(biased)되어 있다는 점을 활용하여 허프만 코딩을 적용합니다.

이 논문의 핵심 통찰(main insight)은, 가지치기와 훈련된 양자화가 서로 간섭하지 않으면서 네트워크를 압축할 수 있다는 점이며, 이로 인해 매우 높은 압축률(compression rate)을 달성할 수 있다는 것입니다. 그 결과 필요한 저장 공간이 매우 작아져서(수 메가바이트 수준) 모든 가중치를 에너지 소모가 큰 오프칩 DRAM이 아닌 온칩(on-chip)에 캐싱할 수 있게 됩니다. 이러한 "Deep Compression"을 기반으로, 압축된 모델 위에서 동작하며 상당한 속도 향상과 에너지 효율 개선을 달성하는 EIE(Efficient Inference Engine) 하드웨어 가속기가 이후에 제안되었습니다(Han et al., 2016).

그림 1 (Figure 1): "가지치기 → 양자화 → 허프만 코딩"으로 이어지는 3단계 압축 파이프라인을 보여주는 다이어그램입니다. 가지치기는 가중치 수를 약 10배 줄이고, 양자화는 압축률을 27배 31배까지 추가로 개선하며, 허프만 코딩은 최종적으로 35배 49배의 압축률을 달성합니다. 이 압축률에는 희소 표현(sparse representation)을 위한 메타데이터까지 포함되어 있으며, 전체 압축 과정에서 정확도 손실은 발생하지 않습니다.

2. Network Pruning (네트워크 가지치기)

네트워크 가지치기(network pruning)는 CNN 모델을 압축하는 방법으로 널리 연구되어 왔습니다. 초기 연구들에서도 가지치기는 네트워크의 복잡도(complexity)와 과적합(over-fitting)을 줄이는 유효한 방법으로 입증되었습니다(LeCun et al., 1989; Hanson & Pratt, 1989; Hassibi et al., 1993; Ström, 1997). 최근에는 Han et al. (2015)이 최신(state-of-the-art) CNN 모델을 정확도 손실 없이 가지치기한 바 있으며, 이 논문은 그 접근법을 기반으로 합니다.

가지치기 과정은 Figure 1의 왼쪽에 나타난 것처럼 다음 3단계로 진행됩니다.

  1. 연결성 학습(learning the connectivity): 먼저 일반적인 네트워크 학습을 통해 연결성을 학습합니다.
  2. 작은 가중치 연결 제거(pruning small-weight connections): 가중치가 특정 임계값(threshold) 이하인 연결을 모두 네트워크에서 제거합니다.
  3. 재학습(retraining): 남아 있는 희소(sparse) 연결에 대한 최종 가중치를 학습하기 위해 네트워크를 재학습합니다.

이러한 가지치기를 통해 AlexNet과 VGG-16 모델의 파라미터 수를 각각 9배, 13배 줄일 수 있었습니다.

가지치기로 얻어진 희소 구조(sparse structure)는 CSR(Compressed Sparse Row) 또는 CSC(Compressed Sparse Column) 형식으로 저장합니다. 이 형식은 $2a + n + 1$ 개의 숫자를 필요로 하는데, 여기서 $a$는 0이 아닌 원소(non-zero element)의 개수, $n$은 행 또는 열의 개수입니다.

압축률을 더 높이기 위해, 절대 위치(absolute position)가 아니라 인덱스 차이(index difference)를 저장하며, 이 차이값은 컨볼루션(convolution) 레이어에서는 8비트, FC(fully-connected) 레이어에서는 5비트로 인코딩합니다. 만약 인덱스 차이가 표현 가능한 범위를 초과하면(예: 3비트로 표현 가능한 최댓값인 8을 초과하는 경우), Figure 2에서 보여주는 것처럼 0으로 채워진 필러(filler zero)를 삽입하는 제로 패딩(zero padding) 방식을 사용합니다.

그림 2 (Figure 2) : 상대 인덱스(relative index)를 이용해 행렬의 희소성(sparsity)을 표현하는 방법을 보여주는 도식입니다. 인덱스 차이가 표현 범위를 넘어설 때 오버플로(overflow)를 방지하기 위해 필러 0(filler zero)을 채워 넣는 과정을 나타냅니다.

3. Trained Quantization and Weight Sharing (훈련된 양자화와 가중치 공유)

네트워크 양자화(quantization)와 가중치 공유(weight sharing)는, 각 가중치를 표현하는 데 필요한 비트 수를 줄여 가지치기된 네트워크를 한층 더 압축합니다. 핵심 아이디어는, 여러 개의 연결이 동일한 가중치를 공유하도록 하여 저장해야 할 "유효 가중치(effective weight)"의 개수를 제한하고, 이후 이 공유 가중치들을 미세 조정(fine-tune)하는 것입니다.

그림 3 (Figure 3) : 스칼라 양자화(scalar quantization)를 통한 가중치 공유(weight sharing, 위쪽)와 중심값 미세 조정(centroid fine-tuning, 아래쪽)을 보여주는 다이어그램입니다.

Figure 3을 예로 들면, 입력 뉴런(neuron) 4개와 출력 뉴런 4개를 가진 레이어가 있다고 할 때 가중치는 $4\times4$ 행렬이 됩니다. 왼쪽 위는 원래의 $4\times4$ 가중치 행렬, 왼쪽 아래는 $4\times4$ 그래디언트(gradient) 행렬입니다. 이 가중치들을 4개의 빈(bin, 4가지 색으로 표시)으로 양자화하면, 같은 빈에 속한 모든 가중치는 동일한 값을 공유하게 됩니다. 따라서 각 가중치는 공유 가중치 테이블(table of shared weights)에 대한 작은 인덱스(index)만 저장하면 됩니다. 업데이트 단계에서는 같은 색(같은 빈)에 속한 모든 그래디언트를 모아서 합산한 뒤, 학습률(learning rate)을 곱해 이전 이터레이션(iteration)의 공유 중심값(shared centroid)에서 빼줍니다.

가지치기된 AlexNet의 경우, 각 컨볼루션(CONV) 레이어는 8비트(256개의 공유 가중치)로, 각 FC 레이어는 5비트(32개의 공유 가중치)로 양자화해도 정확도 손실이 발생하지 않았습니다.

 

압축률(compression rate) 계산

$k$개의 클러스터(cluster)가 있을 때, 인덱스를 인코딩하는 데 필요한 비트 수는 $\log_2(k)$입니다. 일반적으로, $n$개의 연결을 가지며 각 연결을 $b$비트로 표현하는 네트워크에서, 연결들이 $k$개의 공유 가중치만 갖도록 제한하면 압축률은 다음과 같습니다.

$$r = \frac{nb}{n\log_2(k) + kb} \tag{1}$$

Figure 3의 예시에서는, 입력 4개·출력 4개인 단일 레이어 신경망의 가중치가 원래 $4\times4=16$개였지만, 비슷한 가중치들을 묶어 4개의 공유 가중치(파란색, 초록색, 빨간색, 주황색)만 사용합니다. 원래는 16개의 가중치를 각각 32비트로 저장해야 했지만, 이제는 4개의 유효 가중치(각 32비트)와 16개의 2비트 인덱스만 저장하면 되므로, 압축률은 $16 \times 32 / (4 \times 32 + 2 \times 16) = 3.2$가 됩니다.

3.1 Weight Sharing (가중치 공유)

각 레이어별로 공유 가중치를 결정하기 위해 k-평균 클러스터링(k-means clustering)을 사용합니다. 이를 통해 같은 클러스터에 속한 모든 가중치는 동일한 값을 공유하게 됩니다. 가중치 공유는 레이어 간(across layers)에는 적용되지 않습니다. $n$개의 원래 가중치 $W={w_1, w_2, \dots, w_n}$ 을 $k$개의 클러스터 $C={c_1, c_2, \dots, c_k}$ ($n \gg k$)로 나누되, 클러스터 내 분산의 합(within-cluster sum of squares, WCSS)이 최소가 되도록 합니다.

$$\arg\min_{C} \sum_{i=1}^{k}\sum_{w \in c_i} |w - c_i|^2 \tag{2}$$

이 방법은 HashNet(Chen et al., 2015)과는 다릅니다. HashNet에서는 네트워크가 학습 데이터를 보기 전에 해시 함수(hash function)에 의해 가중치 공유가 미리 결정되는 반면, 이 논문의 방법은 네트워크가 완전히 학습된 이후에 가중치 공유를 결정하므로, 공유되는 가중치가 원래 네트워크를 더 잘 근사(approximate)할 수 있습니다.

3.2 Initialization of Shared Weights (공유 가중치의 초기화)

중심값(centroid) 초기화는 클러스터링의 품질에 영향을 주며, 결과적으로 네트워크의 예측 정확도에도 영향을 미칩니다. 이 논문에서는 세 가지 초기화 방법, 즉 Forgy(임의/random), 밀도 기반(density-based), 선형(linear) 초기화를 비교합니다.

그림 4 (Figure 4) : (왼쪽) 세 가지 중심값 초기화 방법을 비교한 그래프입니다. (오른쪽) 가중치의 분포(파란색)와, 미세 조정 전(녹색 십자) 및 후(빨간색 점)의 코드북(codebook) 분포를 보여주는 그래프입니다.

Figure 4의 왼쪽 그래프는 가지치기 이후 AlexNet의 conv3 레이어의 가중치 분포(CDF는 파란색, PDF는 빨간색)를 보여줍니다. 가지치기 후 가중치는 양봉 분포(bimodal distribution)의 형태를 띱니다. 아래쪽 그래프는 세 가지 초기화 방법에 따른 유효 가중치(중심값)들을 파란색·빨간색·노란색으로 표시한 것이며, 이 예시에서는 13개의 클러스터를 사용합니다.

  • Forgy(임의/random) 초기화: 데이터셋에서 $k$개의 관측값을 임의로 선택하여 초기 중심값으로 사용합니다(노란색으로 표시). 가중치 분포에 두 개의 봉우리(peak)가 있기 때문에, Forgy 방법은 이 두 봉우리 주변에 중심값이 몰리는 경향을 보입니다.
  • 밀도 기반(density-based) 초기화: 가중치의 CDF를 y축 방향으로 선형 등분한 다음, CDF와의 교점을 찾고, 다시 x축에서의 교점을 찾아 이를 중심값으로 삼습니다(파란색 점으로 표시). 이 방법은 두 봉우리 주변에 중심값을 더 밀집시키지만, Forgy 방법보다는 더 넓게 퍼져 있습니다.
  • 선형(linear) 초기화: 원래 가중치의 [min, max] 범위 안에서 중심값들을 균등하게(linearly) 배치합니다. 이 방법은 가중치의 분포와 무관하며, 앞의 두 방법에 비해 가장 넓게 퍼진(scattered) 분포를 갖습니다.

큰 가중치(larger weights)는 작은 가중치보다 더 중요한 역할을 하지만(Han et al., 2015), 그 개수는 훨씬 적습니다. 따라서 Forgy 초기화와 밀도 기반 초기화 모두, 절댓값이 큰 가중치를 담당하는 중심값이 거의 없어 이러한 소수의 큰 가중치들을 제대로 표현하지 못하는 문제가 있습니다. 반면 선형 초기화는 이러한 문제를 겪지 않습니다. 실험(Experiments) 절에서는 클러스터링과 미세 조정을 거친 뒤 각 초기화 방법의 정확도를 비교하며, 선형 초기화가 가장 좋은 성능을 보임을 보여줍니다.

3.3 Feed-forward and Back-propagation (순전파와 역전파)

1차원 k-평균 클러스터링의 중심값(centroid)이 바로 공유 가중치(shared weight)가 됩니다. 순전파(feed-forward)와 역전파(back-propagation) 과정에서는 가중치 테이블을 조회(lookup)하는 한 단계의 간접 참조(indirection)가 추가됩니다. 즉, 각 연결마다 공유 가중치 테이블에 대한 인덱스가 저장됩니다. 역전파 시에는 각 공유 가중치에 대한 그래디언트를 계산하여 해당 공유 가중치를 업데이트합니다. 이 과정은 Figure 3에서 이미 설명되었습니다.

손실(loss)을 $L$, $i$행 $j$열의 가중치를 $W_{ij}$, 원소 $W_{ij}$가 속한 중심값의 인덱스를 $I_{ij}$, 레이어의 $k$번째 중심값을 $C_k$라고 하겠습니다. 지시 함수(indicator function) $\mathbb{1}(\cdot)$을 사용하면, 중심값에 대한 그래디언트는 다음과 같이 계산됩니다.

$$\frac{\partial L}{\partial C_k} = \sum_{i,j} \frac{\partial L}{\partial W_{ij}} \frac{\partial W_{ij}}{\partial C_k} = \sum_{i,j} \frac{\partial L}{\partial W_{ij}} \mathbb{1}(I_{ij}=k) \tag{3}$$

즉, 같은 클러스터 $k$에 속한 모든 가중치들의 그래디언트를 합산한 값이, 그 클러스터의 공유 중심값 $C_k$에 대한 그래디언트가 됩니다.

4. Huffman Coding (허프만 코딩)

허프만 코딩(Huffman coding)은 무손실 데이터 압축(lossless data compression)에 흔히 사용되는 최적의 프리픽스 코드(prefix code)입니다(Van Leeuwen, 1976). 가변 길이(variable-length)의 코드워드(codeword)를 사용하여 소스 심볼(source symbol)을 인코딩하며, 이 코드 테이블은 각 심볼의 출현 확률(occurrence probability)로부터 만들어집니다. 즉, 더 자주 등장하는 심볼일수록 더 적은 비트로 표현됩니다.

그림 5 (Figure 5) : AlexNet의 마지막 FC 레이어에서, 양자화된 가중치(왼쪽)와 희소 행렬 인덱스(오른쪽)의 확률 분포를 보여주는 그래프입니다.

 

Figure 5는 AlexNet의 마지막 FC 레이어에 대해, 양자화된 가중치 값과 희소 행렬(sparse matrix) 인덱스의 확률 분포를 보여줍니다. 두 분포 모두 편향(biased)되어 있습니다. 양자화된 가중치 대부분은 두 봉우리 주변에 분포하며, 희소 행렬의 인덱스 차이(index difference)는 20을 넘는 경우가 거의 없습니다. 실험 결과, 이렇게 균일하지 않게 분포된(non-uniformly distributed) 값들에 허프만 코딩을 적용하면 네트워크 저장 공간의 20%~30%를 추가로 절감할 수 있습니다.

참고
허프만 코딩(Huffman coding)
은 한마디로 "자주 나오는 건 짧게, 가끔 나오는 건 길게 표현하자"는 압축 방법입니다.
예를 들어 어떤 문장에 알파벳 A, B, C, D가 등장하는데, A가 압도적으로 자주 나오고 D는 거의 안 나온다고 해봅시다. 모든 문자를 똑같이 2비트(00, 01, 10, 11)로 표현하면 비효율적입니다. 대신 자주 나오는 A에는 가장 짧은 코드(예: 0)를, 드물게 나오는 D에는 좀 더 긴 코드(예: 110)를 부여하면, 전체적으로 필요한 비트 수가 줄어듭니다.
이렇게 코드를 만드는 절차는 대략 이렇습니다.
각 심볼(문자, 숫자, 가중치 값 등)이 얼마나 자주 등장하는지 빈도를 셉니다. 빈도가 가장 낮은 두 개를 묶어 하나의 노드로 합치고, 그 합친 빈도를 다시 목록에 넣습니다. 이 과정을 반복하면 트리(tree) 구조가 만들어지는데, 이 트리에서 왼쪽 가지는 0, 오른쪽 가지는 1로 표시합니다. 루트에서 각 심볼까지 내려가는 경로의 0/1 값들이 그 심볼의 코드가 됩니다. 자주 나오는 심볼은 트리 상단 가까이 있어서 코드가 짧고, 드문 심볼은 아래쪽에 있어서 코드가 깁니다.
중요한 점은 이 코드가 "프리픽스 코드(prefix code)"라서, 어떤 코드도 다른 코드의 앞부분이 되지 않습니다. 그래서 디코딩할 때 구분자 없이도 어디서 한 심볼이 끝나고 다음 심볼이 시작하는지 명확하게 알 수 있습니다.
Deep Compression 논문에서는 가지치기·양자화를 거친 뒤 남은 가중치 값들과 인덱스 값들의 분포가 매우 편향(특정 값들이 훨씬 자주 등장)되어 있다는 점을 활용해서, 이 허프만 코딩을 마지막 단계로 적용함으로써 저장 공간을 추가로 20~30% 정도 더 줄였습니다.

5. Experiments (실험)

이 논문에서는 MNIST 데이터셋 대상 2개, ImageNet 데이터셋 대상 2개, 총 4개의 네트워크에 대해 가지치기, 양자화, 허프만 코딩을 적용했습니다. 가지치기 전후의 네트워크 파라미터 수와 정확도는 아래 표(Table 1)에 정리되어 있습니다. 이 압축 파이프라인은 네트워크에 따라 35배에서 49배까지 저장 공간을 절감하면서도 정확도 손실이 전혀 없습니다. AlexNet의 전체 크기는 240MB에서 6.9MB로 줄어들었는데, 이는 온칩(on-chip) SRAM에 들어갈 수 있을 정도로 작은 크기여서, 에너지를 많이 소모하는 DRAM 메모리에 모델을 저장할 필요가 없어집니다.

학습은 Caffe 프레임워크(Jia et al., 2014)로 수행되었습니다. 가지치기는 블롭(blob)에 마스크(mask)를 추가하여 가지치기된 연결의 업데이트를 막는 방식으로 구현되었습니다. 양자화와 가중치 공유는, 공유 가중치를 저장하는 코드북(codebook) 구조를 유지하고, 각 레이어의 그래디언트를 계산한 뒤 인덱스별로 그룹화(group-by-index)하는 방식으로 구현되었습니다. 각 공유 가중치는 해당 버킷(bucket)에 속한 모든 그래디언트로 업데이트됩니다. 허프만 코딩은 학습이 필요 없으며, 모든 미세 조정이 끝난 뒤 오프라인(offline)으로 적용됩니다.

표 1 (Table 1) : 압축 파이프라인이 정확도 손실 없이 35배에서 49배까지 파라미터 저장 공간을 절감함을 보여주는 표입니다(네트워크별 Top-1/Top-5 오류율, 파라미터 크기, 압축률 비교).

 

5.1 LeNet-300-100 and LeNet-5 on MNIST

먼저 MNIST 데이터셋에서 LeNet-300-100과 LeNet-5(LeCun et al., 1998) 네트워크로 실험을 진행했습니다.

  • LeNet-300-100: 300개, 100개의 뉴런을 가진 두 개의 은닉층(hidden layer)으로 구성된 완전 연결 네트워크(fully connected network)로, MNIST에서 1.6%의 오류율을 달성합니다.
  • LeNet-5: 2개의 컨볼루션 레이어와 2개의 완전 연결 레이어로 구성된 컨볼루션 네트워크로, MNIST에서 0.8%의 오류율을 달성합니다.

표 2 (Table 2) : LeNet-300-100의 레이어별 압축 통계입니다(P: 가지치기, Q: 양자화, H: 허프만 코딩 적용 시의 가중치/인덱스 비트 수 및 압축률).
표 3 (Table 3) : LeNet-5의 레이어별 압축 통계입니다(P: 가지치기, Q: 양자화, H: 허프만 코딩 적용 시의 가중치/인덱스 비트 수 및 압축률).

 

두 네트워크 모두에서, 압축률은 코드북과 희소 인덱스(sparse index)에 따른 오버헤드까지 포함한 값입니다. LeNet-300-100과 LeNet-5의 전체 압축률은 가지치기와 양자화만으로 각각 32배까지 도달했으며, 여기에 허프만 코딩을 추가하면 40배, 39배까지 향상됩니다. 즉, 압축 효과의 대부분은 가지치기와 양자화에서 나오고, 허프만 코딩은 추가적인 소폭의 이득(marginal gain)을 제공합니다.

5.2 AlexNet on ImageNet

다음으로는 1.2M개의 학습 샘플과 50k개의 검증 샘플을 가진 ImageNet ILSVRC-2012 데이터셋에서 Deep Compression의 성능을 평가했습니다. 기준 모델(reference model)로는 6,100만 개의 파라미터를 가지며 Top-1 정확도 57.2%, Top-5 정확도 80.3%를 달성하는 AlexNet Caffe 모델을 사용했습니다.

표 4 (Table 4) : AlexNet의 레이어별 압축 통계입니다(P: 가지치기, Q: 양자화, H: 허프만 코딩 적용 시의 가중치/인덱스 비트 수 및 압축률).

표 4에 따르면, AlexNet은 정확도에 영향을 주지 않고 원래 크기의 2.88%까지 압축할 수 있습니다. 각 CONV 레이어에는 256개의 공유 가중치가 있으며 이는 8비트로 인코딩되고, 각 FC 레이어에는 32개의 공유 가중치가 있으며 이는 단 5비트로 인코딩됩니다. 상대 희소 인덱스(relative sparse index)는 4비트로 인코딩됩니다. 허프만 코딩은 여기에 추가로 22%를 압축하여, 최종적으로 총 35배의 압축률을 달성합니다.

5.3 VGG-16 on ImageNet

AlexNet에서의 성공적인 결과를 바탕으로, 더 크고 최신인 VGG-16(Simonyan & Zisserman, 2014) 네트워크에 대해서도 같은 ILSVRC-2012 데이터셋에서 실험을 진행했습니다. VGG-16은 컨볼루션 레이어가 훨씬 많지만, 완전 연결 레이어는 여전히 3개뿐입니다. 동일한 방법론을 적용하여, 컨볼루션 레이어와 완전 연결 레이어 모두를 적극적으로(aggressively) 압축하여 유효 가중치의 수를 크게 줄였습니다.

표 5 (Table 5) : VGG-16의 레이어별 압축 통계입니다(P: 가지치기, Q: 양자화, H: 허프만 코딩 적용 시의 가중치/인덱스 비트 수 및 압축률).

 

VGG-16 네트워크 전체는 49배로 압축되었습니다. CONV 레이어의 가중치는 8비트, FC 레이어의 가중치는 5비트로 표현되며, 이는 정확도에 영향을 주지 않습니다. 가장 큰 두 개의 완전 연결 레이어는 각각 원래 크기의 1.6% 미만으로 가지치기될 수 있었습니다. 이러한 축소는 실시간 이미지 처리(real time image processing)에서 매우 중요한데, 배치 처리(batch processing)와 달리 실시간 처리에서는 이러한 레이어들의 재사용(reuse)이 거의 없기 때문입니다. 또한 하나의 CONV 패스(pass)를 여러 FC 패스에서 사용하는 빠른 객체 검출(object detection) 알고리즘에서도 이는 중요합니다. 이렇게 축소된 레이어는 온칩 SRAM에 들어갈 수 있어 대역폭 요구량도 적당한 수준이 되지만, 이러한 축소가 없다면 대역폭 요구량은 감당할 수 없는 수준이 됩니다.

6. Discussions (논의)

6.1 Pruning and Quantization Working Together (가지치기와 양자화의 결합)

그림 6 (Figure 6) : 가지치기와 양자화를 단독으로 적용했을 때와 함께 적용했을 때, 압축률에 따른 정확도 변화를 비교한 그래프입니다. 두 방법을 결합했을 때 가장 좋은 성능을 보여줍니다.
그림 7 (Figure 7) : 가지치기가 양자화에 미치는 영향을 보여주는 세 개의 그래프입니다(왼쪽: CONV 레이어, 중앙: FC 레이어, 오른쪽: 전체 레이어). 점선은 가지치기 없이 양자화만 적용한 경우, 실선은 가지치기와 양자화를 모두 적용한 경우를 나타냅니다.

Figure 6은 가지치기와 양자화를 단독으로 또는 함께 적용했을 때, 압축률에 따른 정확도를 보여줍니다. 각각 단독으로 적용한 경우(보라색, 노란색 선), 가지치기된 네트워크와 양자화된 네트워크 모두 원래 크기의 8% 이하로 압축되면 정확도가 크게 떨어지기 시작합니다. 하지만 두 방법을 결합하면(빨간색 선), 네트워크를 원래 크기의 3%까지 압축해도 정확도 손실이 없습니다. 그래프의 가장 오른쪽에는 SVD 방식의 결과도 함께 비교되어 있는데, SVD는 계산 비용은 낮지만 압축률이 좋지 않습니다.

Figure 7의 세 그래프는 CONV 레이어(왼쪽), FC 레이어(중앙), 전체 레이어(오른쪽)에서, 연결당 비트 수(bits per connection)가 줄어들 때 정확도가 어떻게 변하는지를 Top-1과 Top-5 정확도로 각각 보여줍니다. 점선은 가지치기 없이 양자화만 적용한 경우, 실선은 가지치기와 양자화를 모두 적용한 경우를 나타냅니다. 두 선 사이에는 거의 차이가 없는데, 이는 가지치기가 양자화와 잘 어우러져 작동함을 보여줍니다.

양자화가 가지치기된 네트워크에서도 잘 작동하는 이유는, 가지치기 전 AlexNet은 양자화해야 할 가중치가 6,000만 개이지만 가지치기 후에는 670만 개에 불과하기 때문입니다. 동일한 수의 중심값(centroid)을 사용한다면, 가중치 수가 적은 쪽이 양자화 오차도 더 작습니다.

또한 Figure 7의 왼쪽 두 그래프를 보면, CONV 레이어는 FC 레이어보다 더 높은 정밀도(precision)의 비트 수를 필요로 합니다. CONV 레이어는 4비트 미만에서 정확도가 크게 떨어지지만, FC 레이어는 더 강건(robust)하여 2비트가 되기 전까지는 정확도가 크게 떨어지지 않습니다.

6.2 Centroid Initialization (중심값 초기화)

그림 8 (Figure 8) : 세 가지 초기화 방법(Forgy/임의, 밀도 기반, 선형)에 따른 정확도를 비교한 그래프입니다(왼쪽: Top-1 정확도, 오른쪽: Top-5 정확도). 선형 초기화가 가장 좋은 결과를 보여줍니다.

 

Figure 8은 네트워크를 2~8비트로 양자화했을 때, 세 가지 초기화 방법에 따른 Top-1 정확도(왼쪽)와 Top-5 정확도(오른쪽)를 비교합니다. 3비트인 경우를 제외한 모든 경우에서, 선형 초기화(linear initialization)가 밀도 기반 초기화와 임의 초기화보다 더 우수한 성능을 보였습니다.

선형 초기화의 초기 중심값들은 x축을 따라 최솟값에서 최댓값까지 균등하게 분포합니다. 이는 큰 가중치를 더 잘 유지하는 데 도움이 되는데, 네트워크 가지치기 연구(Han et al., 2015)에서도 나타났듯이 큰 가중치가 작은 가중치보다 더 중요한 역할을 하기 때문입니다. 임의 초기화와 밀도 기반 초기화는 모두 큰 중심값을 유지하지 못합니다. 이 두 방법에서는 큰 가중치의 수가 적기 때문에, 큰 가중치들이 작은 중심값으로 클러스터링되어 버립니다. 반면 선형 초기화는 큰 가중치들이 큰 중심값을 형성할 수 있는 더 좋은 기회를 제공합니다.

6.3 Speedup and Energy Efficiency (속도 향상과 에너지 효율)

그림 9 (Figure 9): 원래 네트워크와 비교했을 때, 가지치기된 네트워크 레이어가 CPU에서 평균 3배, GPU에서 3.5배, 모바일 GPU에서 4.2배의 속도 향상을 달성함을 보여주는 그래프입니다(배치 크기 = 1, 실시간 처리 기준, CPU 대비 정규화된 성능).
그림 10 (Figure 10) : 원래 네트워크와 비교했을 때, 가지치기된 네트워크 레이어가 CPU에서 평균 7배, GPU에서 3.3배, 모바일 GPU에서 4.2배 적은 에너지를 소비함을 보여주는 그래프입니다(배치 크기 = 1, 실시간 처리 기준, CPU 대비 정규화된 에너지).

 

Deep Compression은 자율주행차(autonomous vehicle)의 임베디드 프로세서에서 보행자 검출(pedestrian detection)을 수행하는 것과 같이, 실시간 추론(real-time inference)이 필요한 매우 지연(latency)에 민감한 모바일 애플리케이션을 목표로 합니다. 배치(batch)가 모일 때까지 기다리는 것은 상당한 지연을 추가하므로, 성능과 에너지 효율을 벤치마크할 때 배치 크기 = 1인 경우를 기준으로 합니다. 배치 처리에 대한 사례는 부록 A(Appendix A)에서 다룹니다.

완전 연결(FC) 레이어는 모델 크기의 90% 이상을 차지하며, Deep Compression에 의해 가장 많이 압축되는 부분입니다(VGG-16에서는 가중치의 96%가 가지치기됩니다). Fast R-CNN(Girshick, 2015)과 같은 최신 객체 검출 알고리즘에서는, 압축되지 않은 모델 기준으로 전체 연산 시간의 최대 38%가 FC 레이어에서 소요됩니다. 따라서 AlexNet과 VGG-16의 FC6, FC7, FC8 레이어를 대상으로 벤치마크를 진행했습니다. 배치되지 않은 경우(non-batched case), 활성화(activation) 행렬은 단 하나의 열(column)을 가진 벡터(vector)이므로, 연산은 원래 모델의 경우 밀집(dense) 행렬-벡터 곱셈, 가지치기된 모델의 경우 희소(sparse) 행렬-벡터 곱셈으로 귀결됩니다. 현재 CPU와 GPU의 BLAS 라이브러리가 간접 조회(indirect lookup)와 상대 인덱싱(relative indexing)을 지원하지 않기 때문에, 양자화된 모델은 벤치마크 대상에서 제외했습니다.

벤치마크에는 데스크톱 프로세서로 NVIDIA GeForce GTX Titan X와 Intel Core i7-5930K(NVIDIA Digits Dev Box와 동일한 구성), 모바일 프로세서로 NVIDIA Tegra K1을 사용했습니다. GPU에서는 원래의 밀집 레이어에 대해 cuBLAS GEMV를, 가지치기된 희소 레이어에 대해서는 CSR 형식으로 저장한 뒤 GPU에서의 희소 행렬-벡터 곱셈에 최적화된 cuSPARSE CSRMV 커널을 사용했습니다. CPU에서는 원래의 밀집 모델에 MKL CBLAS GEMV를, 가지치기된 희소 모델에는 MKL SPBLAS CSRMV를 사용했습니다.

전력 소비를 측정할 때는 일관된 방식으로 측정하는 것이 중요합니다(NVIDIA, b). 이 논문에서는 애플리케이션 프로세서(AP)/SOC와 DRAM을 합친 사전 레귤레이션(pre-regulation) 전력을 비교합니다. CPU에서는 단일 소켓의 Haswell-E급 Core i7-5930K 프로세서에서 벤치마크를 수행했으며, Intel의 pcm-power 유틸리티로 CPU 소켓과 DRAM 전력을 측정했습니다. GPU에서는 nvidia-smi 유틸리티로 Titan X의 전력을 측정했습니다. 모바일 GPU에서는 Jetson TK1 개발 보드를 사용했고 외부 전력 측정기(power-meter)로 전체 전력 소비를 측정했으며, AC-DC 변환 손실 15%, 레귤레이터 효율 85%, 주변 부품(peripheral component)이 소비하는 전력 15%를 가정하여 Tegra K1의 AP+DRAM 전력을 산출했습니다.

CONV 비트 / FC 비트 Top-1 오류율 Top-5 오류율 Top-1 오류율 증가 Top-5 오류율 증가
32비트 / 32비트 42.78% 19.73% - -
8비트 / 5비트 42.78% 19.70% 0.00% -0.03%
8비트 / 4비트 42.79% 19.73% 0.01% 0.00%
4비트 / 2비트 44.77% 22.33% 1.99% 2.60%
표 6 (Table 6): 가중치 공유 및 양자화의 적극성(aggressiveness)에 따른 AlexNet의 정확도 비교 표입니다. 8/5비트 양자화는 정확도 손실이 없으며, 더 하드웨어 친화적인 8/4비트 양자화는 0.01%의 무시할 만한 정확도 손실만 발생합니다. 매우 적극적인 4/2비트 양자화의 경우 Top-1 1.99%p, Top-5 2.60%p의 정확도 손실이 발생합니다.

 

배치(batching) 여부에 따라 메모리 접근과 연산량의 비율 특성이 달라집니다. 입력 활성화(activation)들이 배치되어 행렬을 이루면 연산은 행렬-행렬 곱셈(matrix-matrix multiplication, MM)이 되며, 이때는 블로킹(blocking)을 통해 지역성(locality)을 개선할 수 있습니다. 행렬을 캐시에 맞게 블록 단위로 나누어 재사용하면, 메모리 접근량은 $O(n^2)$, 연산량은 $O(n^3)$ 수준이 되어, 메모리 접근과 연산량의 비율은 $1/n$ 수준이 됩니다.

반면 배치가 허용되지 않는 실시간 처리에서는 입력 활성화가 단일 벡터이고 연산은 행렬-벡터 곱셈(matrix-vector multiplication, MV)이 됩니다. 이 경우 메모리 접근량과 연산량이 모두 $O(n^2)$ 수준으로 같은 크기가 됩니다($1/n$이 아니라). 이는 MV 연산이 MM보다 훨씬 더 메모리에 의존적(memory-bounded)임을 의미하며, 따라서 배치를 사용하지 않는 경우 메모리 사용량을 줄이는 것이 매우 중요합니다.

Figure 9는 다양한 하드웨어에서 가지치기로 인한 속도 향상을 보여줍니다. 각 벤치마크마다 CPU/GPU/TK1의 밀집(dense)/가지치기(pruned) 네트워크에 대한 연산 시간을 6개의 열(column)로 나타내며, 시간은 CPU를 기준으로 정규화되어 있습니다. 배치 크기가 1일 때, 가지치기된 네트워크 레이어는 평균적으로 밀집 네트워크보다 3배에서 4배의 속도 향상을 얻었는데, 이는 메모리 사용량이 작아져 데이터 전송 오버헤드가 줄어들기 때문이며, 특히 캐시에 들어가지 못하는 대형 행렬에서 효과가 큽니다. 예를 들어 이 실험에서 가장 큰 레이어인 VGG-16의 FC6 레이어는 $25088 \times 4096 \times 4\text{ bytes} \approx 400\text{MB}$의 데이터를 가지는데, 이는 L3 캐시 용량을 훨씬 초과합니다.

지연에 덜 민감한(latency-tolerating) 애플리케이션에서는 배치를 통해 메모리 지역성을 개선할 수 있고, 가중치를 블록화하여 행렬-행렬 곱셈에서 재사용할 수 있습니다. 이 경우에는 가지치기된 네트워크의 장점이 사라집니다. 자세한 타이밍 결과는 부록 A에 제시되어 있습니다.

Figure 10은 다양한 하드웨어에서 가지치기로 인한 에너지 효율을 보여줍니다. 전력 소비량에 연산 시간을 곱하여 에너지 소비량을 구한 뒤, CPU를 기준으로 정규화하여 에너지 효율을 계산했습니다. 배치 크기가 1일 때, 가지치기된 네트워크 레이어는 평균적으로 밀집 네트워크보다 3배에서 7배 적은 에너지를 소비했습니다. nvidia-smi 기준으로 GPU 사용률(utilization)은 밀집/희소 두 경우 모두 99%였습니다.

6.4 Ratio of Weights, Index and Codebook (가중치, 인덱스, 코드북의 비율)

가지치기는 가중치 행렬을 희소(sparse)하게 만들기 때문에, 0이 아닌 원소들의 인덱스를 저장하기 위한 추가 공간이 필요합니다. 양자화는 코드북을 위한 저장 공간을 추가합니다. 앞의 실험 절에서는 이 두 요소를 이미 포함하여 압축률을 계산했습니다.

그림 11 (Figure 11) : 네 가지 네트워크를 양자화할 때, 가중치/인덱스/코드북 세 가지 요소가 차지하는 저장 공간 비율을 보여주는 그래프입니다.

Figure 11은 네 가지 네트워크를 양자화할 때 가중치, 인덱스, 코드북이라는 세 가지 요소가 차지하는 비율을 보여줍니다. 평균적으로 가중치와 희소 인덱스 모두 5비트로 인코딩되므로, 이 둘이 저장 공간의 절반씩을 차지합니다. 코드북의 오버헤드는 매우 작아서 대부분 무시할 수 있는 수준입니다.

 

표 7 (Table 7) : AlexNet에서 다른 압축 방법들과의 비교 표입니다. (Collins & Kohli, 2014)는 파라미터를 4배 줄였지만 정확도가 더 낮았습니다. Deep Fried Convnets(Yang et al., 2014)는 완전 연결 레이어에서 4배 미만의 파라미터를 줄였습니다. SVD는 파라미터를 줄이지만 최대 2%의 정확도 손실이 발생합니다. Network pruning(Han et al., 2015)은 인덱스 오버헤드를 포함하지 않은 상태에서 파라미터를 9배 줄였습니다. AlexNet과 유사한 다른 네트워크에서, (Denton et al., 2014)는 convnet의 선형 구조(linear structure)를 활용하여 레이어 단위로 2.4배에서 13.4배까지 압축했으며 단일 레이어 압축 시 0.9%의 정확도 손실이 있었습니다. (Gong et al., 2014)는 벡터 양자화(vector quantization)를 이용해 16배에서 24배까지 압축했고 1%의 정확도 손실이 있었습니다.

 

다른 비교 방법들(Fastfood, Collins & Kohli, SVD 등)에 비해, Deep Compression(가지치기+양자화+허프만 코딩)은 정확도를 거의 그대로 유지하면서 가장 높은 압축률을 달성함을 알 수 있습니다.

7. Related Work (관련 연구)

신경망은 일반적으로 과도하게 파라미터화(over-parametrized)되어 있으며, 딥러닝 모델에는 상당한 중복성(redundancy)이 존재합니다(Denil et al., 2013). 이는 연산과 메모리 사용 모두에서 낭비를 초래합니다. 이러한 중복성을 줄이기 위한 다양한 시도들이 있었습니다.

  • Vanhoucke et al. (2011)은 32비트 부동소수점 대신 8비트 정수(integer) 활성화를 사용하는 고정소수점(fixed-point) 구현을 탐구했습니다.
  • Hwang & Sung (2014)은 -1/0/+1의 삼진(ternary) 가중치와 3비트 활성화를 사용하는 고정소수점 네트워크에 대한 최적화 방법을 제안했습니다.
  • Anwar et al. (2015)은 L2 오차 최소화를 이용한 신경망 양자화를 통해 MNIST와 CIFAR-10에서 더 나은 정확도를 달성했습니다.
  • Denton et al. (2014)은 신경망의 선형 구조를 활용하여 파라미터에 대한 적절한 저랭크 근사(low-rank approximation)를 찾음으로써, 정확도를 원래 모델의 1% 이내로 유지했습니다.

이 논문의 실험적 성공은, $+1/0/-1$ 가중치를 가진 무작위(random-like) 희소 네트워크에 대한 이론적 연구(Arora et al., 2014)와도 맥락이 닿아 있습니다. 해당 연구는 이러한 네트워크가 (가역성reversibility 등의) 좋은 성질을 가지며, 다항 시간(polynomial time) 알고리즘으로 학습 가능함을 증명한 바 있습니다.

네트워크 파라미터를 버킷(bucket)으로 분류(binning)하여 버킷 내의 값만 저장하는 연구도 많이 진행되었습니다.

  • HashedNets(Chen et al., 2015)은 해시 함수를 이용해 연결 가중치를 무작위로 그룹화하여, 같은 해시 버킷에 속한 모든 연결이 하나의 파라미터 값을 공유하도록 합니다. 이 방법에서는 가중치 분류가 해시 함수에 의해 사전에 결정되며, 학습을 통해 결정되지 않으므로 이미지의 본질적 특성을 포착하지 못합니다.
  • (Gong et al., 2014)는 벡터 양자화(vector quantization)를 이용해 딥 convnet을 압축했고 1%의 정확도 손실이 발생했습니다.

두 방법 모두 완전 연결 레이어만 다루었으며, 컨볼루션 레이어는 다루지 않았습니다.

완전 연결 레이어를 전역 평균 풀링(global average pooling)으로 대체하여 파라미터 수를 줄이려는 시도들도 있었습니다. Network in Network(Lin et al., 2013)와 GoogLeNet(Szegedy et al., 2014)은 이러한 아이디어를 채택하여 여러 벤치마크에서 최신(state-of-the-art) 성능을 달성했습니다. 하지만 ImageNet에서 학습된 특징(feature)을 재사용하여 완전 연결 레이어만 미세 조정함으로써 새로운 작업에 적용하는 전이 학습(transfer learning)은 이 접근법에서는 더 어렵습니다. Szegedy et al. (2014)도 이 문제를 언급했으며, 이를 해결하기 위해 네트워크 상단에 선형(linear) 레이어를 추가하여 전이 학습을 가능하게 했습니다.

네트워크 가지치기는 네트워크 복잡도를 줄이고 과적합을 줄이는 데에도 사용되어 왔습니다. 초기 접근법으로는 편향된 가중치 감쇠(biased weight decay)(Hanson & Pratt, 1989)가 있었습니다. Optimal Brain Damage(LeCun et al., 1989)와 Optimal Brain Surgeon(Hassibi et al., 1993)은 손실 함수의 헤시안(Hessian)을 기반으로 연결 수를 줄이는 가지치기를 수행했으며, 이러한 가지치기가 가중치 감쇠와 같은 크기 기반(magnitude-based) 가지치기보다 더 정확하다고 제안했습니다. 최근 연구(Han et al., 2015)는 여러 최신 대형 네트워크를 성공적으로 가지치기하여 파라미터 수를 한 자릿수(order of magnitude) 줄일 수 있음을 보였습니다. 또한 압축과 가속을 위해 활성화(activation)의 수를 줄이려는 시도도 있습니다(Van Nguyen et al., 2015).

8. Future Work (향후 연구 방향)

가지치기된 네트워크는 다양한 하드웨어에서 벤치마크되었지만, 가중치 공유를 적용한 양자화된 네트워크는 아직 벤치마크되지 않았습니다. 그 이유는 기존의 cuSPARSE나 MKL SPBLAS 라이브러리가 간접적인 행렬 원소 조회(indirect matrix entry lookup)나, CSC/CSR 형식에서의 상대 인덱스(relative index)를 지원하지 않기 때문입니다. 따라서 모델을 캐시에 올릴 수 있다는 Deep Compression의 완전한 장점은 아직 충분히 드러나지 않았습니다.

이에 대한 해법으로는 다음 두 가지를 생각할 수 있습니다.

  • 소프트웨어적 해법: 이러한 기능을 지원하는 커스터마이즈된 GPU 커널(kernel)을 직접 작성하는 것입니다.
  • 하드웨어적 해법: 희소하고 양자화된 네트워크 구조를 순회(traverse)하는 데 특화된 커스텀 ASIC 아키텍처를 만들고, 커스터마이즈된 양자화 비트 폭(bit width)도 지원하도록 하는 것입니다.

이러한 아키텍처는 에너지 소비가 오프칩 DRAM 접근이 아니라 온칩 SRAM 접근에 의해 좌우될 것으로 기대됩니다.

9. Conclusion (결론)

이 논문에서는 정확도에 영향을 주지 않으면서 신경망을 압축하는 "Deep Compression"을 제안했습니다. 이 방법은 중요하지 않은 연결을 가지치기하고, 가중치 공유를 이용해 네트워크를 양자화한 다음, 허프만 코딩을 적용하는 방식으로 동작합니다.

주요 결과는 다음과 같습니다.

  • AlexNet: 정확도 손실 없이 가중치 저장 공간을 35배 줄였습니다.
  • VGG-16: 정확도 손실 없이 49배 압축했습니다.
  • LeNet: 정확도 손실 없이 39배 압축했습니다.

이를 통해 convnet을 모바일 앱에 탑재하는 데 필요한 저장 공간 요구량을 크게 줄일 수 있습니다. Deep Compression을 적용한 뒤에는 이러한 네트워크의 크기가 오프칩 DRAM 메모리(640pJ/access)가 아닌 온칩 SRAM 캐시(5pJ/access)에 들어갈 수 있게 되며, 이는 모바일에서 심층 신경망을 더 에너지 효율적으로 구동할 수 있게 해줄 잠재력을 가집니다. 또한 이 압축 방법은 애플리케이션 크기와 다운로드 대역폭이 제한된 모바일 애플리케이션에서 복잡한 신경망을 사용하는 것을 용이하게 합니다.

+ Recent posts