使用 Huggingface 的蒸馏器模型生成文本

Geo*_*rge 6 nlp machine-learning pytorch distilbert huggingface-transformers

一段时间以来,我一直在为 Huggingface 的 DistilBERT 模型苦苦挣扎,因为文档似乎非常不清楚及其示例(例如https://github.com/huggingface/transformers/blob/master/notebooks/Comparing-TF-and-PT -models-MLM-NSP.ipynbhttps://github.com/huggingface/transformers/tree/master/examples/distillation)非常厚,他们展示的东西似乎没有很好的记录。

我想知道这里是否有人有任何经验并且知道一些很好的代码示例,用于他们模型的基本 Python 内使用。即:

  • 如何将模型的输出正确解码为实际文本(无论我如何改变它的形状,标记器似乎都愿意解码它并总是产生一些[UNK]标记序列)

  • 如何实际使用他们的调度器+优化器来训练一个简单的文本到文本任务的模型。

Ber*_*abi 2

要解码输出,你可以这样做

        prediction_as_text = tokenizer.decode(output_ids, skip_special_tokens=True)
Run Code Online (Sandbox Code Playgroud)

output_ids包含生成的令牌 ID。它也可以是一个批处理(每行输出 id),那么它prediction_as_text也将是一个包含每行文本的 2D 数组。skip_special_tokens=True过滤掉训练中使用的特殊标记,例如(句子结尾)、(句子开头)等。当然,这些特殊标记因模型而异,但几乎每个模型在训练和推理过程中都使用此类特殊标记。

没有一种简单的方法可以摆脱未知的标记[UNK]。这些模型的词汇量有限。如果模型遇到词汇表中不存在的子词,则会将其替换为特殊的未知标记,并使用这些标记来训练模型。所以,它也学习生成[UNK]。有多种方法可以处理它,例如将其替换为第二高可能的标记,或者使用波束搜索并采用不包含任何未知标记的最可能的句子。但是,如果您确实想摆脱这些,您应该使用使用字节对编码的模型。彻底解决了不认识单词的问题。正如您可以在此链接中阅读的那样,Bert 和 DistilBert 使用子工作标记化并具有这样的限制。https://huggingface.co/transformers/tokenizer_summary.html

要使用调度程序和优化器,您应该使用类TrainerTrainingArguments。下面我发布了我自己的项目之一的示例。

    output_dir=model_directory,
    num_train_epochs=args.epochs,
    per_device_train_batch_size=args.batch_size,
    per_device_eval_batch_size=args.batch_size,
    warmup_steps=500,
    weight_decay=args.weight_decay,
    logging_dir=model_directory,
    logging_steps=100,
    do_eval=True,
    evaluation_strategy='epoch',
    learning_rate=args.learning_rate,
    load_best_model_at_end=True, # the last checkpoint is the best model wrt metric_for_best_model
    metric_for_best_model='eval_loss',
    lr_scheduler_type = 'linear'
    greater_is_better=False, 
    save_total_limit=args.epochs if args.save_total_limit == -1 else args.save_total_limit,

)

trainer = Seq2SeqTrainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
    optimizers=[torch.optim.Adam(params=model.parameters(), 
    lr=args.learning_rate), None], // optimizers
    tokenizer=tokenizer,
)
Run Code Online (Sandbox Code Playgroud)

对于其他调度程序类型,请参阅此链接:https://huggingface.co/transformers/main_classes/optimizer_schedules.html