跳转至

常用预训练架构

BERT 的模型结构属于哪一类?它的预训练任务是什么?

BERT(Bidirectional Encoder Representations from Transformers)的模型结构属于Encoder-only 架构。它只使用了原始 Transformer 模型中的编码器部分,没有解码器。具体来说,BERT-base 包含 12 层 Transformer 编码器,BERT-large 包含 24 层。每一层内部包含多头自注意力和前馈网络,并辅以残差连接和层归一化。这种结构使得 BERT 能够对输入序列中的每个 token 生成一个融合了全局上下文信息的表示向量。

BERT 的预训练包含两个任务:

任务一:掩码语言模型(Masked Language Model, MLM) 在输入序列中随机选中 15% 的 token,对它们进行处理:其中 80% 被替换为特殊的 [MASK] 标记,10% 替换为随机词,10% 保持不变。模型需要根据上下文预测这些被选中位置的原始 token。这个任务迫使模型学习双向的上下文表示——要预测一个被掩码的词,必须同时理解它的左侧和右侧信息。与传统的单向语言模型不同,MLM 使得 BERT 能够捕捉到更深层的语义和句法依赖,这也是它在下游理解任务中表现优异的核心原因。

任务二:下一句预测(Next Sentence Prediction, NSP) 从语料中随机选取两个句子 A 和 B,50% 的情况下 B 是 A 的真实下一句,50% 的情况下 B 是随机抽取的其他句子。模型需要在 [CLS] token 的最终表示上判断 A 和 B 是否连贯。这个任务旨在让模型学习句子级别的语义关系和篇章连贯性。不过后来的研究(如 RoBERTa)发现 NSP 对下游任务的提升有限,甚至可能不如单纯使用 MLM 并增加数据量,因此后续的 Encoder 模型大多放弃了 NSP,仅保留 MLM 或改进它。

BERT 这种 Encoder-only + MLM 的组合,使得它天然适合各种自然语言理解任务,如文本分类、序列标注、句子对关系判断、抽取式问答等。通过在预训练好的 BERT 上添加简单的任务特定头(如线性分类器),并在下游任务数据上微调,即可取得当时最先进的性能。


GPT 系列为什么采用 Decoder-only?自回归语言模型的预训练目标是什么?

image.png

其中 x<t表示前 t−1 个 token。模型通过因果自注意力(Causal Self-Attention)实现:每个 token 只能关注到它之前的 token,未来的信息被掩码掉。这种训练方式使得模型天然具备了逐 token 续写文本的能力,即生成能力。

为什么 Decoder-only 是合理的?因为:

  1. 生成是刚需:GPT 的最终目的是作为一个通用的文本生成引擎。自回归架构保证了每个时刻的预测只依赖已经生成的内容,与人类写作的过程一致。

  2. 架构统一:不需要像 Encoder-Decoder 那样分别处理源序列和目标序列。任何任务(分类、翻译、问答)都可以被重构成一个“补全”任务——只需将输入文本拼接起来,让模型接着生成输出。这种统一性使得同一个模型可以处理五花八门的任务,极大降低了任务切换的成本。

  3. 扩展性强:Decoder-only 的因果注意力在训练时可以利用教师强制,在推理时自然支持自回归生成。随着模型规模和数据量的增长,GPT 系列展示出了强大的涌现能力(如上下文学习),证明了这种简单架构的巨大潜力。

因此,GPT 系列坚守 Decoder-only,是对“一切皆生成”理念的极致贯彻。


T5 如何将所有 NLP 任务统一为 Text-to-Text 格式?请举例说明。

T5(Text-to-Text Transfer Transformer)的核心理念是:每一个 NLP 问题都可以用“文本输入,文本输出”的格式来表达。它采用 Encoder-Decoder 架构,Encoder 接收输入文本,Decoder 生成输出文本,训练目标是标准的自回归交叉熵损失(在目标端)。通过这种统一的框架,T5 将预训练和微调阶段的所有任务都转换为同一个形式,实现了模型和代码的完全统一。

例子:

  • 翻译:输入 "translate English to German: That is good.",输出 "Das ist gut."

  • 文本摘要:输入 "summarize: [文档文本]",输出 "[摘要文本]"

  • 情感分类:输入 "sentiment: This movie is a waste of time.",输出 "negative"

  • 问答:输入 "question: What is the capital of France? context: France is a country in Europe. Its capital is Paris.",输出 "Paris"

  • 自然语言推理:输入 "premise: I have a dog. hypothesis: I have a pet.",输出 "entailment"

T5 统一的关键在于:

  1. 任务前缀:在输入文本的开头加入一个简短的任务描述(如上例中的 "translate English to German:""summarize:"),告诉模型当前要执行哪种任务。这个前缀作为输入的一部分,被 Encoder 编码,Decoder 生成时可以根据这个指令调整输出。

  2. 所有输出都被视为文本:即使是分类标签,也被当作普通的文本 token 来预测。模型不需要任何任务特定的输出层(比如 softmax 分类头),只需在词表上预测下一个 token。这让同一个模型可以在完全不同的任务上共享所有参数。

这种 Text-to-Text 格式使得 T5 成为一个真正的多任务统一模型。在微调时,只需将不同任务的数据集都转换为文本对,混合在一起训练,就能得到一个能处理多种任务的多面手。


BART 的预训练目标是什么?它为什么适合生成式任务?

