BERT per la misurazione della somiglianza del testo

Similitudine semantica ad alte prestazioni con BERT

Oggi sembra che si parli solo di BERT di qua e BERT di là. Vorrei scrivere di qualcos’altro, ma BERT è troppo bello, quindi questo articolo parlerà di BERT e della similarità delle sequenze!

E noi non siamo da meno, abbiamo proprio un corso dedicato al NLP in cui si tratta BERT

Gran parte dell’NLP si basa sulla similarità in spazi altamente dimensionali. In genere, una soluzione NLP prende un testo, lo elabora per creare un grande vettore/array che rappresenta il testo in questione, quindi esegue diverse trasformazioni.

È una magia altamente dimensionale.

La somiglianza tra le frasi è uno degli esempi più chiari di quanto possa essere potente la magia altamente dimensionale.

La logica è questa:

– Prendete una frase, convertitela in un vettore.

– Prendete molte altre frasi e convertitele in vettori.

– Trovate le frasi che hanno tra loro la distanza più piccola (euclidea) o l’angolo più piccolo (somiglianza del coseno).

– Ora abbiamo una misura della somiglianza semantica tra le frasi – facile!

Ad alto livello, non c’è molto altro da fare. Ma naturalmente vogliamo capire cosa sta succedendo in modo un po’ più dettagliato e implementare anche questo in Python! Quindi, iniziamo.

Perché BERT è utile?

Come abbiamo già detto, BERT è l’MVP della PNL. E gran parte di questo è dovuto alla capacità di BERT di incorporare il significato delle parole in vettori densi.

Li chiamiamo vettori densi perché ogni valore all’interno del vettore ha un valore e ha una ragione per essere quel valore – questo è in contrasto con i vettori radi, come i vettori codificati con un solo punto, in cui la maggior parte dei valori è 0.

Il BERT è bravissimo a creare questi vettori densi e ogni livello di codifica (ce ne sono diversi) produce un insieme di vettori densi.

Rete BERT base - con le rappresentazioni dello strato nascosto evidenziate in verde.

Per la rete BERT base, si tratta di un vettore contenente 768 valori. Questi 768 valori contengono la nostra rappresentazione numerica di un singolo token, che possiamo utilizzare come embedding di parole contestuali.

Poiché c’è uno di questi vettori per rappresentare ogni token (prodotto da ogni codificatore), stiamo osservando un tensore di dimensioni 768 per il numero di token.

Possiamo prendere questi tensori e trasformarli per creare rappresentazioni semantiche della sequenza in ingresso. Possiamo quindi prendere le nostre metriche di somiglianza e calcolare la rispettiva somiglianza tra sequenze diverse.

Il tensore più semplice e più comunemente estratto è il tensore last_hidden_state, che viene opportunamente prodotto dal modello BERT.

Naturalmente, si tratta di un tensore piuttosto grande (512×768) e vogliamo un vettore a cui applicare le nostre misure di similarità.

Per farlo, dobbiamo convertire il tensore last_hidden_states in un vettore di 768 dimensioni.

Creare il vettore

Per convertire il nostro tensore last_hidden_states nel nostro vettore, utilizziamo un’operazione di mean pooling.

Ognuno dei 512 token ha 768 valori rispettivi. Questa operazione di pooling prenderà la media di tutte le incorporazioni di token e le comprimerà in un unico spazio vettoriale di 768, creando un “vettore frase”.

Allo stesso tempo, non possiamo limitarci a considerare l’attivazione media così com’è. Dobbiamo considerare i token di riempimento nulli (che non dobbiamo includere).

In Codice

Tutto ciò è ottimo per quanto riguarda la teoria e la logica del processo, ma come lo applichiamo nella realtà?

Illustreremo due approcci: uno semplice e l’altro un po’ più complesso.

 

Facile – Trasformatori di frasi

L’approccio più semplice per implementare tutto ciò che abbiamo appena trattato è la libreria sentence-transformers, che racchiude la maggior parte di questo processo in poche righe di codice.

Per prima cosa, installiamo sentence-transformers usando pip install sentence-transformers. Questa libreria utilizza i trasformatori di HuggingFace dietro le quinte, quindi possiamo trovare qui i modelli di sentence-transformers.

Utilizzeremo il modello bert-base-nli-mean-tokens, che implementa la stessa logica di cui abbiamo parlato finora.

(Inoltre, utilizza 128 token in ingresso, anziché 512).

Creiamo alcune frasi, inizializziamo il nostro modello e codifichiamo le frasi:

Bene, ora abbiamo quattro incorporazioni di frasi, ciascuna contenente 768 valori.

Ora prendiamo queste incorporazioni e troviamo la somiglianza del coseno tra ciascuna di esse. Quindi, per la frase 0:

Tre anni dopo, la bara era ancora piena di gelatina.

Possiamo trovare la frase più simile usando:

Questo è l’approccio più semplice e astratto. Sette righe di codice per confrontare le nostre frasi.

Coinvolgimento - Transformers e PyTorch

Prima di passare al secondo approccio, vale la pena di notare che fa la stessa cosa del primo, ma a un livello inferiore.

Con questo approccio, dobbiamo eseguire la nostra trasformazione dell’ultimo stato_nascosto per creare l’embedding della frase. A tal fine, eseguiamo l’operazione di mean pooling.

Inoltre, prima dell’operazione di mean pooling, dobbiamo creare last_hidden_state, e lo facciamo in questo modo:

Dopo aver prodotto le nostre incorporazioni vettoriali dense, dobbiamo eseguire un’operazione di mean pooling per creare un’unica codifica vettoriale (l’incorporazione della frase).

Per eseguire questa operazione di mean pooling, dovremo moltiplicare ogni valore del nostro tensore embeddings per il rispettivo valore attention_mask, in modo da ignorare i token non reali.

Una volta ottenuti i nostri vettori densi, possiamo calcolare la somiglianza del coseno tra ciascuno di essi, secondo la stessa logica utilizzata in precedenza:

I risultati sono quasi gli stessi, con l’unica differenza che la somiglianza del coseno per l’indice tre è passata da 0,5547 a 0,5548, una differenza minima dovuta all’arrotondamento.

È tutto per questa introduzione alla misurazione della somiglianza semantica delle frasi con BERT, utilizzando sia i trasformatori di frasi sia un’implementazione di livello inferiore con PyTorch e i trasformatori.

Potete trovare i quaderni completi di entrambi gli approcci qui e qui.

Spero che l’articolo vi sia piaciuto. Fatemi sapere se avete domande o suggerimenti via Twitter o nei commenti qui sotto. Se siete interessati ad altri contenuti come questo, pubblico anche su YouTube.

Grazie per aver letto!

Riferimenti

  1. Reimers, I. Gurevych, Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (2019), Atti della Conferenza 2019 sui Metodi Empirici in NLP

 

Corso di PNL con trasformatori

Se siete interessati a saperne di più sulle metriche di somiglianza in NLP (compresa la somiglianza del coseno, che abbiamo usato qui), date un’occhiata a questo articolo che ho scritto per spiegare le metriche più popolari:

*Tutte le immagini sono dell’autore, tranne quando diversamente indicato

 

Articolo originale di James Briggs

https://towardsdatascience.com/bert-for-measuring-text-similarity-eec91c6bf9e1

Share:

Contenuti
Torna in alto