# T5:Encoder-Decoder 的代表作,为什么翻译和摘要还在用
2019 年,Google 发布 T5(Text-To-Text Transfer Transformer),提出一个大胆的想法:
能不能把所有 NLP 任务都统一成「输入一段文本,输出另一段文本」?
- 翻译:输入「translate English to German: I love you」,输出「Ich liebe dich」
- 摘要:输入「summarize: [一篇长文]」,输出摘要
- 情感分析:输入「sentiment: This movie is great」,输出「positive」
不管什么任务,都是 text-to-text——输入文本,输出文本。
T5 用标准 Transformer 的 Encoder-Decoder 架构实现这个想法,在几乎所有任务上都达到了 SOTA。
但今天,ChatGPT、Llama、GPT-4 全都是 Decoder-only 架构,T5 的 Encoder-Decoder 反而不是主流了。
那 T5 还有意义吗?什么场景下 T5 比 GPT 更合适?
# 一、T5 的核心设计:Text-to-Text 范式 + Encoder-Decoder 架构
# 1.1 Text-to-Text:万物皆可转换
T5 的核心思想是:所有 NLP 任务都可以表示成「输入文本 → 输出文本」的形式。
| 任务 | 传统做法 | T5 的做法 |
|---|---|---|
| 翻译 | 输入:I love you 输出:我爱你 | 输入:translate English to Chinese: I love you 输出:我爱你 |
| 摘要 | 输入:[长文] 输出:摘要 | 输入:summarize: [长文] 输出:摘要 |
| 情感分类 | 输入:This movie is great 输出:label=1(正面) | 输入:sentiment: This movie is great 输出:positive |
| 问答 | 输入:question: 首都是哪? context: 中国的首都是北京 输出:北京 | 输入:question: 首都是哪? context: 中国的首都是北京 输出:北京 |
| 文本生成 | 输入:Once upon a time 输出:续写 | 输入:generate: Once upon a time 输出:续写 |
关键点:任务类型通过 prefix(如 translate, summarize, sentiment)来区分,输出都是自由文本,不是固定的标签。
这和 BERT 完全不同:
- BERT:分类任务接分类头,NER 任务接序列标注头,换任务要换头
- T5:所有任务都是生成文本,模型架构不变
# 1.2 Encoder-Decoder 架构:标准 Transformer
T5 用的是标准 Transformer 的 Encoder-Decoder 架构,和原始论文《Attention is All You Need》一样。
# Encoder 部分:
- Self-Attention:双向的,每个词都能看到整个输入序列
- 输出:输入序列的语义表示(每个词一个向量)
# Decoder 部分:
- Masked Self-Attention:单向的,每个词只能看左边(因果掩码)
- Cross-Attention:从 Encoder 的输出中获取信息
- 输出:逐词生成目标序列
数据流:
输入文本(如「translate English to Chinese: I love you」)
↓
Encoder(12 层 Transformer Encoder)
↓
语义向量(每个输入词一个向量)
↓
Decoder(12 层 Transformer Decoder,通过 Cross-Attention 读取 Encoder 输出)
↓
逐词生成输出文本(「我 爱 你」)
2
3
4
5
6
7
8
9
# 1.3 与 BERT 和 GPT 的对比
| BERT | GPT | T5 | |
|---|---|---|---|
| 架构 | Encoder-only | Decoder-only | Encoder-Decoder |
| 预训练任务 | MLM(填空) | CLM(预测下一个词) | Span Corruption(填空变体) |
| 输入形式 | 单句或句对 | 单句 | 带 prefix 的文本 |
| 输出形式 | 每个词的向量 | 逐词生成 | 逐词生成 |
| 擅长任务 | 分类、匹配 | 生成、对话 | 翻译、摘要、问答 |
| 任务切换方式 | 换分类头 | 换 prompt | 换 prefix |
T5 的独特之处:
- 用 Encoder 理解输入(和 BERT 类似)
- 用 Decoder 生成输出(和 GPT 类似)
- 通过 Cross-Attention 让 Decoder 读取 Encoder 的理解结果
# 二、T5 的预训练任务:Span Corruption
T5 的预训练任务叫 Span Corruption,是 BERT 的 MLM 的变体。
# 2.1 和 BERT MLM 的区别
BERT MLM:
- 随机遮住 15% 的词,用
[MASK]替换 - 目标:预测被遮住的词是什么
T5 Span Corruption:
- 随机遮住 15% 的词,用
<X>这样的 sentinel token 替换 - 一次可以遮住连续的多个词(span)
- 目标:用 Decoder 生成被遮住的内容
例句:
原始:I love eating hot pot very much
遮蔽输入:I love <X> hot pot <Y>
Decoder 目标:<X> eating <Y> very much <Z>
2
3
为什么这样设计?
- Span Corruption 更接近实际生成任务:翻译、摘要都是生成连续的文本,不是逐词填空
- Decoder 学会了「从 Encoder 的理解中提取信息并生成」,这是翻译和摘要需要的能力
# 2.2 预训练数据:C4 语料库
T5 用的是 C4(Colossal Clean Crawled Corpus):
- 从 Common Crawl 爬取的网页
- 经过严格清洗(去低质量、去重复、去非英语)
- 总量:750GB 文本
比 BERT 的 Wikipedia + BookCorpus(16GB)大了 40 倍。
# 三、T5 的 Encoder 和 Decoder 如何协作
# 3.1 Encoder 的任务:理解输入
Encoder 接收完整的输入文本(包括 prefix 和内容),用双向 Self-Attention 理解整个序列。
例如翻译任务:
输入:translate English to Chinese: I love you
Encoder 经过 12 层 Self-Attention 后,输出每个词的语义向量:
[translate] → 向量1
[English] → 向量2
[to] → 向量3
[Chinese] → 向量4
[:] → 向量5
[I] → 向量6
[love] → 向量7
[you] → 向量8
2
3
4
5
6
7
8
这些向量包含了整个输入的语义信息。
# 3.2 Decoder 的任务:生成输出
Decoder 从 <BOS> 开始,逐词生成目标文本。
关键是 Cross-Attention:
- Decoder 的 Query 来自当前生成的词
- Key 和 Value 来自 Encoder 的输出
生成第一个词「我」时:
- Decoder 的 Query:
<BOS>的向量 - Decoder 的 Key 和 Value:Encoder 输出的 8 个向量
- Cross-Attention 计算:
<BOS>和哪些输入词最相关?(应该关注「I」) - 生成:「我」
生成第二个词「爱」时:
- Decoder 的 Query:「我」的向量
- Decoder 的 Key 和 Value:仍然是 Encoder 输出的 8 个向量
- Cross-Attention 计算:「我」和哪些输入词最相关?(应该关注「love」)
- 生成:「爱」
Decoder 的每一步都能"回头看" Encoder 理解的输入,这是 Encoder-Decoder 架构的核心优势。
# 3.3 与 Decoder-only(GPT)的区别
GPT 的 Decoder 只能看已生成的输出:
- 生成「我」时,只能看
<BOS> - 生成「爱」时,只能看
<BOS> 我 - 输入「I love you」也在同一个序列里,但 Decoder 的因果掩码让它只能「从左往右」看
T5 的 Decoder 能通过 Cross-Attention 随时回头看 Encoder 理解的输入:
- 生成「我」时,Cross-Attention 可以关注输入的「I」
- 生成「爱」时,Cross-Attention 可以关注输入的「love」
- 输入和输出是分开的两个序列,Decoder 可以灵活地「对齐」输入和输出
这是为什么翻译任务更适合 Encoder-Decoder——源语言和目标语言的词序不同,需要 Decoder 灵活地从 Encoder 输出中「抽取」对应的信息。
# 四、T5 的变体:T5-Small / Base / Large / XL / XXL
T5 有 5 个版本,从小到大:
| 模型 | 参数量 | Encoder 层数 | Decoder 层数 | d_model | 显存占用 |
|---|---|---|---|---|---|
| T5-Small | 60M | 6 | 6 | 512 | ~1GB |
| T5-Base | 220M | 12 | 12 | 768 | ~3GB |
| T5-Large | 770M | 24 | 24 | 1024 | ~10GB |
| T5-3B | 3B | 24 | 24 | 1024 | ~30GB |
| T5-11B | 11B | 24 | 24 | 1024 | ~100GB |
特点:
- Small 和 Base 适合快速实验和资源受限场景
- 3B 和 11B 在很多任务上接近或超过 GPT-3(175B)
# 五、T5 为什么在翻译和摘要上有优势
# 5.1 输入和输出是不同语言/格式
翻译任务:
- 输入:英语句子
- 输出:中文句子
摘要任务:
- 输入:一篇长文(可能几千词)
- 输出:100 词的摘要
这类任务的特点是:输入和输出不是同一种语言、不是同一种长度。
Encoder-Decoder 架构天然适合:
- Encoder 专门理解输入(不管多长、什么语言)
- Decoder 专门生成输出(可以和输入长度、语言完全不同)
- Cross-Attention 让 Decoder 灵活地从 Encoder 输出中「抽取」对应信息
Decoder-only(GPT)呢?
- 输入和输出在同一个序列里:
translate English to Chinese: I love you <SEP> 我 爱 你 - Decoder 的因果掩码让它只能「从左往右」看,不能像 Cross-Attention 那样灵活对齐
在翻译任务上,T5(Encoder-Decoder)比 GPT-3(Decoder-only)效果更好。
# 5.2 Encoder 可以用双向注意力
翻译任务需要理解整个源语言句子的语义,双向注意力比单向注意力更准确。
例如翻译「I didn't go because I was sick」:
- 双向理解:「didn't go」和「was sick」互相呼应,语义是因果关系
- 单向理解(GPT):看到「didn't go」时还没看到「was sick」,可能理解不到位
T5 的 Encoder 用双向 Self-Attention,能完整理解源语言;Decoder 再根据理解的语义生成目标语言。
# 5.3 更适合固定输入-输出格式的任务
T5 的 text-to-text 范式适合输入和输出格式固定的任务:
- 翻译:源语言 → 目标语言
- 摘要:长文 → 短摘要
- 问答:问题 + 上下文 → 答案
GPT 的自回归生成适合开放式生成:
- 对话:不知道会聊多久、聊什么
- 续写:不知道会生成多长的文本
- 代码生成:不知道需要多少行
如果你的任务是「输入一段固定格式的文本,输出另一段固定格式的文本」,T5 更合适。
# 六、T5 的后续改进
# 6.1 mT5:多语言版本
mT5(multilingual T5)在 101 种语言的语料上预训练,支持跨语言翻译。
例如:
输入:translate Chinese to Spanish: 我爱你
输出:Te amo
2
mT5 的 Encoder 能理解 101 种语言,Decoder 能生成 101 种语言,一个模型搞定所有语言对的翻译。
# 6.2 FLAN-T5:指令微调版本
FLAN-T5 是 T5 的指令微调版本(类似 ChatGPT 对 GPT-3 的关系)。
在 1800+ 个任务上用指令格式微调,让模型更听话、更通用:
- 输入:
Translate this to French: I am happy - 输出:
Je suis heureux
FLAN-T5 在 Zero-Shot 任务上比原始 T5 强很多。
# 6.3 T5-XXL:11B 参数的大模型
T5-XXL(11B 参数)在很多任务上和 GPT-3(175B 参数)打平,证明了 Encoder-Decoder 架构的参数效率更高。
同样参数量,T5 比 GPT 效果更好(在翻译和摘要任务上)。
# 七、T5 vs GPT:什么时候该用哪个
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 翻译 | T5 / mT5 | Encoder-Decoder 更适合源语言和目标语言的对齐 |
| 摘要 | T5 | 输入长、输出短,Encoder 双向理解更准确 |
| 问答(输入=问题+长文) | T5 | Encoder 理解长文,Decoder 生成答案 |
| 对话 | GPT / ChatGPT | Decoder-only 更适合开放式生成 |
| 续写 | GPT | 自回归生成天然适合续写 |
| 代码生成 | GPT / Codex | 代码是自回归的(从上往下写) |
| 分类、匹配 | BERT 或 T5 | BERT 微调更快,T5 可以用 text-to-text 范式 |
简单规则:
- 如果输入和输出格式差别大(如翻译、摘要),用 T5
- 如果输入和输出是同一种语言、开放式生成(如对话、续写),用 GPT
- 如果资源受限、需要快速部署,用 T5-Small 或 BERT
# 八、T5 没有成为主流的原因
虽然 T5 在翻译和摘要上有优势,但今天的大模型主流是 Decoder-only,原因有三个:
# 8.1 用户需求更偏向开放式生成
ChatGPT 火了之后,用户发现:他们更需要的是「对话、写作、创意生成」,而不是「翻译、摘要」。
对话和写作是开放式的,没有固定的输入-输出格式,Decoder-only 更灵活。
# 8.2 Decoder-only 的架构更简单
Encoder-Decoder 有两组参数(Encoder 和 Decoder),训练和推理都更复杂。
Decoder-only 只有一组参数,架构简洁、训练效率高、推理更快。
# 8.3 规模定律在 Decoder-only 上更明显
OpenAI 的研究发现:Decoder-only 模型的能力随参数量增长更快。
同样参数量,GPT-3(175B Decoder-only)比 T5-XXL(11B Encoder-Decoder)在更多任务上效果更好。
# 九、总结
T5 的核心是 text-to-text 范式 + Encoder-Decoder 架构:
- 所有任务统一为「输入文本 → 输出文本」
- Encoder 用双向 Self-Attention 理解输入
- Decoder 用 Cross-Attention 从 Encoder 输出中提取信息并生成
T5 的优势:
- 翻译、摘要等任务上比 GPT 效果更好
- Encoder-Decoder 更适合输入和输出格式差别大的任务
- 参数效率更高(11B 的 T5 打平 175B 的 GPT-3)
T5 没有成为主流的原因:
- 用户需求更偏向开放式生成(对话、写作)
- Decoder-only 架构更简洁
- 规模定律在 Decoder-only 上更明显
什么时候用 T5:
- 翻译、摘要、问答等输入输出格式差别大的任务
- 资源受限、需要小模型快速部署
- 垂直领域的文本转换任务
下一篇我们讲 MoE(Mixture of Experts)——稀疏模型为什么越来越流行,DeepSeek 和 Mixtral 为什么都选 MoE。
相关文章:
- BERT:双向编码的代表(理解 Encoder)
- GPT:自回归成为主流(理解 Decoder)
- Transformer 整体架构(理解 Encoder-Decoder 协作)
评论
验证登录状态...