BART(Bidirectional and Auto-Regressive Transformer)是一种去噪自编码器,采用标准的 Encoder-Decoder 架构。其预训练目标是:对原始文本施加各种噪声,然后训练模型重建出原始文本。具体来说,Encoder 接收被破坏后的文本,Decoder 自回归地生成原始的干净文本。这个重建过程让模型学会理解噪声文本并将其修正为流畅、合理的输出。

BART 使用了多种噪声组合:

  • Token 掩码:随机掩码掉部分 token(类似 BERT 的 MLM)。

  • Token 删除:随机删除一些 token,模型必须学会恢复缺失的词。

  • 文本填充:随机选取一段连续文本(span),用一个 [MASK] 替代,模型需要生成被替换的整个片段(长度和内容)。

  • 句子重排:将文档中的句子顺序打乱,模型需要还原正确顺序。

  • 文档旋转:随机选择一个 token 作为文档的起点,将前面部分移到末尾,模型需要找到真正开头。

BART 适合生成式任务的原因:

  1. 自回归 Decoder:BART 的 Decoder 就是一个标准的自回归语言模型生成器,这使得它天然适合文本生成任务。预训练时 Decoder 已经学会了根据 Encoder 提供的上下文生成流畅文本。

  2. Encoder 的双向理解:Encoder 是双向的,可以充分理解被破坏的文本,提取全局语义。这为 Decoder 的生成提供了高质量的上下文基础。

  3. 文本填充预训练:这个特定噪声迫使模型学会生成连贯的多词片段,与摘要、问答等需要“根据上下文写出新文本”的任务高度一致。因此 BART 在文本摘要、生成式问答、对话生成等任务上表现尤为突出。

  4. 灵活的条件生成:BART 的架构天然支持 Encoder 处理输入条件,Decoder 生成输出,非常适合翻译、摘要等 Seq2Seq 任务。

概括来说,BART 可以看作“BERT 的双向理解 + GPT 的自回归生成”的结合体,通过去噪预训练将两者有机融合,在下游生成任务上具有天然优势。


比较 BERT 和 GPT 在处理上下文时的方向性差异,这如何影响它们的应用场景?

BERT 和 GPT 在上下文方向性上存在根本差异,这直接决定了它们的能力边界和适用场景。

BERT(双向上下文):

  • BERT 使用 双向自注意力,每个 token 可以同时看到其左侧和右侧的所有其他 token(除了被掩码的特殊位置)。这意味着在编码某个词时,模型利用了该词前后的完整上下文信息。

  • 这种双向性使得 BERT 对文本的理解非常深刻。例如,要判断一个代词指代的是前文还是后文的实体,双向信息至关重要。在词义消歧、句法分析、关系抽取等需要全局上下文的任务中,双向表示具有天然优势。

  • 应用场景:主要面向自然语言理解(NLU)任务——文本分类、情感分析、命名实体识别、语义相似度、自然语言推理等。这些任务通常不需要模型生成新文本,而是需要从已有文本中提取、归纳或分类信息。

GPT(单向/因果上下文):

  • GPT 使用因果自注意力,每个 token 只能关注它之前的 token,未来的信息被掩码不可见。这模拟了人类语言产出的过程:从左到右依次生成。

  • 这种单向性虽然牺牲了对“后文”信息的利用,但换来了连贯的文本生成能力。模型被训练为根据前文预测下一个词,因此它学会了续写、补全和创造新内容。

  • 应用场景:主要面向自然语言生成(NLG)任务——文本续写、对话系统、文章创作、机器翻译、代码生成等。在这些场景中,模型需要自主产生新的文字序列,因果约束是必需的。

影响总结:BERT 因为能够看到全局信息,在需要“读懂”文本的任务上是王者;GPT 因为符合自回归生成范式,在需要“写出”文本的任务上是霸主。两者不可互换:用 BERT 做生成需要额外改造且效果不如原生生成模型;用 GPT 做理解任务(如分类)虽然在技术上可行(通过补全方式),但双向信息的缺失使其在一些需要精细理解的任务上(如序列标注)不如 BERT 精准。现代趋势是将两者的优势结合,如 Encoder-Decoder 架构,或是用 Decoder-only 模型通过大规模预训练来隐式地弥补单向的不足。


Encoder-only 模型能否用于生成?如果可以,通常如何改造?

能否用于生成?

原则上,纯 Encoder-only 模型不能直接用于文本生成,因为它们没有自回归生成机制——Encoder 的输出是一次性对整个输入序列编码得到的向量序列,而不是逐 token 产生的。但通过一些改造,我们可以赋予 Encoder-only 模型生成能力,尽管效率和效果通常不如原生生成模型。

