news 2026/9/10 0:37:49

Transformers 序列到序列翻译实战:使用 T5 在 OPUS Books 数据集上微调英法翻译模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Transformers 序列到序列翻译实战:使用 T5 在 OPUS Books 数据集上微调英法翻译模型

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中注册了大量可用于翻译的架构,例如BartForConditionalGenerationMarianMTModelMBartForConditionalGenerationM2M100ForConditionalGenerationNllbMoeForConditionalGenerationSeamlessM4TForTextToText以及本文使用的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, bias=False) # 输出词表映射

其中_tied_weights_keys声明了lm_head、编码器/解码器的embed_tokensshared之间的权重绑定关系(Weight Tying),这是 T5 这类 Seq2Seq 模型的典型设计。理解这一结构有助于理解为什么翻译微调中需要同时处理好"输入侧"和"目标侧"两条文本流——这正是预处理阶段的核心难点。

环境准备与依赖安装

在开始之前,需要安装以下库:

pip install transformers datasets evaluate sacrebleu
依赖库在本流程中的作用
transformers提供 T5 模型、AutoTokenizerDataCollatorForSeq2SeqSeq2SeqTrainer等核心组件
datasets加载 OPUS Books 数据集并进行map批量预处理与训练/测试划分
evaluate快速加载 SacreBLEU 等评估指标
sacrebleuBLEU 指标的参考实现,被evaluate调用

此外建议安装numpy(用于评估函数中的标签处理)。

如果要将在微调过程中把模型上传并分享给社区,建议先登录 Hugging Face 账号;按提示输入 Token 即可完成登录:

>>> from huggingface_hub import notebook_login >>> notebook_login()

如果不想上传模型,可以省略登录步骤,并在后文训练参数中不设置push_to_hub=True,改为将模型保存在本地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_size=0.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)

预处理函数的设计要点

针对翻译任务,预处理函数需要满足三个关键要求:

  1. 为输入添加任务前缀(Prefix):T5 是支持多种 NLP 任务的多任务模型,需要通过提示(Prompt)告诉它当前要执行的是翻译任务。本例使用前缀"translate English to French: "。这一机制与 T5 的预训练范式一脉相承——从 T5 模型源码 的示例可以看出,T5 在预训练时就使用<extra_id_0>等特殊 Token 与任务描述拼接输入,微调时延续同样的"前缀即任务"约定。

  2. 输入与目标分别 Tokenizetokenizer是基于英语词汇预训练的,无法直接正确切分法语文本。因此输入(英语)与目标(法语)必须分开处理。目标侧通过text_target=targets参数传入,tokenizer会为输入与目标分别返回input_idslabels。这一点至关重要——从 英文版文档 的补充说明可以看到:如果不设置text_target,tokenizer 会把目标文本当作英语处理,导致法语文本被错误切分。

  3. 截断到最大长度:通过max_length=128truncation=True,保证序列不会超过模型可处理的最大长度。

>>> 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_target=targets, max_length=128, truncation=True) ... return model_inputs

批量应用预处理

使用 Datasets 的map方法将预处理函数应用到整个数据集。设置batched=True可以一次处理多个样本,显著加速map的执行:

>>> tokenized_books = books.map(preprocess_function, batched=True)

map之后,数据集中的每个样本会包含input_ids(英语)、attention_masklabels(法语)三组字段,可直接喂给模型与数据整理器。

动态 Padding:DataCollatorForSeq2Seq

训练时需要对一个 batch 内的样本做 Padding 使其长度一致。与"把整个数据集 Padding 到最大长度"相比,更高效的做法是使用DataCollatorForSeq2Seq动态 Padding:只在整理(Collate)时把当前 batch 内的序列补齐到该 batch 的最长长度。

>>> from transformers import DataCollatorForSeq2Seq >>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)

