Pruning
가지치기는 학습된 신경망에서 중요도가 낮은 가중치, 필터 또는 레이어를 제거해 모델 크기를 줄이고 추론 속도를 높인 다음, 성능을 회복하도록 미세 조정합니다.
가지치기는 학습된 신경망의 출력에 거의 기여하지 않는 가중치, 뉴런, 필터, 어텐션 헤드 또는 전체 레이어를 제거하는 모델 최적화 기법입니다. 그 결과 메모리, 연산량, 에너지를 덜 사용하는 더 작은 모델이 만들어집니다. 딥러닝에서 이 용어는 모델 가지치기와 동의어입니다. 대부분의 네트워크에는 필요 이상으로 많은 파라미터가 있습니다. Han 외 연구진은 학습, 크기가 작은 연결 제거, 나머지 연결 재학습을 통해 ImageNet에서 정확도(정확도) 손실 없이 AlexNet의 파라미터를 6,100만 개에서 670만 개로, VGG-16의 파라미터를 1억 3,800만 개에서 1,030만 개로 줄였습니다. 메모리, 전력, 추론 지연 시간 예산이 제한적인 엣지 AI 배포 전에 가지치기를 수행하는 경우가 많습니다.
가지치기의 작동 방식#
모든 가지치기 방법은 어떤 파라미터를 언제 제거할지 결정합니다. 중요도 점수로는 일반적으로 가중치 크기를 사용합니다. 0에 가까운 가중치는 출력에 미치는 영향이 가장 작기 때문입니다. 그래디언트 기반 점수는 각 파라미터가 손실 함수에 미치는 영향을 더 직접적으로 추정합니다. 한 번에 많은 비율을 제거하면 정확도 손실이 커지는 경향이 있습니다. 반면 반복적 가지치기는 일부만 제거하고, 남은 가중치를 파인튜닝해 성능을 복구한 뒤 크기 또는 속도 목표를 달성할 때까지 이를 반복합니다. 복권 티켓 가설에 따르면 밀집 네트워크에는 원래 초기화 상태로 되돌렸을 때 전체 네트워크와 비슷한 정확도를 달성하도록 독립적으로 학습할 수 있는 희소 서브네트워크가 포함되어 있습니다.
비구조적·구조적·반구조적 가지치기#
비구조적 가지치기는 텐서 내 위치와 관계없이 개별 가중치를 0으로 설정합니다. 동일한 정확도에서 가장 높은 희소성을 얻을 수 있지만, 결과는 불규칙한 희소 행렬이 됩니다. 희소 런타임이 0을 건너뛰지 않는 한 밀집 GPU 및 CPU 커널은 이 행렬을 여전히 전체 비용으로 처리합니다. 구조적 가지치기는 합성곱 신경망 또는 트랜스포머에서 전체 필터, 채널, 어텐션 헤드 또는 레이어를 제거합니다. 따라서 가지치기된 각 레이어는 어떤 하드웨어에서든 더 빠르게 실행되는 더 작은 밀집 레이어가 되지만, 제거한 파라미터당 정확도 손실은 더 큽니다. PyTorch의 가지치기 유틸리티는 기존 레이어에 마스크를 적용해 두 가지 방식을 모두 수행합니다.
import copy
from torch import nn
from torch.nn.utils import prune
# Two copies of one convolution layer with 32 filters of shape 16x3x3
unstructured = nn.Conv2d(16, 32, kernel_size=3)
structured = copy.deepcopy(unstructured)
# Unstructured: zero the 50% of individual weights with the smallest magnitude
prune.l1_unstructured(unstructured, name="weight", amount=0.5)
# Structured: zero the 50% of whole filters (dim=0) with the smallest L2 norm
prune.ln_structured(structured, name="weight", amount=0.5, n=2, dim=0)
for name, layer in [("Unstructured", unstructured), ("Structured", structured)]:
zeros = (layer.weight == 0).float().mean()
empty_filters = (layer.weight.flatten(1).abs().sum(dim=1) == 0).sum()
print(f"{name}: {zeros:.0%} of weights zeroed, {empty_filters}/32 filters entirely empty")두 레이어 모두 가중치의 50%가 제거되지만, 구조적 레이어만 32개 필터 중 16개가 완전히 비게 됩니다. 이 필터를 물리적으로 제거하면 필터가 16개인 밀집 합성곱 레이어가 됩니다.
반구조적 가지치기는 이 두 방식의 중간에 해당합니다. NVIDIA의 2:4 희소성 패턴은 연속된 가중치 4개 중 2개를 0으로 설정합니다. Ampere 및 이후 GPU의 Sparse Tensor Cores는 이 값을 건너뛰어 동일한 행렬 연산을 절반의 시간에 수행합니다. NVIDIA는 A100에서 TensorRT를 사용해 희소 ResNeXt-101의 엔드투엔드 성능을 최대 20% 향상했다고 측정했습니다. 조밀한 하드웨어에서는 흩어진 0만으로 속도가 빨라지지 않습니다. 미세 조정 없이 prune() 유틸리티로 Ultralytics YOLOv5x를 가지치기하여 전역 비구조적 희소성을 30%로 만들었을 때, COCO mAP50-95는 0.507에서 0.489로 낮아졌고 V100 추론 시간은 이미지당 5.2ms로 그대로였습니다.
실제 적용 사례#
제한된 하드웨어에서 모델을 실행해야 할 때 가지치기의 효과가 가장 큽니다. 채널 가지치기를 적용한 객체 탐지 네트워크는 드론, 스마트 카메라, 휴대폰의 메모리 및 전력 예산에 맞게 작아져 클라우드 연결 없이도 실시간 추론이 가능하며, 데이터 프라이버시를 위해 이미지를 기기 내에 보관합니다. 제조 검사에서는 동일한 압축 기법으로 결함 탐지기를 생산 라인 옆의 저가 엣지 모듈에서 실행할 수 있습니다.
대규모 언어 모델에도 가지치기를 적용합니다. SparseGPT는 재학습 없이 한 번의 작업으로 OPT-175B와 BLOOM-176B를 비구조적 희소성 60%로 가지치기하며, 퍼플렉시티 증가는 무시할 수 있는 수준입니다. NVIDIA의 Minitron 연구에서는 레이어 또는 은닉 차원을 제거해 Llama 3.1 8B를 4B 모델로 가지치기한 후, 원본 모델의 지식 증류를 통해 성능을 복구했습니다.
가지치기와 관련 기법 비교#
가지치기는 다른 압축 기법과 함께 사용하는 경우가 많으며, 이 용어는 신경망 밖에서 더 오래된 의미로도 쓰입니다.
- 모델 양자화: 양자화는 모든 가중치를 유지하면서 숫자 정밀도를 낮춥니다. 예를 들어 32비트 부동소수점을 8비트 정수로 변환합니다. 가지치기된 모델에 추가로 이득을 얻기 위해 양자화를 적용하는 경우가 많습니다.
- 지식 증류: 증류는 별도의 소형 학생 모델이 대형 교사 모델을 모방하도록 학습하며, 가지치기를 많이 적용한 모델에서 손실된 정확도를 복구하는 데 흔히 사용됩니다.
- 드롭아웃 레이어: 드롭아웃은 정규화를 위해 한 번의 학습 단계 동안 무작위 활성화를 0으로 설정하며 파라미터 수는 그대로 유지합니다. 가지치기는 파라미터를 영구적으로 제거합니다.
- 결정 트리 가지치기: 고전적 머신러닝에서 가지치기는 학습된 결정 트리의 가지를 잘라 과적합을 줄이는 기법입니다. scikit-learn의 비용 복잡도 가지치기가 그 예로,
ccp_alpha파라미터가 증가할수록 가장 약한 하위 트리를 제거합니다.










