Pruning
Il pruning rimuove da una rete neurale addestrata pesi, filtri o strati poco importanti per ridurla e velocizzare l'inferenza, quindi esegue il fine-tuning per recuperare le prestazioni.
Il pruning è una tecnica di ottimizzazione del modello che elimina pesi, neuroni, filtri, teste di attenzione o interi strati che contribuiscono poco all’output di una rete neurale addestrata, lasciando un modello più piccolo che richiede meno memoria, potenza di calcolo ed energia. Nel deep learning, il termine è sinonimo di potatura del modello. La maggior parte delle reti è fortemente sovraparametrizzata: Han et al. hanno ridotto il numero di parametri di AlexNet da 61 milioni a 6,7 milioni e quello di VGG-16 da 138 milioni a 10,3 milioni su ImageNet, senza alcuna perdita di accuratezza, tramite l’addestramento, la rimozione delle connessioni con pesi di modulo ridotto e il riaddestramento delle reti risultanti. Il pruning è un passaggio comune prima dell’implementazione di soluzioni di IA edge, dove i vincoli in termini di memoria, consumo energetico e latenza di inferenza sono stringenti.
Come funziona il pruning#
Ogni metodo di pruning decide quali parametri rimuovere e quando. Il punteggio d’importanza è solitamente la magnitudine del peso, poiché i pesi prossimi allo zero modificano meno l’output, mentre i punteggi basati sul gradiente stimano più direttamente l’effetto di ciascun parametro sulla funzione di perdita. Rimuovere in una sola volta una frazione elevata tende a compromettere l’accuratezza più del pruning iterativo, che rimuove una piccola frazione, esegue il fine-tuning dei pesi rimanenti per recuperare le prestazioni e ripete il processo finché non viene raggiunto l’obiettivo di dimensione o velocità. La Lottery Ticket Hypothesis aggiunge che le reti dense contengono sottoreti sparse che, riportate all’inizializzazione originale, si addestrano da sole raggiungendo un’accuratezza paragonabile a quella dell’intera rete.
Pruning non strutturato, strutturato e semistrutturato#
Il pruning non strutturato azzera singoli pesi in qualsiasi punto di un tensore. Raggiunge la sparsità massima a parità di accuratezza, ma produce una matrice sparsa irregolare che i kernel densi di GPU e CPU elaborano comunque a pieno costo, a meno che un runtime sparso non salti gli zeri. Il pruning strutturato rimuove interi filtri, canali, teste di attenzione o livelli da una rete neurale convoluzionale o da un transformer, così ogni livello potato diventa un livello denso più piccolo, più veloce da eseguire su qualsiasi hardware, ma con una maggiore perdita di accuratezza per parametro rimosso. Le utility di pruning di PyTorch applicano entrambi i tipi come maschere su un livello esistente:
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")Entrambi i livelli perdono il 50% dei pesi, ma solo il livello strutturato finisce con 16 dei suoi 32 filtri completamente vuoti, che possono essere rimossi fisicamente per lasciare una convoluzione densa con 16 filtri.
Il pruning semistrutturato si colloca tra i due. Il modello di sparsità 2:4 di NVIDIA azzera due pesi ogni quattro consecutivi; gli Sparse Tensor Core di Ampere e delle GPU successive saltano questi pesi per eseguire gli stessi calcoli matriciali nella metà del tempo. NVIDIA ha misurato miglioramenti end-to-end fino al 20% per ResNeXt-101 sparso con TensorRT su A100. Sull'hardware denso, gli zeri sparsi da soli non aumentano la velocità: il pruning di Ultralytics YOLOv5x fino al 30% di sparsità globale non strutturata con l'utility prune(), senza fine-tuning, ha ridotto mAP50-95 di COCO da 0.507 a 0.489 e lasciato invariato a 5,2 ms per immagine il tempo di inferenza su V100.
Applicazioni nel mondo reale#
Il pruning è particolarmente importante quando un modello deve funzionare su hardware con risorse limitate. Le reti di rilevamento degli oggetti con pruning dei canali rientrano nei limiti di memoria e potenza di droni, telecamere intelligenti e telefoni, consentendo l’inferenza in tempo reale senza connessione al cloud e mantenendo le immagini sul dispositivo per la privacy dei dati. Nell’ispezione manifatturiera, la stessa compressione consente a un rilevatore di difetti di funzionare su un modulo edge a basso costo accanto alla linea di produzione.
Anche i modelli linguistici di grandi dimensioni vengono sottoposti a pruning. SparseGPT riduce OPT-175B e BLOOM-176B a una sparsità non strutturata del 60% in una sola passata, senza riaddestramento e con un aumento trascurabile della perplexity. Il lavoro Minitron di NVIDIA ha ridotto Llama 3.1 8B a un modello 4B rimuovendo livelli o dimensioni nascoste, quindi ha recuperato qualità tramite la distillazione della conoscenza dal modello originale.
Pruning e tecniche correlate#
Il pruning viene spesso combinato con altri metodi di compressione e il termine ha anche un significato più antico, al di fuori delle reti neurali.
- Quantizzazione del modello: La quantizzazione mantiene tutti i pesi e ne riduce la precisione numerica, per esempio passando da numeri in virgola mobile a 32 bit a interi a 8 bit. Spesso i modelli sottoposti a pruning vengono poi quantizzati per ottenere ulteriori risparmi.
- Distillazione della conoscenza: La distillazione addestra uno studente compatto separato a imitare un insegnante più grande ed è un metodo comune per recuperare l’accuratezza persa da un modello sottoposto a pruning intensivo.
- Livello Dropout: Il dropout azzera attivazioni casuali per un singolo passaggio di addestramento come regolarizzazione e lascia invariato il numero di parametri, mentre il pruning rimuove i parametri in modo permanente.
- Pruning degli alberi decisionali: Nel machine learning classico, il pruning elimina rami da un albero decisionale adattato per ridurre l’overfitting, come nel pruning per complessità del costo di scikit-learn, che rimuove i sottoalberi più deboli man mano che aumenta il parametro
ccp_alpha.