从 DataCollatorForSeq2Seq 源码 可以看到其关键行为:

  • 默认padding=True(即'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_tokens=True) ... labels = np.where(labels != -100, labels, tokenizer.pad_token_id) ... decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True) ... decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels) ... result = metric.compute(predictions=decoded_preds, references=decoded_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_tokens=True)把 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_dir="my_awesome_opus_books_model", ... eval_strategy="epoch", ... learning_rate=2e-5, ... per_device_train_batch_size=16, ... per_device_eval_batch_size=16, ... weight_decay=0.01, ... save_total_limit=3, ... num_train_epochs=2, ... predict_with_generate=True, ... fp16=True, ... push_to_hub=True, ... )

各参数的作用与说明如下:

参数作用备注
output_dir模型与检查点保存目录唯一必填参数
eval_strategy="epoch"每个 epoch 结束时评估一次并保存检查点新版本命名,旧版本为evaluation_strategy
learning_rate=2e-5Adam 优化器的初始学习率微调 T5-small 的常用取值
per_device_train_batch_size=16每个设备上的训练 batch 大小显存不足时可调小
per_device_eval_batch_size=16每个设备上的评估 batch 大小同上
weight_decay=0.01权重衰减系数,用于正则化
save_total_limit=3最多保留 3 个检查点超出后自动删除旧检查点
num_train_epochs=2训练 2 个 epoch
predict_with_generate=True评估时使用generate自回归解码,而非直接取 logits 贪心 argmaxSeq2Seq 评估的关键开关,必须开启才能得到有意义的 BLEU 分数
fp16=True使用混合精度训练(FP16)在 XPU 等不适用 FP16 的硬件上可改为bf16=True(参见 英文版文档 的注释)
push_to_hub=True训练结束后把模型推送到 Hub需要已登录且拥有上传权限

组装 Seq2SeqTrainer 并训练

>>> trainer = Seq2SeqTrainer( ... model=model, ... args=training_args, ... train_dataset=tokenized_books["train"], ... eval_dataset=tokenized_books["test"], ... processing_class=tokenizer, ... data_collator=data_collator, ... compute_metrics=compute_metrics, ... ) >>> trainer.train()

Seq2SeqTrainer是专为序列到序列任务设计的训练器(实现位于 trainer_seq2seq.py),它在标准Trainer基础上做了关键增强:

  • 评估时使用生成式解码predict_with_generate=True时,评估与预测阶段调用prediction_step走完整的自回归生成流程(对应model.generate),这样计算出的 BLEU 分数才真实反映模型的翻译能力;
  • 自动处理生成超参数:支持通过generation_configgeneration_max_lengthgeneration_num_beams等参数控制评估时的生成行为;
  • 与动态 Padding 无缝配合DataCollatorForSeq2Seq提供的labels(含-100填充)与compute_metricsnp.where的处理逻辑完全对应。

注意processing_class=tokenizer:新版 Transformers 中Seq2SeqTrainerprocessing_class参数用于接收 tokenizer/processor,负责解码与特征处理。

分享模型

训练完成后,将模型推送至 Hub 供社区使用:

>>> trainer.push_to_hub()

如果未登录或不想公开模型,也可以只保留本地output_dir中的pytorch_model.binconfig.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_tensors="pt").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_tokens=40, do_sample=True, top_k=30, top_p=0.95)

本例使用的生成参数:

参数作用
max_new_tokens=40最多生成 40 个新 Token(不含输入部分),防止无限生成
do_sample=True开启随机采样而非贪心解码,增加输出多样性
top_k=30采样时只考虑概率最高的前 30 个 Token
top_p=0.95核采样(Nucleus Sampling),在累积概率达到 0.95 的最小 Token 集合内采样

generateGenerationMixin提供的通用生成方法,支持贪心、束搜索、采样等多种解码策略。更完整的生成策略与参数说明可参考 文本生成 API 文档,本仓库对应的实现位于 src/transformers/generation 目录下。

最后,将生成的 Token ID 解码回文本:

>>> tokenizer.decode(outputs[0], skip_special_tokens=True) 'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'

可以看到模型输出了一串通顺的法语译文,说明英法翻译微调取得了效果。

拓展:用 pipeline 快速体验翻译

