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 obtener tokens generados en el paso de entrenamiento de T5 para utilizar métricas definidas por el usuario?

Estoy afinando T5 para la generación de respuestas a preguntas y quiero agregar medidas adicionales (por ejemplo, BLEU, ROUGE) para las respuestas generadas, además de la función de pérdida.

Para eso, creo que sería necesario obtener los tokens generados (respuestas) en cada training_step. Sin embargo, después de leer el código fuente, aún no tengo idea de cómo hacerlo.

A continuación, dejo un fragmento de mi código. Puedo extraer la pérdida de salida (output.loss) y los logits de salida (output.logits), pero no encontré una forma de obtener los tokens generados para usar métricas de evaluación adicionales.

Gracias de antemano.

class MyQAModel(pl.LightningModule):
  def __init__(self):
    super().__init__()
    self.model = T5ForConditionalGeneration.from_pretrained(MODEL_NAME, return_dict=True)

  def forward(self, input_ids, attention_mask, labels=None):
    output = self.model(
        input_ids, 
        attention_mask=attention_mask,
        labels=labels)

    return output.loss, output.logits

  def training_step(self, batch, batch_idx):
    input_ids = batch['input_ids']
    attention_mask = batch['attention_mask']
    labels = batch['labels']
    loss, outputs = self(input_ids, attention_mask, labels)
    self.log("train_loss", loss, prog_bar=True, logger=True)
    return {"loss": loss, "predictions":outputs, "labels": labels}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los tokens generados durante el ajuste fino (fine-tuning) de T5 para la generación de respuestas a preguntas, puedes usar el método generate proporcionado por la biblioteca transformers de Hugging Face. En particular, puedes utilizar el método model.generate para generar respuestas dada la pregunta de entrada y el contexto.

    Aquí tienes un ejemplo de cómo modificar tu código para obtener los tokens generados:

    from transformers import T5Tokenizer
    
    class MyQAModel(pl.LightningModule):
      def __init__(self):
        super().__init__()
        self.model = T5ForConditionalGeneration.from_pretrained(MODEL_NAME, return_dict=True)
        self.tokenizer = T5Tokenizer.from_pretrained(MODEL_NAME)
    
      def forward(self, input_ids, attention_mask, labels=None):
        output = self.model(
            input_ids, 
            attention_mask=attention_mask,
            labels=labels)
    
        return output.loss, output.logits
    
      def generate_answer(self, input_ids, attention_mask):
          generated_ids = self.model.generate(
              input_ids=input_ids,
              attention_mask=attention_mask,
              max_length=100
          )
          answer_tokens = self.tokenizer.decode(generated_ids[0], skip_special_tokens=True)
          return answer_tokens
    
      def training_step(self, batch, batch_idx):
        input_ids = batch['input_ids']
        attention_mask=batch['attention_mask']
        labels = batch['labels']
    
        # Generar respuestas
        answer_tokens = [self.generate_answer(inp_ids, att_mask) for inp_ids, att_mask in zip(input_ids, attention_mask)]
    
        loss, outputs = self(input_ids, attention_mask, labels)
        self.log("train_loss", loss, prog_bar=True, logger=True)
    
        # Calcular métricas de evaluación adicionales
        # Aquí tienes un ejemplo usando la puntuación BLEU
        reference_answer_tokens = [self.tokenizer.decode(label, skip_special_tokens=True) for label in labels]
        bleu_score = sentence_bleu(reference_answer_tokens, answer_tokens)
    
        return {"loss": loss, "predictions":outputs, "labels": labels, "bleu_score": bleu_score}
    
        ...
        (el código continúa...)
        ....
    

    En el código modificado, el método generate_answer toma input_ids y attention_mask como entradas, y devuelve los tokens de respuesta generados utilizando el método model.generate. A continuación, el método training_step llama a generate_answer para cada elemento del lote (batch) para obtener los tokens de respuesta generados.

    Puedes utilizar los tokens de respuesta generados junto con las etiquetas de verdad fundamental (ground truth labels) para calcular métricas de evaluación adicionales, como la puntuación BLEU o ROUGE, como se describe en tu pregunta. En el código modificado anteriormente, hemos incluido un ejemplo de cómo calcular la puntuación BLEU utilizando la función sentence_bleu proporcionada por la biblioteca nltk.

Comments are closed.