深夜的文献修复室,小林端详着一卷破损的古籍。虫蛀之处并非零星单字,而是一小段一小段地消失——“秋天的银杏叶铺满了小径,阳光透过缝隙洒下斑驳的光影”,如今只剩“秋天的银杏叶……小径,阳光……斑驳的光影”。他必须结合上下文、句式乃至季节意象,才能把“铺满了”和“透过缝隙洒下”这些连续片段补全。这种修复整段文字的工作,与预训练范式 Span Corruption 惊人地相似:把文本中的连续片段“蛀掉”,再让模型像修复师一样,依据上下文把缺失的内容补回来。 Span Corruption 由 Google 在 2019 年提出的 T5 模型中率先采用,是 Transformer 架构预训练阶段的一种核心任务。与 BERT 那种“填单个空字”的掩码语言建模不同,它要求模型理解更大范围的语境,重建一整段连续的 token 序列。本文将借“古籍修复”这条主线,从基本概念、哨兵机制、关键参数、训练流程,一路讲到性能优势、优化策略与落地应用,帮你彻底吃透这一预训练范式。
掌握 Span Corruption 是理解 T5 及现代文本生成模型的钥匙,对从事 NLP 预训练、微调与文本生成任务的工程师在模型选型和训练设计上有直接的职业价值。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
基本概念
深夜的文献修复室,小林端详着一卷破损的古籍。虫蛀之处并非零星单字,而是一小段一小段地消失——“秋天的银杏叶铺满了小径,阳光透过缝隙洒下斑驳的光影”,如今只剩“秋天的银杏叶……小径,阳光……斑驳的光影”。他必须结合上下文、句式乃至季节意象,才能把“铺满了”和“透过缝隙洒下”这些连续片段补全。这种“整段修复”的思维方式,正是 Span Corruption 预训练范式的写照。
Span Corruption 由 Google 在 2019 年发布的 T5 模型中提出,是 Transformer 架构预训练阶段的核心任务。这里的 Span 指一段连续的 token 序列——可以把 token 粗略理解为词或子词;Corruption 则是“故意破坏”:随机选取文本中的若干连续片段,从原文中删去,再让模型根据两侧幸存文本将它们重建出来。修复古籍需要理解文风,修复文本需要理解语义,两者本质相通。
与 BERT 的掩码语言建模(MLM)相比,Span Corruption 将破坏粒度从“单字”提升到“整段”。BERT 遮蔽单个 token,预测时各位置相互独立,如同修复师只填单个缺字;Span Corruption 则要求模型按顺序生成完整片段,必须理解片段内部的语序。设原始序列为 X,共采样 m 个连续片段,第 i 个片段起始于位置 s\_i、长度为 l\_i,X\_corrupt 表示损坏后的序列,整体训练目标如下:
对修复师小林而言,修补一句完整的话比填补一个缺字,更能磨炼对文章的把握;对模型而言,重建一段连续文本也比预测单个词更能学到语言的深层结构。Span Corruption 正是用这种“整段完形”的高难度任务,让 Transformer 从“认得词”跃迁为“读懂文”。
- 片段总数 m求和符号遍历所有被遮蔽的连续片段,m 是片段个数,它由遮蔽比例与平均跨度共同决定。
- 单个片段的重建损失每个片段都计算负对数似然,值越小,说明模型对“这一处缺什么”越有把握。
- 条件概率在已知损坏序列 X\_corrupt 的条件下,模型预测第 i 个原始片段的概率分布。
- 求和汇总将 m 个片段的负对数似然相加,得到整条样本上的预训练损失。
哨兵机制
修复室里有十几处缺口时,小林会在每处缺口夹一张编号标签——“缺-1”“缺-2”,并在工作笔记上记录每个编号对应的原文位置。这样做的目的是把“哪里缺了”和“缺了什么”严格对应起来,补全时按编号逐个还原,避免张冠李戴。Span Corruption 同样需要这种“编号标签”,它的名字叫哨兵 token。
哨兵 token(Sentinel Token)是 T5 引入的一组特殊标记,形如 <extra_id_0>、<extra_id_1>。训练时,每个被遮蔽的连续片段都被替换为一个哨兵 token,编码器输入不再包含原来的片段内容,而只保留哨兵作为“缺口标记”。解码器目标则反过来:先输出哨兵 token,再紧跟该片段被藏起来的原始内容,以此建立“标记—内容”的配对关系。
具体而言,设未被遮蔽的片段按顺序保留,编码器输入 X\_in 与目标输出 Y\_out 可表示为:
哨兵 token 就像小林夹在竹简上的编号纸条——纸条本身不是文物,不承载语义信息,但它是修复工程的坐标。模型不需要“理解”哨兵的含义,只需把它当作锚点,就能精确地知道每一段重建内容应该落在何处。
- 编码器输入中的哨兵替换原文中第 i 个被遮蔽片段的位置上放置哨兵 M\_i,其余未遮蔽文本原样保留。
- 目标输出中的哨兵锚点解码器先输出 M\_i,再接原始片段内容,使最终预测可被唯一地对齐到输入中的缺口。
- 结束哨兵输出末尾追加一个结束标记,宣告“所有缺口已补完”。
- 一一对应关系m 个哨兵在输入与输出中成对出现,顺序一致,保证模型在自回归解码时知道当前在补第几处。
关键参数
小林很快发现,修复工作的难度取决于两个变量:蛀洞的长度和破损的密度。若蛀洞只有一两个字的宽度,修复简单但学不到长句规律;若蛀洞长到半句话,就只能靠猜。顶尖的修复师不会随意开工,而是先评估缺损特征,再选择相应的修复策略。Span Corruption 的训练同样有两个核心超参数:span 长度与遮蔽比例。
span 长度(span length)是每个连续片段的期望长度。如果 span 长度为 1,Span Corruption 就退化成 BERT 式的单 token 掩码,失去“整段推理”的意义;如果长度过大,上下文被破坏得过于严重,模型几乎无法推断原文。遮蔽比例(corruption rate)则是被破坏 token 占序列总长的比例。T5 论文通过大规模消融实验给出的推荐配置是:平均 span 长度约为 3,遮蔽比例约为 15%。
给定序列总长度 n、平均 span 长度与遮蔽比例 p 时,需要采样的 span 个数 m 由下面的关系决定:
修复师不会让蛀洞大到整句消失,也不会把古籍蛀得千疮百孔却只修单字。T5 的实验同样表明,span 长度 3 与遮蔽比例 15% 的组合,恰好让任务“难而可解”:既有足够的挑战促使模型学习长程依赖,又保留了充分的上下文让模型能够作答。
- p × n 表示总损坏量遮蔽比例 p 乘以序列长度 n,得到被破坏的 token 总数。
- 平均跨度 E[l]每个 span 的平均长度,T5 默认取 3。
- span 个数 m总损坏量除以平均跨度,就得到需要采样的片段个数。
- 整体关系三者相互制约——跨度越长,片段数越少;比例越高,片段数越多。
训练流程
小林修复一卷古籍有一套固定流程:先通读全文扫描缺损,再给每处缺口编号,然后逐块补全,最后通篇复核。Span Corruption 的训练流程也与此严格对应,每一步都有明确的工程实现。理解这套流程,是搭建预训练任务的第一步。
流程的第一步是采样片段。T5 先按 15% 的遮蔽比例随机筛选出需要破坏的 token 位置,再从每个被选中的位置出发,顺延一段长度为 1 到最大 span 的连续区间,最终形成若干不重叠的 span。第二步是构建序列:用哨兵 token 替换每个 span,组装出编码器输入与解码器目标。第三步是损失计算:解码器以自回归方式逐个预测目标 token,每一步的交叉熵损失被累加。第四步是反向传播,梯度更新整个 Transformer 参数。
训练目标在数学上可以写成:
小林的修复工作环环相扣:扫描不仔细,编号就会错位;补全顺序混乱,文气就会断裂。Span Corruption 的训练流程同样讲究顺序——采样决定了任务难度,构建决定了信息对齐,损失计算决定了学习信号的质量,四步缺一不可。
- 解码位置 t从 1 到目标序列总长度逐个遍历。
- 条件概率第 t 步的概率依赖于前面已经生成的所有 token,这是自回归的典型形式。
- 交叉熵损失取负对数,使模型对正确 token 的概率趋近于 1。
- 全序列求和把所有位置的损失加起来,作为一条样本的总损失。
性能特性
小林发现,经过大量整段修复训练后,自己不再需要逐字对照工具书,只凭上下文就能自然补出成段的文字。这种“功力”的提升源于长期处理高难度完形任务。Span Corruption 给予 Transformer 的,正是类似的“整段推理”训练,它带来三项关键的性能优势。
首先,学习效率更高。每破坏一个 span,模型需要同时学会“预测哪些位置缺了内容”和“预测缺了什么内容”,一次前向传播覆盖更多有效信息。其次,长程依赖建模能力更强。被遮蔽的 span 长度较大时,模型必须跨越更远的距离寻找线索,这迫使注意力机制充分利用远距离上下文。最后,在下游任务上对比优势显著:T5 采用 Span Corruption 预训练后,在 GLUE、SuperGLUE 等基准上超越了 BERT 及其变体。
为了说明任务结构的影响,可以考察平均 span 长度这个统计量:
就像修复师从“补单字”升级到“补整句”后功力大涨,模型从“预测单 token”升级到“重建连续片段”后,对文本结构的理解也更深刻。跨度越长,模型被迫调动的上下文越大,最终沉淀出来的表征也就越有全局性。
- 求和所有片段长度把 m 个 span 的长度逐项相加。
- 除以片段数 m得到每个 span 的平均长度。
- 期望表达式在随机采样框架下,这一均值收敛于设置的目标期望值 E[l]。
- 与 MLM 的对比MLM 等价于 E[l] = 1 的特例,因此 Span Corruption 可以看作它的“加长版”。
优化策略
修复师小林不断改进自己的工具箱:选择合适的墨色、调整补纸的厚度、优化工作台的照明角度,甚至总结出“先干后湿、由外向内”的修复口诀。训练 Span Corruption 模型同样有一系列优化策略,可以在不改变模型架构的前提下显著提升效果与训练效率。
第一个优化方向是超参联合选择。span 长度与遮蔽比例并非孤立变量,二者共同决定任务难度。若遮蔽比例不变而跨度增大,span 个数减少,训练信号密度下降;若跨度不变而比例升高,上下文被破坏过多,任务变得不可解。因此需要联合调参,找到曲线上的最佳工作点。第二个方向是训练效率优化:T5 提供了 prefix 模式,将输入输出拼接为单一序列,只在目标部分计算损失,从而减少前缀部分的重计算开销,提高吞吐量。
prefix 模式的损失可以表示为:
修复师的技巧源于日复一日的实践与微调,模型训练的优化同样如此:没有放之四海皆准的参数,只有结合数据规模、序列长度与算力预算做出的权衡选择。好的策略不是“更难的预训练任务”,而是“难度与可解性的最佳平衡”。
- 目标集合 T只对目标序列中的 token 位置计算损失,前缀部分被排除。
- 拼接序列输入与目标拼接成一个整体序列,用单向注意力同时建模两者。
- 条件概率第 t 步的概率依赖该步之前的所有 token,无论它们来自输入还是目标。
- 求和范围收窄相比 standard 模式,损失只作用于目标部分,计算量更小。
应用前景
小林在修复古籍上积累了深厚功力后,发现这门手艺可以迁移到古画修复、碑帖拓印甚至古建筑保护——底层的“跨领域补全”能力一通百通。Span Corruption 赋予模型的也不仅仅是完形能力,而是一种通用的“文本到文本”转换能力,让一个预训练模型可以胜任门类繁多的 NLP 任务。
T5 的核心设计是用统一的 Text-to-Text 框架封装所有任务:摘要、翻译、问答、分类、生成,全部变成“输入一段文本,输出一段文本”。预训练阶段通过 Span Corruption 学到的重构能力,被迁移到下游任务时只需微调即可适配。比如要做翻译,就把输入拼成 “translate English to Chinese: ……“;要做摘要,就拼成 ”summarize: ……”。模型始终输出文本,架构无需任何改动。
这种统一推理范式可以表示为:
修复技艺从古籍延伸到更广阔的文化遗产保护,Span Corruption 也从预训练走向了多任务应用的星辰大海。理解这一范式,就理解了 T5 家族模型“一个模型打天下”的底层逻辑,也为设计下一代预训练任务提供了清晰的方向。
- 任务前缀与输入将任务描述与原始文本拼接,作为模型的输入。
- 序列概率对整个输出序列 y 计算对数概率,衡量它作为答案的合理程度。
- arg max 搜索在所有候选输出中选出概率最高者,作为最终回答。
- 统一框架不同任务只改变前缀,模型与训练流程完全一致。
AI 应用场景
大规模预训练语料构造
阶段:数据准备与预训练
解决的问题:传统预训练需要针对不同目标分别设计掩码任务(如 BERT 的 NSP+MLM),而 Span Corruption 只需一个统一目标即可在海量无标注语料上构造训练样本,流程简单、扩展性强,尤其适合数百 GB 级的大规模语料处理。
具体案例:某医疗 AI 团队预训练中文医疗大模型时,使用 Span Corruption 对 100 万篇医学文献进行预训练。模型在“修复”被遮蔽的诊断描述片段时,必须理解医学定义、症状与治疗方案的上下文关联。预训练完成后,再微调到诊断报告生成任务,生成流畅度相比直接微调 BERT 提升约 20%。
统一多任务文本生成平台
阶段:模型微调与部署应用
解决的问题:传统 NLP 项目往往需要为摘要、翻译、问答分别训练独立模型,维护成本高。基于 Span Corruption 预训练得到的 T5 模型,天然支持 Text-to-Text 框架,可用同一套权重通过不同任务前缀切换功能。
具体案例:某内容平台构建统一的文本服务中台,部署一个 T5-Large 模型。输入新闻原文加 “summarize:“ 前缀即返回摘要;切换 ”translate to English:“ 前缀即执行翻译;加 ”question:” 前缀即回答事实性问题。一个模型同时支撑三个 API,GPU 资源成本降低约 60%。
Python 演示
import random SENTINELS = [f"<extra_id_{i}>" for i in range(100)] def span_corrupt(text, corruption_rate=0.15, span_length=3, seed=0): """对文本执行 Span Corruption,返回损坏序列与重建目标。""" rng = random.Random(seed) tokens = list(text) n = len(tokens) if n == 0: return text, "" num_corrupt = max(1, int(n * corruption_rate)) num_spans = max(1, round(num_corrupt / span_length)) spans = [] used = set() for _ in range(num_spans * 20): if len(spans) >= num_spans: break start = rng.randrange(0, n - 1) end = min(n, start + rng.randint(1, span_length)) if any(i in used for i in range(start, end)): continue spans.append((start, end)) used.update(range(start, end)) spans.sort() corrupted_parts = [] target_parts = [] prev = 0 for idx, (start, end) in enumerate(spans): corrupted_parts.extend(tokens[prev:start]) sentinel = SENTINELS[idx] corrupted_parts.append(sentinel) target_parts.append(sentinel) target_parts.extend(tokens[start:end]) prev = end corrupted_parts.extend(tokens[prev:]) target_parts.append(SENTINELS[len(spans)]) return "".join(corrupted_parts), "".join(target_parts) if __name__ == "__main__": sample = "The quick brown fox jumps over the lazy dog near the river." corrupted, target = span_corrupt(sample, seed=42) print("原始文本:", sample) print("损坏序列:", corrupted) print("重建目标:", target)
tokens = list(text)将文本拆成字符级 token,便于演示连续片段的遮蔽与恢复。num_corrupt = max(1, int(n * corruption_rate))根据遮蔽比例计算要破坏的字符总数。num_spans = max(1, round(num_corrupt / span_length))由总破坏量和 span 长度反推需要采样的片段个数。start = rng.randrange(0, n - 1)随机选取一个片段起点,模拟随机采样策略。if any(i in used for i in range(start, end)): continue若与已有片段重叠则跳过,保证 span 互不重叠。corrupted_parts.append(sentinel)用哨兵 token 替换原文中的连续片段,模拟编码器输入。target_parts.extend(tokens[start:end])将原始片段内容放入目标序列,供解码器学习重建。target_parts.append(SENTINELS[len(spans)])在目标末尾追加结束哨兵,对应 T5 的终止标记约定。
常见误区
误区我听说 BERT 也是随机遮词让模型预测,Span Corruption 不就是把遮一个词改成遮几个词吗?本质应该完全一样。
正解两者有本质差异。BERT 的 MLM 遮蔽单个 token,预测各位置相互独立,模型只需判断“这里是什么词”;Span Corruption 遮蔽连续片段,模型要按顺序“生成”一整段内容,必须同时把握片段的长度、边界和内部语序。好比修复古籍:MLM 是补单个缺字,Span Corruption 是从上下文推演并誊写整段补文。一个是判别式填空,一个是生成式完形。
为何常见:两者都叫"mask"且都基于 Transformer 双向编码,名称与工具链的相似让初学者误以为只是参数规模不同。
误区既然要学习长程依赖,那 span 长度越长越好,最好一次遮蔽半句话,让模型挑战极限。
正解T5 的系统性实验表明,平均 span 长度取 3 时效果最佳。span 过长时,编码器留下的可见信息太少,模型几乎无法推断完整内容,只能靠词频先验“硬猜”,学到的不是语言结构而是噪声。这和修复师面对整段完全消失的文字只能臆测一样,硬补出来的内容反而破坏了对原文的理解。
为何常见:直觉上认为“难度越大收获越大”,但预训练任务需要“难而可解”,过高的难度会让梯度信号失去方向。
误区遮蔽比例越高,模型被迫关注更多上下文,接触到的“知识点”就越多,预训练效果自然更好。
正解T5 实验证明 15% 的遮蔽比例是最优平衡点。遮蔽太少,任务过于简单,模型很快收敛到平庸解;遮蔽太多,上下文被严重破坏,剩余文本无法支撑有效推断,模型学到的更多是猜测策略而非语言表征。预训练的目标从来不是“让任务变难”,而是“让表征变好”。
为何常见:人们常把“练习强度”等同于“学习效果”,忽略了输入信息被破坏后任务可解性急剧下降这一事实。
误区`<extra_id_0>` 这些哨兵是词表里新增的特殊词,模型应该像学习“苹果”“奔跑”一样学习它们的语义表示。
正解哨兵 token 不承载语义,它只是“占位锚点”。模型不需要理解"extra_id_1"是什么意思,只需利用它对齐输入输出位置:编码器看到哨兵知道这里缺了一段,解码器见到哨兵知道该输出哪段内容。可以理解为修复师在缺口夹的编号纸条——标签本身不是文物,只是修复工程的定位工具。
为何常见:哨兵 token 在输入输出序列中高频出现,又占据嵌入表位置,容易让人误以为它们也是需要学习的语义单元。
面试题
Q1. Span Corruption 预训练范式首先由哪个模型提出?
- A.BERT 模型
- B.GPT-2 模型
- C.T5 模型← 正确答案
- D.RoBERTa 模型
答案:C。T5 模型在 2019 年提出并使用 Span Corruption 作为预训练目标。BERT 和 RoBERTa 使用的是掩码语言建模,GPT-2 使用的是自回归语言建模,它们都不是 Span Corruption 的首倡者。
Q2. Span Corruption 中被遮蔽的基本单位是?
- A.单个字符
- B.连续文本片段← 正确答案
- C.整个句子
- D.单个段落
答案:B。Span Corruption 中的 "Span" 特指一段连续的 token 序列。遮蔽的单位不是单字符或单 token,而是连续片段;也不是固定整个句子或段落,而是长度不等的子串。
Q3. T5 论文推荐的默认平均 span 长度约为?
- A.1 个 token
- B.3 个 token← 正确答案
- C.5 个 token
- D.10 个 token
答案:B。T5 通过消融实验发现,平均 span 长度取 3 时预训练效果最优。1 个 token 会退化成 MLM,5 或 10 个 token 则难度过高,导致模型难以恢复完整语义。
Q4. Span Corruption 的典型遮蔽比例是多少?
- A.约 3%
- B.约 8%
- C.约 15%← 正确答案
- D.约 30%
答案:C。T5 论文验证 15% 的遮蔽比例最接近“难而可解”的任务平衡点。比例太低任务过于简单,比例太高则上下文被破坏严重,模型无法有效学习。
Q5. 下面哪些属于哨兵 token 的作用?
- A.标记片段位置← 正确答案
- B.参与语义表示
- C.帮助解码器对齐← 正确答案
- D.扩大模型词表量
答案:AC。哨兵 token 的核心作用是在输入中标记被遮蔽片段的位置,并在解码时作为锚点帮助对齐输入输出。它不承载语义,也不以扩充词表为目的,因此 B 和 D 错误。
Q6. T5 的 "Text-to-Text" 框架指的是什么?
- A.输入输出均为文本← 正确答案
- B.只能处理翻译任务
- C.文本编码为图像
- D.依赖强化学习算法
答案:A。Text-to-Text 框架将所有 NLP 任务统一为“输入文本、输出文本”的形式,通过任务前缀区分不同任务。它不仅能处理翻译,还覆盖摘要、问答、分类等,且不依赖强化学习。
Q7. 下列哪些策略有助于提升 Span Corruption 预训练效果?
- A.起点均匀随机采样← 正确答案
- B.使用过高遮蔽比例
- C.调节跨度与比例搭配← 正确答案
- D.目标端加结束哨兵← 正确答案
答案:ACD。均匀随机采样可以保证 span 分布无偏;跨度与遮蔽比例联合调优能找到最佳任务难度;结束哨兵让模型明确输出终止位置。过高的遮蔽比例会破坏上下文,不利于训练,因此 B 错误。
Q8. Span Corruption 相比 MLM 的主要优势是?
- A.训练速度更加快速
- B.驱动模型推理长上下文← 正确答案
- C.显著缩小模型词表
- D.无需使用 Transformer
答案:B。连续片段遮蔽迫使模型跨越更远距离寻找线索,强化长程依赖建模能力。它并不会天然加快训练速度,也不改变词表大小,且依然依赖 Transformer 架构。
Q9. 输入输出 token 总数公式 T = n + m 中,m 表示?
- A.每层多头注意力头数
- B.被遮蔽片段的个数← 正确答案
- C.输入句子的总数量
- D.词表的大小规模
答案:B。在 standard 模式下,编码器输入由剩余文本与 m 个哨兵组成,长度约等于 n;解码器输出包含 m 个哨兵及对应内容。公式中的 m 是被遮蔽片段的个数,不是注意力头数、句子数或词表规模。
Q10. 关于 T5 的 Span Corruption,下列说法正确的是?
- A.遮蔽片段替换为哨兵标记← 正确答案
- B.解码端只需预测单个词
- C.损失在所有目标位置计算← 正确答案
- D.预训练与下游形式统一← 正确答案
答案:ACD。编码器输入中被遮蔽片段都被替换为哨兵 token(A 对);解码端需要自回归生成所有目标 token,而非单个词(B 错);损失在目标序列所有位置累加(C 对);Text-to-Text 框架让预训练与下游任务形式一致(D 对)。