NLP moderna una panoramica dettagliata. Parte 3 BERT

Panoramica dettagliata di NLP moderna, Parte 3 su BERT.

Nelle mie precedenti articoli sui transformer e GPT, abbiamo fatto un’analisi sistematica della cronologia e dello sviluppo dell’NLP. Abbiamo visto come il campo si sia spostato dalla modellazione sequenza-sequenza ai transformer e presto verso un approccio di apprendimento generalizzato. In questo articolo, parleremo di un altro lavoro molto influente pubblicato da Google, BERT (Bi-directional Encoder Representation from Transformers)

BERT ha senza dubbio portato importanti miglioramenti nel campo dell’NLP. Sebbene gli autori di BERT non abbiano proposto un’architettura molto innovativa, similmente al lavoro di GPT di OpenAI, hanno utilizzato in modo impeccabile i concetti moderni dell’NLP come i transformer, il pretraining e il transfer learning per ottenere prestazioni eccellenti.

Prerequisito

Prima di immergerci nella comprensione di BERT, dobbiamo capire che per creare il modello gli autori hanno utilizzato o fatto riferimento a diversi concetti e miglioramenti di lavori precedenti. Dobbiamo avere una buona comprensione di quei concetti per capire infine i concetti utilizzati in BERT. Le dipendenze sono Transformers, Semi-supervised Sequence Learning, ULMFit, OpenAI GPT e ELMo. Quindi, ho discusso tutti gli argomenti necessari tranne ELMo, suggerisco di leggere quegli articoli e poi tornare per continuare il percorso per una migliore comprensione, dato che i concetti non sono noti. Per quanto riguarda ELMo, niente paura, inizieremo capendo questo concetto.

Rappresentazioni di parole contestualizzate in modo profondo

Questo articolo è stato pubblicato da Allen-AI nel 2018. Fino ad allora, le word embeddings pre-addestrate come Bag of Words, Word2Vec e Glove avevano già guadagnato popolarità e si era dimostrato che migliorano significativamente le prestazioni dei modelli di addestramento. Tuttavia, considerando il successo, l’unico svantaggio era che le word embeddings ottenute da questi modelli erano basate su un approccio generalizzato, non specifico del contesto. In parole più semplici, una parola può essere utilizzata in diversi contesti in una frase, il significato cambia in base alla frase, ma la rappresentazione o l’embedding rimane lo stesso. Ad esempio, considera queste due frasi:

L’accordo commerciale è andato bene.

Per favore, occupati immediatamente del problema.

La parola “accordo” viene utilizzata in entrambe le frasi, ma i significati sono diversi a seconda dell’uso, quindi entrambi non dovrebbero essere rappresentati dagli stessi embeddings. Ecco dove entra in gioco ELMo.

Gli autori di ELMo suggeriscono che l’embedding delle parole debba esprimere due cose:

(i) Le caratteristiche complesse dell’uso della parola in senso semantico e

(ii) come le parole vengono utilizzate in contesti linguistici variabili.

ELMo affronta entrambe queste problematiche e produce embeddings o rappresentazioni di una parola, come funzione dell’intera frase di input. Gli autori affermano che il metodo proposto può essere facilmente adattato anche ad altri modelli e lo hanno fatto, ottenendo miglioramenti.

Architettura: Gli autori hanno utilizzato un LSTM bidirezionale a due strati per dimostrare il concetto. Si è osservato che la bidirezionalità del modello, ovvero la sua capacità di scoprire le parole che lo precedono e quelle che lo seguono, dà al modello un vantaggio rispetto al semplice LSTM unidirezionale, nel comprendere il contesto della frase completa, migliorando così la qualità dell’embedding.

Architettura

