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을 할지?(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이라고 부름
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나 비슷하네
'딥러닝 > light weight modeling' 카테고리의 다른 글
값싼 비용으로 최대 효율을 낼 수 있을까 - lottery ticket hypothesis (0) | 2022.12.31 |
---|---|
iterative pruning의 여러가지 변형 버전 알아보기 (0) | 2022.11.14 |
pruning 기본 알고리즘, regularization과의 연관성 알아보기 (0) | 2022.11.09 |
딥러닝 경량화 기법 pruning은 무엇이고 왜 등장했는가 (0) | 2022.11.09 |
CPU,GPU,TPU,.... 여러가지 processing unit 알아보기 (0) | 2022.11.07 |