Percorso visivo per Vectorized BERTScore per valutare la generazione di testi

Un viaggio visivo attraverso Vectorized BERTScore per valutare la generazione di testi

BERTScore visual walkthrough

La generazione di testo basata sull’IA è chiaramente entrata nel mainstream. Dalle assistenti di scrittura automatizzate alla generazione di documenti legali, alla generazione di contenuti di marketing, alla scrittura di e-mail e altro ancora, non mancano casi d’uso commerciali in cui i modelli trasformativi stanno avendo successo. Le aziende hanno ora un’abbondanza (forse un’eccessiva abbondanza) di modelli e paradigmi di addestramento tra cui scegliere. Tuttavia, valutare quale modello scegliere non dovrebbe essere lasciato alla narrazione aneddotica. La valutazione di un modello dovrebbe essere impostata come un esperimento in cui le parti interessate concordano su un elenco di criteri che sono importanti per il caso d’uso.

Una griglia di valutazione per la generazione di testo include esempi <X, Y>; ovvero, dato questo input, produrre questo output, dove X e Y sono casi di copertura importanti per il caso d’uso. Ma questo tipo di criterio può essere eccessivamente prescrittivo, il che significa che la valutazione automatica non dovrebbe prendere troppo sul serio il fatto che l’output di X corrisponda esattamente a Y. Invece, è più importante che l’output del modello Y’ significhi la stessa cosa di Y, anche se non corrisponde esattamente alla formulazione esatta o all’uso dei token.

https://browse.arxiv.org/pdf/1904.09675.pdf

BERTScore è stato creato per gestire questo tipo di criteri di valutazione approssimativi. L’idea principale di BERTScore è utilizzare un modello di linguaggio che sia bravo a comprendere il testo, come BERT, e utilizzarlo per valutare la similarità tra due frasi, un Y nel tuo set di test e un Y’ che rappresenta il testo generato dal modello. BERTScore calcola un punteggio di similarità basato sui token di embedding come proxy per la similarità valutata dall’uomo. Nel 2020, quando BERTScore è stato pubblicato in ICLR, non era ancora comune utilizzare BERT stesso come misura per la generazione di testo. I metodi principali erano BLEU, che utilizza la corrispondenza esatta delle stringhe, e METEOR, che utilizza euristiche per abbinare il testo, e questi avevano problemi ben noti. Nel frattempo, la valutazione di BERTScore continua ad essere rilevante perché è possibile collegare la tua variante preferita tra le molte varietà di BERT ora disponibili.

Il calcolo di BERTScore può essere effettuato in modo completamente vettorizzato, in modo da poter confrontare un batch di frasi di riferimento (Y hat) con le rispettive etichette di verità fondamentale (Y). Questo è efficiente perché può sfruttare il kernel GPU per la parallelizzazione e rende anche facile utilizzare BERTScore stesso come funzione di perdita di contrasto, ad esempio per il fine-tuning dei modelli di generazione di testo, ovvero come alternativa alla perdita di entropia incrociata per la predizione del prossimo token. In questo modo, la tua funzione di perdita si allinea effettivamente con il significato anziché con il testo esatto.

In questo articolo, illustrerò come calcolare BERTScore in modo vettorizzato. Innanzitutto, inizieremo con l’esempio di 2 frasi in cui calcoliamo la similarità solo tra 2 frasi. Poi passeremo a confronti di frasi basati su batch come potresti avere in un obiettivo di addestramento.

Dettagli della visualizzazione

I passaggi di calcolo saranno mostrati in modo visuale utilizzando uno strumento di visualizzazione di un grafo dei nodi. Ogni blocco è un’operazione che prende gli input sul lato sinistro e produce i dati per le variabili di output sul lato destro. I collegamenti indicano il passaggio dei dati dagli output agli input, e i cerchi sugli input significano che i dati sono specificati sul posto e sono statici.

Le operazioni sono composte da compositi contenenti un’icona “unbox”, che poi si decompongono in un sottografo i cui input sono gli input del genitore e i cui output sono gli output del genitore, oppure sono primitive, il che significa che non possono essere ulteriormente decomposte e corrispondono a operazioni tensoriali di basso livello come quelle di NumPy o TensorFlow. I colori indicano il tipo di dati e i motivi indicano la forma dei dati. Il blu indica che il tipo di dati è un numero intero, mentre il viola/rosa indica che è un tipo di dati decimali. I collegamenti solidi indicano che la forma dei dati è scalare, mentre i puntini nel collegamento indicano il numero di dimensioni dell’array (il numero di punti tra le lineette). In fondo a ogni grafico c’è una tabella che caratterizza la forma, il tipo e il nome dell’operazione di ogni variabile che trasporta i dati nel modello.

