mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
4692 字
13 分钟
GLM:BERT+GPT 合体
2026-07-08

GLM 论文解读:一个填空游戏,把 BERT 和 GPT 焊成了一个人#

论文:GLM: General Language Model Pretraining with Autoregressive Blank Infilling 作者:Zhengxiao Du, Yujie Qian, Xiao Liu, Ming Ding, Jiezhong Qiu, Zhilin Yang, Jie Tang(清华 KEG) arXiv: 2103.10360,ACL 2022 这篇是整个 GLM 家族的”宪法”。ChatGLM、GLM-130B、GLM-4,往上数三代,根都在这篇。它干的事就一句话:用一个”自回归填空”的预训练目标,把 BERT 那套理解能力和 GPT 那套生成能力,塞进同一个模型里,还谁都不吃亏。想搞懂 GLM 这一整条线为什么长这样,这篇是绕不开的第一站。


一、先说背景:BERT 和 GPT 的”老死不相往来”#

2018 到 2021 年,NLP 圈其实分裂成了两派,而且互相看不太顺眼。

一派是 BERT 式的**自编码(Autoencoding)**路线。做法是把句子挖几个洞,让模型猜洞里是什么。好处是模型能同时看左右两边的上下文,理解能力极强,做分类、做匹配、做抽取式问答都是好手。但缺点也致命:它不会生成。你让它写一段话,它没那个结构,因为它训练时从来没干过”一个字一个字往后蹦”这件事。

另一派是 GPT 式的自回归(Autoregressive)路线。做法是从左往右,用前面的字预测后面的字。好处是天生会生成,给它个开头它能一直编下去。但缺点是只看左边、看不见右边,做那种”需要理解整句再回答”的任务就有点吃亏。

后来 Google 出了个 T5,走 **序列到序列(Seq2Seq)**的路子,挖掉一整段,再重新生成出来,算是往中间靠了靠。但 T5 本质还是”编码器+解码器”两套结构,挖洞的时候挖得也比较死板。

这就出现了一个很尴尬的局面:你想要一个又能理解又能生成的全能模型,就得分别训两个模型再想办法拼起来。理解归 BERT,生成归 GPT,井水不犯河水。

这篇论文要干的事,就是把这口井填了。它的核心主张一句话:理解和生成,本来就不该是两件事,它们是同一件事的两种采样方式

二、核心机制:自回归填空,一个目标管所有#

论文提出的目标叫 自回归填空(Autoregressive Blank Infilling)。我把这个名字拆开讲。

先说填空。做法很朴素:从原文里随机挑几个连续的片段(论文叫 span,跨度),把每个片段整体替换成一个 [MASK] 标记。比如原文是”今天天气真好,我想去公园散步”,我把”天气真好”和”公园”挖掉,就变成”今天[MASK],我想去[MASK]散步”。

这跟 BERT 的挖洞有点像,但有两个关键升级。

第一个升级:挖的是”块”,不是”字”。 BERT 一次挖一个 token,挖得稀碎。GLM 一次挖一整段连续的 span。为什么?因为挖整段,模型就得”一口气生成一段话”,这就天然带上了生成的能力。

第二个升级:这些被挖掉的 span 会打乱顺序。 论文叫它 Span Shuffling(跨度乱序)。就是说我挖掉的这几个片段,喂给模型去填的时候,不按原文顺序排,而是随机排。比如原文先挖了 A 再挖了 B,但模型可能先要填 B 再填 A。

为什么要打乱?这是全篇最鸡贼也最关键的一招。如果 span 顺序不变,模型会偷懒——它会发现”填空”其实退化成了”从前往后顺着写”,那就又回到 GPT 了,理解能力还是练不出来。把顺序打乱,模型就没法靠”顺着猜”蒙混过关,必须真正理解 Part A(没被挖的那部分)的整体语义,才能决定每个空该填什么。这一招,逼着模型同时动用”理解”和”生成”两种能力。

