☰
自回归VS掩码语言建模:预训练范式如何决定模型擅长生成还是理解
2026/10/24 4:31:00 网站建设 项目流程

刚接触自然语言处理那段时间,我一直被各种“预训练模型”弄晕:为什么同样是预训练,掩码语言建模出来的模型擅长分类、抽取这类理解任务,而自回归语言建模出来的模型天生就会写文章、做对话?后来才明白,这不是某一家模型更强,而是两种预训练范式选择了完全不同的底层假设。这篇内容想认真拆一拆这两个最重要的范式,讲清楚它们各自的设计逻辑、优劣势、实际表现,以及工程落地时到底该怎么选。适合刚入门NLP、准备上预训练模型的开发者,也适合已经在微调模型、却对“为什么BERT和GPT差距这么大”心存疑问的人。

1. 先搞清楚一件事:这两个范式到底在争什么

1.1 一个“接龙”,一个“完形填空”

我一直觉得,用两个日常场景来类比这两种范式最直观。自回归语言建模就像“成语接龙”:你只知道自己已经写出来的前半段,然后预测下一个最合理的词。它严格遵循从左到右的因果顺序,每一步都只能依赖已经出现的“历史信息”,不能回头偷看还没写出来的“未来内容”。生成文本时也是这个逻辑:先预测第一个词,再基于第一个词预测第二个词,如此循环。

掩码语言建模更像“完形填空”:把一段文本里某些词挖掉,让模型同时看被挖掉位置左右两侧的上下文,把缺失的词补充回来。它不讲究顺序,只要能把空缺填对就行,因此模型可以拿到完整的上下文信息。举个例子:输入“今天天气真____,适合出去散步”,完形填空模型能同时看“今天天气真”和“适合出去散步”来推测空格里大概率是“好”;而接龙模型只看到“今天天气真”的时候,候选可以是“好”“不错”“暖和”,它拿不到后半句话提供的额外线索。

这个类比看起来简单,却是理解一切后续差异的起点。自回归强调的是“序列是如何一步步生成出来的”,掩码强调的是“文本中存在可以被噪声破坏后重建的结构”。两种假设没有谁绝对正确,只是各自适合解决不同类型的问题。

1.2 方向性差异带来的信息量差距

顺着刚才的类比往下说,两种范式最本质的分歧在于“能看多少个方向的上下文”。

标准自回归语言模型把序列概率拆成条件概率的连乘:P(x) = P(x₁) × P(x₂|x₁) × P(x₃|x₁,x₂) × … 每一步都只看左侧的历史 token。因为推理时你不可能预知未来的词,所以这种单向假设天然匹配文本生成场景。但代价也很明显:在做情感分类、命名实体识别这类理解任务时,某个词的判断往往需要同时考虑它后面的内容。比如“苹果发布了新款手机,销量很好”这句话,如果只看“苹果发布了新款手机”,你可能会以为它在讲水果,看到后面的“手机”才知道指的是科技公司。单向左文模型在这个场景下存在信息盲区。

掩码语言建模的思路正好相反:把一部分 token 遮住,用剩余 token 中的双向上下文去重建它们。模型在任何位置上都能看到句子左右两侧的信息,因此学到的表示天然带有“全局视野”。但也正因为训练目标是“重建被破坏的片段”,它缺少一种天然的、从零开始逐字生成文本的机制。

把两种范式的核心差异整理成一张表:

对比维度自回归语言建模掩码语言建模
核心假设文本是按顺序因果生成的文本存在可被重建的冗余结构
预测目标给定前文预测下一个 Token挖掉部分 Token 后用双向上下文重建
上下文方向单向,只能看左侧双向,左右两侧都能看
典型代表GPT 系列等BERT、RoBERTa 等
天然优势文本生成、对话、代码补全分类、抽取、相似度匹配、句向量
训练监督每个位置都计算损失只在被掩码的位置计算损失

