Se parliamo di intelligenza artificiale nel mondo conversazionale, il nome che sentiamo sempre più spesso ad oggi è quello di GPT-3. Ma cos’è che rende davvero speciale questa tecnologia? GPT-3 (il cui nome sta per Generative Pre-Trained Transformers) è un modello rilasciato da Google ormai nel 2019 che ha fatto parlare di sé per le sue incredibili capacità di risolvere numerosi task di Natural Language Processing nel contesto del few-shot learning. Sarebbe a dire?
Sarebbe a dire che questi modelli non hanno bisogno di essere addestrati su dati supervisionati per imparare a svolgere un task, ma imparano da un numero molto piccolo di esempi, chiamati shot, che vengono dati in input al modello per aiutarlo a svolgere correttamente il task richiesto. Ad esempio, per un task di sentiment analysis, il modello riceve una breve descrizione del task, accompagnato da alcuni esempi (composti da: frase da analizzare + output) del tipo
This is a tool that read a sentence and make sentiment analysis to that.
- Sentence: I really liked watching that movie
- Sentiment: Positive
- Sentence: This cake is not as good as expected
- Sentiment: Negative
Questo è quello che in linguaggio tecnico viene definito prompt, ed è tutto ciò che viene passato in input al modello per imparare a svolgere il task. Infatti, per andare a fare predizione su una nuova frase, si passa al modello questo template, seguito dalla frase da classificare, come sotto:
This is a tool that read a sentence and make sentiment analysis to that.
- Sentence: I really liked watching that movie
- Sentiment: Positive
- Sentence: This cake is not as good as expected
- Sentiment: Negative
- Sentence: I was at the stadium yesterday, it was an amazing experience!
- Sentiment:
e a quel punto il modello genera la sentiment associata a quella frase. In questo modo, GPT-3 può svolgere qualsiasi task utilizzando un approccio generativo.
Ma allora com’è possibile che, dandogli solo queste brevi istruzioni, questi modelli riescono a imparare a svolgere correttamente questi task? La risposta è da ricercare nel cosiddetto pre-training: modelli come quelli di tipo GPT, infatti, vengono inizialmente addestrati in una prima fase, chiamata appunto pre-training, in cui vedono una enorme quantità di dati non-supervisionati (cioè facilmente estraibili dal web e che non hanno bisogno di una lavorazione da parte di umani) e dove acquisiscono una prima, generica, conoscenza del nostro linguaggio. Trattandosi di modelli di linguaggio cosiddetti large, sfruttano una quantità di parametri dell’ordine dei miliardi per poter immagazzinare più informazione possibile al loro interno, e poter essere in grado di applicare la conoscenza acquisita per svolgere diversi task di natural language processing, semplicemente dandogli l’istruzione corretta senza dover ulteriormente addestrare il modello per svolgere uno specifico task, su uno specifico dominio. Questa è l’innovazione principale di questi modelli GPT che ha spostato l’attenzione della ricerca sul filone chiamato zero-shot learning.
Il vero vantaggio è quello di poter usare un’unica tecnologia per diverse applicazioni, e di poterlo fare in un modo molto più semplice e fruibile a tutti, anche a chi non ha spiccate conoscenze tecniche ma vuole sfruttare i vantaggi di questi strumenti tecnologici.
Nonostante queste premesse, questi modelli generativi non raggiungono ancora lo stato dell’arte su alcuni task, soprattutto di classificazione, dove i modelli addestrati ad-hoc risultano ancora più performanti. La principale ragione è da ricercare nell’instabilità di questi modelli: diversi studi hanno evidenziato come la scelta del prompt risulta cruciale per ottenere i risultati desiderati, poiché influenza notevolmente le generazioni, facendo variare le performance anche fino ad oltre il 40%. In particolare, le 3 principali variabili si possono riassumere così:
- scelta del template
- scelta degli esempi few-shot
- scelta dell’ordine degli esempi few-shot.
In particolare, l’ultima ci dice che anche a parità di esempi dati in input al modello, l’ordine in cui il modello li vede è fondamentale, e permutazioni diverse di questi esempi portano a dei risultati molto variabili. Uno studio di ricerca condotto dall’università di Berkeley ha evidenziato come questi modelli generativi tendono a essere fortemente condizionati dagli esempi che vedono nel prompt. In particolare, sono stati individuati 3 bias:
- majority label bias, ovvero il modello è più portato a predire un output che ha visto più volte negli esempi few-shot
- recency bias, ovvero il modello è più portato a predire gli output degli esempi più vicini alla fine del prompt
- common token bias, ovvero il modello è più portato a generare un token che ha visto più spesso nella fase di pre-addestramento (ad esempio, se gli si chiede di generare la capitale dell’Andorra ha più difficoltà rispetto a generare la capitale degli Stati Uniti).
Diversi studi di ricerca focalizzati nel risolvere questo problema hanno individuato come possibile soluzione quella di ottimizzare la scelta del prompt per trovare quello in grado di ottenere le performance più alte. Questo approccio risulta spesso troppo complesso e non sempre efficace, dovendo ricercare il template migliore in linguaggio naturale tra tantissime alternative.
La soluzione proposta nel paper Calibrate Before Use: Improving Few-Shot Performance of Language Models è quella di andare ad agire non sui dati (quindi non sul prompt) ma sul modello, in particolare sulla distribuzione di probabilità del modello in fase di output.
L’idea proposta è estremamente semplice, ma efficace: considerando il caso della sentiment analysis, fissano un prompt fatto di 2 shot, e danno al modello un input che chiamano “content-free”, cioè privo di alcun significato semantico, e osservano le probabilità di predizione che il modello fornisce (come in figura sotto).

