Fondamenti di IA
Che cos’è un Autoencoder?
Se hai letto di tecniche di apprendimento non supervisionato in precedenza, potresti aver incontrato il termine “autoencoder”. Gli autoencoder sono uno dei principali modi in cui vengono sviluppati i modelli di apprendimento non supervisionato. Eppure, cosa è esattamente un autoencoder?
In breve, gli autoencoder operano prendendo in ingresso i dati, comprimendoli ed encodandoli, e poi ricostruendo i dati dalla rappresentazione di encoding. Il modello viene addestrato fino a quando la perdita non viene minimizzata e i dati vengono riprodotti il più fedelmente possibile. Attraverso questo processo, un autoencoder può apprendere le caratteristiche importanti dei dati. Sebbene questa sia una definizione rapida di un autoencoder, sarebbe utile prendere uno sguardo più approfondito sugli autoencoder e acquisire una migliore comprensione di come funzionano. Questo articolo si propone di demistificare gli autoencoder, spiegando l’architettura degli autoencoder e le loro applicazioni.
Che cos’è un Autoencoder?
Gli autoencoder sono reti neurali. Le reti neurali sono composte da più strati, e l’aspetto caratteristico di un autoencoder è che gli strati di ingresso contengono esattamente la stessa quantità di informazioni dello strato di uscita. Il motivo per cui lo strato di ingresso e lo strato di uscita hanno esattamente lo stesso numero di unità è che un autoencoder mira a replicare i dati di ingresso. Esso produce una copia dei dati dopo averli analizzati e ricostruiti in modo non supervisionato.
I dati che attraversano un autoencoder non vengono semplicemente mappati direttamente dall’ingresso all’uscita, il che significa che la rete non copia semplicemente i dati di ingresso. Ci sono tre componenti di un autoencoder: una parte di encoding (ingresso) che comprime i dati, un componente che gestisce i dati compressi (o collo di bottiglia), e una parte di decoding (uscita). Quando i dati vengono immessi in un autoencoder, vengono encodati e poi compressi a una dimensione inferiore. La rete viene quindi addestrata sui dati encodati/compressi e produce una ricostruzione di quei dati.
Perché si vorrebbe addestrare una rete a ricostruire semplicemente i dati che le vengono forniti? Il motivo è che la rete apprende l'”essenza” o le caratteristiche più importanti dei dati di ingresso. Dopo aver addestrato la rete, è possibile creare un modello che possa sintetizzare dati simili, con l’aggiunta o la sottrazione di determinate caratteristiche bersaglio. Ad esempio, si potrebbe addestrare un autoencoder su immagini granulose e poi utilizzare il modello addestrato per rimuovere il rumore dalle immagini.
Architettura dell’Autoencoder
Vediamo l’architettura di un autoencoder. Discuteremo qui della principale architettura di un autoencoder. Ci sono variazioni su questa architettura generale che discuteremo nella sezione successiva.