Approccio: Gli autori fanno passare la frase attraverso uno strato convoluzionale di caratteri, per creare un vettore indipendente dal contesto (Xk), spesso facciamo così nei problemi di apprendimento LSTM. Il vettore di contesto (Xk), per ogni passo k, viene fatto passare attraverso 2 strati LSTM. Dopo il primo strato (Layer 1) di LSTM, vengono prodotti 2 vettori intermedi nascosti (Hk-forward, Hk-backward), uno per la sequenza in avanti e un altro per la sequenza all’indietro. I due intermedi vengono sommati per creare un vettore intermedio finale (Hk-final-layer-1) che rappresenta la conoscenza dell’ambiente delle parole che si avvicinano da entrambi i lati. Quindi, i vettori di stato nascosti vengono nuovamente fatti passare attraverso il secondo strato (Layer 2) del modello LSTM per creare un altro vettore intermedio finale (Hk-final-layer-2) per ogni passo o parola k. Il secondo vettore intermedio ha una migliore comprensione del contesto rispetto al primo strato LSTM.

Infine, (Hk-final-layer-1), (Hk-final-layer-2) e (Xk) vengono aggiunti per creare l’embedding finale di ELMo, che viene utilizzato per applicazioni specifiche del compito. Gli autori hanno stabilito che il modello LSTM può avere più strati ed è molto facile da aggiungere a qualsiasi modello per compiti specifici. Questo tipo di approccio viene chiamato approccio basato su feature, a differenza degli approcci come OpenAI che sono approcci basati su fine-tuning.

L’equazione del vettore di embedding è data da:

Link all’articolo: https://arxiv.org/pdf/1802.05365.pdf

Importante conclusione: i modelli LSTM bidirezionali possono essere utilizzati per generare embedding basati sul contesto.

Quindi, infine, arriviamo a BERT.

BERT: Pre-training di Deep Bidirectional Transformers per la comprensione del linguaggio

BERT è stato introdotto nel 2019 da Jacob Devlin e i suoi colleghi di Google. Prima di addentrarci nella discussione approfondita dell’architettura e del funzionamento di BERT, chiariremo alcune cose, in modo da evitare la stessa confusione in cui sono caduto io mentre esploravo questi argomenti.

Nel mondo dell’NLP, solitamente ci sono due tipi di modelli o compiti in generale, modelli auto-regressivi e modelli di auto-codifica.

I modelli auto-regressivi sono quelli che, alimentati con una frase o un token di inizio, generano parole correlate all’input, ad esempio GPT. Sono ideali per compiti come la generazione di testo, la traduzione e la sintesi.

L’altro tipo di modello è il modello di auto-codifica, che si occupa dei compiti che richiedono la comprensione dell’intero contesto della frase al fine di ottenere dei risultati migliori, come la classificazione, le domande-risposte, le implicazioni e il riconoscimento delle entità, ovvero individuare una particolare entità in un testo. Nelle nostre ricerche su Google, vediamo questa applicazione di volta in volta, dove, nelle pagine web, le righe corrispondenti alla nostra ricerca vengono evidenziate.

Ora, non fraintendetemi, non sto dicendo che i modelli regressivi non possano essere utilizzati per compiti di codifica e viceversa, sto solo dicendo che i modelli sono più adatti nel loro dominio specifico.

BERT è progettato come un modello di auto-codifica, quindi mentre modelli come GPT utilizzano la parte del decoder del transformer, il modello BERT consiste solo nella parte dell’encoder del transformer. La domanda è, PERCHÉ?

Se osserviamo l’architettura, il decoder prende in input l’output o, al primo passo, prende il token di inizio, applica l’auto-attenzione e produce le probabilità della prossima parola, quindi vede solo i token o le parole precedenti o ha conoscenza solo dei contesti precedenti, quindi è ideale per i modelli regressivi, poiché sono essenzialmente addestrati per produrre parole. Ma l’encoder è la parte che vede l’intera frase insieme e quindi ha l’intero contesto e può produrre migliori inferenze, il che è adatto per compiti di auto-codifica.