如果不需要训练、只想快速体验现成的翻译模型,可以使用 Transformers 的pipelineAPI。从 pipelines 注册表 可以看到TASK_ALIASES中定义了"translation_en_to_fr"之类的别名(以及sentiment-analysisner等通用别名),它们会在 SUPPORTED_TASKS 的基础上自动拼接出translation_xx_to_yy形式的任务名。示例用法:

>>> from transformers import pipeline >>> translator = pipeline("translation", model="my_awesome_opus_books_model") >>> translator("Legumes share resources with nitrogen-fixing bacteria.")

pipeline内部自动完成 Tokenize、generate与解码,适合快速验证模型效果或集成到小型应用。

总结与进一步探索

本文完整走通了"T5 + OPUS Books 英法翻译微调"的全流程:

  1. 数据load_dataset("opus_books", "en-fr")加载平行语料并划分训练/测试集;
  2. 预处理:任务前缀 +text_target双语 Tokenize +max_length/truncation截断,再经map(batched=True)批量应用;
  3. 数据整理DataCollatorForSeq2Seq动态 Padding,标签以-100填充以屏蔽损失;
  4. 评估:SacreBLEU 指标 +compute_metrics解码/后处理管线;
  5. 训练Seq2SeqTrainer配合predict_with_generate=True进行生成式评估;
  6. 推理generate解码 +tokenizer.decode还原文本,亦可换用pipeline封装。

在此基础上,你可以沿以下方向继续深入:

  • 换用其他语言对(如en-dezh-en)或直接替换为MarianMTModelM2M100等多语言翻译模型;
  • 参考 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 0:36:54

基于ESP8266的WiFi网络授时时钟设计与实现

简介&#xff1a;一份完整的STM32网络授时时钟工程代码&#xff0c;以STM32F103C8T6为主控、ESP-12F为WiFi模块&#xff0c;配合PCF8563时钟芯片、按键和OLED显示屏&#xff0c;实现联网获取天气与时间信息并定时刷新。工程按功能拆分为多个可读性较强的模块&#xff1a;bsp_es…

作者头像 李华
网站建设 2026/9/10 0:36:03

PS2手柄+STM32四电机麦克纳姆轮小车:从接线到PID调试全解析

简介&#xff1a;这是一套基于STM32RCT6微控制器、利用PS2手柄控制四轮全向轮小车的完整工程资源。项目从手柄信号解析、电机PWM调速到全向轮运动逻辑均有详细代码实现&#xff0c;适合学习STM32库函数开发、嵌入式电机控制及无线遥控小车的开发者参考。压缩包共233个文件&…

作者头像 李华
网站建设 2026/9/10 0:32:41

毕业设计论文写作:那些吞噬时间的隐形黑洞与我的破局之道

1. 引言&#xff1a;一场与时间的拉锯战 作为一名正在进行毕业设计的大学生&#xff0c;我深知论文写作中的繁琐和耗时。在这个过程中&#xff0c;许多环节都让我感到无比耗费时间&#xff0c;尤其是在参考文献格式、中英文混排、文本修改、人工核对和任务交接等方面。于是&am…

作者头像 李华
网站建设 2026/9/10 0:32:21

温控风扇工程实战:DS18B20、PWM与PID调速的嵌入式设计全解析

简介&#xff1a;温控风扇工程文件.zip是一份完整的嵌入式温控项目资料&#xff0c;面向电子设计初学者、单片机开发者及课程设计学生&#xff0c;围绕温度采集、控制逻辑与风扇驱动展开。压缩包共8个文件、仅996KB&#xff0c;涵盖C语言源码、HEX固件、Protues仿真工程、原理图…

作者头像 李华
网站建设 2026/9/10 0:30:49

消费抵物业费模式全拆解:三方共赢的社区商业新玩法

上个月跟一位物业项目经理吃饭&#xff0c;他倒了一晚上苦水&#xff1a;年度收缴率不到七成&#xff0c;业主群里每天都有投诉&#xff0c;楼下底商换了一茬又一茬&#xff0c;物业守着这么多铺面&#xff0c;却拿不到一分钱场租以外的收入。他说业主不交物业费&#xff0c;核…

作者头像 李华