Svelando le dinamiche interne un’analisi approfondita del meccanismo di attenzione di BERT

Rivelando le dinamiche interne un'analisi approfondita del meccanismo di attenzione di BERT

Introduzione

BERT, acronimo di Bidirectional Encoder Representations from Transformers, è un sistema che utilizza il modello transformer e il pre-training non supervisionato per l’elaborazione del linguaggio naturale. Essendo pre-allenato, BERT impara in anticipo attraverso due compiti non supervisionati: modellazione del linguaggio mascherato e previsione delle frasi. Ciò consente di personalizzare BERT per compiti specifici senza partire da zero. Fondamentalmente, BERT è un sistema pre-allenato che utilizza un modello unico per comprendere il linguaggio, semplificando la sua applicazione a diverse attività. In questo articolo, capiremo il meccanismo di attenzione di BERT e il suo funzionamento.

Leggi anche: Cos’è BERT? Clicca qui!

Obiettivi di Apprendimento

  • Comprendere il meccanismo di attenzione in BERT
  • Come viene effettuata la tokenizzazione in BERT?
  • Come vengono calcolati i pesi di attenzione in BERT?
  • Implementazione di un modello BERT in Python

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Meccanismo di Attenzione in BERT

Cominciamo con capire cosa significa attenzione nel modo più semplice. L’attenzione è uno dei modi con cui il modello cerca di dare maggior peso alle caratteristiche di input che sono più importanti per una frase.

Consideriamo i seguenti esempi per capire come funziona fondamentalmente il meccanismo di attenzione.

Esempio 1

Maggiore attenzione data a alcune parole rispetto ad altre parole

Nella frase sopra, il modello BERT potrebbe voler dare maggiore peso alla parola “gatto” e al verbo “saltò” rispetto a “sacca”, poiché conoscerli sarà più critico per la previsione della prossima parola “cadde” rispetto a sapere da dove il gatto sia saltato.

Esempio 2

Consideriamo la seguente frase –

Maggiore attenzione data a alcune parole rispetto ad altre parole

Per prevedere la parola “spaghetti”, il meccanismo di attenzione consente di dare maggior peso al verbo “mangiare” piuttosto che alla qualità “insipida” degli spaghetti.

Esempio 3

Allo stesso modo, per un compito di traduzione come il seguente:

Frase di input: Come è stata la tua giornata

Frase di destinazione: Comment ça va ta journée

Fonte: https://blog.floydhub.com/attention-mechanism/

Per ogni parola nella frase di output, il meccanismo di attenzione mappera le parole significative e pertinenti della frase di input e darà a queste parole di input un peso maggiore. Nell’immagine sopra, notate come la parola francese ‘Comment’ assegna il peso più alto (rappresentato dal blu scuro) alla parola ‘Come’, e per la parola ‘giornata’, la parola di input ‘day’ riceve il peso più alto. In questo modo, il meccanismo di attenzione aiuta ad ottenere maggiore precisione di output dando maggior peso alle parole che sono più critiche per la previsione rilevante.

La domanda che sorge è come il modello assegna poi questi diversi pesi alle diverse parole di input. Vediamo nella prossima sezione come i pesi di attenzione rendano possibile questo meccanismo.

Pesi di Attenzione per Rappresentazioni Composite

BERT utilizza pesi di attenzione per elaborare sequenze. Prendiamo in considerazione una sequenza X composta da tre vettori, ognuno con quattro elementi. La funzione di attenzione trasforma X in una nuova sequenza Y con la stessa lunghezza. Ciascun vettore Y è una media ponderata dei vettori X, con pesi chiamati pesi di attenzione. Questi pesi, applicati alle embedding delle parole di X, producono embedding composti in Y.

Il calcolo di ciascun vettore in Y si basa su pesi di attenzione variabili assegnati a x1, x2 e x3, a seconda dell’attenzione richiesta per ciascuna caratteristica di input nella generazione del vettore corrispondente in Y. In termini matematici, ciò si presenta come segue –

