
Transformers 序列到序列翻译实战使用 T5 在 OPUS Books 数据集上微调英法翻译模型【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers导读本文基于 Transformers 仓库的 翻译任务指南完整演示如何将一个预训练 T5 模型google-t5/t5-small在 OPUS Books 数据集的英语–法语子集上进行微调使其能够完成英译法任务并将微调后的模型用于推理。读完本文你将掌握翻译任务的标准工作流数据集加载与划分、带任务前缀的双语预处理、动态 Padding 的数据整理器Data Collator、SacreBLEU 指标评估、基于Seq2SeqTrainer的训练以及generate推理的完整实战方案同时结合仓库源码理解每一步背后的实现原理。翻译任务与序列到序列范式翻译Translation是将一段文本从一种语言转换为另一种语言的任务。它是典型的**序列到序列Sequence-to-Sequence, Seq2Seq**问题模型从输入序列出发生成一段输出序列。这一框架同样适用于摘要Summarization等任务。翻译系统最常见的应用场景是不同语言文本之间的互译但该框架同样可以扩展到语音领域例如文本到语音TTS、语音到文本STT等跨模态组合。在本仓库中翻译类模型通过AutoModelForSeq2SeqLM自动加载。从 建模自动映射表 可以看到MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES中注册了大量可用于翻译的架构例如BartForConditionalGeneration、MarianMTModel、MBartForConditionalGeneration、M2M100ForConditionalGeneration、NllbMoeForConditionalGeneration、SeamlessM4TForTextToText以及本文使用的T5ForConditionalGeneration。这意味着本文的微调流程稍作调整即可迁移到其他 Seq2Seq 架构。T5 的序列到序列结构从 T5 模型源码 可以看到T5ForConditionalGeneration的核心构成self.shared nn.Embedding(config.vocab_size, config.d_model) # 共享词嵌入 encoder_config.is_decoder False self.encoder T5Stack(encoder_config) # 编码器 decoder_config.is_decoder True decoder_config.num_layers config.num_decoder_layers self.decoder T5Stack(decoder_config) # 解码器 self.lm_head nn.Linear(config.d_model, config.vocab_size, biasFalse) # 输出词表映射其中_tied_weights_keys声明了lm_head、编码器/解码器的embed_tokens与shared之间的权重绑定关系Weight Tying这是 T5 这类 Seq2Seq 模型的典型设计。理解这一结构有助于理解为什么翻译微调中需要同时处理好输入侧和目标侧两条文本流——这正是预处理阶段的核心难点。环境准备与依赖安装在开始之前需要安装以下库pip install transformers datasets evaluate sacrebleu依赖库在本流程中的作用transformers提供 T5 模型、AutoTokenizer、DataCollatorForSeq2Seq、Seq2SeqTrainer等核心组件datasets加载 OPUS Books 数据集并进行map批量预处理与训练/测试划分evaluate快速加载 SacreBLEU 等评估指标sacrebleuBLEU 指标的参考实现被evaluate调用此外建议安装numpy用于评估函数中的标签处理。如果要将在微调过程中把模型上传并分享给社区建议先登录 Hugging Face 账号按提示输入 Token 即可完成登录 from huggingface_hub import notebook_login notebook_login()如果不想上传模型可以省略登录步骤并在后文训练参数中不设置push_to_hubTrue改为将模型保存在本地output_dir。加载 OPUS Books 数据集使用 Datasets 库加载 OPUS Books 数据集的英语–法语子集 from datasets import load_dataset books load_dataset(opus_books, en-fr)该数据集来自 Project Gutenberg 的公有领域书籍天然包含高质量的英法平行语料。加载后使用train_test_split方法将训练集按 80/20 划分出测试集 books books[train].train_test_split(test_size0.2)查看一条样本观察其数据结构 books[train][0] {id: 90560, translation: {en: But this lofty plateau measured only a few fathoms, and soon we reentered Our Element., fr: Mais ce plateau élevé ne mesurait que quelques toises, et bientôt nous fûmes rentrés dans notre élément.}}translation字段是一个字典包含同一句话的英文en与法文fr两种译文id为样本编号。注意这里是字段嵌套的平行语料格式translation键内部再按语言区分预处理函数需要按此结构取值。预处理双语 Tokenization 与任务前缀加载 T5 Tokenizer from transformers import AutoTokenizer checkpoint google-t5/t5-small tokenizer AutoTokenizer.from_pretrained(checkpoint)预处理函数的设计要点针对翻译任务预处理函数需要满足三个关键要求为输入添加任务前缀PrefixT5 是支持多种 NLP 任务的多任务模型需要通过提示Prompt告诉它当前要执行的是翻译任务。本例使用前缀translate English to French: 。这一机制与 T5 的预训练范式一脉相承——从 T5 模型源码 的示例可以看出T5 在预训练时就使用extra_id_0等特殊 Token 与任务描述拼接输入微调时延续同样的前缀即任务约定。输入与目标分别 Tokenizetokenizer是基于英语词汇预训练的无法直接正确切分法语文本。因此输入英语与目标法语必须分开处理。目标侧通过text_targettargets参数传入tokenizer会为输入与目标分别返回input_ids和labels。这一点至关重要——从 英文版文档 的补充说明可以看到如果不设置text_targettokenizer 会把目标文本当作英语处理导致法语文本被错误切分。截断到最大长度通过max_length128与truncationTrue保证序列不会超过模型可处理的最大长度。 source_lang en target_lang fr prefix translate English to French: def preprocess_function(examples): ... inputs [prefix example[source_lang] for example in examples[translation]] ... targets [example[target_lang] for example in examples[translation]] ... model_inputs tokenizer(inputs, text_targettargets, max_length128, truncationTrue) ... return model_inputs批量应用预处理使用 Datasets 的map方法将预处理函数应用到整个数据集。设置batchedTrue可以一次处理多个样本显著加速map的执行 tokenized_books books.map(preprocess_function, batchedTrue)map之后数据集中的每个样本会包含input_ids英语、attention_mask和labels法语三组字段可直接喂给模型与数据整理器。动态 PaddingDataCollatorForSeq2Seq训练时需要对一个 batch 内的样本做 Padding 使其长度一致。与把整个数据集 Padding 到最大长度相比更高效的做法是使用DataCollatorForSeq2Seq动态 Padding只在整理Collate时把当前 batch 内的序列补齐到该 batch 的最长长度。 from transformers import DataCollatorForSeq2Seq data_collator DataCollatorForSeq2Seq(tokenizertokenizer, modelcheckpoint)从 DataCollatorForSeq2Seq 源码 可以看到其关键行为默认paddingTrue即longest策略对输入与标签同时动态 Padding标签使用label_pad_token_id-100填充-100会被 PyTorch 的交叉熵损失函数自动忽略保证 Padding 位置不参与损失计算这是 Seq2Seq 训练的标准做法传入model参数后若模型实现了prepare_decoder_input_ids_from_labels数据整理器会用它从labels推导decoder_input_ids避免在使用标签平滑label smoothing时重复计算损失支持pad_to_multiple_of参数例如设为 8将序列对齐到 8 的倍数以便在 NVIDIA Volta 及以上架构的 GPU 上充分利用 Tensor Core 加速。评估SacreBLEU 指标在训练过程中引入评估指标有助于监控模型表现。使用 Evaluate 库加载 SacreBLEU 指标 import evaluate metric evaluate.load(sacrebleu)SacreBLEU 是机器翻译领域 BLEU 指标的标准化实现其计算流程经过了规范化处理确保不同工具之间的分数具有可比性。接下来编写compute_metrics函数将预测结果与标签传给metric.compute计算 SacreBLEU 分数 import numpy as np def postprocess_text(preds, labels): ... preds [pred.strip() for pred in preds] ... labels [[label.strip()] for label in labels] ... return preds, labels def compute_metrics(eval_preds): ... preds, labels eval_preds ... if isinstance(preds, tuple): ... preds preds[0] ... decoded_preds tokenizer.batch_decode(preds, skip_special_tokensTrue) ... labels np.where(labels ! -100, labels, tokenizer.pad_token_id) ... decoded_labels tokenizer.batch_decode(labels, skip_special_tokensTrue) ... decoded_preds, decoded_labels postprocess_text(decoded_preds, decoded_labels) ... result metric.compute(predictionsdecoded_preds, referencesdecoded_labels) ... result {bleu: result[score]} ... prediction_lens [np.count_nonzero(pred ! tokenizer.pad_token_id) for pred in preds] ... result[gen_len] np.mean(prediction_lens) ... result {k: round(v, 4) for k, v in result.items()} ... return result这个函数的关键细节值得逐点说明解码预测tokenizer.batch_decode(preds, skip_special_tokensTrue)把 Token ID 还原为文本并去掉特殊 Token还原标签训练时标签中的 Padding 位置被填充为-100在解码前需要先用np.where将其替换为tokenizer.pad_token_id否则解码会出错或产生无意义输出后处理postprocess_text去除首尾空白并把每个标签包装成列表——SacreBLEU 的references参数要求每个预测对应一个或多个参考译文列表附加信息gen_len统计平均生成长度用于观察生成序列的规模结果取整所有指标保留 4 位小数便于日志展示。训练Seq2SeqTrainer 微调 T5加载模型通过AutoModelForSeq2SeqLM加载 T5 from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer model AutoModelForSeq2SeqLM.from_pretrained(checkpoint)AutoModelForSeq2SeqLM会根据 checkpoint 自动路由到T5ForConditionalGeneration映射关系参见 modeling_auto.py。定义训练超参数使用Seq2SeqTrainingArguments定义训练超参数其中唯一必填参数是output_dir模型保存位置 training_args Seq2SeqTrainingArguments( ... output_dirmy_awesome_opus_books_model, ... eval_strategyepoch, ... learning_rate2e-5, ... per_device_train_batch_size16, ... per_device_eval_batch_size16, ... weight_decay0.01, ... save_total_limit3, ... num_train_epochs2, ... predict_with_generateTrue, ... fp16True, ... push_to_hubTrue, ... )各参数的作用与说明如下参数作用备注output_dir模型与检查点保存目录唯一必填参数eval_strategyepoch每个 epoch 结束时评估一次并保存检查点新版本命名旧版本为evaluation_strategylearning_rate2e-5Adam 优化器的初始学习率微调 T5-small 的常用取值per_device_train_batch_size16每个设备上的训练 batch 大小显存不足时可调小per_device_eval_batch_size16每个设备上的评估 batch 大小同上weight_decay0.01权重衰减系数用于正则化save_total_limit3最多保留 3 个检查点超出后自动删除旧检查点num_train_epochs2训练 2 个 epochpredict_with_generateTrue评估时使用generate自回归解码而非直接取 logits 贪心 argmaxSeq2Seq 评估的关键开关必须开启才能得到有意义的 BLEU 分数fp16True使用混合精度训练FP16在 XPU 等不适用 FP16 的硬件上可改为bf16True参见 英文版文档 的注释push_to_hubTrue训练结束后把模型推送到 Hub需要已登录且拥有上传权限组装 Seq2SeqTrainer 并训练 trainer Seq2SeqTrainer( ... modelmodel, ... argstraining_args, ... train_datasettokenized_books[train], ... eval_datasettokenized_books[test], ... processing_classtokenizer, ... data_collatordata_collator, ... compute_metricscompute_metrics, ... ) trainer.train()Seq2SeqTrainer是专为序列到序列任务设计的训练器实现位于 trainer_seq2seq.py它在标准Trainer基础上做了关键增强评估时使用生成式解码predict_with_generateTrue时评估与预测阶段调用prediction_step走完整的自回归生成流程对应model.generate这样计算出的 BLEU 分数才真实反映模型的翻译能力自动处理生成超参数支持通过generation_config或generation_max_length、generation_num_beams等参数控制评估时的生成行为与动态 Padding 无缝配合DataCollatorForSeq2Seq提供的labels含-100填充与compute_metrics中np.where的处理逻辑完全对应。注意processing_classtokenizer新版 Transformers 中Seq2SeqTrainer的processing_class参数用于接收 tokenizer/processor负责解码与特征处理。分享模型训练完成后将模型推送至 Hub 供社区使用 trainer.push_to_hub()如果未登录或不想公开模型也可以只保留本地output_dir中的pytorch_model.bin、config.json等文件推理时直接指定该本地目录即可。关于Trainer的基础用法数据集、训练参数、回调等可参考 Trainer 训练教程。仓库还提供了更完整的可运行示例脚本 examples/pytorch/translation/run_translation.py 及其无 Trainer 版本 run_translation_no_trainer.py支持从命令行传入数据集、语言对与各类超参数适合批量实验与脚本化训练。推理使用微调后的模型进行翻译微调完成后即可用于推理。先准备一段待翻译的英文文本。与训练一致T5 要求输入带有任务前缀 text translate English to French: Legumes share resources with nitrogen-fixing bacteria.将文本 Tokenize并把input_ids以 PyTorch 张量形式返回 from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(my_awesome_opus_books_model) inputs tokenizer(text, return_tensorspt).input_ids如果模型已推送到 Hub此处使用用户名/my_awesome_opus_books_model这样的 Hub 仓库 ID 加载即可。加载微调后的模型并调用generate生成翻译 from transformers import AutoModelForSeq2SeqLM model AutoModelForSeq2SeqLM.from_pretrained(my_awesome_opus_books_model) outputs model.generate(inputs, max_new_tokens40, do_sampleTrue, top_k30, top_p0.95)本例使用的生成参数参数作用max_new_tokens40最多生成 40 个新 Token不含输入部分防止无限生成do_sampleTrue开启随机采样而非贪心解码增加输出多样性top_k30采样时只考虑概率最高的前 30 个 Tokentop_p0.95核采样Nucleus Sampling在累积概率达到 0.95 的最小 Token 集合内采样generate是GenerationMixin提供的通用生成方法支持贪心、束搜索、采样等多种解码策略。更完整的生成策略与参数说明可参考 文本生成 API 文档本仓库对应的实现位于 src/transformers/generation 目录下。最后将生成的 Token ID 解码回文本 tokenizer.decode(outputs[0], skip_special_tokensTrue) Les lignées partagent des ressources avec des bactéries enfixant lazote.可以看到模型输出了一串通顺的法语译文说明英法翻译微调取得了效果。拓展用 pipeline 快速体验翻译如果不需要训练、只想快速体验现成的翻译模型可以使用 Transformers 的pipelineAPI。从 pipelines 注册表 可以看到TASK_ALIASES中定义了translation_en_to_fr之类的别名以及sentiment-analysis、ner等通用别名它们会在 SUPPORTED_TASKS 的基础上自动拼接出translation_xx_to_yy形式的任务名。示例用法 from transformers import pipeline translator pipeline(translation, modelmy_awesome_opus_books_model) translator(Legumes share resources with nitrogen-fixing bacteria.)pipeline内部自动完成 Tokenize、generate与解码适合快速验证模型效果或集成到小型应用。总结与进一步探索本文完整走通了T5 OPUS Books 英法翻译微调的全流程数据load_dataset(opus_books, en-fr)加载平行语料并划分训练/测试集预处理任务前缀 text_target双语 Tokenize max_length/truncation截断再经map(batchedTrue)批量应用数据整理DataCollatorForSeq2Seq动态 Padding标签以-100填充以屏蔽损失评估SacreBLEU 指标 compute_metrics解码/后处理管线训练Seq2SeqTrainer配合predict_with_generateTrue进行生成式评估推理generate解码 tokenizer.decode还原文本亦可换用pipeline封装。在此基础上你可以沿以下方向继续深入换用其他语言对如en-de、zh-en或直接替换为MarianMTModel、M2M100等多语言翻译模型参考 examples/pytorch/translation/run_translation.py 的命令行参数如--max_source_length、--num_beams、--fp16/--bf16等做更大规模、更长序列的实验深入阅读 T5 模型源码 理解编码器–解码器内部机制或查看 文本生成 API 调整解码策略以获得更优的翻译质量与多样性。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考