Inclusione di ELMo per supportare l’embedding basato su feature: gli autori del paper BERT hanno argomentato che, nel caso di alcuni compiti, un approccio di apprendimento solo da sinistra a destra ha un prezzo molto alto, poiché si perde la conoscenza del contesto successivo alla parola. BERT ha introdotto l’apprendimento bidirezionale, ovvero imparerà la parola da sinistra a destra e da destra a sinistra utilizzando l’auto-attenzione. Gli autori si sono anche concentrati sui due tipi di approcci di apprendimento sviluppati fino ad ora, l’approccio di apprendimento basato su feature come ELMo e l’approccio di apprendimento basato su fine-tuning come GPT di OpenAI. BERT ha unito il meglio di entrambi i mondi. Come abbiamo già appreso, ELMo basato su Bi-LSTM è facile da integrare in un modello. Quindi, sfruttando l’encoder per ricevere l’intera frase come input in una volta sola, BERT ha aggiunto ELMo per generare embedding dipendenti dal contesto di alta qualità per le parole, migliorando le prestazioni.

Pre-training e GPT: Gli autori hanno anche realizzato che il pre-training contribuisce in modo significativo alle prestazioni del modello ed è altamente necessario. Quindi, è stato deciso di utilizzare la tecnica di pre-training e fine-tuning di GPT alla fine per ottenere completamente ciò che gli approcci basati su fine-tuning avevano da offrire. Il problema era che l’addestramento di GPT è adatto solo per modelli di previsione da sinistra a destra o in avanti, ma BERT aveva dati bidirezionali. C’era un altro problema che, se viene utilizzato un normale compito di modellazione del linguaggio per il pre-training, il modello potrebbe cercare di aggirare l’apprendimento e filtrare i dati dal modello da destra a sinistra e viceversa. Per eliminare i problemi, gli autori hanno introdotto un compito di modellazione del linguaggio mascherato o MLM come compito primario di pre-training, il che significa fondamentalmente che una parola viene casualmente mascherata nel testo e il modello deve prevedere la parola mascherata.

Architettura e addestramento:

BERT utilizza un’architettura basata su encoder del transformer come indicato da Vaswani et al., senza molti cambiamenti. BERT ha rilasciato due modelli BERT-Base e BERT-Large. BERT-Base contiene 12 strati di encoder, un vettore di layer nascosti di dimensione 768 e 12 self-attention heads in ogni blocco, per un totale di circa 110 milioni di parametri, mentre BERT-Large ha 24 strati di encoder, ciascuno con 16 attention heads che gestiscono un vettore di dimensione 1024, per un totale di 340 milioni di parametri.

BERT viene anche addestrato in un approccio a 2 fasi: Pre-training seguito da Fine Tuning. Nel caso di BERT, il pre-training viene effettuato utilizzando due compiti:

  1. Modellazione del linguaggio mascherato: In questo caso, casualmente, il 15% delle parole nel testo viene mascherato e il modello deve utilizzare il contesto della frase per prevedere la parola.
  2. Previsione della frase successiva: Poiché BERT mira ad essere utilizzato per compiti come domande e risposte e implicazioni, è importante che BERT impari ad analizzare il contesto per sequenze più lunghe. Quindi, in questo caso, viene passata una frase al modello e gli viene chiesto di prevedere la frase successiva. Per l’addestramento, gli autori hanno considerato il 50% dei casi in cui la frase successiva è la vera frase successiva (IsNextSequence), e nel 50% degli altri casi non lo è (IsNotNextSequence). È stato aggiunto uno strato SoftMax in cima al modello per fornire una probabilità tra questi due casi.

Per l’input, se si tratta di una singola frase, viene aggiunto un token [CLS] all’inizio, che indica il compito di classificazione come spiegano gli autori. Per compiti come similitudine di frasi e domande e risposte, gli autori hanno inserito un token di separatore [SEP] nel mezzo per differenziare le frasi, quindi metteranno i vettori di embedding del contesto della frase, nel lato a cui appartengono. Per il corpus di pre-training, gli autori hanno utilizzato il BooksCorpus (800 milioni di parole) e l’English Wikipedia (2,500 milioni di parole). Per Wikipedia, vengono estratti solo i passaggi di testo e vengono ignorate le liste, le tabelle e gli header.

