Pruning
A poda remove pesos, filtros ou camadas de baixa importância de uma rede neuronal treinada para a tornar menor e acelerar a inferência; depois, ajusta-a para recuperar o desempenho.
A poda é uma técnica de otimização de modelos que remove pesos, neurónios, filtros, cabeças de atenção ou camadas inteiras que contribuem pouco para a saída de uma rede neuronal treinada, deixando um modelo mais pequeno que precisa de menos memória, capacidade de computação e energia. Em aprendizagem profunda, o termo é sinónimo de poda de modelos. A maioria das redes tem um número excessivo de parâmetros: Han et al. reduziram o AlexNet de 61 milhões para 6,7 milhões de parâmetros e o VGG-16 de 138 milhões para 10,3 milhões no ImageNet, sem perder precisão, através do treino, da remoção das ligações de baixa magnitude e do novo treino das restantes. A poda é uma etapa comum antes da implementação de IA de periferia, onde os limites de memória, energia e latência de inferência são apertados.
Como funciona a poda#
Cada método de poda decide quais os parâmetros a remover e quando os remover. A pontuação de importância costuma basear-se na magnitude do peso, uma vez que os pesos próximos de zero alteram menos a saída, enquanto as pontuações baseadas em gradientes estimam mais diretamente o efeito de cada parâmetro na função de perda. Remover uma grande fração de uma só vez tende a custar mais precisão do que a poda iterativa, que remove uma pequena fração, ajusta os pesos restantes para recuperar e repete o processo até atingir o objetivo de tamanho ou velocidade. A hipótese do bilhete de lotaria acrescenta que as redes densas contêm sub-redes esparsas que, quando repostas à inicialização original, são treinadas de forma autónoma até atingirem uma precisão comparável à da rede completa.
Poda não estruturada, estruturada e semiestruturada#
A poda não estruturada coloca a zero pesos individuais em qualquer ponto de um tensor. Atinge a maior esparsidade para uma determinada precisão, mas o resultado é uma matriz esparsa irregular que os kernels densos de GPU e CPU continuam a processar com o custo total, a menos que um ambiente de execução esparso ignore os zeros. A poda estruturada remove filtros, canais, cabeças de atenção ou camadas inteiros de uma rede neuronal convolucional ou de um transformer, fazendo com que cada camada podada se torne uma camada densa mais pequena, que funciona mais depressa em qualquer hardware, à custa de uma maior perda de precisão por parâmetro removido. Os utilitários de poda do PyTorch aplicam ambos os tipos como máscaras numa camada existente:
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")Ambas as camadas perdem 50% dos pesos, mas apenas a camada estruturada acaba com 16 dos seus 32 filtros completamente vazios, que podem ser removidos fisicamente para deixar uma convolução densa com 16 filtros.
A poda semiestruturada fica entre os dois tipos. O padrão 2:4 de esparsidade da NVIDIA zera dois de cada quatro pesos consecutivos, que os Sparse Tensor Cores das GPUs Ampere e posteriores ignoram para executar os mesmos cálculos matriciais na metade do tempo; a NVIDIA mediu ganhos de ponta a ponta de até 20% para um ResNeXt-101 esparso em TensorRT em uma A100. Em hardware denso, zeros dispersos, por si só, não aumentam a velocidade: a poda do Ultralytics YOLOv5x para 30% de esparsidade global não estruturada com o utilitário prune(), sem ajuste fino, reduziu o COCO mAP50-95 de 0,507 para 0,489 e manteve inalterado o tempo de inferência na V100, de 5,2 ms por imagem.
Aplicações no mundo real#
A poda é mais importante quando um modelo tem de funcionar em hardware com recursos limitados. As redes de deteção de objetos com canais podados cabem nos limites de memória e energia de drones, câmaras inteligentes e telemóveis, permitindo a inferência em tempo real sem ligação à nuvem e mantendo as imagens no dispositivo para proteger a privacidade dos dados. Na inspeção de fabrico, a mesma compressão permite que um detetor de defeitos funcione num módulo de periferia de baixo custo junto à linha de produção.
Também se podam modelos de linguagem de grande escala. O SparseGPT poda o OPT-175B e o BLOOM-176B até atingirem 60% de esparsidade não estruturada numa única operação, sem novo treino e com um aumento negligenciável da perplexidade. O trabalho Minitron da NVIDIA reduziu o Llama 3.1 8B a um modelo 4B através da remoção de camadas ou dimensões ocultas e, em seguida, recuperou a qualidade com destilação de conhecimento do modelo original.
Poda vs. técnicas relacionadas#
A poda é frequentemente combinada com outros métodos de compressão, e o termo também tem um significado mais antigo fora das redes neuronais.
- Quantização de modelos: A quantização mantém todos os pesos e reduz a sua precisão numérica, por exemplo, de números de vírgula flutuante de 32 bits para inteiros de 8 bits. Muitas vezes, os modelos podados são quantizados posteriormente para obter poupanças adicionais.
- Destilação de conhecimento: A destilação treina um aluno compacto separado para imitar um professor maior e é uma forma comum de recuperar a precisão perdida por um modelo podado de forma agressiva.
- Camada de dropout: O dropout coloca ativações aleatórias a zero durante uma única etapa de treino, como regularização, e mantém inalterado o número de parâmetros, enquanto a poda remove parâmetros permanentemente.
- Poda de árvores de decisão: Na aprendizagem automática clássica, a poda remove ramos de uma árvore de decisão ajustada para reduzir o sobreajuste, como na poda por complexidade de custo do scikit-learn, que remove as subárvores mais fracas à medida que aumenta o seu parâmetro
ccp_alpha.










