Modelli di apprendimento automatico più potenti spiegati (Trasformatori, CNN, RNN, GAN…)

Potent machine learning models explained (Transformers, CNN, RNN, GAN...)

Immagine generata da Midjourney

Il Machine Learning è un campo vasto e comprendere quali modelli e tecniche siano all’avanguardia nella tecnologia al momento può essere complesso. Detto ciò, questo articolo sarà più un’esplorazione concettuale che un’analisi scientifica concreta di ciascuno di questi modelli. Infatti, consiglio di approfondire ciascuno di essi se possibile. Desidero inoltre fornire esempi di dove vengono utilizzati questi modelli, poiché, a mio parere, la teoria dovrebbe sempre essere legata alla pratica. Se manca qualche informazione, non esitate a fornire feedback e richiedere ulteriori dettagli.

Prima di iniziare, ecco l’elenco dei modelli che saranno affrontati.

  1. CNN (Convolutional Neural Network)
  2. RNN (Recurrent Neural Network)
  3. Transformer
  4. GAN (Generative Adversarial Network)

CNN

Una CNN (Convolutional Neural Network) è un tipo di rete neurale che funziona molto bene con dati topologici ed è modificata in qualche modo per essere migliore nella rilevazione di modelli. In cosa è diversa? Beh, per cominciare, permettetemi di darvi una breve panoramica generale di cosa sia una rete neurale.

Una rete neurale, in breve, è una “mappa” di nodi che elabora i dati di input e produce un output. È composta da livelli che mappano un insieme di nodi in un altro, propagando e trasformando l’input in un risultato. La propagazione avviene tramite pesi, che sono i valori che modificano il nostro input ad ogni passaggio di propagazione per produrre il risultato desiderato. Dopo ogni passaggio di propagazione, viene applicato un bias. I pesi e i bias sono ciò che stiamo cercando veramente: sono i numeri che vengono modificati durante l’addestramento della rete.

Figura 1 (fonte)

In cosa consiste la particolarità di una CNN? Beh, ciò che distingue una CNN è che utilizza livelli convoluzionali nella sua pila di livelli. Ciò non significa che una CNN non possa avere altri tipi di livelli (di solito li ha), ma la convoluzione la rende speciale. Ecco come funziona questo livello.

Se immaginate ogni pixel dell’immagine come un valore di luminosità, l’immagine diventa semplicemente una matrice bidimensionale di numeri. La convoluzione prenderà questa matrice e produrrà una matrice di output applicando un kernel ad essa. Un kernel è semplicemente una matrice più piccola che funziona come un filtro per ogni area dell’immagine.

La matrice più piccola “scansiona” la matrice più grande dell’immagine per produrre una matrice di output.

Figura 2 (fonte)

Qui ci sono alcune idee chiave.

  1. Il kernel viene in un certo senso applicato a ogni pixel dell’immagine e alla sua area circostante, ma rimane lo stesso. Questo perché un kernel è destinato a rilevare un modello o una caratteristica all’interno dell’area di quel pixel.
  2. I kernel sono di solito considerevolmente più piccoli dell’immagine stessa, il che aiuta molto nell’addestramento.
  3. L’idea alla base dei kernel è che ogni immagine è solo un insieme di modelli che possiamo scomporre. Ad esempio, supponiamo di avere un volto. Immaginate che ci sia un kernel in grado di rilevare cerchi. Il suo output conterrà 2 punti luminosi nella parte superiore dell’immagine (gli occhi che ha rilevato). Ora immaginate che ci sia un altro kernel che può rilevare due linee vicine. L’output avrà un punto luminoso nella parte inferiore (la bocca che ha rilevato). Infine, immaginate che l’ultimo kernel applicato possa rilevare questa formazione di 2 cerchi e le 2 linee inferiori. Bene, allora riconoscerebbe il volto.
  4. Un livello convoluzionale può avere più di questi kernel applicati per produrre più nuove immagini. Queste vengono poi impilate insieme e inoltrate nella rete. Quindi un altro livello convoluzionale avrebbe un altro insieme di kernel da applicare.
  5. Le CNN di solito contengono anche livelli di pooling, che servono a ridurre la dimensione e la complessità dell’immagine.

Ovviamente, ci sono molti più dettagli e matematica che ho omesso qui, ma l’intuizione principale dietro le CNN risiede nel nucleo.

Alcuni strumenti e prodotti popolari che utilizzano le CNN includono Google Photos, AlphaGo di DeepMind e i sistemi di autopilota di Tesla.

RNN