改造方法:

  1. 添加 Decoder 形成 Encoder-Decoder 架构: 最直接的方法是将一个预训练好的 Encoder(如 BERT)作为编码器,在其上随机初始化一个标准的 Transformer Decoder,然后在下游生成任务上微调整个模型。Encoder 负责提取输入的双向语义,Decoder 通过交叉注意力利用这些语义进行自回归生成。这就是 BERT2BERT、BERT-gen 等工作的思路。优点是充分利用了 Encoder 强大的理解能力,缺点是 Decoder 需要从头训练或大量微调,且整体架构复杂,推理时需管理 Encoder 和 Decoder 两套参数和 KV 缓存。

  2. 将 Encoder 当作 Decoder 使用(非标准): 可以强行让 Encoder 以因果掩码方式工作——给 Encoder 加上上三角掩码,将其转化为单向 Transformer。然后用语言模型目标进行微调。但这样会丢失预训练时学到的双向特性,且 Encoder 结构并不适合长序列的自回归生成(因为双向注意力中该层所有 token 的表示在一次前向中就计算完了,而生成时需要逐 token 计算并缓存状态)。这种方式很少被采用,效果不佳。

  3. 用于迭代式生成(如 Mask-Predict): 利用 BERT 等模型的 MLM 能力,进行非自回归生成。具体做法是:先确定生成长度,全部用 [MASK] 填充;然后多次迭代,每次将部分低置信度的 token 重新掩码,并用模型重新预测,直到所有 token 稳定或达到预设步数。这种方法可以并行生成,速度较快,但生成质量通常低于自回归模型,尤其在长文本生成时。

  4. 作为大模型的一个组件: 在某些混合架构中,Encoder 只负责对输入(条件)进行编码,生成部分由另一个模块(如轻量级 Decoder)完成。这实际上又回到了 Encoder-Decoder 框架。

总之,Encoder-only 模型生成能力是通过嫁接 Decoder 或采用非自回归策略来实现的。然而,由于缺乏原生的自回归预训练,改造后的生成质量和流畅性往往逊于 GPT 等原生生成模型,且工程实现复杂。这也是为什么当前主流通用大模型普遍选择 Decoder-only 架构的原因之一。


UniLM 如何做到用一个模型既做理解又做生成?它的注意力掩码是如何设计的?

UniLM(Unified Language Model)的核心思想是:通过灵活配置注意力掩码,在同一个 Transformer 架构中同时实现双向、单向和 Seq2Seq 的注意力模式,从而让一个预训练模型既能做自然语言理解,又能做自然语言生成。

UniLM 使用一个共享的 Transformer 网络(通常是多层 Transformer 块),在预训练期间,根据不同类型的任务,给自注意力层应用不同的掩码矩阵。主要有三种掩码:

  1. 双向掩码(Bidirectional LM):

应用于文本理解任务。此时所有 token 都可以互相看到(全0掩码),与 BERT 的 Encoder 完全相同。模型学习双向上下文表示,适合 MLM 等理解任务。输入是一个文本段落,部分 token 被掩码,模型在双向上下文中预测它们。

  1. 单向掩码(Left-to-Right LM):

应用于文本生成任务。使用标准的因果掩码(上三角为 -∞),每个 token 只能看见它左边的 token。输入一个文本序列,模型自回归地预测每个位置的 token。这类似于 GPT 的预训练方式。

  1. Seq2Seq 掩码:

应用于序列到序列任务。输入被分为两部分:源序列(S1)和目标序列(S2)。在注意力掩码中,S1 内部使用双向注意力(源序列 token 可以互相看到),S2 内部使用因果注意力(只能看到 S2 的前文),同时 S2 中的所有 token 都可以看到 S1 的全部 token(但不能反过来)。这完美模拟了 Encoder-Decoder 架构的注意力模式:源端双向编码,目标端自回归生成并关注源端。UniLM 用这种掩码实现翻译、摘要、问答等任务。

实现方式:

UniLM 的模型参数完全共享,只是对于不同 batch 或不同样本,在自注意力计算时动态选择对应的掩码矩阵。模型通过这种多任务混合训练,迫使同一组参数学会根据掩码切换行为模式。最终,一个 UniLM 既可以像 BERT 一样被用于理解任务(使用双向掩码微调),也可以像 GPT 一样被用于生成任务(使用单向掩码微调),还可以直接处理 Seq2Seq 问题。

优点:参数利用率极高,理解和生成能力共享同一个表示空间,可以互相促进。缺点:训练调度复杂,不同掩码模式的混合比例需要精心设计;在极大规模下,双向和单向模式的梯度差异可能对共享参数造成冲突。


Prefix LM 与 Causal LM 的注意力掩码有何不同?各有什么优缺点?

Prefix LM 和 Causal LM 都是 Decoder-only 或类 Decoder 架构中常用的两种注意力模式,主要区别在于对输入前缀的处理上。

Causal LM(因果语言模型):

标准的自回归掩码,所有 token 都只能看到自己及其左边的 token。整个序列(无论是条件还是目标)都遵循严格的从左到右的因果约束。

Prefix LM(前缀语言模型):

将序列分为“前缀(prefix)”和“目标(target)”两部分。前缀部分的 token 之间使用双向注意力(可以互相看到),前缀也可以看到目标的前文?不,通常 target 部分只能看到前缀和自己左边的 target token(因果)。但前缀内部是双向的。即:前缀 token 之间可以互看,目标 token 可以看到前缀的所有 token 和目标的前文,但前缀 token 不能看到目标 token(因为未来)。

掩码差异:

  • Causal LM:一个标准的上三角掩码矩阵(包括前缀部分),全序列一律单向。

  • Prefix LM:掩码矩阵被分割为两块。左上角(前缀×前缀)是全零(双向可见);左下角(目标×前缀)是全零(目标可见前缀);右上角(前缀×目标)是 -∞(前缀看不到目标);右下角(目标×目标)是上三角掩码(目标内部因果)。这种设计使得前缀能充分双向交互,形成更好的全局表示,而目标保持自回归。

