Incrustaciones de frases BERT de transformadores
Estoy tratando de obtener vectores de oración de estados ocultos en un modelo BERT. Mirando las instrucciones de BertModel huggingface aquí , que dicen:
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)
Así que primera nota, como está en el sitio web, esto no se ejecuta. Usted obtiene:
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable
Pero parece que un cambio menor lo soluciona, ya que no llama al tokenizador directamente, sino que le pide que codifique la entrada:
encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)
Bien, aparte de eso, los tensores que obtengo, sin embargo, tienen una forma diferente a la que esperaba:
>>> output[0].shape
torch.Size([1,11,768])
Son muchas capas. ¿Cuál es la capa correcta para usar para incrustaciones de oraciones? [0]
? [-1]
? ¿Promediando varios? Tengo el objetivo de poder hacer una similitud de coseno con estos, por lo que necesito un vector 1xN adecuado en lugar de un tensor NxK.
Veo que el popular proyecto bert-as-a-service parece usar[0]
¿Es esto correcto? ¿Existe documentación para lo que son cada una de las capas?
Respuestas
No creo que haya una única documentación autorizada que diga qué usar y cuándo. Necesita experimentar y medir lo que es mejor para su tarea. Las observaciones recientes sobre BERT se resumen muy bien en este documento:https://arxiv.org/pdf/2002.12327.pdf.
Creo que la regla de oro es:
Utilice la última capa si va a ajustar el modelo para su tarea específica. Y afine siempre que pueda, varios cientos o incluso docenas de ejemplos de entrenamiento son suficientes.
Use algunas de las capas intermedias (séptima u octava) si no puede ajustar el modelo. La intuición detrás de eso es que las capas primero desarrollan una representación cada vez más abstracta y general de la entrada. En algún momento, la representación comienza a estar más enfocada a la tarea previa al entrenamiento.
Bert-as-services usa la última capa por defecto (pero es configurable). Aquí estaría [:, -1]
. Sin embargo, siempre devuelve una lista de vectores para todos los tokens de entrada. Se considera que el vector correspondiente al primer [CLS]
token especial (así llamado ) es la inserción de la oración. De aquí [0]
viene el snipper al que te refieres.
Si bien la respuesta existente de Jindrich es generalmente correcta, no aborda la pregunta por completo. El OP preguntó qué capa debería usar para calcular la similitud de coseno entre las incrustaciones de oraciones y la respuesta corta a esta pregunta es ninguna . Una métrica como la similitud del coseno requiere que las dimensiones del vector contribuyan de manera equitativa y significativa, pero este no es el caso de BERT. Jacob Devlin (uno de los autores del artículo BERT) escribió :
No estoy seguro de cuáles son estos vectores, ya que BERT no genera vectores de oración significativos. Parece que se trata de un agrupamiento promedio de los tokens de palabras para obtener un vector de oración, pero nunca sugerimos que esto generará representaciones de oración significativas. E incluso si son representaciones decentes cuando se introducen en un DNN capacitado para una tarea posterior, no significa que serán significativas en términos de distancia cosenoidal. (Dado que la distancia del coseno es un espacio lineal donde todas las dimensiones se ponderan por igual).
Sin embargo, eso no significa que no pueda usar BERT para tal tarea. Simplemente significa que no puede usar las pesas pre-entrenadas listas para usar. Puede entrenar un clasificador sobre BERT que aprende qué oraciones son similares (usando el [CLS]
token) o puede usar transformadores de oraciones que se pueden usar en un escenario no supervisado porque fueron entrenados para producir representaciones de oraciones significativas.