很多人把 BERT 和 GPT 当成“两个模型”来比较,容易陷入参数、架构、榜单的细节里。实际上,它们分别站在两条不同的统计建模假设上:一个假设文本是“可以被去噪重建的”,另一个假设文本是“顺序生成的”。这两种假设决定了后续所有设计,包括损失函数、微调方式,甚至推理时的资源消耗。

2. 训练目标与损失函数:设计差异决定了模型性格

2.1 自回归的因式分解:每一步都依赖前文

自回归语言模型的训练目标相当“朴素”:拿到一段训练文本,从头到尾依次给模型输入“前 t-1 个真实 token ”,让模型预测第 t 个 token 是什么,然后和真实 token 计算交叉熵损失。因为训练时喂进去的是真实历史,而不是模型自己生成的历史,这种方法也被称为 teacher forcing。

这里有一个容易被忽视的设计细节:它在序列的每一个 token 位置上都产生监督信号。也就是说,一句话里有 100 个 token,就有 100 个对应的预测任务。对数据利用效率来说,这是非常充分的。你不需要额外构造标签,只需要准备海量纯文本,模型就能不断学习“在给定前文的条件下,下一个词是什么”。

为什么这种设计特别适合生成任务?因为推理时的场景和训练时完全对齐:推理也是基于已经生成的 token 预测下一个 token,预测完一个就加入历史,继续预测下一个。训练和推理的“任务形状”是一样的,模型不存在“换了一个玩法”导致的表现崩塌问题。

当然,它的问题也同样明显:如果你想让模型判断“苹果发布了新款手机,销量很好”这句话的整体情感,自回归模型在读到“苹果发布了”的时候,并不知道后面会出现“手机”还是“香蕉”。它被迫按时间顺序理解句子,这在很多需要全局理解的任务上并不占优。

2.2 掩码的加噪与重建:为什么15%这个数字靠谱

掩码语言建模的训练目标要绕一些:首先对输入文本做“破坏”,随机挑出一部分 token 挖掉,然后让模型用双向上下文的编码结果去重建这些被破坏的位置。我这里用伪代码表示一下常见的掩码策略:

# 伪代码:掩码策略示意 for pos in range(seq_len): if random.random() < 0.15: # 只选15%的位置做掩码 r = random.random() if r < 0.8: # 80%替换为[MASK] tokens[pos] = MASK_TOKEN elif r < 0.9: # 10%随机替换成词表中的一个词 tokens[pos] = random_vocab_token() # else: 剩下10%保持不变,逻辑上仍要求模型预测该位置

新手最容易问的问题是:为什么是 15%,而不是 30% 或者 5%?这个数字本身来自经验调优。如果掩码比例太高,训练时的输入文本被破坏得太严重,模型很难学到正常的语言规律,更像是在做“碎片拼图”,而且预训练和下游真实任务的分布差距会被拉大。如果比例太低,每个样本里可供模型学习的监督位置太少,训练效率下降,模型也容易过快地收敛到“只会复读”的懒惰状态。15% 是 BERT 时代研究者们摸索出的平衡点,后续大量模型沿用并验证了这个设置确实稳。

再解释一下“随机替换和保持不变”:如果只把被掩码的词换成 [MASK],模型会学到“看到 [MASK] 就要重建它”,但下游微调阶段文本里根本没有 [MASK] 这个 token,这种依赖关系就失效了。加入一部分随机替换词,能让模型学会“即使当前输入是错的、不符合上下文的,也要根据上下文判断它不对”;保留一部分不替换的位置,则是为了让模型始终保持一定的重建能力,不至于完全依赖 [MASK] 信号。这一套设计的本质是让模型对“上下文中的错误信息”更鲁棒。

2.3 监督信号的分布差异

对比两种训练方式会发现,掩码模型在监督信号利用上和自回归模型有非常明显的差别:自回归模型的每一个 token 都参与了损失计算,而掩码模型只有那 15% 被选中的位置会产生损失,其余 85% 的 token 只作为上下文输入参与编码,并不直接产出预测损失。