优缺点:

  • Prefix LM 优点:前缀部分的双向注意力可以产生更高质量的上下文表示,尤其当条件信息较长时(如长文档摘要、多轮对话历史),双向处理能更好地融合前缀中的信息,提升目标生成的相关性和准确性。它更适合条件生成任务,因为生成质量更依赖于对条件的深刻理解。

  • Prefix LM 缺点:前缀的双向注意力使得训练时无法用标准的因果掩码一次计算所有位置的损失(因为前缀 token 需要预测吗?通常前缀不计算损失,只有目标计算)。在推理时,前缀表示可以一次性编码完成,但训练时需要为前缀和目标使用不同的掩码,实现比纯 Causal LM 复杂。此外,由于前缀使用了双向注意力,无法像纯 Causal LM 那样简单地将整个序列视为统一的语言模型,导致预训练数据格式要求更细致。

  • Causal LM 优点:掩码统一、实现简单、扩展性好,且能与标准的下一 token 预测完美契合,训练和推理范式完全一致。在超大规模预训练中,这种简洁性非常重要。

  • Causal LM 缺点:前缀部分(条件)只能单向理解,可能无法很好地利用全局上下文信息,对于长条件任务可能不如 Prefix LM。

目前,很多大模型(如 PaLM、GLM)在特定任务微调或预训练中结合了 Prefix LM 的思想,而在通用预训练中仍以 Causal LM 为主。


为什么 Decoder-only 架构更容易做多任务统一和指令微调?

Decoder-only 架构(如 GPT)在多任务统一和指令微调方面具有天然优势,主要有以下几方面原因:

  1. 统一的输入输出格式

Decoder-only 模型只需要一种序列格式:输入文本(可以包含指令、上下文、示例)直接拼接输出文本。任何任务都可以通过构造合适的文本前缀来表述,模型只需要接着前缀续写即可。例如:

  • 翻译:"翻译成英文:你好 -> Hello"

  • 分类:"评论:这部电影很烂。 情感:消极"

  • 摘要:"请总结: [文章] \n摘要: [摘要]" 这种一致性使得同一个模型可以无缝处理不同任务,无需为每个任务设计不同的输入接口或添加任务特定层。

  • 自回归生成与训练目标一致

Decoder-only 的预训练目标就是预测下一个 token。微调或指令微调时,只需将任务数据也转换成“给定前缀,续写后续”的形式,训练目标保持不变。模型不需要学习新的输出格式(如分类头),也不需要额外的损失函数。这种一致性降低了任务切换的代价,并且模型在预训练中积累的生成知识能直接迁移到下游任务。

  1. 没有 Encoder 的限制

在 Encoder-Decoder 架构中,Encoder 和 Decoder 各司其职,Encoder 负责理解输入,Decoder 负责生成输出。多任务统一需要模型能处理不同长度的源序列和目标序列,编码器和解码器的分离会增加序列管理的复杂度。而且,不同的任务可能需要不同的源-目标划分方式。Decoder-only 将所有信息都放在一个序列中,完全避开了这种显式划分,灵活性更强。

  1. 上下文学习的涌现

Decoder-only 模型通过在海量文本上预训练,自然地获得了上下文学习(In-Context Learning)能力。只需在输入前缀中提供几个示例(few-shot),模型就能在没有梯度更新的情况下执行新任务。这是 Decoder-only 架构特有的涌现能力,建立在自回归语言模型的强大序列模式学习之上。

  1. 指令微调的高效性

指令微调只需将自然语言指令作为前缀,模型继续生成回复。这种简洁的方式使得数据收集和模型训练变得非常经济。模型可以在大量多样化的指令数据上微调,学会遵循用户意图,展现出强大的零样本泛化能力。这种范式(如 GPT-3.5/4)已被证明是目前构建通用助手最有效的途径。

综上所述,Decoder-only 的“一切皆序列续写”的统一范式,加上其强大的自回归预训练和零样本能力,使其成为多任务统一和指令微调的首选架构。


从零开始预训练一个小型 GPT 模型,你会如何设置架构超参数(层数、头数、维度)?依据是什么?

设计一个小型 GPT 模型(参数量在 100M 到 300M 之间),需要在模型容量、训练成本和下游性能之间取得平衡。设置架构超参数时,通常会遵循一些经验法则,并考虑模型的总参数量目标。

假设我们的目标参数量在 150M 左右,参考 GPT-2 Small(117M)和类似规模的模型,我会这样设置:

  • 层数(L):12 层。12 层是小型 Transformer 的经典设置,既能提供足够的深度来逐层抽象信息,又不会因过深导致训练不稳定或显存压力过大。浅层(如 6 层)可能容量不足,无法学到复杂模式。

  • 模型维度(d_model):768。768 是 BERT-base 使用的维度,在 12 层下能达到约 110M 参数(不含词嵌入,算上词嵌入约 120M)。这个维度大小既能保证每个 token 有足够的表示容量,又不至于使计算量过大。

  • 注意力头数(h):12 头。通常建议每个头的维度 d_k = d_model / h = 64。64 是经验和理论上的一个良好平衡点:头维度足够大以保证单头的表示能力,同时多头能提供足够的多样性。

  • FFN 中间维度(d_ff):3072(4 倍)。这是标准 Transformer 的经典比例,能提供充分的非线性变换容量。对于小模型,4 倍是很好的起点,若想进一步压缩参数量可减少到 3 倍或 2.5 倍。

  • 总参数量估算(不计词表):

  • 每层参数:注意力部分 4 × d_model² = 4 × 768² ≈ 2.36M;FFN 部分 2 × d_model × d_ff = 2 × 768 × 3072 ≈ 4.72M;两个 LayerNorm 可忽略。每层约 7.08M。
  • 12 层总计约 85M。加上词表嵌入(假设 50k 词表 × 768 ≈ 38M)和位置编码,总参数量约 120M-130M,符合小型模型预期。

