오늘은 모델 경량화 방법 중 하나인 pruning에 대해 공부했다.
딥러닝 모델의 경량화를 위해 중요도가 낮은 파라미터를 제거하는 기법
이미지 출처 : Learning both Weights and Connections for Efficient Neural Networks (2015)
뉴런(노드)이나 시냅스(연결, 간선)을 제거해서 모델의 size와 cost를 줄인다.
일반적으로는 경량화 정도와 성능은 반비례하지만,
dropout 같은 효과를 보이면서 가끔 일반화 성능이 올라가는 경우도 있음.
과정
초기 모델에서 제거 가능한 파라미터를 판별해 제거한 뒤, fine-tuning을 거쳐 최종 평가를 진행
목적
노드, 연결 제거 -> 모델 크기 감소 -> 메모리 사용량 최적화
노드, 연결 제거 -> 연산량 감소 -> 추론 속도 향상
랜덤하게 초기화된 밀집 신경망 내에는 원래 네트워크와 비슷한 성능을 달성할 수 있는 작은 서브네트워크(winning ticket)가 존재한다는 것이 핵심 가설
네트워크를 학습시킨 후 가중치의 크기가 작은 연결을 제거한 뒤 초기 가중치로 되돌린 후 다시 학습
네트워크 압축과 효율적인 학습이 가능함
Structured
필터, 채널, 뉴런과 같은 전체 구조적 단위를 제거
해 실제적인 속도 향상과 압축을 달성.
다만 구현 자체가 안될 수도 있음.
Unstructured
개별 파라미터 단위로 0으로 바꾸는 방식으로 제거해 모델 구조 변경이 없어
구현도 쉽고 유연성은 좋지만 실제 성능 향상은 미미
덜 중요한 파라미터/레이어를 제거 하는데 그 기준이 점수 기반.
파라미터의 절대값이나 레이어별 -norm 이 작은 레이어를 제거하는 방법을 쓴다.
global : 그냥 모델 전체에서 점수가 낮은 파라미터를 제거
local : 단위별(레이어별)로 그 안에서만 비교해 점수가 낮은 파라미터를 제거
one-shot : pruning을 딱 한번 진행하고, 그 후에 파인튜닝도 한번만 진행
빠르게 할 수 있지만 성능이 불안정하다.
recursive : pruning과 파인튜닝을 조금씩 여러번 반복해서 진행
안정적인 성능이 따라오지만 시간이 오래걸린다.
weight-preserving : pruning 직후 파인튜닝을 그대로 진행
성능이 불안하지만 학습 속도가 빠르다.
weight-reinitializing(rewind) : pruning 후 남은 파라미터를 랜덤으로 초기화 후 파인튜닝 진행
성능이 안정적이지만 오래걸린다.
가장 기본적인 Pruning 방법으로 Unstructured, Global(절대값), Recursive, Rewind 방식
초기 모델을 학습하고, 하위 몇%의 파라미터를 절대값 기준으로 global하게 제거한 뒤,
rewind로 중요도가 낮은 파라미터부터 반복적으로 조금씩 제거하고 fine-tuning 하는 기법