In un caso ideale (senza bias), il modello dovrebbe predire con 50% di probabilità sentiment positiva e con 50% sentiment negativa; quello che osservano, in realtà, è che il modello predice sentiment positiva col 62% di probabilità, e sentiment negativa col restante 38%. Questo è dovuto probabilmente al recency bias a cui si fa riferimento prima (l’ultimo esempio nel prompt ha sentiment positiva quindi il modello è sbilanciato verso quella sentiment).
A questo punto, usano queste probabilità ottenute per calibrare il modello, tramite una trasformazione lineare del tipo

con W = [ 1/0.62 0 0 1/0.38 ] chiamata matrice di pesi e b vettore bias, in questo caso nullo.
Da un rapido calcolo, si vede facilmente che, applicando questa trasformazione lineare, si ottiene lo stesso valore per le due probabilità di predizione, che normalizzate si trasformano in una probabilità del 50% ciascuna.
Come si può vedere, quindi, è un’operazione estremamente semplice che però si è dimostrata molto efficace per risolvere l’instabilità di questi modelli e migliorare le performance, come si nota nel grafico in basso.

Per rendere più robusti i risultati, gli autori hanno provato a variare il “content-free” input usando altre stringhe prive di significato, così come la size del modello GPT-3 e il numero di esempi nel prompt. In tutti i casi, i risultati ottenuti dimostrano come questo tipo di approccio sia robusto e, quindi, poco sensibile a diverse scelte delle variabili indicate sopra.
Questo tipo di approccio è però contestuale: una scelta diversa di esempi, permutazione e formato del prompt avrebbe portato ad un errore diverso sullo stesso input. Per questo motivo si parla di calibrazione contestuale. Inoltre, un approccio così semplice risulta efficace per un problema di classificazione binaria come la sentiment analysis, meno se si estende ad altri task. Altri approcci hanno provato ad indagare tipologie di calibrazioni più complesse, come nel paper Prototypical Calibration for Few-shot Learning of Language Models, che è in grado di gestire problemi più complessi utilizzando un approccio di clustering delle probabilità di predizione abbinato a un problema di matching con la categoria giusta. Questo dimostra che la calibrazione è un approccio promettente e che può essere ulteriormente raffinato.