pruning을 하는 여러가지 방법들

1. introduction

 

pruning을 모두 관통하는 핵심은 결국 덜 중요한 weight를 제거하는 것

 

어떻게 제거하느냐에 따라 그 방법이 매우 많음

 

 

 

수 많은 pruning의 극히 일부분….

 

앞으로도 쏟아져 나올 것인데 당연히 다 알 수는 없는 부분

 

global magnitude pruning은 network의 모든 곳에서 절댓값이 가장 낮은 weight를 제거

 

layerwise magnitude pruning은 각 layer에서 절댓값이 가장 낮은 weight를 제거함

 

global gradient magnitude pruning은 input의 batch에 의해 계산된 gradient로부터 weight와 gradient의 곱의 절댓값이 가장 낮은 weight를 제거함

 

layerwise gradient magnitude pruning은 각 layer에서 input의 batch에 의해 계산된 gradient로부터 weight와 gradient의 곱의 절댓값이 가장 낮은 weight를 제거

 

random pruning은 network의 fraction(조각, 부분…)이 제거될 확률에 따라 독립적으로 각각의 weight를 제거함

 

 

2. 잘 알려진 기본적인 pruning 방법들

 

얼마나 pruning을 자주 할지?(how often)에 따라 pruning 1번만 하고 fine-tuning하고 끝내는 one shot과

 

pruning과 fine-tuning을 반복적으로 수행하는 iterative pruning

 

pruning 방법을 categorize한 그림

 

언제 pruning을 할지?(when to prune)에 따라 training 전에 할 것인가, training중에 할 것인가, training하고 나서 할 것인가

 

pruning을 위한 weight의 중요도를 어떻게 계산할지(how to prune)에 따라 가장 자주 쓰는 magnitude부터(절댓값? L1 norm? L2 norm? 여러가지 가능), gradient based, information based 등등

 

무엇을 pruning을 할 것인가?(what to prune?)에 따라 network의 모든 부분에서의 global한 범위에 따라 pruning을 하는가? local한 범위의 layerwise로 할 것인가?

 

혹은 weight를 pruning할 것인가? activation값을 pruning할 것인가?

 

 

3. structure pruning과 unstructure pruning

 

unstructure하게 pruning을 할 것인가? 무슨 뜻이냐면 random하게 별 기준 없이 weight를 제거할 것인가?

 

혹은 structure하게 pruning을 할 것인가? 무슨 뜻이냐면 channel단위로 weight를 제거할 것인가? kernel단위로 자를 것인가? layer단위로 자를 것인가?

 

 

왼쪽은 중요하지 않은 weight중 아무 weight를 하나하나 자른 unstructured pruning

 

오른쪽은 channel에 묶인 모든 weight를 자른 channel structured pruning

 

structure pruning을 하면 재수없으면 channel안에 중요한 weight가 섞여들어갈 수 있지만 hardware에 optimization이 잘 되는 경향이 있음

 

unstructure pruning을 하면 random하게 자르니까 weight가 sparse하게 되는 경향이 있음

 

 

structure pruning중 filter pruning, channel pruning, filter shape pruning을 그림으로 나타냄

 

당연히 방법에 따라 효과도 다름

 

 

4. weight distribution

 

fine-tuned는 pretrain한 model을 pruning하고 fine-tuning한 것

 

scratch-trained는 initialization을 한 model을 완전히 새롭게 train하고 pruning한 다음에 retrain을 한 것이겠지 아마?... 이거는 논문에 딱히 언급이 없네

 

fine-tuning은 어떤 task에 대해 어느정도 train이 된 model에서 다른 task에 대해 미세 조정한다는 뜻

 

미세 조정은 train이 될 수도 있고 learning rate나 optimizer나 다른 것을 조정하는 것일수도 있고

 

scratch-training은 완전히 initialization된 model을 task에 대해 새롭게 train하는 것을 보통 scratch-training이라고 부름

 

model과 pruning방법에 따른 weight distribution

 

unpruned 형태를 보면 weight가 0에 대부분 분포해있는데 이것을 보고 알 수 있는 사실은

 

중요하지 않은 parameter가 많아 비효율적으로 model size(parameter 수)가 쓸데없이 크다는 것임

 

fine-tuned model을 보면 0 주위의 대부분의 parameter가 제거됨

 

그런데 unstructured pruning을 보면 weight가 0인게 거의 아니 그냥 없음

 

이게 재미있는 부분은 pruning을 하고 fine-tuning으로 retrain을 했음에도 0 주위에 weight가 거의 없다는 사실

 

scratch train은 structured나 unstructured나 비슷하네

TAGS.

Comments