Bert是基于Encoder架构,擅长理解(如分类、实体识别),GPT基于Decoder架构,擅长生成(如续写、对话), T5回归了Encoder-Decoder架构,将输入输出形式上寻找一种通解,将所有NLP任务都视为“文本到文本”的转换问题,以此来统一理解和生成任务。
一、万物皆文本的核心概念
在BERT模式下,针对不同的任务需要设计不同的模型结构:
- 文本任务: BERT+全连接层
- 序列标注: BERT+CRF/分类层
- 文本相似度: 双塔BERT或拼接输入+回归层
Google提出的T5模型打破了这种模式。它提出——无论是什么任务,输入是文本,输出也是文本。
1.1. 提示词的先去与多任务平衡
T5引入了Task Prefix(任务前缀)的概念。例如,在翻译是,输入文本前加上 翻译成英文:;在做摘要是,加上摘要:。
T5是较早地将“使用自然语言提示指令显式定义任务”这一范式应用到大规模训练与多任务设置中的模型之一。证明了通过改变输入文本来变成模型,而不是改变模型结构。
T5 Prefix 和GPT Prompt区别
T5 Prefix: 主要用于有监督微调。模型训练时坚果这些前缀,是多任务学习的一种标记,告诉模型当前要调用哪部分参数。
GPT Prompt: 主要用于零样本/少样本推理。模型在预训练时可能没见过特定的Prompt, 依靠强大的泛化能力,能通过Prompt理解用户意图,无需更新参数。
有监督阶段,T5将多个任务统一为多个多任务学习框架。针对不同任务的数据量差异巨大,为了防止大任务淹没小人物,T5采用一种带上限的比例混合策略(对大数据集设置采样上限、适当提升小数据集的采样概率),确包模型能雨露均沾地学习各种能力。
1.2 独特的预训练目标 Span Corruption
Bert 采用的单字掩码,GPT采用的单向预测。T5设计了一种全新预训练目标——Span Corruption (片段破坏与重构)。
- 破坏: 输入文本中随机选中一些连续的片段,并将他们替换为特殊的哨兵符, 如<extra_id_0>,<extra_id_1>.
-
重构: 要求Decoder生成被遮盖的片段。
image.png
关键设计细节:
- Mask 比例与长度: T5 讲过大量实验发现,遮盖15%的token,且平均长度为3时,模型性能最佳。这比Bert仅遮盖单个token更有挑战性,会迫使模型理解更长的上下文依赖。
-
哨兵符的唯一性: 输出序列中包含的<extra_id_0>等哨兵符是唯一的,不与词表中普通词共享,这让Decoder能够将却地定位它正在恢复的是哪一段内容。
image.png
预训练任务兼顾了理解与生成,配合使用的C4(Colossal Clean Crawled Corpus)超大规模清晰数据集,模型学习到了机器丰富的语言知识。
二、T5 架构解析
T5是标准的Encoder-Decoder模型,具备Bert双向理解能力,又具有GPT的生成能力,符合Text-to-Text的任务设定。
2.2 关键技术改进
1. 相对位置编码
BERT和GPT使用的是绝对位置编码,但T5认为注意力应该乖猪词与词之间的相对距离,而不是他们句子中的绝对坐标。
T5采用了基于分桶的相对位置编码方案:
- 近距离精确,远距离模糊:对于相邻的词,模型会精确区分他们的距离,对应较远的词,模型通过对数映射将他们归入一个桶中。
- 参数共享: 不是直接加在input Embedding上,而是作为Bias(偏置) 直接加载Attention Score(Q-K)矩阵上,这些编码的参数所有层之间共享,即每一层都使用一组Bias参数,大幅度减少了参数量。
2. 简化版LayerNormalization
T5去除了加性偏置,仅对激活值进行缩放,这种设计在保证性能的同事,减少了参数量和计算开销。
此外,原版T5在FFN中使用仍是标准的ReLU激活函数。知道后续的T5 v1.1版本,才引入了更复杂的GEGLU门控激活单元。
3. SentencePiece 分词器
与BERT使用WordPiece、GPT使用BPE不同, T5采用了SentencePiece分词器。
- 处理原始文本: BERT是现将原始文本进行与分词,T5的SentencePiece直接在原始文本上进行训练,将空格视为特殊字符处理。
- 语言无关性: 使T5能够天然支持多语言混合训练,不需要针对每种语言设定分词规则,符合其大一统的设计哲学。
SentencePiece 是由 Google 开源的一款无监督文本分词器(Tokenizer)和去分词器(Detokenizer),专为神经网络文本生成系统设计。
简单来说,它的作用是将原始文本转换成神经网络能理解的数字序列(ID),或者将数字序列还原回文本。与传统的分词工具不同,它不依赖语言特定的预处理规则,而是将句子视为 Unicode 字符序列,直接从原始文本中学习分词模型。