依据:

  • 深度优先:在一定范围内,增加层数比增加宽度更有效。12 层能提供多层抽象,对文本理解有益。

  • 头维度 64:大量实验表明,64 维的头在表示能力和计算效率之间达到最优。过大则多头数量不够,过小则单头受限。

  • 计算效率:这个配置在 8×V100 或单张 A100 上可以高效训练,最大序列长度 1024 时显存占用可控。

  • 下游迁移:类似配置的模型(如 BERT-base、GPT-2 Small)已证明在多种 NLP 任务上表现良好,可以作为基线。

如果追求更紧凑的模型(如 50M 以下),可以减小层数至 6-8 层,d_model 降至 512,d_ff 降至 2048。


在 Encoder-Decoder 架构中,编码器和解码器的层数是否必须一致?不一致会怎样?

不必一致,且常见不一致。编码器和解码器的层数是独立配置的,可以根据任务需求灵活调整。

常见配置:

  • 许多原始 Transformer 工作(如机器翻译)中,编码器和解码器通常设置为相同层数(如各 6 层),但这主要是出于对称美观和调参方便,并非必须。

  • 很多后续模型采用了非对称设计。例如,BART 的 base 版本 Encoder 6 层、Decoder 6 层;但也有一些任务中,Encoder 更深(理解任务需要深层双向编码),Decoder 较浅(生成简单文本时)。反之,某些需要强生成能力的任务可能 Decoder 更深。

不一致的影响:

  • Encoder 更深:如果编码任务非常复杂(如理解长文档、多跳推理),增加 Encoder 层数可以提取更丰富的源端特征,给 Decoder 提供更高质量的上下文。Decoder 相对浅一些不会显著降低生成质量,因为生成有时更依赖于最后一层的表示。

  • Decoder 更深:当生成任务需要精细控制(如诗歌创作、长文本连贯生成)时,加深 Decoder 能增强目标端的建模能力。Encoder 只需提供基本源端信息,不需要太深。

  • 训练稳定性:层数不一致不会破坏训练,只要两个部分的输入输出维度一致(通过残差和归一化保证)。反向传播时,梯度会分别流过 Encoder 和 Decoder,各自更新参数,没有额外的耦合。

  • 性能:在总参数量固定下,如何分配层数取决于任务。实验表明,极端不对称(如 1 层 Encoder + 11 层 Decoder)可能效果不佳,因为源端表示太浅,无法为生成提供有效信息。一般建议保持一定的对称性,但不要求严格相等。

实践:T5 中基础版 Encoder 和 Decoder 都是 12 层,但大模型可以不同。在适配特定下游任务时,可冻结部分层或微调时调整层数。


解释一下 T5 中的“Span Corruption”预训练目标,它与 BERT 的 MLM 有何不同?

T5 的预训练目标被称为 Span Corruption(跨度破坏),其核心是随机遮盖连续的文本片段(span),并让模型生成被遮盖的内容。具体做法:

  • 从输入文本中随机选择若干连续 token 片段,每个片段用一个独特的哨兵 token(如 <X>, <Y>, ...)替换。

  • 片段的选择基于几何分布,平均跨度长度约为 3。

  • 模型的 Encoder 接收这个被破坏的序列,Decoder 则需要自回归地生成被替换的片段内容,每个片段后跟着该哨兵 token,直到生成完所有缺失内容。

  • 损失函数只计算被遮盖片段的生成部分。

例如,输入文本 "The quick brown fox jumps over the lazy dog",随机遮盖两个片段 "quick brown""the lazy",得到:"The <X> fox jumps over <Y> dog"。目标输出为:"<X> quick brown <Y> the lazy"。模型需要根据 Encoder 给出的上下文,由 Decoder 生成这些被遮盖的片段。

与 BERT MLM 的核心不同:

查看内嵌表格

Span Corruption 的优势:

  • 更强的生成能力:模型预训练时学会了根据上下文连续生成多个 token,这与文本摘要、生成式问答、翻译等下游任务高度一致。模型学会了“写出缺失的内容”,而非仅仅“补全单个词”。

  • 长度灵活:模型必须预测片段的长度(何时输出哨兵 token),这教会模型何时停止生成,对生成完整句子或段落有帮助。

  • 语义连贯性:预测连续片段比孤立 token 更能理解文本的连贯性,有助于提升生成文本的流畅度。

简言之,T5 的 Span Corruption 是一种面向生成的统一预训练策略,它将 MLM 扩展为序列到序列的生成任务,使模型在理解与生成之间架起了桥梁。


BERT 的 [CLS] 标记聚合了整个序列的信息,从注意力角度看,这是怎么做到的?

BERT 在输入序列的最前端添加了一个特殊的 [CLS] 标记。经过多层 Transformer 编码后,[CLS] 的最终隐藏状态被用作整个序列的聚合表示,用于句子级分类任务。

