Perplessità dei modelli linguistici

Nov 27 2022
La perplessità è una metrica di valutazione che misura la qualità dei modelli linguistici. In questo post discuteremo cos'è la perplessità e come viene calcolata per il popolare modello GPT2.

La perplessità è una metrica di valutazione che misura la qualità dei modelli linguistici. In questo post discuteremo cos'è la perplessità e come viene calcolata per il popolare modello GPT2 .

Che cos'è un modello linguistico?

Potresti aver già sentito parlare di modelli di linguaggio di grandi dimensioni (LLM) come BERT, GPT2 ecc., Che hanno cambiato il volto dell'elaborazione del linguaggio naturale. Esistono diversi tipi di modelli linguistici come modelli linguistici statistici e modelli linguistici neurali. Gli SLM si basano su statistiche nel testo dato in cui i modelli di linguaggio neurale vengono addestrati utilizzando architetture di reti neurali.

Al suo interno, un modello linguistico (LM) non è altro che una distribuzione di probabilità su un insieme di parole che è noto come vocabolario del modello. Indica la probabilità che una certa parola nel vocabolario si verifichi date tutte le sue parole precedenti. Di solito, la parola che ha la massima probabilità viene selezionata come successiva parola prevista nella sequenza.

Questa probabilità può essere calcolata moltiplicando una sequenza di probabilità condizionali per ogni parola date le sue parole precedenti che dà la probabilità di questa sequenza.

Ad esempio, la verosimiglianza congiunta della frase di esempio "È una bella giornata" è scritta come mostrato di seguito. Il calcolo di questa probabilità ci aiuta a prevedere le parole successive o mancanti in una sequenza e quindi il modello apprende le sfumature della lingua, da cui il termine modello linguistico.

P(It,is,a,beautiful,day) = P(day|beautiful, a, is, it) * 
                           P(beautiful|a, is, it) * P(a|is, it) * P(is|it)

Nelle prossime sezioni discuteremo alcuni termini importanti utilizzati per calcolare la perplessità.

Entropia

L'entropia è una misura che quantifica l'incertezza e si ottiene come l'inverso della probabilità che un evento si verifichi. Maggiore è la probabilità, minore è l'incertezza. Pertanto, l'obiettivo del modello linguistico è ridurre al minimo l'entropia della generazione di una sequenza di parole simile alle sequenze di addestramento. La formula per il calcolo dell'entropia è la seguente, dove P(x) è la probabilità della parola x.

Formula per l'entropia di una distribuzione di probabilità

Ecco un ottimo video per comprendere l'entropia in modo più dettagliato:https://youtube.com/watch?v=YtebGVx-Fxw

Entropia incrociata

L'entropia incrociata confronta due distribuzioni di probabilità P(x) e Q(x). Nel contesto dei modelli linguistici, confrontiamo la distribuzione di probabilità prevista sulle parole con la distribuzione di probabilità effettiva. Qui, P(x) è la distribuzione di probabilità effettiva e Q(x) è la distribuzione prevista dal modello. L'entropia incrociata viene quindi calcolata come mostrato di seguito che può essere utilizzata come funzione di perdita per addestrare i modelli linguistici.

Diciamo che abbiamo un modello linguistico che è stato addestrato con un vocabolario di sole 5 parole “soleggiato”, “giorno”, “bello”, “panorama”, “nuvole”. Ora, vogliamo calcolare la perplessità del modello quando vede la frase “bellissimo scenario”.

Calcoliamo l'entropia incrociata usando un semplice esempio in PyTorch.

# Get the needed libraries
import torch
from torch.nn import functional as F

Questi logit vengono quindi passati a una funzione softmax che normalizza i valori e li converte in una distribuzione di probabilità. Questa è la distribuzione di probabilità prevista.

tensor([[-0.7891,  1.3421,  0.4929,  0.0715, -0.0910],
        [ 0.9024, -0.8675,  0.8498, -1.0331,  0.5531]])

F.softmax(input, dim = -1)

Predicted:

tensor([[0.0575, 0.4841, 0.2071, 0.1359, 0.1155],
        [0.3369, 0.0574, 0.3196, 0.0486, 0.2375]])

Target/Actual: tensor([2, 3])

tensor([[0, 0, 1, 0, 0],
        [0, 0, 0, 1, 0]])

Loss for First Word:
(((- 0 * log(0.0575)) + (- 0 * log(0.4841)) + (- 1 * log(0.2071)) + 
  (- 0 * log(0.1359)) + (- 0 * log(0.1155))) = 1.5745535105805986

Loss for Second Word:
(((- 0 * log(0.3369)) + (- 0 * log(0.0574)) + (- 0* log(0.3196)) + 
  (- 1* log(0.0486)) + (- 0 * log(0.2375))) = 3.024131748075689

Loss = (1.5745535105805986 + 3.024131748075689)/2 = 2.299

loss = torch.nn.CrossEntropyLoss()

output = loss(input, target)
output

Loss: tensor(2.299)

Intuitivamente, perplessità significa essere sorpresi. Misuriamo quanto il modello è sorpreso vedendo nuovi dati. Minore è la perplessità, migliore è l'allenamento.

La perplessità è calcolata come esponente della perdita ottenuta dal modello. Nell'esempio sopra, possiamo vedere che la perplessità del nostro modello di esempio rispetto alla frase "bellissimo scenario" è 9,97. La formula per la perplessità è l'esponente della media della probabilità logaritmica di tutte le parole in una sequenza di input.

Formula di perplessità da HuggingFace

Ora, confrontiamo la perplessità di due frasi con GPT2 e vediamo quanto è perplesso. Per prima cosa carichiamo un tokenizer e una testa causale per il modello GPT2 da HuggingFace:

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("ABC is a startup based in New York City and Paris", return_tensors = "pt")
loss = model(input_ids = inputs["input_ids"], labels = inputs["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 29.48

inputs_wiki_text = tokenizer("Generative Pretrained Transformer is an opensource artificial intelligence created by OpenAI in February 2019", return_tensors = "pt")
loss = model(input_ids = inputs_wiki_text["input_ids"], labels = inputs_wiki_text["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 211.81

La perplessità viene solitamente utilizzata solo per determinare quanto bene un modello ha appreso il set di addestramento. Altre metriche come BLEU , ROUGE ecc. vengono utilizzate sul set di test per misurare le prestazioni del test.

In questo post abbiamo discusso e calcolato l'entropia incrociata, la perplessità di un modello linguistico. Nel prossimo post parleremo del benchmark GLUE che misura la capacità di comprensione linguistica generale dei modelli linguistici più diffusi.

Riferimenti