이번 포스트에서는 ICLR 2017 poster로 발표된 논문인 “DSD : Dense-Sparse-Dense Training for Deep Neural Networks”에 대해 소개드리고자 합니다. ‘Deep Compression’, ‘EIE’, ‘Pruning Neural Networks’ 등으로 유명한 Song Han 씨가 1 저자로 참여한 논문인데요. 기존의 pruning 연구의 대부분은 neural network의 redundancy를 이용해서 inference speed를 빠르게 하거나, weight들의 memory size를 작게 만드는데에 초점을 맞추어 진행되었습니다. 하지만 때에 따라서는 이러한 성능들을 향상 시키기 보다는 accuracy를 조금이라도 더 높이는 것이 중요한 task들이 있습니다. 해당 연구는 바로 이러한 task에 사용될 수 있도록 neural network들의 redundancy를 활용하여 accuracy를 높이는데에 초점을 맞추어 진행된 연구입니다. 비록 accuracy 향상이 크지는 않지만, 기존의 training method에 한 개의 hyperparameter (sparsity)만을 추가하여 vision, caption, speech 등의 다양한 domain에서 일관된 성능 향상을 얻었습니다.

Pruning

우선 DSD에 대해 본격적으로 알아보기 전에, pruning에 대해 간단하게 짚고 넘어가도록 하겠습니다. NIPS 2015에 발표된 “Learning both Weights and Connections for Efficient Neural Networks” 라는 논문에서는 pruning 을 통해 accuracy 하락 없이 CNN의 parameters 를 9배 ~ 13배까지 압축할 수 있다는 점을 실험적으로 보여주었습니다. 사실 pruning 이라는 개념은 이미 89년도의 Lecun 씨에 의해서 ‘Optimal Brain Damage’라는 이름으로 연구된 바 있습니다. 다만 기존에는 pruning을 하기 위해서 이차 미분을 계산해야했기 때문에 계산 시간이 오래 걸린다는 단점이 있었는데, 해당 논문에서는 단순히 특정 threshold 이하의 값을 0으로 만드는 방식으로 아래의 그림과 같이 pruning을 적용합니다.

Screen Shot 2018-04-30 at 4.48.59 PM

해당 논문에서는 이러한 과정을 반복적으로 적용해서 네트워크의 크기를 최대한으로 줄였습니다. 아래의 그래프에서 살펴볼 수 있듯이, 단순히 pruning만 적용했을때는 50% 이상 부터는 급격히 accuracy가 떨어지지만, retraining을 하면 80%까지 pruning을 해도 기존의 network와 동일한 성능을 낼 수 있었습니다. 여기에 추가적으로 반복적인 pruning과 retraining을 하면 기존의 10%만의 weights를 사용하여 기존의 네트워크와 동일한 성능을 낼 수 있다는 것을 실험적으로 입증하였습니다.

Screen Shot 2018-04-30 at 4.49.40 PM

Pruning을 할 때 주의해야 할 점은 layer마다 pruning에 대한 sensitivity가 다르다는 점입니다. 아래의 그래프에서 살펴볼 수 있듯이 fully connected layer의 경우 80% 가까이 pruning을 적용해도 accuracy가 거의 떨어지지 않는 반면, convolutional layer의 경우 이에 비해 훨씬 더 민감한 것을 살펴볼 수 있습니다. 특히 low-level feature extraction을 하는 전반부의 layer의 경우 pruning에 비교적 더 민감한 모습을 살펴볼 수 있습니다.

Screen Shot 2018-04-30 at 4.49.45 PM

그렇다면 pruning은 왜 잘 작동하는 것일까요? 기존의 weights들 중에 90%를 제거했음에도 불구하고 동일한 accuracy가 나올 수 있는 이유에 대해 살펴보겠습니다. 가령 Mnist data를 살펴보면 다음과 같이 대부분의 글씨가 영상의 중앙에 위치해있기 때문에, 가장자리는 아예 보지 않더라도 결과를 구할 수 있게 됩니다. Neural Network를 학습하는 과정에서 이와 같이 보지 않아도 되는 부분은 0에 수렴하도록 학습이 되고, pruning을 적용하면 이와 같이 불필요한 weight 들이 제거가 되게 됩니다. 실제로 Lenet-300-100 네트워크의 첫번째 fully connected layer을 visualize 해보았더니 아래와 같이 영상의 center에 해당하는 부분의 weight들이 남아있는 것을 확인할 수 있었습니다. 또한 사이즈가 큰 neural network의 경우 다른 case에 일반화 되지 않는 noise까지도 같이 학습이 되는 경향이 있는데, pruning을 통해서 이러한 over-fitting 문제를 부분적으로 완화할 수 있게 됩니다.

Screen Shot 2018-04-30 at 4.49.52 PM

Screen Shot 2018-04-30 at 4.50.06 PM

 

DSD Training