Pre-training e Fine-tuning per BERT

L’addestramento fine-tuning di BERT per un compito specifico di destinazione avviene molto facilmente, come abbiamo visto nel caso degli altri approcci di apprendimento basati su fine-tuning. Per compiti come domande e risposte e similitudine, le frasi vengono concatenate utilizzando un separatore. Gli embedding dei token per le frasi vengono aggiunti agli embedding di segmentazione per determinare a quale frase appartiene la parola e un embedding posizionale, come mostrato nell’articolo originale sul transformer, per indicare le posizioni delle parole nella frase.

Creazione di embedding

L’immagine sopra mostra la creazione degli embedding finali dei token per l’apprendimento.

Link all’articolo: https://arxiv.org/pdf/1810.04805.pdf

Questo è tutto su come funziona un modello BERT. Ora, vedremo brevemente due lavori che sono stati realizzati basati su BERT, che è stato utilizzato in modo estensivo ed è stato di successo.

RoBERTa: Un Approccio di Pretraining di BERT Ottimizzato in Modo Robusto

Nel 2019, un team guidato da Yinhan Liu di Meta AI research ha pubblicato questo lavoro sul miglioramento delle prestazioni di BERT utilizzando un approccio di addestramento ottimizzato in modo robusto. Hanno utilizzato BERT-Large per testare le ipotesi.

Gli autori hanno apportato le seguenti modifiche:

  1. Il BERT, durante l’addestramento, ha aggiunto una codifica di segmentazione all’embedding dei token per capire a quale frase appartengono le parole. RoBERTa ha rimosso la codifica e invece ha aggiunto un carattere di separazione del tokenizer per separare le frasi.
  2. Inizialmente BERT veniva addestrato su 16 GB di dati, mentre RoBERTa ha introdotto un proprio dataset combinando il dataset di (1) BERT (16GB), (2) CC-NEWS, che abbiamo raccolto dalla porzione in inglese del database delle notizie di CommonCrawl (76 GB), (3) OPENWEBTEXT, una ricreazione open-source di WebText in cui il testo è estratto da URL condivisi su Reddit con almeno tre upvote. (38 GB)(4) STORIES, un dataset contenente una parte dei dati di CommonCrawl filtrati per corrispondere allo stile delle Winograd schemas. (31GB) Portando ad una dimensione totale di 160GB. Gli autori sostengono che un dataset più grande abbia aiutato il modello a ottenere un peso preaddestrato più compatto e completo.
  3. BERT utilizza una tecnica di masked language modeling (MLM), ma il masking viene effettuato durante la pre-elaborazione, quindi fondamentalmente c’è un pattern di masking che diventa statico, che il modello di apprendimento può rilevare, decadendo le prestazioni generalizzate. Invece, RoBERTa ha introdotto un masking dinamico effettuato durante l’esecuzione. Quindi, la sequenza di input viene addestrata per 40 epoche con 10 diversi pattern di masking, quindi ciascun pattern di masking appare 4 volte, portando variazione e impedendo al modello di apprendere il pattern di masking.
  4. Gli autori di RoBERTa hanno scoperto che l’obiettivo di Next Sentence Prediction di BERT nel pretraining danneggia leggermente le prestazioni del modello nelle attività successive, poiché influisce sulla capacità del modello di apprendere dipendenze a lungo raggio. Quindi, tale obiettivo di pretraining è stato rimosso.
  5. Dai lavori precedenti, è stato stabilito che l’ottimizzazione della velocità e delle prestazioni può essere aumentata se il learning rate e le dimensioni dei mini-batch vengono aumentati correttamente. Originariamente BERT veniva addestrato per 1 milione di passi utilizzando un batch di 256 sequenze. Mantenendo fissa la quantità di memoria richiesta, gli autori di RoBERTa hanno scoperto che il modello può essere addestrato utilizzando 125k passi su un batch di sequenze di 2K o 31k passi su un batch di 8K. Dopo alcune prove, gli autori hanno deciso per una dimensione del batch di 8K.
  6. RoBERTa ha introdotto anche una modifica nella rappresentazione di input. BERT utilizzava originariamente un encoding di BPE (byte-pair encoding) a livello di carattere con un vocabolario di 30K, mentre RoBERTa lo ha aumentato a un vocabolario di 50K unità di parole a livello di byte.