再说自回归。填每个空的时候,模型是一个 token 一个 token 地往外生成的,而且后面生成的能看到前面已经生成的——这就是自回归。所以一个空里要填”天气真好”四个字,模型是”天→气→真→好”这么一步步吐出来的,空和空之间也是依次填的。

一句话总结这个目标:随机挖几个连续的洞、把洞打乱顺序、然后让模型一个一个把洞填回去。就这一个动作,理解和生成都练到了。

三、两个零件:二维位置编码和 Prefix-LM 注意力#

光有填空还不够,还得有两个工程零件把这事撑起来。这两个零件是 GLM 架构里最容易被忽略、但其实最关键的部分。

零件一:二维位置编码(2D Positional Encoding)#

先说问题。语言模型靠位置编码知道每个字在句子里站哪。现在我把一个 span 挖掉了,变成一个 [MASK]。那模型怎么知道这个 [MASK] 该填多长?

这里有个坑:如果我老老实实给 [MASK] 标上”你后面还有 5 个字的位置被占了”,模型就直接知道答案长度了,等于作弊。可如果不告诉它任何位置信息,它又不知道该从哪儿开始接。

GLM 的解法很聪明:给每个 token 用两个位置,而不是一个

  • 位置一(全局位置):这个 span 在原文里的起始位置。也就是说,整个被挖掉的 span,不管它原来有 5 个字还是 50 个字,都只占原文起始处那”一个格子”。
  • 位置二(局部位置):这个 token 在 span 内部排第几。

这样一来,模型从位置一知道”这个空出现在原文的什么地方”,从位置二知道”我现在填到第几个字了”,但它推不出这个空到底该填多长——因为长度信息被位置一压缩成了一个格子。长度得靠模型自己根据语义去判断。这就把”猜长度”这个真正考验理解的部分,留给了模型。

这个设计后来被证明极其关键。ChatGLM 一路传下来,骨架里都还留着二维位置的影子。

零件二:Prefix-LM 注意力掩码(Part A 双向 / Part B 单向)#

第二个零件是注意力掩码(Attention Mask)。它决定了”谁能看见谁”。

GLM 把输入切成两半:

  • Part A:没被挖的原文(那些还在的 token),加上几个 [MASK]。
  • Part B:所有被挖掉的 span 的真实内容,按打乱后的顺序排好,等着模型去生成。

注意力规则是这么定的:

  • Part A 内部是双向的。就是 BERT 那套,A 里的每个 token 能看见 A 里所有其他 token。这保证了理解能力——模型能充分消化”还剩下的原文”。
  • Part B 是单向的,而且只能看前面。就是 GPT 那套,B 里每个 token 只能看自己前面已经生成的内容。这保证了生成是自回归的、可以真正用于推理部署的。
  • 关键一条:Part B 能看见整个 Part A,但 Part A 看不见 Part B。

为什么 Part A 不能看 Part B?因为 Part A 是”题面”,Part B 是”答案”。题面要是能看到答案,那就泄题了,模型直接抄答案,啥也学不到。所以掩码必须保证:答案能参考题面,题面绝不能偷看答案。

这个”前面一部分双向、后面一部分单向”的结构,论文里对应的是 Prefix-LM 的思路(前缀双向、后面自回归)。你可以把它理解成:把 BERT 的双向和 GPT 的单向,用一道掩码墙,在同一个 Transformer 里隔成了两个房间,中间开了一扇单向门

一个 Transformer,一套参数,理解在 Part A 练,生成在 Part B 练,两边共享同一个身体。这就是 GLM 的”General”到底 General 在哪。

四、分水岭:调一调空的数量和长度,模型就变身了#

这篇论文最漂亮的地方,是它证明了:同一个模型、同一个架构,只靠调节”挖空”的方式,就能退化成 BERT、GPT、T5 三种形态。这是真正的统一,不是嘴上说说。