从注意力角度: 在每一层自注意力中,[CLS] 作为查询(Query)可以与序列中的所有其他 token(包括自己)计算注意力权重。由于注意力是双向且全连接的,[CLS] 可以自由地关注序列中的任意位置。通过训练(尤其是 NSP 任务和 MLM 中间接影响),模型学会让 [CLS] 从所有 token 中提取对整体语义最有用的信息,融合成一个紧凑的序列级表示。具体来说:

  • 在底层,[CLS] 可能关注到一些关键内容词。

  • 在高层,[CLS] 整合了来自各个位置的重要语义特征,形成了全局语义向量。

此外,自注意力的加权求和机制使得 [CLS] 可以自适应地聚合信息,而不像简单池化那样平等对待所有 token。因此,[CLS] 成为了一个可学习的、上下文相关的全局句子表示。

补充说明:后来的研究表明,[CLS] 并非天生就自动聚合全局信息,而是通过预训练任务(特别是 NSP 和 MLM)的梯度信号,使得自注意力权重学习到这种聚合行为。如果去掉 NSP 或改变训练目标,[CLS] 的聚合效果可能减弱。这也是为什么 RoBERTa 等模型虽然保留了 [CLS],但有时会使用平均池化等替代方案。不过,[CLS] 作为一种简单有效的聚合方式,在大多数场景下仍然表现良好。


为什么 GPT 系列的自回归预训练不需要 [MASK] 标记,而 BERT 需要?

根本原因在于两者的预训练任务和架构方向性不同。

BERT 采用 MLM,这是一个“完形填空”任务:需要从上下文中预测被挖掉的词。为了让模型知道“哪里需要预测”,必须引入一个特殊的 [MASK] 标记来占位。BERT 的 Encoder 在处理整个序列时是双向的,如果不放一个特殊标记,模型就不知道哪个位置是“空缺”的,也就无法输出对应的预测。因此 [MASK] 是 MLM 任务不可或缺的指令信号。

GPT 采用 自回归语言模型,本质是“根据前文预测下一个词”。这个任务是天然对齐的:每个位置的目标就是序列中的下一个 token。模型不需要知道“哪里被挖掉了”,因为它没有空缺——所有位置都是已知的,只是预测时不能看后面的词。它通过因果掩码实现只看左边,所以对于每个输入 token,模型直接输出一个概率分布,目标是紧接着的那个真实 token。整个过程不需要任何特殊标记来指示预测位置。

更深层的差异:

  • BERT 的 MLM 是破坏-重建任务:需要先破坏输入,再恢复。[MASK] 是破坏的标记。

  • GPT 的语言建模是自监督序列建模:输入即学习目标,不需要破坏。

因此,[MASK] 是 MLM 任务的人工产物,而自回归语言模型天然没有这个需求。这也是为什么 GPT 的训练和推理更一致,而 BERT 存在预训练-微调不一致的问题。


T5 中的“text-to-text”框架如何处理分类任务?标签如何被 token 化?

T5 将分类任务完全转化为文本生成问题。具体步骤如下:

输入构造: 在原始输入文本前添加任务前缀,比如对于情感分类,输入可能是:"sst2 sentence: This movie is terrible."。这个前缀告诉模型这是一个情感分类任务。

输出标签:

T5 不使用整数类别 ID,而是将标签映射为自然语言词,然后用模型自己的词表将这些词 token 化。例如:

  • 二分类情感:标签 "positive""negative"。模型输出这些词对应的 token ID 序列(比如 positive 被切分为 ['pos', 'itive'] 或作为单个 token,取决于词表)。

  • 多分类(如主题分类):直接使用类别名称的文本,如 "sports", "politics" 等。

  • 如果标签是数字,也可以将数字作为文本 token。

训练: 模型(Encoder-Decoder)的 Encoder 接收输入文本,Decoder 自回归生成目标标签文本。损失函数是标准的交叉熵,计算在 Decoder 输出标签序列的每个 token 上。例如,目标标签是 "negative",模型需要一步步生成 n -> e -> g -> a -> t -> i -> v -> e(或子词)。

推理: 对于分类任务,模型生成文本后,需要后处理映射回类别(例如将生成的 "positive" 字符串与预设的标签文本集合做匹配)。如果生成的文本不在有效标签集合中,则视为错误或进行最小距离匹配。

优势:

  • 不需要任何任务特定的输出层,完全共享参数。

  • 可以自然处理任意数量的类别,甚至新增类别,只需提供对应的标签文本即可。

  • 对于结构化输出(如多标签)也很容易扩展。

局限:

  • 生成的文本可能不在合法的标签空间内(如拼写错误),需要额外的约束或校准。

  • 对于大规模类别(如几千类),使用文本标签可能效率低于分类头。

尽管如此,Text-to-Text 框架成功地将分类问题无缝融入统一的生成范式,这是 T5 的核心贡献之一。


BART 的“去噪自编码器”预训练中包含文本填充任务,这对生成式问答有什么好处?

BART 的文本填充任务(Text Infilling)要求模型恢复被替换为单个 [MASK] 标记的连续多个 token 的完整文本片段。这种训练方式对生成式问答(尤其是需要从上下文中抽取并重写答案的任务)有直接的促进作用:

  1. 答案片段生成能力