这个看似细微的差别,影响却很深远。对掩码模型来说,剩下的 85% 位置相当于“免费的阅读素材”,模型在编码时需要充分理解它们,才能更好地推断被遮住的位置,所以双向上下文表示被逼得很强大。但这种做法的代价是训练效率偏低——你花同样的算力读一遍文本,真正产生学习信号的只有一小部分位置。这也是后来很多研究者尝试用判别式方法替代生成式掩码的原因之一。

对自回归模型来说,监督信号虽然密集,但每个位置的预测只依赖左侧上下文,学到的表示在局部因果推断上很强,全局关联上偏弱。因此,与其说“哪种范式更好”,不如说两种范式各自选择了不同的“信息利用策略”:一个用全部位置换取顺序生成能力,一个用双向上下文换取全局理解能力。

3. 下游任务表现对比:理解任务选掩码,生成任务选自回归

3.1 双向上下文让理解任务占便宜

在实际业务里,文本分类、情感识别、文本蕴含判断、命名实体识别、段落抽取这类任务,绝大多数都要求“读懂整个句子或整段话”。模型在判断一个词的情感倾向或者实体边界时,往往需要同时知道这个词前后分别是什么。

掩码模型的优势在这里体现得最直接:因为预训练阶段它被训练成“用左右两侧信息重建被遮住的词”,所以它的每个 token 表示都融合了句子两端的语境。拿“苹果发布了新款手机,销量很好”举例,双向模型在编码“苹果”时就能把后面“手机”带来的语义修正算进去,表示里同时含有了“公司”和“产品发布”两种信息。后续接一个简单的分类头,就能很自然地把这些信息压缩成句子级判断。

自回归模型当然也能做理解任务,尤其是当模型规模大到一定程度后,凭借海量知识储备和涌现能力,它可以通过“提示 + 示例”的方式完成不少理解任务。但在中小规模场景下,用单向顺序建模去硬做全局判断,往往需要更多参数、更多数据才能补齐那部分“后面的信息”,在同等资源下性价比不如掩码模型。

3.2 生成任务里,训练和推理一致才是王道

反过来看生成任务:写文章、聊天对话、代码补全、翻译生成,本质上都是在给定已有内容的情况下,逐步决定下一个词应该是什么。这是一个天然的、从左到右的序列决策过程,而这恰好就是自回归语言模型预训练时做的事情。

为什么自回归模型生成文本总是更“顺”?因为训练时它在学习因果条件概率,生成时也完全按因果条件概率来采样。两者是同一种游戏,模型的所有能力都被调度在“顺序预测”上。

掩码模型从原理上并不擅长这种逐步生成。你可以强行让一个掩码模型从左到右解码,但它训练目标是“看到左右文重建中间词”,而不是“看到左文预测右文”。训练和推理的任务形态不一致,导致模型在长文本生成时容易出现上下文漂移、重复、逻辑断裂。一个很实在的经验:我用纯掩码模型试过写一段几十字的文案,经常出现前文还正常、后文突然开始复读已经说过的内容的情况,换成自回归模型后流畅度立刻提升一个档次。除非你的应用是受限的“填空式生成”,否则生成任务请优先考虑自回归或融合型序列到序列模型。

3.3 推理效率和微调细节的隐性差异

除了效果,工程落地还要考虑推理效率和微调习惯,这些隐性差异常常被教程忽略。

自回归模型在推理时有一个非常实用的优化技巧:缓存历史 token 的注意力键值对,也就是常说的 KV Cache。因为每一步预测只需要拿当前 token 和缓存的历史表征做计算,不需要重新编码整个序列,所以生成长文本时推理成本可以压得很低。掩码模型在设计上并不天然适配这种增量解码模式,它的典型用法是一次性编码整个输入,直接产出表示。