Come hai visto, le CNN sono principalmente utilizzate per l’elaborazione delle immagini. Le RNN, d’altra parte, sono utilizzate principalmente per l’elaborazione del linguaggio naturale (NLP) e altri domini come l’analisi delle serie temporali. Per capire l’architettura delle RNN, mettiamo in evidenza alcuni problemi nell’utilizzo di una semplice rete neurale per l’NLP. Consideriamo un problema standard di NLP: l’autocompletamento del testo. L’input del nostro modello è un pezzo di testo e l’output è un altro pezzo di testo. Il problema è che il nostro input ha una dimensione variabile (può essere composto da poche parole o da molte parole), mentre le reti neurali semplici hanno tipicamente una dimensione di input fissa. L’altro problema è catturare le complesse relazioni tra le parole nel nostro input per produrre l’output corretto. Ricorda, ci sono migliaia di parole nella lingua inglese e l’ordine di queste parole in una frase non necessariamente cambia il significato. Quindi, come assicurarsi che la frase “Il gatto soffice è venuto qui di domenica” sia simile a “Di domenica, il gatto soffice è venuto qui”, ma diversa da “La domenica è venuta qui su un gatto soffice”?

L’intuizione delle RNN viene dalla modalità in cui l’informazione fluisce attraverso di esse. Prendiamo una frase ad esempio e vediamo come una RNN la elaborerebbe: “Il gatto mangia”.

Consideriamo la frase come una sequenza di parole: “Il”, “gatto” e “mangia” (in realtà probabilmente sarebbe rappresentata come una sequenza di numeri o vettori). La RNN elaborerà questa sequenza… in modo sequenziale (da qui deriva la parte “ricorrente” del nome). Prima, prenderà la parola “Il” e produrrà qualche output x1 facendo passare “Il” attraverso il proprio set di pesi e bias. Poi, prenderà x1 e la parola successiva nella sequenza – “gatto”, per farla passare attraverso lo stesso set di pesi e bias per ottenere il prossimo output x2. Successivamente, prenderà x2 e la parola successiva nella sequenza – “mangia”, per ottenere il prossimo output x3. In questo modo, puoi vedere come la RNN prenda il suo output precedente e l’input successivo per produrre un nuovo output. Lo “stato” corrente della RNN è chiamato stato nascosto. Qui c’è un’animazione che potrebbe aiutarti a sviluppare questa intuizione da un ottimo articolo scritto da Michael Phi.

Figura 3 (fonte)

Come si può utilizzare per prevedere la parola successiva dopo una domanda? Immagina che ogni output – x1, x2, x3 – rappresenti effettivamente una nuova parola. Possiamo addestrare la rete in modo che l’output sia in realtà una previsione della parola successiva. Quindi, guardiamo di nuovo alla nostra frase in elaborazione.

“Il” -> Passato attraverso il nostro modello -> produce x0, addestriamo il nostro modello in modo che x0 possa essere correttamente extrapolato in “gatto”

“gatto” e output precedente x0 -> Passato attraverso il nostro modello -> produce x1, dopo l’addestramento x1 può essere correttamente extrapolato in “mangia”

“mangia” e output precedente x1 -> Passato attraverso il nostro modello -> produce x2. Scopriamo che x2 rappresenta ora la parola “tonno”! Possiamo usarlo per il nostro prossimo “input”

“tonno” e output precedente x2 -> Passato attraverso il nostro modello -> produce x3… E così via

L’intuizione principale delle RNN risiede nel fatto che

  1. Le RNN tengono sempre traccia di ciò che è stato visto in precedenza tramite questo stato nascosto e catturano le relazioni tra le parole o qualsiasi dato sequenziale.
  2. Lo stesso modello viene applicato a ogni parte della sequenza in modo ricorrente, il che rende le RNN fattibili da addestrare (a differenza di avere un enorme modello che elabora l’intero input in una volta sola)

Qui probabilmente puoi già immaginare alcuni problemi con questo approccio. Una volta che il testo diventa lungo, le nostre prime poche parole contribuiscono appena allo stato nascosto corrente, il che non è ideale. Inoltre, siamo costretti a fare questo processo in modo sequenziale e quindi sia il nostro processo che la velocità di addestramento sono limitati dall’algoritmo stesso.

Tuttavia, ci sono molto di più in questi modelli potenti, quindi ti incoraggio a approfondire!

Alcuni strumenti e prodotti popolari che utilizzano le reti neurali ricorrenti includono Google Translate, GPT2 di OpenAI e il sistema di raccomandazione di Spotify.

Transformers

Transformers! La furia attuale del mondo del Machine Learning. Sia GPT4 che BERT (il proprio modello di linguaggio avanzato di Google) si basano sull’architettura del transformer. Quindi di cosa si tratta?

