Machine learning 使用huggingface'生成文本;s-distilbert模型

Machine learning 使用huggingface'生成文本;s-distilbert模型,machine-learning,nlp,pytorch,huggingface-transformers,distilbert,Machine Learning,Nlp,Pytorch,Huggingface Transformers,Distilbert,我已经为huggingface的DistilBERT模型挣扎了一段时间,因为文档似乎非常不清楚,他们的示例(例如和)非常丰富,而且他们展示的东西似乎没有很好的文档记录 我想知道这里是否有人有任何经验,并且知道他们的模型在python中使用basic的一些好的代码示例。即: 如何正确地将模型的输出解码为实际文本(无论我如何更改其形状,标记器似乎都愿意对其进行解码,并且总是产生一些[UNK]标记序列) 如何实际使用他们的调度器+优化器为简单的文本到文本任务训练模型 要解码输出,您可以执行以下操作

我已经为huggingface的DistilBERT模型挣扎了一段时间,因为文档似乎非常不清楚,他们的示例(例如和)非常丰富,而且他们展示的东西似乎没有很好的文档记录

我想知道这里是否有人有任何经验,并且知道他们的模型在python中使用basic的一些好的代码示例。即:

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

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


要解码输出,您可以执行以下操作

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

没有一种简单的方法可以去除未知的令牌[UNK]。这些模型的词汇量有限。如果模型遇到不在其in词汇表中的子词,它将被一个特殊的未知标记替换,并使用这些标记对模型进行训练。因此,它还可以学习生成[UNK]。有各种各样的方法来处理它,比如用第二高可能的标记替换它,或者使用beam搜索并获取不包含任何未知标记的最可能的句子。然而,如果您真的想摆脱这些,您应该使用一个使用字节对编码的模型。它完全解决了未知词的问题。正如您在这个链接中看到的,Bert和DistilBert使用子工作标记化,并且有这样的限制

要使用调度程序和优化器,应使用类
Trainer
TrainingArguments
。下面我发布了一个来自我自己项目的例子

    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,
)
有关其他计划程序类型,请参见以下链接: