Capsule Networks (CapsNet)
Le reti a capsule (CapsNets) codificano ogni parte come un vettore la cui lunghezza ne rappresenta la probabilità e la direzione la posa, collegandole tramite routing dinamico.
Le reti a capsule (CapsNets) sono reti neurali composte da capsule, piccoli gruppi di neuroni la cui uscita è un vettore anziché un singolo numero. La lunghezza del vettore di una capsula indica la probabilità che sia presente un'entità, come una cifra, un occhio o una ruota; la direzione codifica i parametri di istanziazione dell'entità: posizione, dimensione, orientamento, spessore del tratto e altre proprietà della posa e della deformazione. Geoffrey Hinton, Alex Krizhevsky e Sida Wang hanno introdotto le capsule in un articolo del 2011 sui codificatori automatici trasformazionali; Sara Sabour, Nicholas Frosst e Hinton le hanno trasformate in un classificatore funzionante in Dynamic Routing Between Capsules, presentato a NIPS 2017, che collega le capsule di livelli consecutivi con un algoritmo iterativo chiamato instradamento per accordo.
Perché le capsule sostituiscono il max pooling#
Una rete neurale convoluzionale (CNN) rileva caratteristiche tramite attivazioni scalari e spesso riduce le proprie mappe delle caratteristiche con il max pooling, che conserva la risposta più forte in ogni finestra e scarta la posizione in cui si è verificata all'interno della finestra. Questo rende il rilevamento tollerante ai piccoli spostamenti, ma una rete che verifica solo se le singole parti sono presenti può accettare un volto con la bocca sopra gli occhi, il cosiddetto problema di Picasso. Hinton sosteneva l'equivarianza anziché l'invarianza: quando un oggetto si sposta o ruota, il vettore di una capsula dovrebbe ruotare insieme a esso, mentre la sua lunghezza, cioè la probabilità che l'oggetto esista, resta invariata. Le capsule che apprendono il punto di vista in questo modo richiedono meno aumento dei dati di quanto ne richieda una CNN per riconoscere oggetti da nuove angolazioni.
Ultralytics YOLO26 mantiene le posizioni degli oggetti senza capsule: cinque convoluzioni con stride 2 riducono l'input a una risoluzione di 1/32 e l'unico blocco max pooling, SPPF, esegue il pooling con stride 1 usando per tre volte consecutive una finestra 5 x 5, ampliando il campo recettivo senza ridurre la griglia da cui predice la testa di rilevamento.
Come funziona l'instradamento dinamico#
Ogni capsula di un livello inferiore moltiplica la propria uscita per una matrice di pesi appresa per predire l'uscita di ogni capsula del livello superiore. L'instradamento decide quindi quanta parte dell'uscita di ogni figlia raggiunge ciascuna capsula genitore. Una softmax sui logit di instradamento, inizializzati a zero, produce coefficienti di accoppiamento che distribuiscono l'uscita di ogni figlia tra i genitori. Ogni genitore somma le predizioni ponderate per quei coefficienti e applica la funzione squash, che mantiene la direzione del vettore e ne porta la lunghezza nell'intervallo da 0 a 1. Il prodotto scalare tra ogni predizione e la nuova uscita del genitore viene aggiunto al logit, così le figlie inviano una parte maggiore della propria uscita ai genitori di cui hanno predetto lo stato:
import torch
torch.manual_seed(0)
# 6 capsule figlie predicono ciascuna una posa 8D per 2 capsule genitore
predictions = 0.2 * torch.randn(6, 2, 8)
pose = 0.5 * torch.randn(8)
predictions[:4, 0] = pose + 0.05 * torch.randn(4, 8) # le figlie da 0 a 3 concordano sul genitore 0
logits = torch.zeros(6, 2)
for _ in range(3): # instradamento per accordo, 3 iterazioni come nell'articolo
coupling = logits.softmax(dim=1) # ogni figlia suddivide il proprio voto tra i genitori
s = (coupling.unsqueeze(-1) * predictions).sum(dim=0)
squared = s.square().sum(dim=-1, keepdim=True)
parents = squared / (1 + squared) * s / squared.sqrt() # squash: lunghezza in [0, 1)
logits = logits + (predictions * parents).sum(dim=-1) # l'accordo aumenta il logit
print(coupling[:, 0].round(decimals=2))
print(parents.norm(dim=-1).round(decimals=2))Stampa tensor([0.9700, 0.9700, 0.9700, 0.9700, 0.5700, 0.4700]) e tensor([0.9800, 0.1500]). Dopo tre iterazioni, le quattro figlie concordi inviano il 97% della propria uscita al genitore 0, le altre due mantengono una ripartizione quasi equa e la lunghezza del vettore del genitore 0 raggiunge 0,98, mentre quella del genitore 1, che ha ricevuto solo voti sparsi, resta a 0,15. L'instradamento somiglia al meccanismo di attenzione di un Transformer eseguito nella direzione opposta: la softmax viene calcolata sui genitori a cui una figlia potrebbe inviare il proprio output, quindi i genitori competono per l'uscita di ogni figlia.
CapsNet del 2017 e i risultati#
La rete originale è poco profonda: una convoluzione con 256 kernel da 9 x 9 alimenta PrimaryCaps, un livello convoluzionale di capsule che trasforma una cifra 28 x 28 in 32 x 6 x 6 = 1.152 capsule a otto dimensioni; l'instradamento le collega a DigitCaps, una capsula a 16 dimensioni per classe. L'addestramento combina una funzione di perdita a margine sulle lunghezze delle capsule, che porta la lunghezza sopra 0,9 per le cifre presenti e sotto 0,1 per le altre, con un decodificatore che ricostruisce l'immagine dalla capsula della cifra corretta, un termine di regolarizzazione in stile autoencoder ridotto di un fattore pari a 0.0005. Perturbare una delle 16 dimensioni e decodificare il risultato modifica una singola proprietà, come la scala, lo spessore del tratto, l'inclinazione o la larghezza; questo rende le uscite delle capsule più facili da esaminare rispetto alle attivazioni di una CNN, un obiettivo condiviso con l'IA spiegabile.
Con 8,2 milioni di parametri contro i 35,4 milioni di una CNN di riferimento, CapsNet ha raggiunto un errore di test dello 0,25% su MNIST, rispetto allo 0,39% del modello di riferimento, e del 5,2% rispetto all'8,1% su MultiMNIST, composto da coppie di cifre i cui riquadri di delimitazione si sovrappongono in media dell'80%. Addestrata solo su cifre MNIST spostate fino a 2 pixel, ha ottenuto il 79% su affNIST, composto dalle stesse cifre sottoposte a trasformazioni affini casuali, mentre una CNN con un numero simile di parametri ha ottenuto il 66%. Su CIFAR-10, un ensemble di sette CapsNet ha raggiunto un errore del 10,6%, paragonabile ai risultati ottenuti dalle CNN quando furono applicate per la prima volta a quel dataset; gli autori hanno attribuito la differenza al tentativo delle capsule di tenere conto degli sfondi disordinati.
Limiti e modelli a capsule successivi#
L'instradamento esegue diverse iterazioni su ogni coppia di capsule figlia e genitore, quindi il consumo di calcolo e memoria cresce rapidamente con le dimensioni dell'immagine e il numero di classi; le reti a capsule non hanno mai eguagliato le CNN o i vision transformer nei benchmark di classificazione delle immagini su larga scala come ImageNet. I ricercatori le hanno applicate all'analisi di immagini mediche, per esempio per classificare i tipi di tumore cerebrale a partire da scansioni MRI, in contesti con pochi dati di addestramento.
Le capsule a matrice con instradamento EM, proposte da Hinton, Sabour e Frosst a ICLR 2018, hanno sostituito i vettori di posa con matrici di posa 4 x 4 e hanno usato l'aspettativa-massimizzazione per l'instradamento; sul benchmark smallNORB di oggetti giocattolo fotografati da molte angolazioni, hanno ridotto del 45% gli errori di test rispetto ai migliori risultati precedenti e hanno resistito agli attacchi avversari white-box meglio di una CNN di riferimento. Nel 2019 sono seguiti gli autoencoder a capsule sovrapposte, che hanno appreso capsule senza etichette; la proposta GLOM di Hinton del 2021 rappresenta le stesse gerarchie parte-intero come isole di vettori di embedding concordi, senza alcun instradamento dinamico.










