**LLM: COMPRENDERE IL FUNZIONAMENTO DEI MODELLI LINGUISTICI SENZA USARE LA MATEMATICA**
Si fa un gran parlare, a tutti i livelli, di Intelligenza Artificiale generativa e il termine **modelli linguistici** è ormai sulla bocca di tutti. I *Large Language Models* (**LLM**) sono modelli di linguaggio ad alta capacità computazionale progettati per comprendere e generare testo in modo simile a come farebbe una persona in carne ed ossa. Sono capaci di svolgere una vasta gamma di compiti linguistici, come la traduzione automatica, la generazione di testo, la risposta alle domande, la creazione di riassunti e molto altro ancora. Possono “comprendere” il contesto e **produrre testo coerente** e significativo in risposta a domande o input in linguaggio naturale.
Nei nostri articoli, generalmente mettiamo il verbo “comprendere” tra virgolette perché i LLM non possono ovviamente poggiare sugli stessi meccanismi alla base del cervello umano. Cercano di approssimarne il funzionamento, a volte in modo piuttosto brillante, in altri casi in maniera meno efficace. Ma sempre di un’approssimazione parliamo.
### CHE COSA FA UN LLM (*LARGE LANGUAGE MODEL*)
Al centro dei LLM c’è il concetto di **token**: spesso sovrapposti alle singole parole, in realtà possono rappresentare sequenze di caratteri oppure più parole (o porzioni di esse). Un token può anche esprimere un punto oppure uno spazio: l’obiettivo di ogni LLM è infatti **codificare il testo** nel modo più efficiente possibile.
A ogni token presente nel **vocabolario** proprio di uno specifico LLM, è assegnato un identificativo numerico univoco. Il LLM utilizza un ***tokenizer*** (traducibile in italiano come “***tokenizzatore***“) per effettuare la trasformazione del testo in una sequenza numerica equivalente. Queste rappresentazioni numeriche sono appunto i token.
### UN ESEMPIO PRATICO CON PYTHON
Il codice Python che proponiamo di seguito utilizza la libreria `tiktoken` per codificare e decodificare testi utilizzando il **modello GPT-2**. Si tratta del più semplice modello che OpenAI ha rilasciato come prodotto open source, quindi studiabile nel dettaglio. In un altro articolo abbiamo visto come usare i fogli elettronici e GPT-2 per dimostrare il funzionamento degli LLM.
Dopo l’importazione del modulo, il codice codifica la frase indicata usando il modello GPT-2, con la funzione `encoding_for_model()`. Vedete i numeri restituiti per ciascun token? Ecco, effettuando un’operazione di decodifica, si può ottenere la frase iniziale.
“`
>>> import tiktoken
>>> encoding = tiktoken.encoding_for_model(“gpt-2”)
>>> encoding.encode(“Il gatto nero attraversa la strada buia.”)
[33666, 308, 45807, 299, 3529, 708, 430, 690, 64, 8591, 965, 4763, 809, 544, 13]
>>> encoding.decode([33666, 308, 45807, 299, 3529, 708, 430, 690, 64, 8591, 965, 4763, 809, 544, 13])
‘Il gatto nero attraversa la strada buia.’
“`
È interessante notare, come accennavamo in precedenza, che un token non contiene necessariamente una parola. Ad esempio, `[308]` viene decodificato in ‘ g’ (l’inizio della parola “gatto” con uno spazio iniziale), `[45807]` in ‘atto’ e `[13]` con un punto. Guardate l’output ottenuto in figura richiamando la funzione `encoding.decode`.
Da tenere presente che la libreria `tiktoken` richiamata tramite Python, va necessariamente installata usando il comando `pip install tiktoken`.
### I MODELLI LINGUISTICI FANNO PREVISIONI
Torniamo all’asserzione con cui abbiamo cominciato: riferendoci alle abilità di “comprensione” dei LLM, mettiamo il termine fra virgolette. Perché l’approccio utilizzato da questi sistemi è fondamentalmente **probabilistico**. O meglio ancora, come raccontavamo nell’articolo sui modelli generativi al servizio delle decisioni aziendali, lo schema sfruttato è di tipo **stocastico**.
I modelli linguistici fanno **previsioni** su quale token seguirà quello in corso di elaborazione. Immaginate una funzione che restituisce la probabilità con cui ogni singolo termine contenuto nel vocabolario del modello possa seguire uno specifico token…
… (continua)….
**Le dimensioni della finestra di contesto**
Il problema di questo approccio, detto catena di Markov, è che considera solo l’ultimo token dell’input. Qualsiasi testo che appare prima dell’ultimo token elaborato, non ha alcuna influenza sulla scelta dei token successivi. La cosiddetta **finestra di contesto** (*context window*), quindi, è in questo uguale a un solo token.
Un approccio del genere è pressoché inutile perché il modello salta da una parola all’altra, selezionando nuovi token senza avere alcuna **“memoria” dei token** elaborati in precedenza. Il risultato è ovvio: il **contesto del *prompt*** non può essere in alcun modo conservato.
Per migliorare le previsioni, si deve quindi costruire una **tabella delle probabilità** di dimensioni maggiori. Si supponga di usare una finestra di contesto formata da **due token**. Limitandoci agli 8 token usati nell’esempio del paragrafo precedente, alla tabella andrebbero aggiunte 64 nuove righe, al di sotto delle 8 già presenti. Il modello dovrebbe essere quindi nuovamente addestrato.
Anche con una finestra di contesto da due token, tuttavia, è impossibile che i token via via aggiunti si riferiscano a concetti e idee espressi dai token precedenti.
L’ormai superato modello open source GPT-2 di OpenAI, utilizza una finestra di contesto di **1024 token**. Per poter implementare una finestra di contesto di queste dimensioni utilizzando le catene di Markov, ciascuna riga della tabella delle probabilità dovrebbe rappresentare una **sequenza compresa tra 1 e 1024 token**….
… (continua)…
**Dalla tabella delle probabilità alle reti neurali**
Gestire una tabella delle probabilità delle dimensioni di quelle descritte in precedenza, soprattutto con i modelli contraddistinti da finestre di contesto particolarmente ampie, richiederebbe una quantità di **memoria RAM** impressionante. Ecco quindi che accorrono in soccorso le reti neurali.
Una rete neurale può essere pensata come una funzione che approssima le probabilità dei vari token utilizzando un insieme di parametri, più o meno vasto.
I **parametri** in una rete neurale al servizio di un LLM si riferiscono alle informazioni che la rete neurale stessa impara durante il processo di addestramento. Questi parametri includono i **pesi** delle connessioni tra i neuroni e i *bias* di ciascun neurone in ogni strato della rete.
… (continua)…
Resta aggiornato sulle ultime novità dell’Intelligenza Artificiale sul nostro sito!