Bene, i transformers sono principalmente utilizzati nei problemi di NLP, proprio come le reti neurali ricorrenti, e quindi devono risolvere problemi simili legati all’elaborazione del linguaggio che ho descritto in precedenza. Tuttavia, ci sono alcune idee chiave che mitigano questi problemi in modo diverso dalle reti neurali ricorrenti.

  1. Codifica posizionale – Mentre l’importanza della sequenza nel linguaggio è naturalmente preservata nelle reti neurali ricorrenti tramite i loro stati nascosti, i transformers incorporano direttamente queste informazioni nell’input. Le codifiche posizionali vengono aggiunte alle incapsulazioni delle parole (rappresentazioni vettoriali delle parole), garantendo che la posizione di ogni parola in una frase venga catturata. Quindi, la rappresentazione di “cane” viene modificata in base alla sua posizione nel testo.
  2. Dimensioni enormi dei dati di addestramento – Per sfruttare il vantaggio della codifica posizionale, i transformers devono essere addestrati su enormi set di dati. Queste differenze nell’ordine delle parole vengono catturate nei dati e quindi, senza vedere tutte le diverse possibilità di ordine e tipo di parola, il modello funzionerà in modo sub-ottimale.
  3. Autoattenzione – Il modello impara a “prestare attenzione” di più a certe parole e a come si relazionano con ogni altra parola in input. Dopotutto, alcune parole avranno molto più significato e potere nella previsione o nella traduzione, specialmente se raggruppate insieme ad altre. Come impara a fare ciò? Di nuovo, attraverso le enormi dimensioni dei dati di addestramento e la sua architettura.

L’architettura dei transformers, tuttavia, è un po’ più complessa e difficile da spiegare in un articolo così breve. Tuttavia, cercherò di darti un’idea molto generale. I transformers sono composti da decodificatori e codificatori. Il codificatore è costituito da una pila di livelli identici il cui ruolo è elaborare il testo e fornire l’input per il decodificatore che catturerà le informazioni più importanti del testo. Il ruolo del decodificatore è prendere questo input e produrre l’output desiderato, in un processo simile con una pila di livelli identici. Di seguito è riportata un’immagine che mostra questa architettura, con un ottimo articolo (di Ketan Doshi) collegato che approfondisce questo argomento.

Figura 4 (fonte)

Ti consiglio vivamente di approfondire questo argomento e in particolare il meccanismo dell'”autoattenzione” che sta alla base dei transformers.

GAN (Generative Adversarial Networks)

Le GAN (Generative Adversarial Networks) riguardano fondamentalmente due modelli opposti che competono tra loro. GAN si riferisce più spesso al metodo di apprendimento per addestrare questi modelli, rispetto ai modelli stessi. Infatti, l’architettura dei due modelli non è eccessivamente importante per il concetto stesso, purché uno sia generativo e l’altro sia un classificatore.

Iniziamo descrivendo la tecnica standard di apprendimento supervisionato per addestrare i modelli.

  1. Alimentiamo il nostro modello con un certo input e produce un certo output
  2. Confrontiamo questo output con l’output desiderato e aggiorniamo il modello in qualche modo per migliorare

Tuttavia, sorge un problema quando vogliamo creare un modello in grado di generare un output realistico che non deve necessariamente essere identico a qualsiasi tipo di output che abbiamo (pensa alla generazione di immagini o di musica). Ecco dove entrano in gioco le GAN. In una GAN abbiamo due modelli, il Modello Generatore e il Modello Discriminatore.

Ad esempio, prendiamo un modello generatore che produce immagini. Iniziamo chiedendo a questo modello di produrre un certo numero di immagini false e poi troviamo anche alcune immagini reali. Successivamente alimentiamo una combinazione di tutte queste immagini nel nostro modello discriminatore che le classifica come reali o false. Se il nostro modello generatore fa bene, il modello discriminatore è confuso e darà la risposta corretta circa la metà delle volte. Ovviamente, questo non sarà il caso all’inizio (il nostro discriminatore è di solito leggermente pre-addestrato), quindi in modo simile all’apprendimento supervisionato (noi stessi sappiamo quali immagini sono reali o false), addestriamo il modello discriminatore a fare meglio la prossima volta. Possiamo anche addestrare il modello generatore poiché sappiamo quanto è stato capace di “ingannare” il modello discriminatore. L’addestramento viene eseguito quando possiamo generare immagini che ingannano il modello di discriminazione circa il 50% del tempo.

Figura 5 (fonte)

Alcuni esempi di utilizzo dei GAN nel mondo reale sono Runway ML, la generazione di arte Midjourney (controlla il mio articolo precedente sull’arte!) e DALL * E di OpenAI.