在生成式问答中,答案往往不是一个词,而是一个短语或句子(如从文章中抽取一个实体名、一个解释片段)。文本填充任务使模型学会了根据上下文生成任意长度的连贯文本片段,而不仅是填补单个词。这直接训练了模型“写出完整答案”的能力,确保答案自然、完整。

  1. 长度预测与结束判断

填充任务中,模型必须自主决定生成多少个 token,直到输出哨兵 token 表示片段结束。这等价于让模型学习何时停止生成——对于问答,就是何时答案已表述完整。这种隐式的长度控制对避免生成过长或截断的答案非常重要。

  1. 上下文压缩与重组

在填充时,模型需要根据被破坏的上下文(缺了一段)推理出缺失的内容,这类似于阅读理解和摘要中需要根据上下文推断出答案。模型必须提取关键信息,并以连贯的形式表达出来。这锻炼了模型理解文本、整合信息并生成凝练答案的能力。

  1. 鲁棒性

去噪自编码器迫使模型学习各种噪声条件下的文本还原,使得模型对输入中的噪声、不完整信息具有鲁棒性。在真实问答场景中,用户问题或提供的上下文可能不完美,这种鲁棒性至关重要。

实验支持:BART 在 SQuAD 等生成式问答基准上表现优异,特别是在需要生成较长、重写形式答案的任务中,明显优于仅使用 MLM 的 BERT 或仅单向的 GPT。可以说,文本填充任务为 BART 提供了“根据片段线索生成完整语句”的核心能力,这正是生成式问答所需要的。


XLNet 的排列语言模型如何避免位置编码泄露?它在实现上为何比 BERT 复杂得多?

排列语言模型(Permutation Language Model) 是 XLNet 的核心创新。它不引入 [MASK],而是保留原始序列,通过随机排列输入 token 的预测顺序来实现双向上下文学习。具体来说,对于长度为 T 的序列,随机生成一个排列 z,然后按照排列的顺序,自回归地预测每个 token:在预测第 z_t 个 token 时,模型可以看到排列中位于它前面的 token(即 z_{<t}),这些 token 中既有原始序列中它左边的词,也有右边的词,从而间接实现了双向上下文。

避免位置编码泄露:

最关键的问题是:在自回归框架中,模型需要知道“下一个要预测的位置”以及“已经有哪些位置被预测”。如果直接告诉模型排列后的顺序,模型可能通过位置编码“作弊”地看到未来 token 的位置信息。XLNet 通过双流注意力(Two-Stream Self-Attention) 来解决:

  • 内容表示(Content Representation):包含 token 的内容和位置信息,用于编码上下文。当预测某个 token 时,模型只能看到内容流中排列在它之前的 token(这些 token 的内容和位置是可见的)。

  • 查询表示(Query Representation):仅包含目标 token 的位置信息,不包含内容。在预测时,查询流通过注意力向内容流询问信息,但查询流自身不将内容泄露给其他 token。

  • 在计算注意力时,内容流和查询流共享 K 和 V(来自内容流),但 Q 不同。这种设计使得 XLNet 能够在不引入 [MASK] 的情况下,利用排列实现双向学习,同时严格遵循自回归的因果关系,防止位置信息泄露。

复杂度高的原因:

  • 双流注意力:标准 Transformer 只有一条流,XLNet 需要同时维护和计算两条流,计算量和内存翻倍。

  • 排列采样:每个 batch 需要动态生成排列,并构造对应的注意力掩码。排列的多样性增加了训练的不稳定性,需要精细的采样策略(如 partial prediction,只预测排列末尾的一些 token)。

  • 没有固定输入格式:BERT 的输入是固定的掩码序列,而 XLNet 的序列顺序在每次训练时都随机变化,数据加载和掩码生成更加复杂。

  • 难以进行自回归生成:尽管预训练时使用了排列,但微调或生成时通常只使用标准因果顺序,这种不一致性需要仔细处理。

总之,XLNet 通过巧妙的双流注意力解决了排列语言模型的核心矛盾,避免了 [MASK] 的弊端,但其实现复杂度和计算成本远高于 BERT,这也是它并未像 BERT/GPT 那样广泛流行的原因之一。


有没有可能在同一个训练过程中同时使用 MLM 和 AR 目标?有哪些尝试和挑战?

可以,且已有成功尝试。将 MLM(掩码语言模型)和 AR(自回归语言模型)结合,目标是让一个模型同时具备双向理解能力和单向生成能力。

代表性工作:

  • UniLM:通过灵活的注意力掩码,在预训练中交替使用双向(MLM)、单向(AR)和 Seq2Seq 掩码,实现联合训练。

  • GLM(General Language Model):提出自回归空白填充(Autoregressive Blank Infilling),将 MLM 的掩码片段用自回归方式生成。训练时随机掩盖多个 span,模型在 span 内部自回归生成,非 span 部分保持双向上下文。这本质上是 MLM 与 AR 的有机融合。

  • CM3/ERNIE 3.0 等:在大规模预训练中混合多种目标。

挑战:

  1. 梯度冲突:MLM 和 AR 的优化方向可能不同。MLM 鼓励利用全局信息,AR 强调从左到右的预测模式。同时训练时,共享参数可能会在两个目标之间妥协,导致两者的效果都达不到最优。

  2. 注意力掩码的管理:需要动态构建不同类型的掩码,增加计算图复杂度。

  3. 数据格式不统一:MLM 需要对输入进行掩码,AR 需要因果序列。如何在一个 batch 内高效混合是个工程难题。

  4. 收敛速度:两个目标的学习动态可能不同,需要精细调整损失权重或使用课程学习(先学 AR 再学 MLM,或反之)。