Abbiamo elencato tutti i punti di miglioramento di RoBERTa rispetto a BERT, che è stato ampiamente utilizzato successivamente per migliorare le prestazioni di BERT.

Link al paper: https://arxiv.org/pdf/1907.11692.pdf

Successivamente, vedremo un’ultima e finora la variante più utilizzata di BERT: DistilBERT.

DistilBERT, una versione distillata di BERT: più piccola, più veloce, più economica e più leggera

Questo lavoro è stato pubblicato da hugging face nel 2020 con l’obiettivo di ridurre l’architettura di BERT e il tempo richiesto per addestrare il modello. Gli autori hanno osservato che i dati di addestramento e la dimensione del modello aumentavano in modo esponenziale con ogni lavoro, come requisito per le prestazioni all’avanguardia, il che rendeva estremamente difficile addestrare e utilizzare tali modelli sotto vincoli di memoria. Per risolvere questo problema, è stato introdotto DistilBERT, che, attraverso il metodo di addestramento di knowledge distillation, sosteneva di ridurre la dimensione del modello BERT del 40% e il tempo di addestramento del 60% mantenendo comunque il 97% delle sue prestazioni.

Knowledge Distillation è un metodo in cui vengono utilizzati due modelli diversi, uno è noto come modello Teacher e un altro viene chiamato modello Student.

Knowledge distillation [Bucila et al., 2006, Hinton et al., 2015] è una tecnica di compressione in cui un modello compatto, lo student, viene addestrato a riprodurre il comportamento di un modello più grande, il teacher, o un insieme di modelli.

Quindi, DistilBERT diventa il modello student e BERT diventa il modello teacher. Come sappiamo, nel caso dell’apprendimento supervisionato, un modello ben addestrato prevede se un’istanza appartiene a una classe con una probabilità molto alta e se non appartiene con un valore molto basso. A volte i valori non sono né troppo alti né troppo bassi. Tali casi vengono utilizzati dallo student per ottimizzare, poiché i casi facili sono già risolti lasciando campioni distillati da cui apprendere.

Il modello DistilBERT è molto simile a BERT, ma il numero di livelli di codifica è dimezzato. Quindi, DistilBERT ha 6 livelli di codifica. Il modello studente è inizializzato solo con i pesi pre-addestrati di BERT, poiché sono molto simili come architettura. Per ogni due livelli in BERT, gli autori hanno selezionato i pesi di un livello per ogni livello di DistilBERT.

DistilBERT viene addestrato sullo stesso corpus del modello BERT originale: una concatenazione di Wikipedia in inglese e Toronto Book Corpus. La funzione di perdita è una somma della perdita di distillazione, una funzione di perdita di incorporamento coseno che cerca di ridurre la distanza tra i vettori nascosti prodotti dall’insegnante e dallo studente, e la perdita effettiva del masked language modeling, che è stata utilizzata nell’articolo originale di BERT.

Link all’articolo: https://arxiv.org/pdf/1910.01108.pdf

Conclusioni

In questo articolo, abbiamo cercato di imparare tutto su BERT e i suoi miglioramenti. Nelle parti successive di questa serie, vedremo ulteriori sviluppi in questo campo.

Fino ad allora, buona lettura!