# Autocodificatore

Un autocodificatore o autoencoder è un tipo di rete neurale artificiale utilizzato per apprendere codifiche efficienti di dati non etichettati, rientrando quindi nel campo dell'apprendimento non supervisionato. La codifica viene convalidata e perfezionata tentando di ricostruire l'input dalla codifica. L'autocodificatore apprende una rappresentazione (codifica) di un insieme di dati, tipicamente per la riduzione della dimensionalità, addestrando la rete a ignorare i dati insignificanti ("rumore").
Esistono varianti che mirano a vincolare le rappresentazioni apprese ad assumere proprietà utili. Esempi sono gli autoencoder regolarizzati (Sparse, Denoising e Contractive), che sono efficaci nell'apprendimento delle rappresentazioni che verranno usate in una successiva classificazione, e gli autoencoder variazionali, impiegati come modelli generativi. Gli autoencoder vengono applicati a molti problemi, tra cui il riconoscimento facciale, il rilevamento di caratteristiche,di anomalie e la comprensione del significato delle parole. Gli autoencoder sono anche modelli generativi che possono generare casualmente nuovi dati simili ai dati di addestramento di input alla rete.

## Architettura di base

Un autoencoder ha due parti principali: un codificatore che mappa l'input nel codice e un decodificatore che fornisce una ricostruzione dell'input a partire dal codice.
Il modo più semplice per eseguire perfettamente la copia è duplicare il segnale. Invece, gli autoencoder sono in genere costretti a ricostruire l'input in modo approssimativo, preservando solo gli aspetti più rilevanti dei dati nella copia.
L'idea degli autoencoder è stata popolare per decenni, con le prime applicazioni risalenti agli anni 1980. Tradizionalmente, sono stati usati per la riduzione della dimensionalità o l'apprendimento delle caratteristiche, ma il concetto è diventato ampiamente utilizzato per l'apprendimento di modelli generativi di dati. Alcune delle intelligenze artificiali (IA) più potenti degli anni 2010 hanno coinvolto autoencoder impilati all'interno di reti neurali profonde.
La forma più semplice di un autocodificatore è una rete neurale feed-forward, non ricorrente, simile ai singoli percettroni che costituiscono un percettrone multistrato, utilizzando uno strato di input e uno strato di output collegati da uno o più strati nascosti. Lo strato di output ha lo stesso numero di nodi (o neuroni) dello strato di input. Il suo scopo è ricostruire i suoi input (minimizzando la differenza tra input e output), invece di prevedere un valore obiettivo $Y$ dati gli input $X$. Pertanto, gli autoencoder rientrano negli algoritmi di apprendimento non supervisionato.
Un autoencoder è costituito da due parti, il codificatore e il decodificatore, che possono essere definiti come le mappe $\phi$ e $\psi$, tali che:
    $\phi :{\mathcal {X}}\rightarrow {\mathcal {F}}$
    $\psi :{\mathcal {F}}\rightarrow {\mathcal {X}}$
    $\phi ,\psi ={\underset {\phi ,\psi }{\operatorname {arg\,min} }}\,\|{\mathcal {X}}-(\psi \circ \phi ){\mathcal {X}}\|^{2}$
Nel caso più semplice, dato uno strato nascosto, lo stadio di codifica prende il valore iniziale $\mathbf {x} \in \mathbb {R} ^{d}={\mathcal {X}}$ e lo mappa su $\mathbf {h} \in \mathbb {R} ^{p}={\mathcal {F}}$ :
    $\mathbf {h} =\sigma (\mathbf {Wx} +\mathbf {b} )$
Questa immagine $\mathbf {h}$ viene solitamente indicato come codice, variabili latenti o rappresentazione latente, mentre $\sigma$ è una funzione d'attivazione, ad esempio una funzione sigmoidea o un rettificatore. Inoltre, $\mathbf {W}$ è una matrice dei pesi e $\mathbf {b}$ è un vettore di bias. I pesi e i bias vengono in genere inizializzati in modo casuale e poi aggiornati iterativamente tramite retropropagazione. Successivamente, si ha la fase di decodifica, nel quale si passa dalla mappa $\mathbf {h}$ alla ricostruzione $\mathbf {x'}$ dei dati $\mathbf {x}$:
    $\mathbf {x'} =\sigma '(\mathbf {W'h} +\mathbf {b'} )$
dove $\mathbf {\sigma '} ,\mathbf {W'} ,{\text{ e }}\mathbf {b'}$ per il decodficatore non sono necessariamente correlata con gli equivalenti del codificatore.
Gli autoencoder sono addestrati per minimizzare l'errore di ricostruzione, cioè la differenza tra $\mathbf {x'}$e $\mathbf {x}$. La cosiddetta "funzione di perdita" (dall'inglese loss function), considerato l'errore quadratico medio, è
    ${\mathcal {L}}(\mathbf {x} ,\mathbf {x'} )=\|\mathbf {x} -\mathbf {x'} \|^{2}=\|\mathbf {x} -\sigma '(\mathbf {W'} (\sigma (\mathbf {Wx} +\mathbf {b} ))+\mathbf {b'} )\|^{2}$
dove $\mathbf {x}$ è di solito mediato su tutto l'insieme di addestramento.
Come accennato in precedenza, l'addestramento dell'autoencoder viene eseguito tramite la retropropagazione dell'errore, proprio come in altre reti neurali feed-forward.
Nei casi in cui lo spazio delle caratteristiche ${\mathcal {F}}$ abbia una dimensionalità inferiore allo spazio di input ${\mathcal {X}}$, il vettore delle caratteristiche $\phi (x)$ può essere considerato come una rappresentazione compressa dell'input $x$. Questo è il caso degli autoencoder non completi. Se gli strati nascosti sono più grandi (detti "sovracompleti", o overcomplete) o uguali allo strato di input, o se le unità nascoste hanno una capacità sufficiente, un autocodificatore può potenzialmente apprendere la funzione identità e diventare inutile. Tuttavia, i risultati sperimentali hanno rilevato che gli autoencoder sovracompleti potrebbero ancora apprendere funzioni utili. Nell'ambiente ideale, la dimensione del codice e la capacità del modello potrebbero essere impostate sulla base della complessità della distribuzione dei dati da modellare. Un modo per farlo è sfruttare le varianti del modello note come autoencoder regolarizzati.