微调方式也明显不同。掩码模型常用的套路是“预训练编码器 + 任务头”:分类任务加分类头,抽取任务加起始和结束位置预测头。自回归模型则更偏向保持语言模型目标不变,通过构造提示模板和示例让模型学会任务,也就是少样本或上下文学习。这意味着团队的技术栈也不同:掩码模型需要对不同任务单独设计和训练任务头,自回归模型要做的是提示工程和采样策略调优。

4. 两大范式走向融合:这些模型都在“既要又要”

4.1 排列语言建模:自回归的躯壳,双向的心

自回归和掩码的争论久了,自然有人想“我全都要”。第一类代表性尝试是排列语言建模。这个思路很巧妙:既然自回归模型只能从左到右看,那不如把预测目标的位置顺序随机打乱,让每个 token 在某种排列下都有机会“看到”句子后面原本在它之后的内容。

实现上,模型仍然按自回归方式逐个预测 token,但 token 的预测顺序不再是原来句子里的从左到右顺序,而是随机采样出的一个新的排列。这样就存在一种情况:原句子里位置靠前的 token,可能在这一轮排列中被放在比较靠后的预测位置,于是它就能观察到原句里位置在它后面的 token。模型因此学会了“从任意上下文方向推断被预测位置的词”,双向上下文被嵌进了自回归的骨架里。

这个方法听起来完美,实际训练时复杂度不低。因为所有可能的排列太多,模型只能采样其中的一部分,而且注意力掩码的构造远比标准的因果掩码复杂。但它证明了“双向信息”和“自回归预测”并不是非此即彼,完全可以组合在一起。

4.2 去噪式序列到序列:把掩码塞进生成框架

另一条融合路线更成功,也更主流:把掩码建模改造成去噪式序列到序列训练。简单说,编码器负责理解被破坏的输入,解码器负责按自回归方式重建正确输出。预训练时给编码端加各种噪声,包括随机掩码连续片段、打乱句子顺序、删除部分 token;解码端要求模型逐步生成原始文本。

这样做的好处是显而易见的:编码端保留双向理解能力,解码端保留自回归生成能力。下游任务无论是分类、抽取还是摘要、翻译,都可以统一地放到一个“输入到输出”的框架里解决。尤其是像总结摘要、机器翻译这类任务,天然是“读一段文本,产出另一段文本”,这种序列到序列模型几乎是为它们量身定做的。从实际表现看,这类模型已经成为通用语言任务的主流选择,融合了两种范式的优势。

4.3 判别式替代生成式:换个角度降低掩码训练浪费

还有一类尝试不直接融合,而是另辟蹊径解决掩码训练“只有小部分位置有监督”的问题。思路很直接:与其让模型去生成被遮住的那个词,不如让模型判断“当前这个词是不是被替换过的”。一个生成器负责把被选中的位置替换成候选词,一个判别器负责扫描整段文本,判断每个位置是否被替换过。

因为每个 token 位置都要做判断,判别器就获得了密集的监督信号,不再像传统掩码那样只监督 15% 的位置。实际训练效率提升非常明显,在同样算力和数据下,这类模型可以更快收敛,并拿到更好的表示质量。这个思路本质上说明:掩码范式的收敛瓶颈不在于“能不能看见上下文”,而在于“有多少位置在产生真实的学习信号”。用判别式替代生成式,等于把监督信号铺满了全序列。

此外还有一些模型尝试在同一套参数上切换不同注意力掩码:理解任务开启双向注意力,生成任务切换为单向注意力。这种做法虽然实现成本高,但把两种范式收入了同一个模型,在工程部署上确实方便。所以回看整个发展脉络,掩码和自回归不是敌人,它们更像是同一个光谱的两端,所有优秀的模型都在想尽办法在这两端之间找到更合适的位置。

5. 工程选型:我到底该用哪一个

5.1 先问自己三个问题

看完前面这么多理论,落到实际项目上时,决策反而应该非常简单。我一般会先问自己三个问题:

