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 entrenar BertForMaskedLM utilizando el Entrenador de Huggingface?

Quiero continuar con el preentrenamiento del modelo BERT en mi propio conjunto de datos. Según entiendo, esto se denomina adaptación de dominio. Por lo tanto, este enfoque será no supervisado.
Usaré BertForMaskedLM o BertForPreTraining. ¿Cómo puedo lograr esto usando transformers.Trainer? ¿Qué debe devolver mi clase Dataset en el método __getitem__? No pude encontrar ningún recurso específico sobre esto. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Pre-entrenamiento BERT en su propio conjunto de datos

    El pre-entrenamiento de BERT en su propio conjunto de datos se conoce como adaptación de dominio, y es un enfoque no supervisado. Para lograr esto mediante transformers.Trainer, puede usar BertForMaskedLM o BertForPreTraining.

    Para crear una clase Dataset para su propio conjunto de datos de pre-entrenamiento, debe devolver un diccionario con las siguientes claves:

    • input_ids: La secuencia de entrada con tokens enmascarados.
    • attention_mask: Un tensor que indica a qué tokens se debe prestar atención.
    • token_type_ids: Un tensor que indica qué partes de la secuencia de entrada corresponden a la primera oración y qué partes corresponden a la segunda oración (si se está utilizando un modelo de clasificación de pares de oraciones).
    • masked_lm_labels: Las etiquetas correspondientes a los tokens enmascarados.

    Aquí hay un ejemplo de cómo podría verse el método __getitem__ de la clase Dataset:

    class MyDataset(torch.utils.data.Dataset):
        def __init__(self, tokenizer, data_dir):
            self.tokenizer = tokenizer
            self.examples = read_data(data_dir)
    
        def __len__(self):
            return len(self.examples)
    
        def __getitem__(self, idx):
            example = self.examples[idx]
            input_ids = self.tokenizer.encode(example['text'], add_special_tokens=True, padding='max_length', max_length=128)
            masked_input_ids, masked_lm_labels = mask_tokens(input_ids, self.tokenizer)
            attention_mask = [int(token_id > 0) for token_id in masked_input_ids]
            token_type_ids = None
    
            return {'input_ids': torch.tensor(masked_input_ids),
                    'attention_mask': torch.tensor(attention_mask),
                    'token_type_ids': token_type_ids,
                    'masked_lm_labels': torch.tensor(masked_lm_labels)}
    
    

    En este ejemplo, tokenizer es una instancia de BertTokenizer, y data_dir es el directorio que contiene sus datos de pre-entrenamiento. La función mask_tokens se utiliza para enmascarar aleatoriamente algunos de los tokens en la secuencia de entrada.

    Para pre-entrenar usando su propio conjunto de datos, puede utilizar el siguiente código:

    from transformers import BertForMaskedLM, DataCollatorForLanguageModeling, Trainer, TrainingArguments
    
    model = BertForMaskedLM.from_pretrained('bert-base-uncased')
    tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
    dataset = MyDataset(tokenizer, 'data/pretrain.txt')
    data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=True, mlm_probability=0.15)
    training_args = TrainingArguments(output_dir='./results', evaluation_strategy='steps', eval_steps=500, save_steps=500)
    trainer = Trainer(model=model, args=training_args, data_collator=data_collator, train_dataset=dataset)
    trainer.train()
    

    En este ejemplo, el model se inicializa con el modelo base de BERT. El tokenizer se utiliza para tokenizar la secuencia de entrada. El dataset es los datos de entrenamiento, que es una instancia de la clase MyDataset. El data_collator se utiliza para agrupar las secuencias de entrada en lotes adecuados para el entrenamiento. Los training_args son hiperparámetros para transformers.Trainer. Por último, el trainer se inicializa con el model, training_args, data_collator, y train_dataset, y se llama a trainer.train() para iniciar el entrenamiento.

    ¡Espero que esto le ayude a pre-entrenar BERT en su propio conjunto de datos utilizando transformers.Trainer!

Comments are closed.