Ho coperto e utilizzato la visualizzazione in precedenti articoli, come la creazione di una mappa di riferimento per GPT Fully Visualized e BERT Fully Visualized, oltre che per le spiegazioni su Graph Attention Networks e il metodo di aggiustamento fine LoRA.

BERTScore

In questa sezione illustriamo i passaggi di calcolo del BERTScore secondo la seguente formula:

La figura riportata nel paper mostra un’idea generale dei passaggi da seguire. Dato due frasi, una di riferimento e una candidata, viene calcolata la similarità coppia per coppia tra gli embedding BERT. Successivamente, per ogni token di riferimento, viene selezionata la similarità massima rispetto all’asse del token di riferimento. Infine, viene effettuato un prodotto scalare pesato (pesi IDF) e diviso per la somma dei pesi IDF.

https://browse.arxiv.org/pdf/1904.09675.pdf

Nel paper originale, ci sono sia un Recall BERTScore (sopra) che un Precision BERTScore, che vengono combinati in un punteggio F-BERTScore. La differenza risiede nel fatto che la similarità massima viene calcolata rispetto a un diverso asse.

I pesi IDF vengono calcolati nel seguente modo:

Dato un dataset di M frasi di riferimento, viene contato il numero di volte in cui ogni token appare e viene diviso per M, utilizzando il risultato come argomento per il logaritmo naturale negativo.

Nell’esempio successivo, viene calcolato il peso di importanza per ogni token. Come esempio, viene utilizzato un sottogruppo di 40 frasi del dataset Standard Sentiment Treebank (SST). L’output è un array unidimensionale [30523] corrispondente alla dimensione del vocabolario. Questo passaggio deve essere eseguito solo una volta durante la pre-elaborazione.

Cliccando sull’icona di apertura della formula, possiamo vedere l’intero grafo di calcolo per il calcolo dell’importanza IDF. Viene utilizzato un tokenizzatore BERT WordPiece per generare gli ID per ogni token di ogni frase, generando un array [40, 30523]. Dopo aver sommato lungo l’asse 40, viene diviso l’array [30523] per un array [30523] il cui valore è 40 (ovvero M=40 nella formula).

Per maggiori dettagli su “Get Tokenized 1 Hot”, possiamo vedere che inizia con una pulizia del testo, l’aggiunta di token speciali come il token [CLS] e [PAD], quindi il tokenizzatore WordPiece legge da un file di Vocabolario.

Successivamente, passeremo il peso di importanza a un calcolo R_{BERT}. La frase di riferimento è “il tempo è freddo oggi” e la frase di contesto è “fa molto freddo oggi”, corrispondendo all’esempio utilizzato nell’infografica del paper originale. L’output è un singolo valore decimale scalare, in questo caso 0,7066, corrispondente al BERTScore.

Guardando all’interno dell’operazione BERTScore, analizzeremo come viene effettuato il calcolo. Innanzitutto, passiamo semplicemente le due frasi attraverso BERT. Tipicamente, BERT restituisce l’ultimo stato nascosto, un tensore di forma [num token, 768], e l’output del Pooler, di forma [768]. Poiché il nostro peso di importanza si basa sugli ID del vocabolario, ho modificato BERT per restituire anche gli ID di input delle frasi.

Per ulteriori dettagli su come è strutturato il grafico BERT, dai un’occhiata al mio precedente articolo.

Continuando a scorrere verso destra, utilizziamo la similarità coseno come misura di similarità tra gli embeddings. Gli input dell’operazione di similarità coseno sono le righe dell’ultimo stato nascosto dell’output di BERT, ogni riga corrisponde a una frase di input. Dopo aver generato le similarità tra i token a coppie, prendiamo il massimo sull’asse Y, l’asse corrispondente ai token delle frasi di contesto (rispetto ai token delle frasi di riferimento). Moltiplichiamo per il peso di importanza e poi dividiamo per la somma dei punteggi di importanza.

Dati gli array A e B, la similarità coseno viene calcolata come segue:

Formula di similarità coseno

