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

标签 machine-learning nlp pytorch huggingface-transformers distilbert

一段时间以来,我一直在为 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] 标记序列)
  • 如何实际使用他们的调度器+优化器来训练一个简单的文本到文本任务的模型。
  • 最佳答案

    要解码输出,您可以执行

            prediction_as_text = tokenizer.decode(output_ids, skip_special_tokens=True)
    
    output_ids包含生成的 token ID。它也可以是批处理(每行输出 id),然后是 prediction_as_text也将是一个包含每一行文本的二维数组。 skip_special_tokens=True过滤掉训练中使用的特殊标记,例如(句子结尾)、(句子开头)等。这些特殊标记当然因模型而异,但几乎每个模型都有在训练和推理过程中使用的特殊标记。
    没有一种简单的方法可以摆脱未知 token [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,
    )
    
    对于其他调度程序类型,请参阅此链接:https://huggingface.co/transformers/main_classes/optimizer_schedules.html

    关于machine-learning - 使用 Huggingface 的蒸馏器模型生成文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59240668/

    相关文章:

    python - 我应该在神经网络中转置特征或权重吗?

    machine-learning - 每个状态都是终端的强化学习

    machine-learning - 推荐系统 : Is it content-based filtering?

    tensorflow - Keras 中填充输出的 F1 分数

    text - 自然语言生成 - 如何测试它听起来是否自然

    python - 在Python中对上下文中的多个多词短语进行分类的NLP策略

    python - 我如何在 Pytorch 中交换 3 个维度?

    python - 添加批量归一化会降低性能

    java - 我应该如何在包含文本的训练集上使用机器学习分类器?

    pytorch - PyTorch 中的 Tensor.size 和 Tensor.shape 有什么区别?