尽管有挑战,实验表明,合理结合 MLM 和 AR 可以带来比单一目标更好的性能,尤其是在需要兼顾理解和生成的下游任务中。未来如果能在架构和训练策略上进一步突破,这种统一预训练范式可能会更常见。


为什么现在少见基于 Encoder-only 的大规模通用模型?它被局限在哪里?

少见原因:Encoder-only 架构在大规模通用模型(作为基座模型)中的局限性日益明显,主要体现在:

  1. 缺乏生成能力:这是最根本的限制。通用模型的核心竞争力在于不仅能理解,还能创造内容。Encoder-only 天生不能直接生成文本,必须外接解码器或改造,失去了统一性和简洁性。在对话、写作、编程等主流生成式 AI 场景中,Encoder-only 无法原生胜任。

  2. 任务适配不灵活:Encoder-only 模型需要在预训练后,为每个下游任务添加任务特定的输出层并进行微调。这与当前“一个模型做所有事”的范式背道而驰。而 Decoder-only 可以通过 Prompt 零样本或少量样本处理新任务,无需额外训练。

  3. 扩展性不足:将 Encoder-only 扩展到极大规模时,双向自注意力的计算复杂度为 O(n2)O(n2),训练长文本时开销巨大。虽然 Decoder-only 也是 O(n2)O(n2),但其因果掩码使得可以利用 KV 缓存和优化的注意力算法(如 FlashAttention)更高效地推理和训练。此外,Encoder 通常用于输出单个序列表示,不能自然支持长序列生成中的缓存机制。

  4. 预训练目标单一:主流的 Encoder 预训练任务(MLM)主要关注 token 级或句子级的理解,难以学习到开放式文本生成的长期依赖和连贯性。尽管 MLM 学到了很好的上下文表示,但缺乏序列生成中的因果推理能力。

  5. 数据利用率:自回归模型可以从海量未标注文本中高效学习,因为每个 token 都是预测目标。MLM 只对约 15% 的 token 进行预测,训练信号的密度较低。这使得 Decoder-only 在同等数据量下能学到更多的语言知识。

Encoder-only 的出路:

在一些细分领域,Encoder-only 仍是最优选择(如语义检索、文本分类、句子嵌入)。但要成为像 GPT-4 一样的通用基座,Encoder-only 必须结合 Decoder 或转变为 Decoder-only。因此,今天的大型通用模型清一色是 Decoder-only,Encoder-only 退居为专用模型。


对比一下 Prefix LM 和 Causal LM,在推理效率和上下文使用上的差异。

推理效率:

  • Causal LM:每次生成一个 token 时,需要为整个前缀(所有历史 token)重新计算注意力?实际上,在自回归生成中使用了 KV 缓存:每个 token 的 Key 和 Value 在生成时会被缓存,计算下一个 token 时,只需要为新的 token 计算 Q,并与所有缓存的 K、V 做注意力。由于所有 token(包括前缀)都按因果顺序排列,KV 缓存的序列是天然对齐的,实现非常直接。

  • Prefix LM:前缀部分使用了双向注意力,因此在前缀内部 token 之间,计算自注意力时 Q 和 K、V 互相可见。在生成时,前缀的表示(KV 缓存)可以一次性计算并缓存,因为前缀不参与自回归生成——它们是固定的。目标部分则使用因果注意力,与 Causal LM 一样使用 KV 缓存逐步生成。Prefix LM 的推理效率在长前缀时更高,因为前缀部分只需编码一次,且双向注意力使前缀表示更优,可能用更短的上下文达到同样的效果。但在实现上,Prefix LM 需要处理前缀双向和目标因果的混合缓存,比纯 Causal LM 复杂一些。

上下文使用:

  • Causal LM:前缀中的每个 token 只能看到它左边的 token,无法利用其右侧的前缀信息。这意味着对于一篇长文档,即使它全部作为前缀输入,模型在理解文档开头时无法参考结尾,理解结尾时可以看到开头。这可能导致对文档整体语义的把握不如双向模型。

  • Prefix LM:前缀中的 token 可以互相看到,因此对前缀(条件)的理解是双向完整的。例如在翻译任务中,源语言句子作为前缀,模型可以一次性充分理解整个句子再生成。这种全局理解对于需要综合全文信息的任务(如摘要、长文档问答)显著更优。生成目标时的质量往往更高,因为条件表示更精确。

总结:

  • 推理效率:Causal LM 的缓存机制非常成熟,工程优化更多;Prefix LM 的前缀编码可以一次完成,对于输入很长而输出较短的任务(如摘要),推理延迟可能更低。

  • 上下文使用:Prefix LM 在理解长条件时具有优势,因为它可以利用双向注意力捕获全局信息;Causal LM 则可能因单向性而丢失部分上下文关联。

在实践中,Prefix LM 常用于需要强条件理解的任务(如 PaLM、T5 的 Encoder-Decoder 实际上也是前缀双向);而 Causal LM 因其极致的简洁性和扩展性成为通用基座模型的默认选择。两者正逐渐融合:现代 Decoder-only 模型通过大规模预训练,用“输入反复思考”的方式在单向框架中隐性学会了双向推理,缩小了与 Prefix LM 的差距。