主题
第 03 章 预训练目标决定模型能看见什么

图 03:同一语料可产生不同目标,允许的上下文因此改变。(本书自绘)
03.1 同一段文字,三种监督信号
上一章讨论了注意力允许哪些位置交换信息。本章接着问:训练时,模型究竟要根据这些信息预测什么?同一句“今天下午下雨”,可以生成三类训练样本。把“下午”遮住再要求恢复,是掩码预测;把一个连续片段换成特殊标记再生成缺失片段,是跨度去噪;给出“今天下午下”预测“雨”,是因果语言建模。三种任务都能从未人工标注的文本自动构造标签,因此常称为自监督学习。“无监督语料”不表示优化器没有标签,而是标签来自文本本身。[源教程第三章 §3.1—§3.3。]
设原序列为
确定训练目标后,才能设计相应的 mask。需要明确的是预测时允许读取什么信息,模型名字只能提供线索。Encoder-only 常用于双向表示,Decoder-only 常用于自回归生成,Encoder-Decoder 常用于输入到输出的条件生成;这些是常用搭配,但特殊前缀 mask、跨度生成等目标可以跨过这种简单分类。
03.2 BERT:先恢复缺失,再把表示交给下游
BERT 的输入由 token embedding、位置 embedding 和句段 embedding 相加。特殊位置 [CLS] 可以供整句分类头使用,[SEP] 用于分隔句段。这些输入经过 Encoder 后,输出为 [CLS] 向量,还没有得到已经训练好的通用分类器。[源教程 §3.1.1 的思想沿承、架构、下游微调。]
原始 BERT 同时使用 MLM 与下一句预测 NSP。构造 MLM 样本时,先选取约 15% 的位置,再在这些位置中按约 80% 替换 [MASK]、10% 随机替换、10% 保持原 token 构造输入;损失仍针对原 token。这样可以缩小预训练经常出现 [MASK]、下游任务却没有 [MASK] 的差异。保留原 token 的位置确实更容易预测,但这只占选中位置的一部分,不能据此说整个任务都能直接复制答案。
NSP 则让模型判断句段 B 是否接在 A 后面,负例通过采样构造,这个二分类任务并不覆盖所有逻辑关系。[原论文 BERT §3;固定源 §3.1.1。]
从研究沿承看,BERT 借鉴了语言模型预训练、上下文表示与迁移学习,延续了“先学语言再做任务”的思路。不过,ELMo 的双向循环表征与 BERT 的多层双向 self-attention 也不应混写成同一个机制。模型之间真正值得比较的是可见上下文、参数如何共享、预测哪些位置,以及下游如何使用参数。
03.3 RoBERTa 和 ALBERT 分别在改什么
RoBERTa 重新检查 BERT 的训练配方:去掉 NSP、训练更充分、使用更大批量和语料,并改变 masking 与 tokenizer 配置。这些改动需要放在论文的比较条件下理解:更充分的训练可以解释相当一部分差异,去掉 NSP 这一项本身并不保证在所有条件下都有增益。使用 byte-level BPE 与更大词表也会改变 embedding 参数量、输入长度和未知字符处理,比较训练成本必须一起算。[源教程 §3.1.2 的三项优化;原研究 RoBERTa。]
ALBERT 关注参数冗余。若词表大小为
ALBERT 还跨层共享部分或全部参数。同一组权重反复作用于不同层输入,计算仍要发生多次,所以 FLOPs 不会随参数量按同样比例减少。
在训练目标上,ALBERT 提出句子顺序预测 SOP:正例保留同一文档连续段的顺序,负例颠倒顺序,让模型更多地判断篇章是否连贯,而不是只辨别主题。不过,模型学到什么仍取决于负例如何构造,不能由此保证它已经形成完整的篇章理解。[源教程 §3.1.3 的三项优化;原研究 ALBERT。]
03.4 T5 把任务接口统一为文本到文本
T5 使用 Encoder-Decoder,把分类、翻译、摘要等任务都写成输入文本到输出文本。比如,分类任务也可以用一个单词输出类别。这让不同任务共用训练代码、混合训练数据更方便,但各任务的数据量、答案空间和评分规则仍各不相同。分类标签拼写变化仍需规范化,生成一句近义话也不一定能被字符串匹配评分接受。[源教程 §3.2.1 的结构与“大一统”思想。]
T5 的跨度去噪还需要解决一个具体问题:遮住多个片段后,怎样知道每段答案应该填回哪里?哨兵 token 为每个缺口提供对应标记。设原文为 甲 乙 丙 丁 戊 己,遮住 乙 丙 和 戊,encoder 输入可为 甲 <extra_id_0> 丁 <extra_id_1> 己,decoder 目标为 <extra_id_0> 乙 丙 <extra_id_1> 戊 <extra_id_2>。哨兵把多个缺失片段一一对应起来,目标不必重写所有未遮住 token。
decoder 仍按因果方式预测目标,但可通过交叉注意力读取完整的损坏输入。损坏比例、跨度长度和结尾标记以具体 T5 配方为准,不应从这个手工例子推断全部变体。[源教程 §3.2.1 预训练任务。]
03.5 GPT、LLaMA 与 GLM:生成路径相近,配方不相同
GPT 类模型使用因果自注意力,输出下一个 token 的概率分布。训练时输入 BOS 甲 乙 丙,标签 甲 乙 丙 EOS,每个位置监督一次;推理时只取最后位置的 logits,采样后再接回输入。原 GPT 强调预训练后下游微调,GPT-2 和 GPT-3 进一步研究规模及提示条件下的任务表现。沿着这条研究线索阅读时,还需区分各代的目标与配方,不能把所有变化都归结为参数量。[源教程 §3.3.1;原 GPT 系列论文见参考。]
LLaMA 同样使用 Decoder-only 路径,归一化、位置编码和前馈模块则有各自的具体选择。第 05 章将拆开 RMSNorm、RoPE、SwiGLU 和不同注意力头设置。LLaMA 各代、不同大小并不共享完全一样的头数、上下文长度或训练语料。因此,即使模型名称的前缀相同,也要在下载和使用时核对具体版本的 tokenizer、许可和运行配置,不能直接互换。本书锁定 Happy-LLM 的教学模型,而不声称复现某代官方权重。[源教程 §3.3.2。]
原始 GLM 使用自回归填空:先看未遮住部分,再按某种顺序生成缺失跨度;位置编码同时表达原文位置与跨度内部位置。这种任务设计涉及上下文可见性和生成顺序,不能简单概括为“BERT 加一个生成头”。后续 GLM/ChatGLM 家族成员的架构也并非始终不变。理解源教程 §3.3.3 的架构修正、GLM 任务和家族演变时,要把原研究任务与后续产品名称分开。具体可见性由 attention mask 决定,读取论文或代码时先画允许访问矩阵,再判断是否会泄漏目标。[原研究 GLM,2021。]
03.6 用标签和可见性检查一次训练样本
可以用 python examples/core/core_checks.py --section objectives 查看短整数序列的因果右移、MLM 选中位置,以及哨兵片段的输入和目标示例。配套已保存记录展示了这些数据约定;其中哨兵示例是手工构造的输入与目标,并不是 T5 模型的运行结果。这组示例不下载 BERT、T5 或 GPT 权重,也不比较它们的准确率。
检查完整训练样本时,还要分别回答两个问题:输入中是否包含不该看到的答案?损失是否真的只覆盖应该学习的位置?仅检查标签数量,发现不了双向旁路造成的信息泄漏;仅检查 mask,也发现不了标签被移位两次。
补充练习。 构造一个长度为 4 的序列,只遮住第 2 个 token。画出 MLM 和 CLM 在预测该位置时能读取哪些原始 token。再解释为什么“训练样本的答案放在输入末尾”对因果模型未必泄漏,但把整段输入送入双向 encoder 再交叉读取却可能泄漏。
答案。 MLM 可读第 1、3、4 个原始 token;CLM 只能读第 1 个。因果模型监督前一位置输出时,后面的答案 token 即使存在张量中也被 mask 阻断;双向 encoder 会把后文混入当前位置表示,所以 decoder 的局部因果 mask 无法补救。T5 则允许读完整损坏源文,因为待恢复片段已经从源文删除。
03.7 来源和阅读顺序
本章为 Datawhale Happy-LLM 第三章的原创伴读,新增数值推导、接口例子及限制说明,采用 CC BY-NC-SA 4.0,署名与完整许可见前置说明。固定第三章。原研究:BERT、RoBERTa、ALBERT、T5、GPT-3、LLaMA、GLM。各论文的基准成绩是原作者实验,不是本书实验。