我给你摆一下这三种退化:

  • 每个空只挖一个 token,挖很多个 → 这就是 BERT 的 MLM(掩码语言模型)。因为每个空就一个字,自回归生成一个字等于直接预测,跟 BERT 一模一样。
  • 只挖一个空,而且这个空覆盖了从某个位置到结尾的全部文本 → 这就是 GPT。因为 Part A 剩个前缀,Part B 是后面全部,等于”用前缀预测后续所有”,就是标准的从左往右语言模型。
  • 挖多个长空,顺序打乱 → 这就是 T5 的 span corruption,但比 T5 更灵活,因为 T5 不打乱顺序,GLM 打乱。

换句话说:BERT、GPT、T5 都是 GLM 的特例。GLM 站在这三者的交集之外更高的地方,通过采样策略的不同,向下兼容它们三个。

这是我心目中这篇论文真正的分水岭意义。它不是在 BERT 和 GPT 之间选边站,也不是简单地把两者拼起来,而是找到了一个更高的抽象——填空的粒度和顺序,本身就是一个可以连续调节的旋钮。往一个方向拧是理解,往另一个方向拧是生成,拧到中间就是全能。

而且论文做了实验验证:把同一个 GLM,用偏向理解的采样(短空、多空)去训,它在 NLU 任务上跟 BERT 打平甚至更好;用偏向生成的采样(长空、单空)去训,它在语言建模和文本生成上追平 GPT。一个目标,两头都占,这就是论文的标题里”General”三个字的底气。

五、实测:同尺寸下,理解生成一把抓#

论文不是光讲理论,它在三个量级上做了实验:GLM-Base(1.1 亿,对标 BERT-Base)GLM-Large(约 3.4 亿,对标 BERT-Large),还有更大的版本。关键是在同样的参数量和同样的训练数据下去跟 BERT、T5、GPT 比——这是最公平的比法。

结果大概是这么个局面:

  • 理解类任务(SuperGLUE 这种):GLM-Large 比 BERT-Large 平均高出大概 5 个点,而且是单一模型、不靠集成。这在当时是很能打的。
  • 生成类任务(语言建模、摘要、问题生成):GLM 不输 GPT,部分还更好。尤其有意思的是,论文发现如果训练时完全不挖长空(即不做生成式填空),模型的生成困惑度会飙到 100 以上,基本废掉。这反向证明了:正是”自回归填空”这个目标,才让 GLM 同时保住了生成能力。
  • 规模放大后:更大的 GLM 在语言建模上超过了 GPT-Large。

换句话说,GLM 用一套框架,在理解和生成两条战线上同时不落下风。这在当时”鱼和熊掌不可兼得”的普遍认知下,是一个很硬的结论。

六、为什么它是整个家族的基石#

最后说清楚这篇在系列里的位置。

GLM 这篇是 2021 年挂 arXiv、2022 年 ACL 正式发表。它提出的三件套——自回归填空、二维位置编码、Part A/Part B 掩码——成了后面所有 GLM 模型的地基:

  • GLM-130B 直接继承了这个填空目标,只不过把空分成”短空 [MASK]“和”长空 [gMASK]“两种混着用,还加了多任务提示训练。
  • ChatGLM 系列,本质是 GLM-130B 做了指令微调,骨架还是这套填空+二维位置。
  • 一直传到后面的 GLM-4,你依然能看到 Prefix-LM 掩码和”前缀双向、生成单向”的影子。

可以这么说:没有这篇论文把”填空”这个看似土得掉渣的想法玩出花来,就没有后面整个 GLM 家族。它是这条技术线的 0 到 1。


收尾:我的一点看法#

这篇论文我最佩服的,是它用一个极其朴素的想法解决了一个看似无解的矛盾。“挖空填字”这件事,小学生天天在做,BERT 也在做。但 GLM 的作者多想了一步:如果挖的是整段、如果挖掉的段落打乱顺序、如果填空的过程是自回归的,那会怎样? 就这三个”如果”,把理解和生成统一了。真正的创新往往不是发明新东西,而是把旧东西换个方式组合——这篇就是教科书级的例子。