Possiamo eseguire questo passaggio di calcolo vettorizzato, come mostrato di seguito. Innanzitutto, facciamo il prodotto scalare tra X e Y trasposti per ottenere un numeratore di forma [num_token, num_token]. Successivamente, normalizziamo X e Y sommando ciascuna voce al quadrato, ottenendo entrambi un risultato di forma [num_token, 1] (senza ridurre la dimensione durante la somma). Li moltiplichiamo per ottenere un risultato di forma [num_token, num_token] e dividiamo il nostro numeratore per questo valore.

BERTScore batch-wise

Fino a questo momento, abbiamo calcolato il BERTScore di Recupero tra 2 frasi. Ho chiamato questo BERTScore 2D perché i passaggi di calcolo vengono eseguiti sugli embeddings di contesto di forma [num_token, hidden_dimension]. Ora, estendiamo questo calcolo per calcolare il BERTScore per un batch di frasi contemporaneamente. Chiamo questo BERTScore batch-wise perché operiamo su un batch di frasi, utilizzando tensori di forma [num_frase, num_token, hidden_dimension] per il passaggio di similarità coseno. Per fare ciò in modo completamente vettorizzato (senza loop espliciti), possiamo ottenere vantaggi in termini di prestazioni abilitando la parallelizzazione GPU.

A scopo dimostrativo, invieremo un batch di 4 coppie di frasi di riferimento e candidate <Reference, Candidate>. La prima coppia è quella originale e l’ultima coppia è effettivamente identica, per verificare che otteniamo una similarità di BERTScore pari a 1.0.

Il risultato è un array [4] con un valore in virgola mobile per ogni confronto di similarità a coppie. Infatti, il quarto elemento ha un BERTScore di similarità pari a 1.0, come previsto perché si trattava della stessa frase.

Se si imposta correttamente l’operazione di similarità coseno (come mostrato in precedenza), non è necessaria alcuna modifica per estendere questa operazione alla similarità coseno batch-wise. Il risultato sarà [num_sent, num_token, num_token], corrispondente alle similarità tra i token per ogni coppia di frasi. Quindi prendiamo il massimo sull’ultima dimensione mantenendo la dimensione per ottenere un tensore di forma [num_sent, num_token, 1] chiamato “risultato massimo”.

Ora moltiplichiamo per i punteggi di importanza. Ridimensioniamo i punteggi di importanza per avere forma [num_sent, 1, num_tokens] in modo tale che possiamo produrre un risultato moltiplicato [num_sent, 1, 1]. Alla fine, questo è ciò che vogliamo, poiché essenzialmente abbiamo ora 1 punteggio per frase. L’ultimo passo è dividere per la somma dei punteggi di importanza. Puoi farlo prima o dopo aver rimosso le dimensioni 1 finali.

Conclusion

Questa panoramica visuale ha illustrato la formula principale per BERTScore. In particolare, abbiamo coperto il BERTScore di richiamo con il peso di importanza, ma dovrebbe essere semplice combinarlo con il BERTScore di precisione e fare la riscalatura raccomandata nel paper. Il progetto BERTScore di richiamo e l’operazione di similarità coseno sono entrambi disponibili su Github.

Il BERTScore può essere utilizzato per produrre metriche su un punteggio di valutazione per la generazione di testo in modo che il testo generato dal modello possa essere confrontato con il testo ideale sulla base del suo significato anziché sulla corrispondenza esatta del testo. Questo è stato dimostrato essere più simile a come gli esseri umani valutano la similarità rispetto ai metodi precedenti come BLEU e METEOR.

Un’altra idea intrigante qui è utilizzare qualcosa come il BERTScore per una funzione di perdita di obiettivo di addestramento. Ad esempio, se si sta ottimizzando un modello per la generazione di testo a partire da GPT, di solito si dispone di un set di test con allineamento delle attività, o si sta utilizzando direttamente la predizione del token successivo come obiettivo di addestramento. Con il BERTScore, non penalizzeresti l’output del modello per la produzione di testo con lo stesso significato delle etichette. Lo svantaggio è che il BERTScore sarebbe lento se fosse necessario eseguire ogni output del modello tramite BERT. Pertanto, sarebbero necessarie alcune modifiche.

Cosa ne pensi? Questa panoramica visuale è stata utile? Cosa vorresti vedere in seguito? Fammi sapere nei commenti!