阿里云服务器搭网站同时做网盘,杭州有几个区,自贡网站制作公司,网站设计的分辨率BART模型是用来预训练seq-to-seq模型的降噪自动编码器#xff08;autoencoder#xff09;。它是一个序列到序列的模型#xff0c;具有对损坏文本的双向编码器和一个从左到右的自回归解码器#xff0c;所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…BART模型是用来预训练seq-to-seq模型的降噪自动编码器autoencoder。它是一个序列到序列的模型具有对损坏文本的双向编码器和一个从左到右的自回归解码器所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系结构比如在自定义数据集上训练一个新的标记那么处理起来会很麻烦所以在本文中我将介绍添加新标记的预处理步骤并介绍如何进行模型微调。
因为Huggingface Hub有很多预训练过的模型可以很容易地找到预训练标记器。但是我们要添加一个标记可能就会有些棘手下面我们来完整的介绍如何实现它首先加载和预处理数据集。
加载数据集
我们使用WMT16数据集及其罗马尼亚语-英语子集。load_dataset()函数将从Huggingface下载并加载任何可用的数据集。 importdatasetsdatasetdatasets.load_dataset(stas/wmt16-en-ro-pre-processed, cache_dir./wmt16-en_ro)在上图1中可以看到数据集内容。我们需要将其“压平”这样可以更好的访问数据让后将其保存到硬盘中。 defflatten(batch):batch[en] batch[translation][en]batch[ro] batch[translation][ro]returnbatch# Map the flatten functiontraindataset[train].map( flatten )testdataset[test].map( flatten )validationdataset[validation].map( flatten )# Save to disktrain.save_to_disk(./dataset/train)test.save_to_disk(./dataset/test)validation.save_to_disk(./dataset/validation)下图2可以看到已经从数据集中删除了“translation”维度。 标记器
标记器提供了训练标记器所需的所有工作。它由四个基本组成部分:(但这四个部分不是所有的都是必要的)
Models:标记器将如何分解每个单词。例如给定单词“playing”:i) BPE模型将其分解为“play”“ing”两个标记ii) WordLevel将其视为一个标记。
Normalizers:需要在文本上发生的一些转换。有一些过滤器可以更改Unicode、小写字母或删除内容。
Pre-Tokenizers:为操作文本提供更大灵活性处理的函数。例如如何处理数字。数字100应该被认为是“100”还是“1”、“0”、“0”?
Post-Processors:后处理具体情况取决于预训练模型的选择。例如将 [BOS]句首或 [EOS]句尾标记添加到 BERT 输入。
下面的代码使用BPE模型、小写Normalizers和空白Pre-Tokenizers。然后用默认值初始化训练器对象主要包括
1、词汇量大小使用50265以与BART的英语标记器一致
2、特殊标记如和
3、初始词汇量这是每个模型启动过程的预定义列表。 fromtokenizersimportnormalizers, pre_tokenizers, Tokenizer, models, trainers# Build a tokenizerbpe_tokenizerTokenizer(models.BPE())bpe_tokenizer.normalizernormalizers.Lowercase()bpe_tokenizer.pre_tokenizerpre_tokenizers.Whitespace()trainertrainers.BpeTrainer(vocab_size50265,special_tokens[s, pad, /s, unk, mask],initial_alphabetpre_tokenizers.ByteLevel.alphabet(),)使用Huggingface的最后一步是连接Trainer和BPE模型并传递数据集。根据数据的来源可以使用不同的训练函数。我们将使用train_from_iterator()。 defbatch_iterator():batch_length1000foriinrange(0, len(train), batch_length):yieldtrain[i : ibatch_length][ro]bpe_tokenizer.train_from_iterator( batch_iterator(), lengthlen(train), trainertrainer )bpe_tokenizer.save(./ro_tokenizer.json)
BART微调
现在可以使用使用新的标记器了。 fromtransformersimportAutoTokenizer, PreTrainedTokenizerFasten_tokenizerAutoTokenizer.from_pretrained( facebook/bart-base );ro_tokenizerPreTrainedTokenizerFast.from_pretrained( ./ro_tokenizer.json );ro_tokenizer.pad_tokenen_tokenizer.pad_tokendeftokenize_dataset(sample):inputen_tokenizer(sample[en], paddingmax_length, max_length120, truncationTrue)labelro_tokenizer(sample[ro], paddingmax_length, max_length120, truncationTrue)input[decoder_input_ids] label[input_ids]input[decoder_attention_mask] label[attention_mask]input[labels] label[input_ids]returninputtrain_tokenizedtrain.map(tokenize_dataset, batchedTrue)test_tokenizedtest.map(tokenize_dataset, batchedTrue)validation_tokenizedvalidation.map(tokenize_dataset, batchedTrue)上面代码的第5行为罗马尼亚语的标记器设置填充标记是非常必要的。因为它将在第9行使用标记器使用填充可以使所有输入都具有相同的大小。
下面就是训练的过程: fromtransformersimportBartForConditionalGenerationfromtransformersimportSeq2SeqTrainingArguments, Seq2SeqTrainermodelBartForConditionalGeneration.from_pretrained( facebook/bart-base )training_argsSeq2SeqTrainingArguments(output_dir./,evaluation_strategysteps,per_device_train_batch_size2,per_device_eval_batch_size2,predict_with_generateTrue,logging_steps2, # set to 1000 for full trainingsave_steps64, # set to 500 for full trainingeval_steps64, # set to 8000 for full trainingwarmup_steps1, # set to 2000 for full trainingmax_steps128, # delete for full trainingoverwrite_output_dirTrue,save_total_limit3,fp16False, # True if GPU)trainerSeq2SeqTrainer(modelmodel,argstraining_args,train_datasettrain_tokenized,eval_datasetvalidation_tokenized,)trainer.train()过程也非常简单加载bart基础模型(第4行)设置训练参数(第6行)使用Trainer对象绑定所有内容(第22行)并启动流程(第29行)。上述超参数都是测试目的所以如果要得到最好的结果还需要进行超参数的设置我们使用这些参数是可以运行的。
推理
推理过程也很简单加载经过微调的模型并使用generate()方法进行转换就可以了但是需要注意的是对源 (En) 和目标 (RO) 序列使用适当的分词器。
总结
虽然在使用自然语言处理(NLP)时标记化似乎是一个基本操作但它是一个不应忽视的关键步骤。HuggingFace的出现可以方便的让我们使用这使得我们很容易忘记标记化的基本原理而仅仅依赖预先训练好的模型。但是当我们希望自己训练新模型时了解标记化过程及其对下游任务的影响是必不可少的所以熟悉和掌握这个基本的操作是非常有必要的。
本文代码https://avoid.overfit.cn/post/6a533780b5d842a28245c81bf46fac63
作者Ala Alam Falaki