第二个让我觉得了不起的是那个统一视角本身。说”BERT、GPT、T5 都是 GLM 的特例”,这句话听着狂,但论文是认真用采样旋钮的连续变化去证明的。这种”找到一个更高维度,让几个看似对立的东西都变成自己的特例”的研究品味,是很高级的。后来很多统一多模态、统一理解和生成的工作,其实都在重复这个思路。

第三个是两个工程零件的巧劲。二维位置编码把”长度信息”优雅地藏起来,Prefix-LM 掩码用一道单向门隔开题面和答案。这两个设计都不是什么惊天动地的大结构改动,但它们是这个框架能成立的命门。我尤其喜欢”Part A 不能看 Part B”这条规则——简单、干净、一语道破”泄题”的本质。这种设计后来被证明极其关键,一路传到了 ChatGLM。

当然也要说说局限。这篇论文本身的模型规模不大,最大的也就几亿参数,它是框架的胜利而不是规模的胜利。它证明了”可以统一”,但没来得及证明”统一之后放大到千亿还能不能打”——这个遗憾留给了下一篇 GLM-130B 去补。另外,自回归填空引入了 Part A/Part B 的切分和打乱,训练和推理的实现比纯 GPT 复杂,工程成本更高,这也是为什么后来很多团队图省事直接选了纯自回归路线。

但瑕不掩瑜。在”理解和生成到底能不能统一”这个问题还众说纷纭的 2021 年,这篇论文用一个简洁到近乎优雅的框架给出了肯定答案,还给整个 GLM 家族打好了地基。它值得被记住,而且值得被反复读。


附:核心数据速查#

核心机制

组件作用
自回归填空挖连续 span → 打乱顺序 → 逐 token 填回
Span Shuffling打乱空顺序,防止退化成纯自回归
二维位置编码位置一=原文起始位,位置二=span 内部位,隐藏长度
Prefix-LM 掩码Part A 双向,Part B 单向,B 能看 A、A 不能看 B

三种退化形态

采样方式退化为
多空、每空 1 个 tokenBERT 式 MLM
单空、覆盖前缀之后全部GPT 式自回归 LM
多个长空、顺序打乱T5 式 span corruption

实验规模

模型参数量对标
GLM-Base~1.1 亿BERT-Base
GLM-Large~3.4 亿BERT-Large

关键结论

项目结果
理解(SuperGLUE)GLM-Large 比 BERT-Large 高约 5 点
生成不输 GPT,部分更好
消融不做生成式填空,生成困惑度 >100,生成能力废掉
放大后语言建模超过 GPT-Large

关键概念清单

  • Autoregressive Blank Infilling = 自回归填空(GLM 的核心预训练目标)
  • Span = 跨度,一段连续的 token
  • Span Shuffling = 跨度乱序,挖掉的片段打乱顺序再填
  • Autoencoding = 自编码(BERT 式,挖洞猜洞,双向)
  • Autoregressive = 自回归(GPT 式,从左往右预测)
  • Seq2Seq = 序列到序列(T5 式,编码+解码)
  • 2D Positional Encoding = 二维位置编码(全局位置 + span 内位置)
  • Prefix-LM = 前缀双向、后续单向的语言模型结构
  • Part A / Part B = 未被挖的原文(双向)/ 待生成的空内容(单向)
  • Attention Mask = 注意力掩码,决定谁能看见谁
  • MLM = Masked Language Modeling(掩码语言模型,BERT 的目标)
  • Span Corruption = 跨度损坏重建(T5 的目标)
  • GLM = General Language Model(通用语言模型)
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

GLM:BERT+GPT 合体
https://mizuki-eaf.pages.dev/posts/glm/glmbertgpt-合体/
作者
无名之子
发布于
2026-07-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录