Il potere di astrazione dell’AI: l’autoencoding
I modelli di intelligenza artificiale supervisionati e non supervisionati sono diversi per quanto riguarda il tipo di addestramento e l’obiettivo che cercano di raggiungere.
In un modello di AI supervisionato, l’algoritmo di apprendimento viene addestrato utilizzando un set di dati di input e l’output desiderato associato a ciascun input. L’obiettivo è quello di costruire un modello che possa imparare a fare previsioni o classificazioni accurate quando gli vengono presentati nuovi input. Ad esempio, un modello supervisionato potrebbe essere addestrato utilizzando immagini di gatti e di cani insieme alle relative etichette corrispondenti (gatto o cane) per apprendere a distinguere tra le due specie.
D’altra parte, in un modello di AI non supervisionato, l’algoritmo di apprendimento viene addestrato utilizzando solo un set di dati di input, senza alcuna informazione sull’output desiderato. L’obiettivo principale qui è quello di estrarre automaticamente strutture o modelli interessanti dai dati di input. Ad esempio, un modello non supervisionato potrebbe essere utilizzato per raggruppare le immagini in diversi clusters in base alle loro caratteristiche comuni senza alcuna conoscenza pregressa dell’etichetta.
Se, per esempio i dati di input sono valori numerici contenuti in una tabella, ogni riga rappresenta un elemento a cui si associano delle caratteristiche o attributi definiti dai valori colonna della tabella stessa. Di solito l’attributo dell’ultima colonna è l’attributo target, l’etichetta che rappresenta l’output desiderato o la risposta corretta per quel dato input.

Durante l’addestramento, viene eseguita una fase di previsione utilizzando l’input fornito e i pesi correnti del modello. La previsione viene quindi confrontata con l’output desiderato per calcolare l’errore, ad esempio l’errore quadratico medio (MSE). I pesi del modello vengono quindi adattati in base all’errore calcolato utilizzando un algoritmo di ottimizzazione, come la discesa del gradiente, al fine di ridurre l’errore e migliorare le previsioni future.
In breve, l’etichettatura o la supervisione si riferiscono alla disponibilità degli attributi target conosciuti durante il processo di addestramento del modello. L’obiettivo è quello di ottimizzare i pesi del modello in modo che le previsioni future siano quanto più vicine possibile all’output desiderato, riducendo l’errore tra la previsione e l’output corretto.
I modelli di clustering sono un classico esempio di modelli non supervisionati.
Leggi questo articolo se vuoi saperne di più sui modelli di clustering.
Autosupervisione
L’autosupervisione è un’area di ricerca che combina elementi di modelli supervisionati e non supervisionati. L’idea è quella di utilizzare dati di input correttamente etichettati in modo automatico o implicito come input per un algoritmo non supervisionato. In altre parole, il modello crea obiettivi di apprendimento da solo utilizzando le informazioni contenute nei dati di input. Ciò può essere utile quando non si dispone di un set di dati completamente etichettato o quando etichettare i dati può richiedere un enorme sforzo umano.
Un esempio di rete neurale autosupervisionata è l’autoencoder. Questo tipo di rete neurale è progettato per comprimere i dati di input in uno spazio di dimensioni ridotte (codice), quindi ricostruire i dati di input originali da questo codice. L’obiettivo del modello è quello di minimizzare la differenza tra i dati originali e i dati ricostruiti. L‘autoencoder è addestrato esclusivamente utilizzando dati non supervisionati, senza bisogno di etichette esplicite.
Un altro esempio di rete neurale autosupervisionata è il modello di predizione della prossima parola (Next Word Prediction). Questo tipo di modello impara a generare continuazioni coerenti di frasi o testi. Viene addestrato utilizzando frasi o testi esistenti e l’obiettivo è quello di prevedere qual sarà la parola successiva in una determinata sequenza. Questo tipo di apprendimento può essere utile in molte applicazioni come la generazione automatica di testo, la traduzione automatica e i chatbot.
L’autoencoder un modello che tenta di applicare i principi fondamentali dell’acquisizione della conoscenza umana.
Il funzionamento dell’autoencoder potrebbe essere ben illustrato dai processi mentali umani mediante i quali si acquisiscono nuove conoscenze. Grazie all’induzione acquisiamo nuove conoscenze a partire da particolari esperienze o osservazioni. Nel fare questo la nostra mente compie un processo di astrazione che ha come obiettivo quello di estrarre dai dati dell’esperienza solo quelle informazioni che ritiene più importanti per rappresentare l’esperienza stessa. Ciò porta inevitabilmente a trascurare altre informazioni. in compenso, ci formiamo dei concetti generali che ci serviranno per ottenere ulteriore conoscenza quando faremo delle deduzioni. Proprio grazie alla deduzione, a cui possiamo pensare come al meccanismo inverso dell’induzione, la mente trasforma le nozioni generali in specifiche e particolari conclusioni. Per esempio grazie all’osservazione di molti oggetti particolari di forma cilindrica fatti di plastica o metallo ed inchiostro che stanno in una mano con cui possiamo scrivere ci formiamo l’idea di una penna (induzione). Questo concetto ci permetterà di riconoscere altre penne prima mai viste o di crearne una nuova a partire da un progetto (deduzione).

La rete neurale autoencoder funziona in modo analogo. In un certo senso, l’autoencoder può essere considerato come un modello computazionale che simula alcuni aspetti del processo mentale induttivo e deduttivo. Attraverso l’addestramento dell’autoencoder, la rete neurale apprende a inferire le caratteristiche rilevanti dei dati e a generare nuove rappresentazioni o ricostruzioni in base a queste conoscenze.
Un autoencoder è un tipo di rete neurale che impara a codificare e decodificare i dati in ingresso. Possiamo definire un autoencoder come composto da un’encoder e un decoder. L’encoder trasforma i dati in ingresso in una rappresentazione latente a dimensione inferiore, mentre il decoder ricostruisce i dati originali dall’output dell’encoder. L’obiettivo è minimizzare la differenza tra i dati in ingresso e quelli ricostruiti dal decoder.
L’encoder rappresenta l’aspetto induttivo del modello, dove l’algoritmo impara a partire dagli input e crea una rappresentazione astratta. Possiamo immaginare l’encoder come un abile studente che assimila conoscenze dal mondo esterno e le riproduce in una forma più concisa.
Dall’altro lato, il decoder rappresenta l’aspetto deduttivo dell’autoencoder. Qui, l’algoritmo prende la rappresentazione astratta fornita dall’encoder e la traduce in una forma più comprensibile e specifica. Immaginiamo il decoder come un insegnante esperto che traduce i concetti astratti in informazioni più concrete e dettagliate.

L’encoder prende in input i dati grezzi e li trasforma in una rappresentazione a bassa dimensionalità chiamata “codice latente“. Questo passaggio di compressione avviene attraverso una serie di strati nascosti che combinano le informazioni dell’input in modi più complessi. Ogni strato nascosto dell’encoder è composto da neuroni che sono collegati ai neuroni dello strato precedente tramite pesi sinaptici. Gli strati nascosti hanno funzioni di attivazione che introducono non linearità nel modello.
Il codice latente ottenuto dall’encoder rappresenta una versione compressa dell’input originale. Questa compressione è possibile grazie al processo di apprendimento dei pesi sinaptici della rete, in cui la rete cerca di ridurre al minimo la differenza tra l’input originale e l’output ricostruito dal decoder. Durante l’addestramento dell’autoencoder, i pesi sinaptici vengono ottimizzati per ridurre l’errore di ricostruzione, in modo che la rappresentazione a bassa dimensionalità del codice latente abbia un alto potere di discriminazione tra i diversi input.
Il decoder, che è simmetrico all’encoder, prende il codice latente in input e cerca di ricostruire l’input originale. Anche il decoder è composto da strati nascosti che combinano le informazioni del codice latente per produrre un’output finale che è una ricostruzione approssimata dell’input originale. Ancora una volta, gli strati nascosti del decoder sono collegati tramite pesi sinaptici, e durante l’addestramento questi pesi vengono ottimizzati per minimizzare l’errore di ricostruzione.
Semplice esempio con un solo livello nascosto
Per fare un esempio concreto, consideriamo una rete neurale autoencoder a singolo strato nascosto. L’input grezzo viene rappresentato come un vettore x di dimensione n=6, e l’encoder e il decoder sono entrambi composti da un unico strato nascosto con m=3 neuroni. Gli ingressi dei neuroni nell’encoder sono pesati dai pesi W, mentre gli ingressi dei neuroni nel decoder sono pesati dai pesi V.
L’output dell’encoder può essere calcolato come:
z = f(1)att(Wx + b)
Dove W è la matrice dei pesi dei connessioni dall’input agli strati nascosti, x è l’input ed è un vettore, b è il bias e f(1)att è la funzione di attivazione. z é un vettore di dimensionalità inferiore a quella di x
L’output del decoder è calcolato come:
x’ = f(2)att(Vz + c)
Dove V è la matrice dei pesi delle connessioni dagli strati nascosti all’output, z è l’output dell’encoder ed è un vettore, c è il bias e f(2)att è la funzione di attivazione.
In questo esempio il vettore x ha dimensionalità n = 6, mentre il vettore z ha dimensionalità m = 3.
Durante l’addestramento dell’autoencoder, viene calcolato l’errore di ricostruzione tra l’input originale e l’output del decoder. Questo errore viene poi utilizzato per regolare i pesi della rete utilizzando algoritmi di ottimizzazione come la discesa del gradiente. L’obiettivo finale è quello di ridurre al minimo l’errore di ricostruzione, in modo da ottenere un codice latente che rappresenti in modo efficace i dati di input.

Una volta addestrato, l’autoencoder può riconoscere modelli a partire da dati incompleti o scarsi oppure può migliorare e completare i dati in ingresso.
Con l’autoencoder è possibile rimuovere il rumore presente nei dati e ricostruire l’informazione originale. Questo trova applicazione in varie aree, come l’elaborazione delle immagini, la cancellazione del rumore nei segnali audio o la pulizia e ricostruzione di testi danneggiati. Può essere utilizzato, ad esempio, per generare nuove immagini, testi o suoni. Un esempio noto è la generazione di volti realistici da parte di autoencoder addestrati su dataset di volti.
L’autoencoder è usato come passaggio di pre-elaborazione dei dati per migliorare l’efficacia di altri algoritmi di intelligenza artificiale. Questa tecnica viene applicata per ridurre il rumore, normalizzare le informazioni o ridurre la dimensionalità dei dati, rendendo più semplice l’elaborazione successiva da parte di altri algoritmi.