Incorporamenti di frasi BERT da trasformatori
Sto cercando di ottenere vettori di frasi da stati nascosti in un modello BERT. Guardando le istruzioni di BertModel che abbracciano qui , che dicono:
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
model = BertModel.from_pretrained("bert-base-multilingual-cased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
Quindi, prima nota, poiché è sul sito Web, questo non funziona. Ottieni:
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable
Ma sembra che una piccola modifica lo risolva, in quanto non chiami direttamente il tokenizer, ma gli chiedi di codificare l'input:
encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)
OK, a parte questo, i tensori che ottengo, tuttavia, hanno una forma diversa da quella che mi aspettavo:
>>> output[0].shape
torch.Size([1,11,768])
Questo è un sacco di strati. Qual è il livello corretto da utilizzare per gli incorporamenti di frasi? [0]
? [-1]
? Media diversi? Ho l'obiettivo di essere in grado di fare la somiglianza del coseno con questi, quindi ho bisogno di un vettore 1xN appropriato piuttosto che di un tensore NxK.
Vedo che il popolare progetto bert-as-a-service sembra utilizzare[0]
È corretto? Esiste documentazione per ciò che è ciascuno dei livelli?
Risposte
Non credo che ci sia una sola documentazione autorevole che dice cosa usare e quando. Devi sperimentare e misurare ciò che è meglio per il tuo compito. Le recenti osservazioni su BERT sono ben riassunte in questo articolo:https://arxiv.org/pdf/2002.12327.pdf.
Penso che la regola pratica sia:
Usa l'ultimo livello se intendi mettere a punto il modello per il tuo compito specifico. E perfeziona ogni volta che puoi, diverse centinaia o addirittura dozzine di esempi di allenamento sono sufficienti.
Usa alcuni degli strati intermedi (7-esimo o 8-esimo) se non puoi mettere a punto il modello. L'intuizione alla base di ciò è che gli strati sviluppano prima una rappresentazione sempre più astratta e generale dell'input. Ad un certo punto, la rappresentazione inizia ad essere più target per l'attività pre-formazione.
Bert-as-services utilizza l'ultimo livello per impostazione predefinita (ma è configurabile). Ecco, sarebbe [:, -1]
. Tuttavia, restituisce sempre un elenco di vettori per tutti i token di input. Il vettore corrispondente al primo [CLS]
token speciale (cosiddetto ) è considerato l'incorporamento della frase. Questo da dove [0]
proviene lo snipper a cui ti riferisci.
Sebbene la risposta esistente di Jindrich sia generalmente corretta, non affronta interamente la domanda. L'OP ha chiesto quale strato utilizzare per calcolare la somiglianza del coseno tra gli incorporamenti di frasi e la risposta breve a questa domanda è nessuno . Una metrica come la somiglianza del coseno richiede che le dimensioni del vettore contribuiscano in modo uguale e significativo, ma questo non è il caso di BERT. Jacob Devlin (uno degli autori dell'articolo BERT) ha scritto :
Non sono sicuro di quali siano questi vettori, poiché BERT non genera vettori di frasi significativi. Sembra che questo stia facendo un raggruppamento medio sulle parole token per ottenere un vettore di frase, ma non abbiamo mai suggerito che questo genererà rappresentazioni di frasi significative. E anche se sono rappresentazioni decenti quando inserite in un DNN addestrato per un'attività a valle, non significa che saranno significative in termini di distanza del coseno. (Poiché la distanza del coseno è uno spazio lineare in cui tutte le dimensioni sono pesate allo stesso modo).
Tuttavia, ciò non significa che non puoi utilizzare BERT per tale attività. Significa solo che non puoi usare i pesi pre-addestrati fuori dalla scatola. Puoi addestrare un classificatore su BERT che apprende quali frasi sono simili (usando il [CLS]
token) oppure puoi utilizzare trasformatori di frasi che possono essere utilizzati in uno scenario non supervisionato perché sono stati addestrati per produrre rappresentazioni di frasi significative.