GPT, creare un modello generativo in appena 60 righe di codice

Intelligenza artificiale nelle mani di ogni utente: con sole 60 righe di codice Python e la libreria NumPy è possibile creare il proprio modello generativo. Un'utile palestra per capire come funziona GPT.

Da settimane non si fa altro che parlare di modelli generativi e di come possono essere utilizzati nelle applicazioni di intelligenza artificiale. Un prodotto come il chatbot ChatGPT ha avuto l’enorme merito di solleticare la curiosità del pubblico e rendere palese ciò che è possibile realizzare ricorrendo a modelli come GPT.

GPT è un acronimo che in informatica fino a qualche tempo fa riconduceva essenzialmente allo standard per la definizione della tabella delle partizioni in un’unità per la memorizzazione dei dati (parliamo in un altro articolo delle differenze tra MBR e GPT).

Con la pubblicazione, a fine 2017, del documento che descrive i Transformer, tutto è cambiato. Nel campo dell’intelligenza artificiale, GPT sta a significare Generative Pre-trained Transformer.

Modelli generativi e intelligenza artificiale

Modello generativo e intelligenza artificiale sono due concetti che spesso vengono associati ma che hanno significati distinti.
L’intelligenza artificiale è un vasto campo incentrato sulla creazione di sistemi che mostrano comportamenti intelligenti simili a quelli degli esseri umani: si pensi a problemi come la comprensione del linguaggio naturale, la risoluzione di problemi, la prevedibilità e lo svolgimento di attività che richiedono conoscenze e competenze.

Un modello generativo può essere pensato come una particolare classe di modelli di intelligenza artificiale che utilizzano un processo generativo</strong< per produrre output. Questi modelli hanno una certa “visione” (impossibile parlare di “conoscenza”) sulle proprietà di una certa categoria di oggetti: immagini, testo o suoni. Le informazioni di cui dispongono vengono utilizzate per generare nuovi “contenuti” appartenenti alle stesse categorie.

Cos’è un Transformer

Il Transformer è un tipo di modello di intelligenza artificiale utilizzato per vari compiti di elaborazione del linguaggio, tra cui la traduzione automatica, la comprensione e la generazione di testo.

A differenza di altri modelli di elaborazione del linguaggio basati su una struttura a blocchi ripetitivi, il Transformer utilizza una struttura che permette di gestire molto efficacemente una serie di elementi presentati in sequenza.
Nei modelli generativi di testo il Transformer produce nuovo testo che è coerente con un certo input fornito dall’utente.

Nell’articolo citato in apertura, Andrej Karpathy, membro fondatore di OpenAI, ricercatore e responsabile fino al 2022 del progetto Tesla Autopilot, di recente tornato a far parte del team di OpenAI, spiega efficacemente “i rudimenti” dei modelli generativi.

Cos’è GPT

GPT è un modello di elaborazione del linguaggio sviluppato da OpenAI, una versione molto avanzata del concetto di Transformer.
GPT-2, GPT-3, GPT-3.5 e Prometheus Model sono le attuali ultime generazioni del modello, addestrate utilizzando una vasta quantità di testo disponibile sul Web per raggiungere un livello di gestione (più che comprensione…) del linguaggio naturale e di capacità generative senza precedenti.

GPT-3 e GPT-3.5 sono nomi che OpenAI ha scelto per due generazioni del suo modello ma ve ne sono altri realizzati da società diverse: ricordiamo ad esempio Google LaMDA. Nel complesso sono tutti Large Language Models (LLM) che integrano i “fondamentali” di GPT.
Ciò che li rende speciali è che sono molto grandi (miliardi di parametri) e addestrati su immense moli di dati (centinaia di gigabyte di testo).

Un’idea di alto livello su come funziona GPT è la seguente: una funzione GPT riceve in ingresso un testo formato da una sequenza di parole. Dopo l’elaborazione viene fornito in output un testo coerente con l’input.

Il testo in input viene rappresentato come una sequenza di numeri interi che a loro volta esprimono una corrispondenza univoca con le stringhe di testo o parole corrispondenti (token). I numeri interi provengono dall’indice di tutti i token conservato nel dizionario del tokenizer di GPT.
All’atto pratico i moderni modelli usano metodi di tokenizzazione più avanzati rispetto alla semplice suddivisione per spazi bianchi (i.e. Byte-Pair Encoding o WordPiece), ma il principio è lo stesso:

– C’è un dizionario che mappa ciascun token in formato stringa creando una corrispondenza con un numero intero. La corrispondenza è conservata in un indice.
– C’è un metodo di codifica che converte la sequenza di token in una lista di interi (str -> list[int]).
– C’è un metodo di decodifica che converte una sequenza di interi in un testo formato da una sequenza di token (stringhe): list[int] -> str.

Per produrre l’output viene usato un modello probabilistico che cerca di stabilire, con buona approssimazione, qual è il token successivo da inserire nella sequenza. Poiché GPT è un modello linguistico ovvero esegue la modellazione del linguaggio il compito è quello di prevedere la parola più logica che succede a un’altra in una sequenza.

La generazione del testo è basata su un approccio autoregressivo e sul campionamento.
È possibile cioè generare frasi complete chiedendo in modo iterativo al modello di prevedere il token successivo probabilisticamente più plausibile; ad ogni iterazione il token viene nuovamente all’input.
Per questo si parla di autoregressione: lo schema poggia infatti da un lato sulla previsione di un valore futuro (regressione), dall’altro sulla successiva aggiunta del token in input (auto).

Il sampling o campionamento permette di introdurre un po’ di stocasticità (casualità): consente di generare frasi diverse per lo stesso input ed aumenta la qualità degli output. Tecniche accessorie chiamate top-k, top-p e temperature aiutano a “mescolare le carte” inducendo comportamenti generativi differenti. Con il parametro temperature abbiamo visto come il modello GPT di OpenAI si prenda qualche rischio in più e diventi sostanzialmente più creativo. Ne parliamo nell’articolo su come collegare ChatGPT con Google Fogli.

Jay Mody, esperto di machine learning presso Cohere, altra società che si occupa di intelligenza artificiale e modelli generativi, mostra come creare un modello GPT da zero con appena 60 righe di codice Python.
Il codice in questione, pubblicato su GitHub e puntualmente commentato, sfrutta NumPy una libreria Python open source che aggiunge al linguaggio di programmazione il supporto per grandi matrici e array multidimensionali insieme a una vasta collezione di funzioni matematiche di alto livello.

A titolo esemplificativo viene usato il modello GPT-2 di OpenAI e in particolare i dati di training contenuti in picoGPT per consentire la generazione di testo a partire da un prompt (input) dell’utente.
Un esempio? Scrivendo “Alan Turing teorizzò che i computer sarebbero diventati un giorno“, si ottiene in risposta qualcosa come “le macchine più potenti del pianeta“.

L’implementazione basata sulle sole 60 righe di codice può essere provata da terminale oppure servendosi di Docker. Richiamando JAX è addirittura possibile trasferire tutte le elaborazioni, molto semplicemente, sulla GPU così da sgravare la CPU e concludere i compiti in modo più rapido.

Mody ha comunque intenzione di far evolvere il suo progetto per aiutare chiunque a comprendere i segreti dei modelli generativi e il funzionamento di alcune intelligenze artificiali.

Ti consigliamo anche

Link copiato negli appunti