Autoencoder
Un autoencoder impara a comprimere i dati in un codice compatto e a ricostruirli, senza etichette. Tratta la struttura, le varianti, il rilevamento delle anomalie e il codice.
Un autoencoder è una rete neurale addestrata a riprodurre il proprio input. Un encoder mappa l'input in un codice compatto, spesso chiamato rappresentazione latente; un decoder riconverte il codice in una ricostruzione e l'addestramento minimizza la differenza tra input e ricostruzione. Poiché il target è l'input stesso, gli autoencoder apprendono da dati senza etichette, una forma di apprendimento non supervisionato oggi generalmente classificata come apprendimento auto-supervisionato. La rete diventa utile grazie a un vincolo che le impedisce di copiare direttamente l'input, come un collo di bottiglia stretto, l'aggiunta di rumore, input mascherati o una penalità di sparsità; ciò la costringe ad apprendere la struttura che rende i dati comprimibili. Gli autoencoder vengono usati per la riduzione della dimensionalità, il rilevamento delle anomalie, la rimozione del rumore, il preaddestramento e come fase di compressione dei moderni generatori di immagini.
Come funzionano gli autoencoder#
L'encoder f mappa un input x in un codice z = f(x), il decoder g produce una ricostruzione x̂ = g(z) e l'addestramento minimizza una loss di ricostruzione, per esempio l'errore quadratico medio tra x e x̂, tramite backpropagation. In un autoencoder sottocompleto, z ha molte meno dimensioni di x, quindi il codice è una sintesi dello spazio latente che conserva solo ciò di cui il decoder ha bisogno. Un autoencoder lineare addestrato con errore quadratico apprende lo stesso sottospazio dell'analisi delle componenti principali (PCA), come dimostrarono Pierre Baldi e Kurt Hornik nel 1989; le funzioni di attivazione non lineari consentono agli autoencoder più profondi di cogliere strutture curve che la PCA non riesce a rappresentare. In un articolo pubblicato su Science nel 2006, Geoffrey Hinton e Ruslan Salakhutdinov mostrarono che, per immagini e documenti, gli autoencoder profondi producevano codici a bassa dimensionalità molto migliori della PCA.
Le varianti che non dipendono da un collo di bottiglia stretto alterano invece l'input e confrontano comunque la ricostruzione con l'originale integro:
Tipi di autoencoder#
- Denoising: Aggiunge rumore all'input e addestra la rete a recuperare l'originale pulito, come descritto da Pascal Vincent e colleghi nel 2008. Le caratteristiche apprese sono robuste alla corruzione e il modello addestrato può ripulire immagini o segnali rumorosi.
- Sparse: Usa più unità di codice che input, ma penalizza il numero di unità attive contemporaneamente. Gli autoencoder sparsi addestrati sulle attivazioni interne dei modelli linguistici di grandi dimensioni (LLMs) li scompongono in molte caratteristiche, ciascuna delle quali tende a corrispondere a un concetto interpretabile.
- Variazionale (VAE): L'encoder produce una distribuzione di probabilità sui codici e una penalità basata sulla divergenza KL la mantiene vicina a una distribuzione normale standard, così la decodifica di un codice campionato casualmente genera nuovi dati. Diederik Kingma e Max Welling hanno introdotto il VAE nel 2013.
- Quantizzato a vettori (VQ-VAE): Porta ogni vettore di codice alla voce più vicina di un codebook appreso tramite quantizzazione vettoriale, convertendo immagini o audio in token discreti che un modello autoregressivo può generare.
- Mascherato: Nasconde la maggior parte dell'input e ricostruisce le parti mancanti. Gli autoencoder mascherati (MAE) nascondono il 75% delle patch di un'immagine e l'encoder addestrato in questo modo diventa un potente backbone per altre attività di visione. Il Segment Anything Model (SAM) di Meta, incluso nel pacchetto Ultralytics, basa il proprio encoder di immagini su un Vision Transformer preaddestrato con MAE; SAM 2 usa invece un encoder Hiera preaddestrato con MAE. Le caratteristiche alla base di ogni maschera generabile tramite prompt vengono quindi apprese inizialmente completando patch nascoste.
Rilevamento delle anomalie tramite errore di ricostruzione#
Un autoencoder addestrato solo su dati normali ricostruisce bene gli input normali e male quelli non familiari, perciò l'errore di ricostruzione funziona come punteggio di anomalia per i difetti di fabbricazione, le transazioni fraudolente o i macchinari guasti, senza bisogno di anomalie etichettate. Il frammento di codice PyTorch qui sotto addestra un piccolo autoencoder sulle cifre scritte a mano incluse in scikit-learn, escludendo tutti i 7, e confronta l'errore sulle cifre tenute da parte con quello sui 7:
import torch
from sklearn.datasets import load_digits
from torch import nn
# 8x8 handwritten digits scaled to [0, 1]; every 7 is held out as the unseen anomaly
digits = load_digits()
x = torch.tensor(digits.data / 16, dtype=torch.float32)
normal, sevens = x[digits.target != 7], x[digits.target == 7]
train, test = normal[:1200], normal[1200:]
# Encoder: 64 pixels to an 8-number code; decoder: code back to 64 pixels
torch.manual_seed(0)
encoder = nn.Sequential(nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 8))
decoder = nn.Sequential(nn.Linear(8, 32), nn.ReLU(), nn.Linear(32, 64), nn.Sigmoid())
model = nn.Sequential(encoder, decoder)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
for step in range(1000):
optimizer.zero_grad()
nn.functional.mse_loss(model(train), train).backward() # reconstruction error
optimizer.step()
with torch.no_grad():
for name, data in [("Held-out digits", test), ("Unseen 7s", sevens)]:
print(f"{name}: reconstruction error {nn.functional.mse_loss(model(data), data):.4f}")Stampa un errore di ricostruzione pari a 0.0163 per le cifre tenute da parte e a 0.0547 per i 7, in media 3,4 volte superiore; una soglia applicata all'errore di ogni immagine trasforma questa differenza in un indicatore di anomalia. Un autoencoder può anche generalizzare troppo bene e ricostruire con precisione alcune anomalie, quindi i sistemi pratici regolano la dimensione del collo di bottiglia e la soglia sui dati di validazione che includono anomalie note.
Autoencoder e concetti correlati#
- Reti generative avversarie (GANs): Un generatore GAN converte rumore casuale in dati e apprende da un discriminatore, senza encoder né obiettivo di ricostruzione. Anche i VAE generano dati e il loro obiettivo basato sulla verosimiglianza rende l'addestramento più stabile, ma tende a produrre immagini più sfocate.
- U-Net: Condivide la struttura encoder-decoder, ma mappa l'input su un target diverso, come una maschera di segmentazione, e porta le connessioni skip oltre il collo di bottiglia, che in un autoencoder permetterebbero alla rete di copiare l'input.
- Apprendimento contrastivo: Apprende rappresentazioni confrontando tra loro i campioni, così le sue caratteristiche colgono ciò che distingue le immagini e ignorano i dettagli a livello di pixel che una funzione di perdita di ricostruzione deve conservare.
- Embedding: Il codice prodotto da un encoder è un tipo di embedding e gli autoencoder sono uno dei diversi metodi per apprenderli.
Autoencoder nella generazione di immagini#
I modelli di diffusione latente, come Stable Diffusion, eseguono il processo di diffusione all'interno dello spazio latente di un autoencoder e alla fine decodificano il risultato riconvertendolo in pixel. Stable Diffusion 1.x utilizza un autoencoder regolarizzato con KL che comprime un'immagine RGB di 512×512 in una rappresentazione latente di 64×64×4, con 48 volte meno valori da elaborare per il modello di diffusione a ogni passaggio di denoising.










