把长篇新闻压成两句话摘要:T5文本摘要微调实战
【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials
你刚收到一份40页的行业报告,老板丢来一句:“10分钟内给我一页纸的要点”;或者你在做内容运营,每天几百条新闻,每条都要人工提炼一两句话。手动总结慢,更糟心的是每个人写出的摘要口径还不一致。
这类任务适合交给序列到序列模型:喂长文、吐短摘要,输出格式从第一条到最后一条都稳定。开源项目 Transformers-Tutorials 里就有现成的 T5 文本摘要微调示例,拿真实新闻语料走一遍从数据到推理的完整流程,链路不长,跑通之后换个语料就能用在你的长文业务上。
技术选型:为什么选T5做摘要?
T5 全称 Text-to-Text Transfer Transformer,它把所有 NLP 任务统一成“文本进、文本出”的形式,摘要不过是把长文压成短文,是原生的文本到文本映射,不需要额外设计结构。你可以把它想象成银行柜台:先叫号报业务——示例里用的是荷兰语 “Vat samen: ”(意为 Summarize: )——柜员才开始办理。
第二个优点是它的预训练语料里就包含摘要任务,标准英文模型对 “summarize: ” 这个前缀开箱即用,微调收敛速度比通用 seq2seq 模型快一截。
项目里的对应实现在 T5/Fine_tuning_Dutch_T5_base_on_CNN_Daily_Mail_for_summarization_(on_TPU_using_HuggingFace_Accelerate).ipynb.ipynb),它在 TPU 上用 HuggingFace Accelerate 微调社区荷兰语模型flax-community/t5-base-dutch,语料是 CNN/Daily Mail 的荷兰语翻译版。
从数据到输入:准备你的语料
依赖一行装完(GPU 用户可省掉 accelerate):
pip install transformers datasets accelerate sentencepiece这四个库覆盖了加载、分词、训练全流程。
语料选 CNN/Daily Mail:30 多万篇新闻,每篇都配着编辑写好的 1~3 句要点摘要,是摘要任务里最经典的评测基准。示例用的是它的荷兰语翻译版,因为基座模型是荷兰语的;换成英文场景,用t5-base配同名英文数据集即可,字段完全一样。加载只需一行:
from datasets import load_dataset train_ds, val_ds, test_ds = load_dataset("ml6team/cnn_dailymail_nl", split=["train", "validation", "test"])加载出来的数据只有两个字段加一个标识,三个划分直接可用:
| 划分 | 行数 | article | highlights | id |
|---|---|---|---|---|
| train | 287,113 | 新闻原文 | 编辑要点摘要 | 唯一标识 |
| validation | 13,368 | 同上 | 同上 | 同上 |
| test | 11,490 | 同上 | 同上 | 同上 |
训练流水线:三步走
✅Step 1:分词并加前缀。模型不吃文本,吃的是input_ids和attention_mask这类整数序列。预处理函数做三件事:给每篇原文拼上任务前缀、按 512 截断分词;摘要按 64 截断;再把 labels 里的 padding 位置标成 -100。
tokenizer = AutoTokenizer.from_pretrained("flax-community/t5-base-dutch") def preprocess(examples): x = tokenizer(["Vat samen: " + a for a in examples["article"]], max_length=512, truncation=True) y = tokenizer(examples["highlights"], max_length=64, truncation=True) x["labels"] = [[t if t else -100 for t in r] for r in y.input_ids] return x为什么是 -100:该模型的 pad token id 是 0,不替换的话 pad 位置也会参与 loss 计算,验证损失会被系统性抬高。注意这里没有写padding="max_length"——TPU 训练需要定长 padding,GPU 用户可以改用动态 padding 省显存。
✅Step 2:组装模型与超参。用T5ForConditionalGeneration.from_pretrained加载预训练权重,优化器选常规 AdamW,关键超参如下:
| 参数 | 取值 | 设置理由 |
|---|---|---|
| 学习率 | 1e-4 | 示例所用值,大语料微调的经验起点 |
| 批大小(单核) | 2 | ×8 个 TPU 核,实际 16 |
| patience | 3 | 验证损失 3 轮不降就早停 |
| num_epochs | 设得很大 | 实际靠 patience 决定停止 |
✅Step 3:启动训练。把原生 PyTorch 训练函数交给notebook_launcher,Accelerate 会把模型和数据复制到 8 个 TPU 核上,循环体仍然是 forward → loss → backward → step 的常规写法,不用自己处理设备。
跑通推理:让模型开口说话
训练完,加载 checkpoint 调 generate 即可:
trained_model = T5ForConditionalGeneration.from_pretrained("./output_dir") input_ids = tokenizer(text, return_tensors="pt").input_ids out = trained_model.generate(input_ids, do_sample=True, max_length=50, temperature=0.7) print(tokenizer.decode(out.squeeze(), skip_special_tokens=True))示例用的是采样生成(temperature 0.7),每次结果略有不同,多样性更高;如果追求稳定,更常用束搜索:num_beams=4让 4 个候选并行竞争、保留得分最高的一条,early_stopping=True则让所有候选生成完毕时就提前停止,省掉无意义的尾部 padding。
输入输出长什么样?拿训练集第一条样本对比:
| 输入原文(节选) | 参考摘要(语料 highlights) | 一句话点评 |
|---|---|---|
| “Vat samen: (CNN) -- de bewering van de Amerikaanse minister van Buitenlandse Zaken John Kerry...”(数百 token 的荷兰语长文) | “Anti-terrorisme beleid leeft op de rand van het internationale recht, Alex Vines schrijft...”(2~3 句荷兰语短句) | 输入数百 token、输出两三句,generate 得到的就是同形态短句 |
⚠️ 两个高频坑记一下:
- 任务前缀不能漏:模型靠前缀判断“现在要做什么任务”,标准英文模型在预训练时见过 “summarize: ”,效果尤其明显,漏掉前缀输出质量会肉眼可见地下降。
- labels 的 padding 位置要置 -100:不处理会让验证损失整体偏高,patience 早停跟着误判停点。
进阶方向与常见问题
链路跑通之后,提升效果的路径大多是参数层面的事:
- 要英文摘要:换
t5-base+ 英文cnn_dailymail数据集,前缀改成 “summarize: ”,其余流程不变。 - 要更高质量:上
T5-large,或者拿 BART / Pegasus 在同一份数据上对比 Rouge 分数。 - 显存不够:引入 LoRA 这类参数高效方法,冻结主干大部分参数,只训练小适配器。
- 要量化评估:在测试集上跑 Rouge(rouge1 / rouge2 / rougeL),其中 rougeL 高说明句序与参考摘要更贴近。
写在最后
整套流程就是:前缀 + 分词 → 监督微调 → generate。适用边界也很清楚:示例是荷兰语语料配荷兰语模型,产出必然是荷兰语;换成英文场景,把模型和语料一并替换,同一套流程就能得到一个英文文本摘要模型。如果你的文档普遍超过 512 个 token,先做分块或换更长上下文的模型,这一步值得在投入真实业务数据之前做掉。
【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考