Tutti parlano di ChatGPT, ossia questo magnifico chatbot in grado di conversare su ogni argomento in tante lingue e fornire risposte sensate, lunghe e diverse.
Ma quello che vogliamo provare a illustrare qui è che ChatGPT non è magia, è matematica molto avanzata, è il tentativo dell’uomo di modellizzare con i numeri i processi che adottiamo per comprendere ed interagire col linguaggio.
ChatGPT, perché ora l’intelligenza artificiale ci stupisce e spaventa
Il funzionamento di ChatGPT, semplificato
Il Web è pieno di prompt, ossia questioni/quesiti da porre a ChatGPT, di ogni genere; infatti, questo sistema è in grado di scrivere testi nuovi, poesie, fare riassunti, parafrasi, traduzioni, creare anche una presentazione di slides su un argomento, scrivere codice informatico per creare software e tantissimo altro.
In quest’articolo proverò a semplificare al massimo il funzionamento di questo sistema di Deep Learning, branca dell’Intelligenza Artificiale (IA), per comprendere come funziona, dato che per molti sembra quasi una stregoneria.
Su come sono strutturate le cosidette “IA” c’è molta letteratura e video per ogni livello culturale, in sintesi i modelli di IA (Machine Learning, Deep Learning), si basano su una fase di addestramento su dei dataset (enormi banche di dati) e poi, grazie a complicati algoritmi matematici, riescono a “prevedere” un risultato per un nuovo input di dati a loro sconosciuti.
Tutto questo si fa per approssimazione, statistica, probabilità, il che rende un dato nuovo più vicino ad un dato conosciuto; da qui la foto di una pantera ha delle caratteristiche più vicine ad un gatto che ad un cane, ed ecco che una CNN (Convolutional Neural Network) potrebbe classificare la foto della pantera come quella di un gatto.
Così anche per altre cose, tipo testi, numeri, audio, ecc..
Le reti generative
Ma arriviamo alle reti generative; queste nascono con l’intento di creare qualcosa di nuovo; quindi, partono da un dato sconosciuto e, tramite delle particolari reti come le RNN (Recursive Neural Network) o le GAN (Generative Adversarial Network), riescono a generare un qualcosa che potrebbe essere classificato da qualcosa già imparato dalla rete.
Facciamo un esempio con una GAN:
- Un’immagine casuale viene generata da una rete che chiameremo “Generatore”
- Il Generatore ha il compito di ingannare una rete avversaria chiamata Discriminatore e fargli credere che il dato da lui generato possa essere un qualcosa che il Discriminatore ha già “imparato”, ad esempio un volto umano.
- Il Discriminatore valuta l’input fornitogli dal Generatore e gli fornisce un punteggio, chiamiamolo di “plausibilità”, oppure un punteggio di “perdita”.
- Il Generatore allora migliorerà il proprio input da passare al discriminatore, magari migliorando l’immagine.
- Quando il Discriminatore sarà ingannato a dovere, quindi giudicherà quell’input abbastanza bene da poter dire che è un volto, allora l’immagine sarà generata e fornita in output.
Ecco che la GAN ha creato un volto umano dal nulla, il volto di una persona inesistente nel mondo; con questo stesso sistema si possono creare anche suoni e testi, ecc..
Per l’NLP (Natural Language Processing), l’IA applicata ai testi ed al linguaggio naturale, ci sono tante soluzioni, come le Bag Of Words, le RNN, LSTM, ecc.. Ma sono limitate a classificazioni o a ridotte previsioni di testo successivo e sono lente, perché sequenziali e non riescono a trattare lunghe sequenze di testo.
Arrivano i Transformers
Il modello Transformer è un tipo di rete neurale utilizzata per il natural language processing (NLP). È stato introdotto nel 2017 da Google in un articolo scientifico intitolato “Attention Is All You Need“[3].
Il modello Transformer si differenzia dalle reti neurali tradizionali perché utilizza l’attenzione per elaborare il testo ed è principalmente composto da strati di Encoders (codificatori) e strati di Decoders (decodificatori).
L’attenzione consente al modello di concentrarsi su parti specifiche del testo mentre lo elabora, permettendogli di capire meglio il contesto e di generare risposte più appropriate; è stato utilizzato con successo in molte applicazioni NLP, come la traduzione automatica, la generazione e la classificazione del testo ed è stato applicato in sistemi come BERT, GPT-2 e GPT-3 e ChatGPT.
In sintesi, è una tecnica utilizzata per identificare quali parti di un input sono più rilevanti per la generazione di un output.
Vediamo i vari step che utilizza il modello Transformer:
Immaginiamo di avere la frase “il gatto è sul” e vogliamo completarla utilizzando un modello Transformer; elenchiamo i vari passaggi che il modello potrebbe seguire:
- Tokenizzazione: Il primo passo è quello di dividere la frase in token, ovvero singole parole; in questo caso, la frase sarebbe divisa in [“il”,”gatto”,”è”,”sul”]
- Embedding: Ogni parola viene convertita in un vettore numerico, chiamato embedding, in modo che il modello possa lavorare con esso e rappresenta la parola in uno spazio numerico e viene utilizzato per l’elaborazione dei dati.
- Positional Encoding: In questo passaggio il modello utilizza una tecnica chiamata “positional encoding” per tenere conto dell’ordine delle parole nella frase, ciò significa che il modello capisce che “il” è all’inizio della frase e “sul” è alla fine. Per implementare il posizionamento delle parole, i modelli Transformer utilizzano un vettore di posizione per ogni parola in una frase. Il vettore di posizione è un vettore numerico che rappresenta la posizione relativa della parola all’interno della frase.
- Multi-head attention: Il modello utilizza una tecnica chiamata “multi-head attention” (modello di self-attention a più teste) per calcolare l’attenzione tra le parole della frase. In questo caso, il modello calcolerà l’attenzione tra la parola “sul” e le altre parole della frase, come “il” e “gatto“, per capire meglio il contesto e il significato della parola “sul” e così per le altre parole componenti la frase. I vettori di attenzione generati da ciascuna testa vengono poi concatenati e sottoposti ad una nuova trasformazione per generare una rappresentazione globale dell’input.
- Feed-forward layer: infine, il modello utilizza una rete neurale feed-forward per generare una risposta plausibile e coerente; in questo caso, il modello potrebbe generare la risposta “il gatto è sul tavolo” o “il gatto è sul letto” in base alla relazione tra le parole della frase e al contesto generale.
Figura 1 – Fonte: https://arxiv.org/pdf/1706.03762.pdf
In sintesi, i Transformers utilizzano una serie di trasformazioni e calcoli per comprendere il significato di una frase e generare una risposta plausibile e coerente.
Per generare una risposta lunga a partire da una domanda breve, il modello Transformer utilizza una combinazione di tecniche come la Language Modeling, la Multi-head Attention, il Fine-tuning e la Generazione Autoregressiva.
La Language Modeling permette di imparare a generare testo plausibile e coerente, mentre la Multi-head Attention consente di capire il contesto e il significato delle parole e delle frasi nella domanda.
Il Fine-tuning permette di adattare il modello ad un dataset specifico per generare risposte più pertinenti.
Infine, la Generazione Autoregressiva consente di generare frasi e paragrafi in modo autonomo, una parola alla volta, utilizzando le informazioni precedentemente generate.
Come funziona il sistema dell’attenzione
Ma cerchiamo di capire come funziona il sistema dell’”attenzione”, che è il cuore del modello Transformer.
Iniziamo con l’embedding, che sulla frase “il gatto è sul” potrebbe essere:
“il”: [0.1, 0.2, -0.3, 0.4, …]
“gatto”: [0.5, -0.1, 0.2, -0.3, …]
“è”: [-0.2, 0.3, 0.1, -0.4, …]
“sul”: [0.3, -0.2, 0.5, -0.1, …]
In questo esempio ogni parola è rappresentata da un vettore numerico di lunghezza n, chiamato embedding.
Gli embeddings vengono pre-calcolati, prima di essere utilizzati come input per il Transformer, utilizzando una grande quantità di dati di testo e un algoritmo di apprendimento automatico, tramite metodi come word2vect, GloVe, ecc..
Il modello utilizza questi embedding per capire il contesto e il significato delle parole e delle frasi nella domanda e generare una risposta pertinente.
Una dimensione di embedding più alta significa che il modello avrà più flessibilità per rappresentare le parole in uno spazio numerico, ma richiederà anche più memoria e potrebbe essere più difficile da addestrare.
In generale, una dimensione di embedding più alta consente al modello di rappresentare in modo più preciso le parole e i loro contesti, migliorando le prestazioni del modello. Tuttavia, una dimensione troppo alta può causare overfitting (scarsa capacità d’approssimazione) mentre una dimensione troppo bassa può causare una perdita di informazioni (underfitting).
Il modello Transformer dopo aver calcolato gli embedding della parole componenti la frase “il gatto è sul“, combina i vettori di embedding con i vettori di positioning per formare l’input da passare all’architettura di attenzione multi-testa (multi-head attention) per capire il contesto e il significato delle parole e delle frasi nella frase.
La tecnica di attenzione multi-testa funziona creando diverse “teste” che calcolano l’attenzione tra le parole della frase in modo indipendente.
Per la frase “il gatto è sul“, il modello potrebbe utilizzare tre multi-head attention:
- La prima testa di attenzione potrebbe calcolare l’attenzione tra la parola “sul” e le altre parole della frase, come “il” e “gatto”, per capire meglio il contesto e il significato della parola “sul”.
- La seconda testa di attenzione potrebbe calcolare l’attenzione tra la parola “gatto” e le altre parole della frase, per capire meglio il contesto e il significato della parola “gatto”.
- La terza testa di attenzione potrebbe calcolare l’attenzione tra la parola “il” e le altre parole della frase, per capire meglio il contesto e il significato della parola “il”.
Dopo aver calcolato l’attenzione tra le parole della frase, le multi-head attentions combinano le loro risposte per generare una rappresentazione globale della frase, che tiene conto del contesto e del significato delle parole e viene utilizzata per generare una risposta plausibile e coerente alla domanda.
Il calcolo di una testa d’attenzione
Il calcolo di una testa d’attenzione si basa su tre componenti principali:
Query (Q): un vettore che rappresenta la parola o le parole per cui si sta cercando attenzione.
Key (K): un vettore che rappresenta la parola o le parole su cui si sta concentrando l’attenzione.
Value (V): un vettore che rappresenta l’informazione associata alla parola o alle parole chiave.
I vettori query, key e value vengono calcolati utilizzando tre diverse matrici di peso, una per ciascun componente; il modello quindi, calcola una matrice di attenzione utilizzando questi vettori; la matrice di attenzione generata determina la quantità di attenzione che ogni parola riceve da ogni altra parola nel testo di input.
Insomma, Q e K sono come la query che facciamo ai motori di ricerca e K le keywords che corrispondono meglio alla query.
Infine, c’è la rete neurale feedforward, che una volta che riceve in input la frase “il gatto è sul“, utilizza la rappresentazione globale della frase generata dalle multi-head attention per prevedere la prossima parola.
Il modello è stato addestrato su un grande dataset di testi; quindi ha già visto molte frasi simili o uguali a “il gatto è sul” e ha imparato a capire il contesto e il significato delle parole nella frase.
La rete neurale feedforward utilizza queste conoscenze per generare una distribuzione di probabilità per ciascuna parola del vocabolario, dove ciascuna parola ha una probabilità di essere la prossima parola nella frase. Inoltre, la rete feed-forward può essere utilizzata per eliminare le informazioni non rilevanti e mettere in evidenza le relazioni più importanti tra le parole nell’input, permettendo al modello di generare una risposta più precisa e pertinente.
Riepilogando, il modello Transformer utilizza la rappresentazione globale della frase generata dalle multi-head attention e dagli embeddings, che sono combinati con i vettori di posizione, per prevedere la prossima parola, utilizzando le conoscenze che ha acquisito durante l’addestramento su un grande dataset di testi, per capire il contesto e il significato delle parole e delle frasi nella frase e generare una distribuzione di probabilità per ciascuna parola del vocabolario.
Encoder e decoder
Tutto il meccanismo si sintetizza in una serie di Encoders e di Decoders.
Gli encoders sono utilizzati per codificare la frase in ingresso in una rappresentazione numerica, utilizzando le tecniche di embedding, multi-head attention e feed forward network; essi analizzano l’input e generano una rappresentazione numerica della frase che tiene conto del contesto e del significato delle parole/frasi contenute.
I decoders, invece, sono utilizzati per generare la risposta; essi utilizzano la rappresentazione numerica generata dagli encoders e il meccanismo dell’auto-attenzione (self-attention) per generare una distribuzione di probabilità per ciascuna parola del vocabolario, dove ciascuna di esse ha una probabilità di essere la prossima parola nella risposta o frase che devono generare. I decoders ricevono come input gli embeddings delle parole della frase o domanda, insieme alla rappresentazione globale della frase o domanda generata dalla matrice d’attenzione degli encoders; inoltre, utilizzano un meccanismo di auto-regressione per generare una risposta lunga a partire da una domanda breve. Quindi, i decoders applicano il meccanismo dell’attenzione per valutare ciò che stanno scrivendo in output, tenendo anche conto dell’input elaborato dagli encoders.
In sintesi, gli encoders sono utilizzati per codificare la frase in ingresso in una rappresentazione numerica, che viene usata dai decoders per generare la risposta.
Se volete divertirvi a creare un vostro piccolo GPT ecco poche righe di codice Python che utilizzano i Trasformers:
Conclusioni
ChatGPT non è sicuramente perfetta ma la strada è aperta e prevedo che in pochi anni vedremo qualcosa di ancora più strabiliante.
P.S.: per scrivere questo articolo mi sono consultato con LEI/LUI…ChatGPT.