Nelle equazioni sopra, i valori 0.4, 0.3 e 0.2 non sono altro che i diversi pesi di attenzione assegnati a x1, x2 e x3 per calcolare gli embedding composti y1, y2 e y3. Come si può notare, i pesi di attenzione assegnati a x1, x2 e x3 per calcolare gli embedding composti sono completamente diversi per y1, y2 e y3.

L’attenzione è fondamentale per comprendere il contesto della frase, in quanto consente al modello di capire come diverse parole sono correlate tra loro oltre a comprendere le singole parole. Ad esempio, quando un modello di linguaggio cerca di prevedere la parola successiva nella frase seguente:

“Il gatto inquieto era ___”

Il modello dovrebbe comprendere la nozione composta di gatto inquieto oltre a comprendere i concetti di inquieto o gatto separatamente; ad esempio, il gatto inquieto salta spesso, quindi “salto” potrebbe essere una parola successiva valida nella frase.

Vettori di chiave e query per acquisire pesi di attenzione

Ora sappiamo che i pesi di attenzione ci aiutano a ottenere rappresentazioni composite delle nostre parole di input tramite il calcolo di una media ponderata degli input con l’aiuto dei pesi. Tuttavia, la domanda successiva è da dove provengono questi pesi di attenzione. I pesi di attenzione derivano essenzialmente da due vettori noti con il nome di vettori di chiave e query.

BERT misura l’attenzione tra coppie di parole utilizzando una funzione che assegna un punteggio a ciascuna coppia di parole in base alla loro relazione. Utilizza i vettori di query e chiave come embedding delle parole per valutare la compatibilità. Il punteggio di compatibilità viene calcolato prendendo il prodotto scalare del vettore di query di una parola e del vettore di chiave dell’altra. Ad esempio, calcola il punteggio tra “saltare” e “gatto” utilizzando il prodotto scalare del vettore di query (q1) di “saltare” e del vettore di chiave (k2) di “gatto” – q1*k2.

Per convertire i punteggi di compatibilità in pesi di attenzione validi, è necessario normalizzarli. BERT lo fa applicando la funzione softmax a questi punteggi, garantendo che siano positivi e che la loro somma sia pari a uno. I valori risultanti sono i pesi di attenzione finali per ogni parola. È importante notare che i vettori di chiave e query vengono calcolati dinamicamente dall’output del livello precedente, permettendo a BERT di regolare il proprio meccanismo di attenzione a seconda del contesto specifico.

Heads di attenzione in BERT

BERT apprende meccanismi di attenzione multipli noti come heads. Queste heads lavorano contemporaneamente allo stesso tempo. Avere più heads aiuta BERT a comprendere meglio le relazioni tra le parole rispetto a se ne avesse solo una.

BERT suddivide i suoi parametri di Query, Key e Value in N modi. Ciascuna di queste N coppie passa indipendentemente attraverso una testa separata, eseguendo calcoli di attenzione. I risultati di queste coppie vengono poi combinati per generare un punteggio di attenzione finale. Ecco perché viene chiamata “attenzione multihead”, fornendo a BERT la capacità migliorata di catturare molteplici relazioni e sfumature per ogni parola.

Attenzione multihead

BERT impila anche più strati di attenzione. Ogni strato prende l’output dallo strato precedente e gli presta attenzione. Facendo questo molte volte, BERT può creare rappresentazioni molto dettagliate man mano che si approfondisce nel modello.

A seconda del modello BERT specifico, ci sono 12 o 24 strati di attenzione e ogni strato ha 12 o 16 testa di attenzione. Questo significa che un singolo modello BERT può avere fino a 384 meccanismi di attenzione diversi perché i pesi non sono condivisi tra gli strati.

Implementazione Python di un modello BERT

Passo 1. Importa le librerie necessarie

Dovremmo importare la libreria ‘torch’ di Python per poter utilizzare PyTorch. Dovremmo anche importare BertTokenizer e BertForSequenceClassification dalla libreria transformers. La libreria tokenizer aiuta a abilitare la tokenizzazione del testo mentre BertForSequenceClassification per la classificazione del testo.

import torch
from transformers import BertTokenizer, BertForSequenceClassification

Passo 2. Carica il modello e il tokenizer BERT pre-allenati