앞서 살펴본 pruning의 결과를 보면 60% 이상의 parameters 들을 제거해도, 이를 retraining 하면 기존의 accuracy보다 근소하게나마 향상되는 모습을 살펴볼 수 있었습니다. 그렇다면 pruning된 weights을 사용하여 더 좋은 feature를 추출할 수 있도록 한다면, 추가적인 정확도 향상을 얻을 수 있지 않을까요? DSD는 바로 이러한 점에 착안하여 진행된 연구입니다. 이를 해결하기 위한 아이디어 자체도 굉장히 단순합니다. 앞서 background에서 설명한 pruning 과정에 더하여, pruning 된 weight들을 0으로 초기화 해준뒤 기존에 retraining된 network와 함께 training 시켜주는 것이 해당 논문 아이디어입니다. 이를 그림으로 나타내면 아래와 같이 나타낼 수 있으며, 각 step마다 weight distribution도 함께 나타내었습니다.

Screen Shot 2018-04-30 at 4.50.25 PM

이를 알고리즘으로 나타내면 아래와 같이 나타낼 수 있습니다. 이 때 dense phase의 경우 단순히 gradient descent를 이용하여 네트워크를 학습하는 과정이기 때문에 자세한 설명은 생략하고, sparse phase에 대해서 조금 더 자세히 알아보겠습니다. Sparse phase에서는 각각의 layer W에 대하여 N개의 parameter들을 sorting 한 뒤에, N * (1 – sparsity) 번째 weight를 threshold로 사용하여 binary mask를 만들어줍니다. Train을 하는 과정에서 해당 mask를 이용해서 threshold 이상의 weight에 대해서만 update 해주는 방식으로 학습이 진행됩니다. 앞선 pruning 연구와 조금 다른 점이 있다면, 동일한 sparsity에 대하여, 각 layer마다 독립적으로 pruning을 적용한다는 점입니다. 또한 pruning에 가장 취약했던 첫번째 convolutional layer의 경우 pruning에서 제외하고, 나머지 layer에 대해서만 이를 적용합니다.

Screen Shot 2018-04-30 at 4.50.35 PM

 

Experiment

해당 논문에서 저자는 vision, caption, speech의 다양한 domain에 걸쳐 DSD가 적용 가능함을 실험적으로 보여줍니다. 아래의 표에서 살펴볼 수 있듯이 CNN, LSTM, RNN에 대하여 적게는 3.6%에서 많게는 13.7% 까지 relative improvement가 있었습니다. 절대적인 수치를 보자면 큰 성능차이는 아니지만, 기존의 네트워크와 size도 동일하고 inference time도 유지시키면서 일괄적인 성능 향상을 얻었다는 점에서 의미가 있는 것 같습니다.

Screen Shot 2018-04-30 at 4.50.47 PM

각 실험에 대해 조금 더 자세하게 살펴봅시다. 우선 개인적으로 가장 관심이 많은 ImageNet에 대한 성능 향상을 살펴보면 아래의 표와 같습니다. 표에 나타낸 baseline의 경우 Caffe model zoo 혹은 Facebook에서 제공하는 모델에 대한 성능이며, 이와 DSD training을 마친 결과 값을 비교하여 정확도 향상 정도를 측정하였습니다. 표에 나타나듯이 DSD train 과정에서 여러 epoch을 학습시키는데, 이와 fair comparison을 위해서 동일한 epoch 만큼 learning rate를 낮추어 가며 학습시킨 결과가 LLR입니다. LLR 모델과 DSD 모델을 비교해보면 성능 향상 차이는 더 줄어들게 됩니다. 특히 GoogleNet의 경우 거의 차이가 나지 않는 점이 다소 아쉽습니다.

Screen Shot 2018-04-30 at 4.50.54 PM

 

다음은 speech domain에 대해 DSD를 적용한 결과입니다. 아래의 표와 같이 DSD를 iterative하게 적용하면 추가적인 성능 향상을 얻을 수 있다는 점을 보여주고 있습니다. 첫번째 sparse phase에서는 50% sparsity를 적용하고, dense phase를 거친 후에 추가적으로 25% sparsity를 적용하였네요.

Screen Shot 2018-04-30 at 4.51.00 PM

 

Summary

본 논문에서는 neural network의 redundancy를 활용하여 정확도 성능을 다소 향상 시킬 수 있는 Dense-Sparse-Dense 학습 방법을 제시하였습니다. 비록 성능 향상 폭이 크지는 않지만, 다양한  domain에 걸쳐 일관된 방법이 적용 가능함을 보여주었습니다. 다만 Sparse phase에서 dense phase로 넘어가는 과정에서 비율상으로 보면 굉장히 많은 parameter 들이 추가가 되는데, 이에 반해 성능상의 이득이 조금 작다는 점이 다소 아쉬움으로 남습니다. 혹시 pruning에 추가적인 관심이 있는 분이 계시다면 “Pruning Convolutional Neural Networks for Resource Efficient Inference”라는 논문을 참고해보셔도 좋을 것 같습니다. DSD 논문과 마찬가지로 ICLR 2017에 발표된 논문이며 channel 단위로 pruning을 적용하여 전체 network size를 줄이면서 inference 속도를 빠르게 할 수 있는, DSD와는 다른 관점으로 pruning을 적용한 예입니다.

 

Reference

[1] DSD: Dense-Sparse-Dense Training for Deep Neural Networks, ICLR 2017

[2] Learning both Weights and Connections for Efficient Neural Networks, NIPS 2015

[3] Pruning Convolutional Neural Networks for Resource Efficient Inference, ICLR 2017

Posted by:Hyun Jae Lee

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s