第一,我的任务到底是“理解型”还是“生成型”?如果产品核心是文本分类、实体抽取、文本匹配,那优先考虑掩码类模型,双向上下文带来的收益是实实在在的。如果产品核心是聊天、作文、代码生成,那就选自回归模型,不要犹豫。

第二,我的算力和数据量有多少?掩码类模型在中小规模数据上收敛相对快,社区现成权重也多,适合快速出基线。自回归大模型想从零预训练,对算力和数据的要求高得多;如果只是微调公开权重,那门槛并不高,但推理阶段长文本生成的显存和延迟预算要提前算清楚。

第三,线上推理场景是否对延迟很敏感?如果是实时生成,自回归模型配合 KV Cache 可以做增量解码,体验更好;掩码模型做一次性编码理解则更快,适合搜索排序、实时审核这类低延迟场景。

把这些判断浓缩一下:

业务场景推荐范式核心理由
短文本分类、情感分析掩码模型双向上下文,表示质量高
命名实体、关系抽取掩码模型依赖上下文片段定位
文档摘要、翻译融合型 seq2seq编码理解 + 解码生成各司其职
对话、写作、代码生成自回归模型训练与推理目标一致,生成连贯
少样本或零样本通用任务大规模自回归模型上下文学习能力更强

5.2 两个典型误区要避开

工程里最常见的误区有两个,都是我见过真实项目踩过的坑。

第一个误区是“生成任务也能随便拿掩码模型凑合”。有人觉得 BERT 那么强,拿去写文案应该也还行。实际试下来,短文本填空或许能看,一旦超过几十个字,输出质量和自回归模型差距很大。原因前面讲过,训练目标不一致。除非需求本身是“把一句话里的空填上”,否则别用掩码模型硬扛生成任务,最后返工成本很高。

第二个误区是“自回归模型理解能力一定不行”。这个论断在中小规模模型上基本成立,但模型参数和数据量跨过一定门槛后,自回归模型可以通过提示模板和上下文示例解决非常多理解任务。如果团队有条件调用大规模模型,哪怕任务是分类,直接用自回归模型配合少样本提示,也常常能拿到不错效果。所以不要被“掩码用于理解、自回归用于生成”这句口诀框死,要结合资源来判断。

还有一个容易被忽略的坑:换模型范式时,微调的超参数不能照搬。掩码模型更吃学习率和序列长度的组合,自回归模型对批大小和上下文窗口更敏感。我见过有人把掩码模型那套超参数原样拿去训自回归模型,训练 loss 直接不降,最后才发现是超参不对。这类问题往往不是模型不行,而是你还没给它合适的训练环境。

5.3 落地建议与个人体会

最后给一些可以直接复用的落地建议。第一,永远不要从零预训练,先找公开的开源权重做微调。很多团队一上来就想“我要训一个自己的模型”,结果数据量、算力都不够,效果反而不如直接下载现成权重。先用现成权重把你的业务场景快速跑通,把失败模式摸清楚,再考虑要不要针对领域数据做继续预训练。

第二,同时准备两个候选模型:一个掩码理解型,一个自回归生成型。用同一个评测集跑一轮,分别记录它们在哪些样本上失败。你会很快发现,有些失败样本是“模型没看到后面的词”,有些是“生成不连贯”。这一步能帮你判断要不要换范式,而不是盲目调参。

第三,当任务的边界比较模糊,比如“既要抽取关键信息,又要生成一段回复”,直接选择融合型 seq2seq 模型。它虽然比纯掩码模型重一点,但一个模型兼顾两头,工程链路更简单。

我个人的习惯是:新的 NLP 任务进来,先花一天时间用掩码模型做分类或抽取类的基线,再用自回归模型做生成类的快速验证;遇到说不清该用哪种的任务,就直接让融合型模型上场。很多问题在这个组合下都能很快看到效果,剩下的就是针对性的数据清洗和采样策略调优。模型范式的选择不是一个“信仰问题”,它就是纯粹的工程取舍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询