Foto: Michela Massi via Wikimedia Commons, (https://commons.wikimedia.org/wiki/File:Autoencoder_schema.png)
Come menzionato in precedenza, un autoencoder può essere essenzialmente diviso in tre diverse componenti: l’encoder, un collo di bottiglia e il decoder.
La parte di encoding di un autoencoder è tipicamente una rete feedforward, densamente connessa. Lo scopo degli strati di encoding è prendere i dati di ingresso e comprimerli in una rappresentazione di spazio latente, generando una nuova rappresentazione dei dati con dimensionalità ridotta.
Gli strati di codice, o il collo di bottiglia, gestiscono la rappresentazione compressa dei dati. Il codice del collo di bottiglia è progettato con cura per determinare le parti più rilevanti dei dati osservati, o per dire altro, le caratteristiche dei dati più importanti per la ricostruzione dei dati. L’obiettivo è determinare quali aspetti dei dati devono essere conservati e quali possono essere scartati. Il codice del collo di bottiglia deve bilanciare due considerazioni diverse: la dimensione della rappresentazione (quanto è compatta la rappresentazione) e la rilevanza delle variabili/caratteristiche. Il collo di bottiglia esegue un’attivazione elemento-per-elemento sui pesi e sui bias della rete. Lo strato del collo di bottiglia è anche a volte chiamato rappresentazione latente o variabili latenti.
Lo strato di decoding è responsabile di prendere i dati compressi e convertirli nuovamente in una rappresentazione con le stesse dimensioni dei dati originali, non alterati. La conversione viene eseguita con la rappresentazione di spazio latente creata dall’encoder.
L’architettura più basilare di un autoencoder è un’architettura feed-forward, con una struttura simile a un percettrone multistrato utilizzato nei multilayer perceptron. Come le reti neurali feed-forward regolari, l’autoencoder viene addestrato tramite l’utilizzo della retropropagazione.
Attributi di un Autoencoder
Ci sono vari tipi di autoencoder, ma tutti condividono alcune proprietà che li uniscono.
Gli autoencoder apprendono automaticamente. Non richiedono etichette, e se forniti con sufficienti dati, è facile ottenere che un autoencoder raggiunga prestazioni elevate su un determinato tipo di dati di ingresso.
Gli autoencoder sono specifici dei dati. Ciò significa che possono solo comprimere dati che sono molto simili ai dati sui quali l’autoencoder è già stato addestrato. Gli autoencoder sono anche lossy, il che significa che le uscite del modello saranno degradate rispetto ai dati di ingresso.
Quando si progetta un autoencoder, gli ingegneri di apprendimento automatico devono prestare attenzione a quattro diversi iperparametri del modello: dimensione del codice, numero di strati, nodi per strato e funzione di perdita.
La dimensione del codice decide quanti nodi iniziano la parte centrale della rete, e meno nodi comprimono i dati di più. In un autoencoder profondo, mentre il numero di strati può essere qualsiasi numero che l’ingegnere ritiene appropriato, il numero di nodi in uno strato dovrebbe diminuire man mano che l’encoder procede. Al contrario, il contrario vale per il decoder, il che significa che il numero di nodi per strato dovrebbe aumentare man mano che gli strati del decoder si avvicinano allo strato finale. Infine, la funzione di perdita di un autoencoder è tipicamente o l’entropia cross di binaria o l’errore quadratico medio. L’entropia cross binaria è appropriata per le istanze in cui i valori di ingresso dei dati sono in un intervallo 0-1.
Tipi di Autoencoder
Come menzionato in precedenza, esistono variazioni sull’architettura classica dell’autoencoder. Vediamo i diversi tipi di architetture dell’autoencoder.
Sparso

Foto: Michela Massi via Wikimedia Commons, CC BY SA 4.0 (https://commons.wikimedia.org/wiki/File:Autoencoder_sparso.png)
Mentre gli autoencoder tipici hanno un collo di bottiglia che comprime i dati attraverso una riduzione dei nodi, gli autoencoder sparsi sono un’alternativa a questo formato operativo tipico. In una rete sparsa, gli strati nascosti mantengono la stessa dimensione degli strati di encoding e decoding. Invece, le attivazioni all’interno di uno strato specifico vengono penalizzate, configurandolo in modo che la funzione di perdita catturi meglio le caratteristiche statistiche dei dati di ingresso. In altre parole, mentre gli strati nascosti di un autoencoder sparsa hanno più unità di un autoencoder tradizionale, solo una certa percentuale di essi è attiva in un dato momento. Le funzioni di attivazione più impattanti vengono preservate e altre vengono ignorate, e questo vincolo aiuta la rete a determinare solo le caratteristiche più salienti dei dati di ingresso.
Contrattivo
Gli autoencoder contrattivi sono progettati per essere resilienti contro piccole variazioni nei dati, mantenendo una rappresentazione coerente dei dati. Ciò viene realizzato applicando una penalità alla funzione di perdita. Questa tecnica di regolarizzazione si basa sulla norma di Frobenius della matrice di Jacobiana per le attivazioni dell’encoder di ingresso. L’effetto di questa tecnica di regolarizzazione è che il modello è costretto a costruire un’encoding in cui ingressi simili avranno encoding simili.
Convolutivo
Gli autoencoder convolutivi encodano i dati di ingresso dividendo i dati in sottosezioni e poi convertendoli in segnali semplici che vengono sommati per creare una nuova rappresentazione dei dati. Simile alle reti neurali convolutive, un autoencoder convolutivo si specializza nell’apprendimento dei dati di immagini, e utilizza un filtro che viene spostato sull’intera sezione dell’immagine sezione per sezione. Le codifiche generate dallo strato di encoding possono essere utilizzate per ricostruire l’immagine, riflettere l’immagine o modificare la geometria dell’immagine. Una volta che i filtri sono stati appresi dalla rete, possono essere utilizzati su qualsiasi ingresso sufficientemente simile per estrarre le caratteristiche dell’immagine.
Desrumore

Foto: MAL via Wikimedia Commons, CC BY SA 3.0 (https://en.wikipedia.org/wiki/File:ROF_Denoising_Example.png)
Gli autoencoder desrumore introducono rumore nell’encoding, risultando in un encoding che è una versione corrotta dei dati di ingresso originali. Questa versione corrotta dei dati viene utilizzata per addestrare il modello, ma la funzione di perdita confronta i valori di uscita con i dati di ingresso originali e non con i dati di ingresso corrotti. L’obiettivo è che la rete sarà in grado di riprodurre la versione originale, non corrotta, dell’immagine. Confrontando i dati corrotti con i dati originali, la rete apprende quali caratteristiche dei dati sono più importanti e quali caratteristiche sono irrilevanti/corruzioni. In altre parole, affinché un modello possa desrumore le immagini corrotte, deve aver estratto le caratteristiche importanti dei dati di immagine.
Variazionale
Gli autoencoder variazionali operano facendo ipotesi su come le variabili latenti dei dati sono distribuite. Un autoencoder variazionale produce una distribuzione di probabilità per le diverse caratteristiche delle immagini di addestramento/gli attributi latenti. Durante l’addestramento, l’encoder crea distribuzioni latenti per le diverse caratteristiche delle immagini di ingresso.

Quando si addestra la rete, i dati encodati vengono analizzati e il modello di riconoscimento produce due vettori, estraendo la media e la deviazione standard delle immagini. Viene creata una distribuzione in base a questi valori. Ciò viene fatto per gli stati latenti diversi. Il decoder prende poi campioni casuali dalla distribuzione corrispondente e li utilizza per ricostruire gli ingressi iniziali della rete.
Applicazioni degli Autoencoder
Gli autoencoder possono essere utilizzati per una vasta gamma di applicazioni, ma vengono tipicamente utilizzati per compiti come la riduzione della dimensionalità, la desrumorizzazione dei dati, l’estrazione delle caratteristiche, la generazione di immagini, la previsione sequenza-per-sequenza e i sistemi di raccomandazione.
La desrumorizzazione dei dati consiste nell’utilizzo degli autoencoder per rimuovere il rumore dalle immagini. Allo stesso modo, gli autoencoder possono essere utilizzati per riparare altri tipi di danni alle immagini, come immagini sfocate o immagini con sezioni mancanti. La riduzione della dimensionalità può aiutare le reti ad alta capacità ad apprendere caratteristiche utili delle immagini, il che significa che gli autoencoder possono essere utilizzati per aumentare l’addestramento di altri tipi di reti neurali. Ciò è anche vero per l’utilizzo degli autoencoder per l’estrazione delle caratteristiche, poiché gli autoencoder possono essere utilizzati per identificare le caratteristiche di altri set di dati di addestramento per addestrare altri modelli.
In termini di generazione di immagini, gli autoencoder possono essere utilizzati per generare immagini umane false o personaggi animati, il che ha applicazioni nella progettazione di sistemi di riconoscimento facciale o nell’automatizzazione di alcuni aspetti dell’animazione.
I modelli di previsione sequenza-per-sequenza possono essere utilizzati per determinare la struttura temporale dei dati, il che significa che un autoencoder può essere utilizzato per generare il prossimo evento in una sequenza. Per questo motivo, un autoencoder potrebbe essere utilizzato per generare video. Infine, gli autoencoder profondi possono essere utilizzati per creare sistemi di raccomandazione rilevando pattern relativi all’interesse dell’utente, con l’encoder che analizza i dati di engagement dell’utente e il decoder che crea raccomandazioni che si adattano ai pattern stabiliti.