In questo passaggio, carichiamo il modello pre-allenato “bert-base-uncased” e lo forniamo al metodo from_pretrained di BertForSequenceClassification. Poiché vogliamo eseguire una semplice classificazione del sentimento qui, impostiamo num_labels su 2 che rappresenta “classe positiva” e “classe negativa”.

model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

Passo 3. Imposta il dispositivo su GPU se disponibile

Questo passaggio serve solo per passare al dispositivo GPU se disponibile o rimanere sulla CPU.

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
# importa csv

Passo 4. Definisci il testo di input e esegui la tokenizzazione

In questo passaggio, definiamo il testo di input per il quale vogliamo eseguire la classificazione. Definiamo anche l’oggetto tokenizer che è responsabile della conversione del testo in una sequenza di token, che sono le unità di base di informazione che i modelli di apprendimento automatico possono comprendere. Il parametro ‘max_length’ imposta la lunghezza massima della sequenza di tokenizzata. Se la sequenza tokenizzata supera questa lunghezza, il sistema la tronca. Il parametro ‘padding’ stabilisce che la sequenza tokenizzata verrà riempita con zeri per raggiungere la lunghezza massima se è più corta. Il parametro “truncation” indica se troncare la sequenza tokenizzata se supera la lunghezza massima.

Dato che questo parametro è impostato su True, la sequenza verrà troncata se necessario. Il parametro “return_tensors” specifica il formato in cui restituire la sequenza tokenizzata. In questo caso, la funzione restituisce la sequenza come un tensore PyTorch. Quindi sposta ‘input_ids’ e ‘attention_mask’ dei token generati al dispositivo specificato. L’attention mask, precedentemente discusso, è un tensore binario che indica a quale parte della sequenza di input prestare maggiore attenzione per un compito di previsione specifico.

text = "Non mi è proprio piaciuto questo film. È stato fantastico!"
# Tokenizza il testo di input
tokens = tokenizer.encode_plus(
    text,
    max_length=128,
    padding='max_length',
    truncation=True,
    return_tensors='pt')
# Sposta i tensori di input al dispositivo
input_ids = tokens['input_ids'].to(device)
attention_mask = tokens['attention_mask'].to(device)
# importa csv

Passo 5. Effettua la previsione del sentimento

Nel passaggio successivo, il modello genera la previsione per i dati input_ids e attention_mask forniti.

with torch.no_grad():
    outputs = model(input_ids, attention_mask)
predicted_label = torch.argmax(outputs.logits, dim=1).item()
sentiment = 'positivo' if predicted_label == 1 else 'negativo'
print(f"Il sentimento del testo di input è {sentiment}.")
# importa csv

Output

Il sentimento del testo di input è Positivo.

Conclusione

In questo articolo abbiamo trattato dell’attenzione in BERT, evidenziandone l’importanza per la comprensione del contesto delle frasi e delle relazioni tra le parole. Abbiamo esplorato i pesi dell’attenzione, che forniscono rappresentazioni composite delle parole di input attraverso medie pesate. Il calcolo di questi pesi coinvolge vettori di chiave e query. BERT determina il punteggio di compatibilità tra due parole prendendo il prodotto scalare di questi vettori. Questo processo, noto come “heads”, è il modo di BERT di concentrarsi sulle parole. Le diverse testa di attenzione migliorano la comprensione di BERT delle relazioni tra le parole. Infine, abbiamo esaminato l’implementazione in Python di un modello BERT pre-allenato.

Punti salienti

  • BERT si basa su due avanzamenti cruciali nell’elaborazione del linguaggio naturale: l’architettura del trasformatore e il pre-training non supervisionato.
  • Utilizza l’ “attenzione” per dare priorità alle caratteristiche di input rilevanti nelle frasi, contribuendo a comprendere le relazioni e i contesti delle parole.
  • I pesi dell’attenzione calcolano una media ponderata degli input per la rappresentazione composita. L’uso di più teste e livelli di attenzione consente a BERT di creare rappresentazioni dettagliate delle parole concentrandosi sugli output dei livelli precedenti.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.