es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo calcular la perplejidad de una frase utilizando los modelos de lenguaje con espaciado de huggingface?

Tengo varios modelos de lenguaje enmascarados (principalmente Bert, Roberta, Albert, Electra). También tengo un conjunto de datos de oraciones. ¿Cómo puedo obtener la perplejidad de cada oración?

En la documentación de huggingface aquí, mencionan que la perplejidad “no está bien definida para modelos de lenguaje enmascarados como BERT”, aunque todavía veo a personas calculándola de alguna manera.

Por ejemplo, en esta pregunta de SO, la calcularon utilizando la función:

def score(model, tokenizer, sentence, mask_token_id=103):
  tensor_input = tokenizer.encode(sentence, return_tensors='pt')
  repeat_input = tensor_input.repeat(tensor_input.size(-1)-2, 1)
  mask = torch.ones(tensor_input.size(-1) - 1).diag(1)[:-2]
  masked_input = repeat_input.masked_fill(mask == 1, 103)
  labels = repeat_input.masked_fill(masked_input != 103, -100)
  loss,_ = model(masked_input, masked_lm_labels=labels)
  result = np.exp(loss.item())
  return result

score(model, tokenizer, '我爱你') # retorna 45.63794545581973

Sin embargo, cuando intento usar el código, obtengo el siguiente error TypeError: forward() got an unexpected keyword argument 'masked_lm_labels'.

Lo intenté con un par de mis modelos:

from transformers import pipeline, BertForMaskedLM, BertForMaskedLM, AutoTokenizer, RobertaForMaskedLM, AlbertForMaskedLM, ElectraForMaskedLM
import torch

1)
tokenizer = AutoTokenizer.from_pretrained("bioformers/bioformer-cased-v1.0")
model = BertForMaskedLM.from_pretrained("bioformers/bioformer-cased-v1.0")
2)
tokenizer = AutoTokenizer.from_pretrained("sultan/BioM-ELECTRA-Large-Generator")
model = ElectraForMaskedLM.from_pretrained("sultan/BioM-ELECTRA-Large-Generator")

Esta pregunta de SO aquí también utilizó masked_lm_labels como entrada y parecía funcionar de alguna manera.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como se menciona en la documentación de Hugging Face, la perplejidad no está bien definida para modelos de lenguaje enmascarados como BERT. Sin embargo, existen métodos para aproximar la perplejidad. Uno de estos métodos es utilizar la función mencionada en la pregunta de SO que mencionaste.

    Puedes intentar utilizar la función con los modelos que tienes, pero parece que el argumento masked_lm_labels no es compatible en todas las versiones de los modelos. Por lo tanto, es posible que te encuentres con el mismo error: TypeError: forward() got an unexpected keyword argument 'masked_lm_labels'.

    También puedes intentar utilizar el método generate() proporcionado por los modelos en lugar de forward(). Por ejemplo, para un modelo BERT, puedes utilizar el siguiente código:

    from transformers import AutoTokenizer, AutoModelWithLMHead
    
    tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
    model = AutoModelWithLMHead.from_pretrained("bert-base-cased")
    
    def score(model, tokenizer, sentence):
        input_ids = tokenizer.encode(sentence, return_tensors='pt')
        loss = model(input_ids, labels=input_ids)[0]
        perplexity = loss.exp().item()
        return perplexity
    
    score(model, tokenizer, 'I love NLP')
    

    Esto te dará la perplejidad aproximada de la frase ‘I love NLP’. Puedes repetir esto para los otros modelos que tengas. El puntaje de perplejidad será diferente para diferentes modelos.

    Ten en cuenta que este método solo proporciona una aproximación de la perplejidad, ya que la perplejidad no está bien definida para los modelos de lenguaje enmascarados.

Comments are closed.