5.1 GLM 系列:从 Autoregressive Blank Infilling 到 Agentic MoE

GLM(General Language Model)系列是一条非常典型的“大模型训练目标与架构共同演进”的路线:早期 GLM1 用 prefix-decoder + 自回归填空 把“理解(双向)”与“生成(自回归)”统一在一个 Transformer 里;随后 ChatGLM2/3 逐步回归 标准 decoder-only 来适配对话与工程生态;GLM4 在架构细节、长上下文与对齐训练上系统化;GLM4 All Tools 与 GLM4.5 则将重心进一步推向 工具调用/智能体MoE 的高效推理


1. GLM1:Prefix-Decoder Transformer 与 Autoregressive Blank Infilling

1.1 模型结构:一个“伪 Encoder-Decoder”的 Decoder

GLM1 的骨干仍是 Transformer decoder,但通过 特殊 attention mask 让输入序列前半部分表现为“编码器式双向可见”,后半部分表现为“解码器式因果可见”。因此常被称为 prefix-decoder

  • Prefix 部分:token 两两可见(双向注意力),相当于 Encoder。
  • Generation 部分:只能看见 prefix 与过去生成 token(因果注意力),相当于 Decoder。

你可以把它理解为:同一个 Transformer 堆栈,同时承担“读懂上下文”和“自回归生成”的职责。

工程/实现层面常见的结构改动(你列出的要点):

  • Pre Deep Norm(把归一化位置前移,增强稳定性)
  • 输出层用单层线性层做 token 预测(常见 LM head)
  • 激活函数 ReLU →\rightarrow GeLU(提升非线性表达与训练稳定性)

1.2 训练目标:自回归填空(Autoregressive Blank Infilling)

GLM1 最核心的训练目标是 把“Mask(自编码)”与“生成(自回归)”合并:不是像 BERT 那样对每个 mask token 独立分类,而是把缺失片段当作一个或多个 span,按顺序自回归重建。

(1) 核心思想拆解

自编码思想:在输入文本里随机删掉连续 tokens(span masking)。
自回归思想:模型按顺序重建这些缺失 spans,在预测第 ttt 个缺失 token 时,既能访问:

  • 被破坏后的上下文(corrupted text)
  • 之前已经重建出来的缺失 tokens(已生成的 span 前缀)

这等价于把“填空”变成一个“带条件的生成任务”。

(2) Part A / Part B 的构造:corrupt + shuffled spans

把原始输入序列 xxx 划分为两部分:

  • Part A:把若干 span 替换成特殊标记 [M][M][M] 的“破坏文本”
  • Part B:被挖走的那些 spans(每个 span 前加 [S][S][S] 作为输入起始标记,末尾用 [E][E][E] 表示输出结束),并且 span 顺序会被 shuffle

一个具体例子:

原始序列:
[x1,x2,x3,x4,x5,x6] [x_1, x_2, x_3, x_4, x_5, x_6] [x1,x2,x3,x4,x5,x6]

采样两个缺失片段(spans):

  • span1:[x3][x_3][x3]
  • span2:[x5,x6][x_5, x_6][x5,x6]

则 Part A(corrupt 后)变成:
[x1,x2,[M],x4,[M]] [x_1, x_2, [M], x_4, [M]] [x1,x2,[M],x4,[M]]

Part B 是两个 span,但会 shuffle。例如若顺序变为 span2 再 span1,则:
[[S],x5,x6,[E], [S],x3,[E]] [[S], x_5, x_6, [E],\ [S], x_3, [E]] [[S],x5,x6,[E], [S],x3,[E]]

最终模型的输入(概念上)就是把 Part A 与 Part B 拼接在一起,让模型在 Part B 上执行自回归预测。

直观理解:Part A 提供“阅读理解的上下文”,Part B 提供“需要补全的答案”,而且 Part B 的顺序被打乱,迫使模型学会更通用的条件生成/填空能力。


1.3 二维位置编码(2D Positional Encoding)

为了让模型同时区分:

  • token 在 Part A 的绝对位置
  • token 在 span 内部的相对位置

GLM 引入二维位置编码:给每个 token 分配两个位置 id(可理解为两张位置 embedding 表叠加)。

设 token 的二维位置为 (p(A),p(span))(p^{(A)}, p^{(span)})(p(A),p(span)),则其位置向量为:
PE(p(A),p(span))=EmbA(p(A))+Embspan(p(span)) \text{PE}(p^{(A)}, p^{(span)}) = \text{Emb}_A(p^{(A)}) + \text{Emb}_{span}(p^{(span)}) PE(p(A),p(span))=EmbA(p(A))+Embspan(p(span))

再与 token embedding 相加得到最终输入表示:
h0=TokEmb(x)+PE(p(A),p(span)) h_0 = \text{TokEmb}(x) + \text{PE}(p^{(A)}, p^{(span)}) h0=TokEmb(x)+PE(p(A),p(span))

  • 对 Part A 的 token:p(A)p^{(A)}p(A) 反映其在破坏文本中的位置;p(span)p^{(span)}p(span) 通常置为 0 或特殊值。
  • 对 Part B 的 token:p(A)p^{(A)}p(A) 可用于标识“属于第几个 span / 与 Part A 对齐关系”,p(span)p^{(span)}p(span) 表示其在 span 内的相对顺序(第 1 个、第 2 个…)。

这样模型就不会把“同一个 span 内的相对顺序”与“文本整体位置”混淆。


1.4 自定义 Attention Mask:在一个模型里同时做双向与因果

GLM 的关键在于 attention mask 的设计。用集合记号表示:

  • Part A 内 tokens 彼此可见(双向注意力)
  • Part A tokens 不可见 Part B tokens(避免“偷看答案”)
  • Part B tokens 可见 Part A(需要条件信息)
  • Part B tokens 可见 Part B 中过去 tokens,不可见未来 tokens(因果自回归)

如果将拼接后的序列记为 [A;B][A;B][A;B],对任意两个位置 i,ji,ji,j

  • i∈Ai \in AiAj∈Aj \in AjA:允许 attention
  • i∈Ai \in AiAj∈Bj \in BjB:禁止 attention
  • i∈Bi \in BiBj∈Aj \in AjA:允许 attention
  • i∈Bi \in BiBj∈Bj \in BjB:仅当 j≤ij \le iji 允许 attention(因果)

最终效果是:模型“自动学会”在 Part A 扮演 encoder(双向理解),在 Part B 扮演 decoder(自回归生成)。


1.5 为什么说这个目标“既能做条件生成,也能做无条件生成”?

关键在于:你可以通过控制被 mask 的 spans 数量与长度,让任务退化到不同形式。

  • 若 mask 覆盖较小比例:模型主要依赖 Part A 的上下文去补全,像 条件生成/填空
  • 若 mask 覆盖很大比例,甚至 Part A 信息很少:模型必须在弱条件下生成长段内容,接近 无条件生成

因此同一目标可以在预训练阶段同时训练“理解 + 生成”的通用能力。


2. GLM1 的多任务预训练:文档级与句子级目标

GLM 在 blank infilling 基础上做了多任务组合,让模型兼顾“长文本生成”和“句子/段落级生成”。

2.1 Doc-level(文档级)目标:生成更长文本

从原始长度的 50%50\%50%100%100\%100% 范围内均匀采样一个 span 作为缺失段,让模型重建一大段内容。其动机是:训练模型在较长跨度上保持连贯性与主题一致性。

一个直观例子:

  • Part A 只保留文章开头与少量提示
  • Part B 需要生成中间大段内容
    模型被迫学会“写长文、保持结构与一致性”。

2.2 Sentence-level(句子级)目标:更贴近 seq2seq

限制被 mask 的 span 必须是完整句子,采样多个 spans 覆盖约 15%15\%15% tokens(与 BERT 的 mask 比例一致)。这更接近很多 seq2seq 任务(摘要、改写、翻译风格等)里“输出是完整句子/段落”的形态。


3. GLM2:回归 Decoder-only,与 RoPE / SwiGLU / MQA

3.1 架构变化:从 prefix-decoder 到纯 decoder-only

GLM2(以 ChatGLM2 为代表)在架构上更贴近现代主流 LLM:

  • 完全 decoder-only
  • 位置编码使用 RoPE
  • 激活函数 GeLU →\rightarrow SwiGLU
  • Pre-RMSNorm
  • 注意力从 MHA →\rightarrow MQA(更高效推理)
  • 更长上下文:结合 FlashAttention,将上下文从 2K 扩到 32K,并在对话阶段使用 8K 上下文训练

这些变化背后的核心驱动是:对话数据与工程生态


3.2 为什么要从 prefix-decoder 回归 causal decoder?

你给的解释非常关键:多轮对话的样本构造成本

假设三轮对话为:Q1A1,Q2A2,Q3A3Q_1A_1, Q_2A_2, Q_3A_3Q1A1,Q2A2,Q3A3

(1) PrefixLM 的训练样本构造

PrefixLM 常需要把“前文作为条件,当前回答作为预测目标”拆成多条样本:

  • Q1→A1Q_1 \rightarrow A_1Q1A1
  • Q1A1Q2→A2Q_1A_1Q_2 \rightarrow A_2Q1A1Q2A2
  • Q1A1Q2A2Q3→A3Q_1A_1Q_2A_2Q_3 \rightarrow A_3Q1A1Q2A2Q3A3

这样会带来:

  • 数据膨胀(同一对话被拆成多条样本)
  • 不同轮次权重/学习信号分布不均匀
  • 工程上更复杂
(2) Decoder-only 的一条样本等效完成多轮对话

Decoder-only 直接把整个对话串起来:

样本序列:
[Q1,A1,Q2,A2,Q3,A3] [Q_1, A_1, Q_2, A_2, Q_3, A_3] [Q1,A1,Q2,A2,Q3,A3]

损失只在回答部分计算:
L=∑t∈A1∪A2∪A3−log⁡p(xt∣x<t) \mathcal{L} = \sum_{t \in A_1 \cup A_2 \cup A_3} -\log p(x_t | x_{<t}) L=tA1A2A3logp(xtx<t)

这意味着:

  • 一条样本就覆盖多轮训练信号
  • 实现简单,生态兼容(与 LLaMA 类架构一致)
  • 也解释了二维位置编码等 prefix-decoder 特有机制逐步淡出:对话训练范式变了,不再需要那套结构

4. GLM3:延续 ChatGLM2 架构,做词表与细节优化

GLM3(ChatGLM3)整体架构延续 ChatGLM2,更多是“系统化的工程与细节收敛”。

你列出的关键差异点:

  1. 词表变小:从 ChatGLM 的 150528 缩到 65024
  • 词表更小通常意味着 embedding 与 LM head 参数减少,加载/推理更快
  • 对中文与多语混合的覆盖策略更精炼
  1. 位置编码从每个 block 一份提升为全局一份
  • 更一致、更省参数、实现更简洁
  1. FFN 激活变化:ChatGLM 用 GeLU;ChatGLM2/3 用 SwiGLU
  • SwiGLU 常见形式可写为:
    SwiGLU(x)=(xW1)⊙SiLU(xW2) \text{SwiGLU}(x) = (xW_1) \odot \text{SiLU}(xW_2) SwiGLU(x)=(xW1)SiLU(xW2)
    其中 ⊙\odot 为逐元素乘法。它往往带来更强的表示能力与更好的训练效率(在同等计算下更“值”)。

5. GLM4:经典三件套 + 长上下文系统工程 + 对齐训练体系化

5.1 架构要点:bias 处理、RMSNorm、SwiGLU、RoPE、GQA

GLM4 的结构描述非常贴近当前主流高性能 LLM 的“共识配方”:

  • 除了 QKV,其余部分移除 bias(提升训练速度,并可能带来一定长度外推收益)
  • RMSNorm
  • SwiGLU
  • RoPE
  • GQA(Grouped Query Attention)

其中 GQA 的直观意义是:让多个 query head 共享更少的 key/value head,从而减少 KV 缓存与计算成本,提高推理效率。在长上下文下尤其重要。

你提到“GQA 减少了 MHA 参数量,所以 FFN 隐藏层维度增加到了原来的 10/310/310/3”,可以把它理解为一种“算力预算再分配”:

  • 注意力变省了(或更高效)
  • 把预算挪给 FFN(提高表示容量)

5.2 预训练:数据治理与统一词表策略

(1) 数据来源与处理链条

数据来源覆盖:网页、维基百科、书籍、代码、研究论文等多语言文档。核心处理步骤:

  • 去重:精确去重 + 模糊去重(提升多样性,降低重复记忆)
  • 筛选:去掉冒犯性语言、占位符文本、源代码噪声等(提升质量)
  • 分词:token 数量直接影响训练吞吐,因此分词与词表策略会影响训练效率与覆盖能力
(2) 统一词表:BBPE + cl100k_base 合并到 15 万

你描述的是一个很典型的“多语统一词表”做法:

  • 用 BBPE 分别训练中文与多语词表
  • 再与 tiktoken 的 cl100k_base 合并,形成约 15 万规模的统一词表

这类策略的目的通常是:

  • 兼顾中文粒度与英文/代码的高效切分
  • 在跨域数据里维持较稳定的 token 分布与吞吐

最终训练中对不同数据来源赋权重(提高书籍、维基等高质量来源权重)也是常见的数据配方思想:让高价值数据在梯度里“更响亮”


5.3 长文本:从扩展位置编码到长文本继续预训练与对齐

GLM4 把上下文扩展到 1M 的路线通常包含三步(你提到的关键词非常到位):

  1. 位置编码扩展(让模型结构上“能放下更长序列”)
  2. 长文本继续预训练(让模型统计上“学会在长序列里工作”)
  3. 长文本对齐(让模型行为上“在长上下文里更可控、更符合人类偏好”)

在长上下文场景,一个典型问题是:模型可能“能读到”,但不一定“会用好”,例如:

  • 重要信息被远距离稀释
  • 召回错误段落
  • 在长文里出现自相矛盾与遗忘

因此继续预训练与对齐是必要步骤。


6. 对齐训练:SFT 与 RLHF 的分工

对齐训练(post-training)的目标是让模型输出更符合人类偏好:指令遵循、多轮一致性、安全、事实性与帮助性等。

6.1 SFT:用高质量真实交互塑形“基本行为”

SFT 的核心价值在于:

  • 建立指令遵循的“默认模式”
  • 学会多轮对话格式、礼貌与结构
  • 把“能说”变成“会按人类方式说”

很多体系会强调:真实人类 prompt 与真实交互比模板化数据更重要,因为它覆盖了真实分布中的含糊指令、上下文省略与多目标需求。

6.2 RLHF:进一步修正拒答、安全、事实与一致性等行为

即便 SFT 已经对齐了大量行为,RLHF 仍常用于补强:

  • 不恰当拒答与过度拒答
  • 安全与合规边界
  • 事实性与幻觉控制
  • 多语言混合、多轮连贯与风格一致性

从“标注维度”来看,经常包括:安全性、事实性、相关性、帮助性、总体偏好等。


7. ChatGLM 技术栈:从长上下文对齐到自我评价数据选择

你列的技术点覆盖面很广,这里按“它们解决什么问题”来组织:

7.1 LongAlign:长上下文对齐配方

长上下文不仅是把 LLL(序列长度)变大,还需要:

  • 让模型在长文里更稳定地定位证据
  • 让回答不被无关信息干扰
  • 让多步推理在长上下文里不发散

LongAlign 类型的工作通常就是围绕这些行为稳定性进行数据与训练策略设计。

7.2 ChatGLM-Math:自我评价驱动的数据筛选/构造

“用自我评价而不是外部模型或人工注释来选择数据”的动机是:

  • 降低昂贵标注成本
  • 让模型从大量候选推理轨迹里筛选出更有效的样本
  • 在数学这类可验证性强的领域更容易落地(例如一致性检查、格式检查、步骤合理性评分)

一个直观例子:
同一道题生成多条解题过程,模型对每条过程做自评打分或规则校验,保留高质量轨迹做再训练。这样可以把“生成能力”转化为“数据生产力”。

7.3 ChatGLM-RLHF:Reward Model 与对齐工程技巧

RLHF 的难点通常集中在:

  • 奖励模型的稳定训练与泛化
  • 奖励 hacking 与过拟合
  • KL 约束与探索强度
  • 多维偏好(安全/事实/帮助性)之间的权衡

实践型总结往往比单一算法描述更有价值,因为它给出“如何训得稳”的经验配方。

7.4 Self-Contrast:用模型自生成负样本降低标注成本

Self-Contrast 的核心是:

  • 让 target LLM 自己生成大量“对比用负样本”
  • 用这些负样本构造偏好对或对比学习信号
  • 减少人工偏好数据依赖

可以把它理解为“用模型的错误与次优答案当作免费的训练信号”。

7.5 AgentTuning:把工具交互轨迹纳入指令微调

Agent 能力不是只靠文本对话学来的,而需要“行动序列”数据:

  • 识别目标
  • 规划步骤
  • 调用工具
  • 读取结果
  • 纠错与重试
  • 汇总输出

AgentTuning 类型的框架通常会构建高质量交互轨迹数据集,把“会用工具”变成模型的可学习行为模式。

7.6 APAR:面向结构化输出的并行自回归

层次化结构化输出(如计划、表格、分段推理)常带来推理延迟。APAR 的目标是让模型在保持自回归正确性的前提下,学习一种“可并行化的生成规划与执行”方式,从而提升生成效率。它本质是把“生成过程”也纳入训练对象:模型不仅输出内容,还输出生成的组织方式。


8. GLM4 All Tools:面向工具调用的对齐目标

GLM4 All Tools 的定位非常清晰:
模型需要能 理解用户意图规划复杂指令,并调用一个或多个工具(Web 浏览、Python、图像理解等)完成任务。

一个典型的工具调用闭环可以概括为:

  1. 意图识别:把用户目标拆解为子目标
  2. 工具选择:决定何时用 Web、何时用计算、何时用图像理解
  3. 执行与读取:调用工具、读取输出
  4. 纠错与迭代:发现信息不足时再次调用
  5. 汇总回答:把证据组织成最终结果

这类能力的训练关键不在“会不会调用”,而在“什么时候调用、调用什么、以及如何把工具结果转化为可解释输出”。


9. GLM4.5:面向 Agentic / Reasoning / Coding 的开源 MoE

GLM-4.5 把重点推到三个方向:

  • 智能体(Agentic)
  • 推理(Reasoning)
  • 编码(Coding)

并且明确提出“混合推理模式”:复杂任务用思考模式,即时任务用直接响应模式。

9.1 参数规模与 MoE 的意义

  • GLM-4.5:总参数 355B,激活参数 32B
  • GLM-4.5-Air:总参数 106B,激活参数 12B

MoE(Mixture of Experts)的核心优势是:
参数很大,但每次只激活一部分专家,因此推理成本更接近“激活参数规模”,而不是“总参数规模”。这使得模型可以在可控成本下获得更强容量。


9.2 架构设计:深度优先、注意力增强、路由与 MTP

(1) 深度优先设计:更深而非更宽

GLM-4.5 系列选择减少宽度、增加层数(更多 MoE 层),动机是让模型在推理等能力上更受益。直觉上:

  • 深度更利于形成分层抽象与长链推理
  • 宽度更偏向并行表征容量
(2) 注意力机制:GQA + 部分 RoPE + 更多 heads + QK-Norm

你提到注意力头数提升到 96(隐藏维度 5120),并引入 QK-Norm 稳定 attention logits。这里可以理解为:在不明显降低训练 loss 的情况下,通过更强的注意力结构提升推理类基准(如 MMLU、BBH)的表现。

QK-Norm 的直观作用是把 Query/Key 的尺度拉回到稳定区间,避免长序列或深层网络里 logits 过大导致注意力分布极端化。

(3) MoE 路由:loss-free balance routing + sigmoid 门控

路由策略的目标是同时满足:

  • 负载均衡(不要某些专家过热)
  • 专家分工(不要所有专家学成一样)
  • 训练稳定(不要引入强耦合的额外损失导致不稳定)

“loss-free balance routing”强调用路由机制本身实现均衡,而非额外加一个很重的负载均衡损失项。

(4) MTP 层:Multi-Token Prediction 与推理投机解码

加入一层 MoE 作为 MTP 层,并支持推理时 speculative decoding,核心目标是:在保持质量的前提下提高生成吞吐。投机解码的直觉是:

  • 用更快的机制提出候选 token
  • 再由主模型验证/修正
    从而减少逐 token 解码的串行瓶颈。

10. GLM-4.5 的训练流程:Pre-training →\rightarrow Mid-training →\rightarrow Post-training

10.1 预训练(Pre-training):23T token 的多源数据与质量分桶

(1) 数据来源

网页(中英文为主)、社交媒体、书籍与论文、代码仓库等,总计约 23T tokens。

(2) 质量控制与去重
  • 网页:参考 Nemotron-CC 分质量桶,优先采高质量桶、丢弃最低质量桶
  • 去重:用 SemDedup 处理模板相似网页(弥补 MinHash 对结构化重复的不足)
(3) 多语言与教育价值筛选

用质量分类器评估文档“教育价值”,优先采样高价值内容,避免社交媒体噪声吞没训练信号。

(4) 代码数据治理:三层质量分级 + FIM 目标
  • 规则过滤去掉低质量/无意义代码
  • 质量模型把代码分三级,只保留并优先采高质量代码
  • 使用 Fill-In-the-Middle(FIM)目标增强代码补全与编辑能力
(5) 数学与科学数据:评分 + 分类器预测 + 高分优先

用大模型对教育内容占比打分,再训练分类器预测评分,构造“高密度数学/科学知识”的优先采样机制。

(6) 两阶段预训练策略
  • 阶段 1:通用网页文档为主,打基础语言能力
  • 阶段 2:提高代码、数学、科学相关数据占比,强化专业能力

10.2 中期训练(Mid-training):用中等规模领域数据把能力“拧紧”

中期训练的目标是弥补纯预训练的局限:预训练提供广覆盖能力,但在复杂推理、软件工程、长上下文与智能体交互上往往需要更集中、更任务化的数据。

(1) Repo-level Code Training(代码仓库级训练)

把同一仓库多个文件拼在一起训练,让模型学习跨文件依赖;并纳入 issues、PRs、commits 强化真实开发场景适配。把序列长度从 4K 扩到 32K,有利于容纳真实仓库上下文。

(2) Synthetic Reasoning Data Training(合成推理数据)

收集数学、科学、编程竞赛问答,用推理模型生成详细推理过程,增强多步逻辑推导能力。

(3) Long-context & Agent Training(长上下文与智能体)
  • 把序列长度进一步扩到 128K,优先采样长文档
  • 引入大规模合成智能体轨迹数据,让模型学会工具交互与多步任务执行

10.3 后训练(Post-training):SFT 冷启动 + 整体 SFT

你提到“冷启动 SFT”和“整体 SFT”,可以理解为:

  • 冷启动:先把基本指令遵循、对话格式、基础偏好建立起来
  • 整体 SFT:蒸馏更强专家模型能力,并在“思考模式/直接响应模式”之间取得平衡

在 MoE 与 agentic 设定下,这种分阶段往往更稳:先学会基本对话与格式,再加强推理、编码与工具交互的高阶策略。


11. 小结:GLM 系列演进的主线

从 GLM1 到 GLM4.5,可以用三条主线概括:

  1. 目标函数演进
    从 Autoregressive Blank Infilling(统一理解与生成)走向更贴合对话、代码与智能体的数据与目标组合。

  2. 架构演进
    从 prefix-decoder 的“统一体”到 decoder-only 的“生态标准化”,再到 GLM4/4.5 的长上下文、GQA 与 MoE 的高效推理体系。

  3. 能力重心迁移
    从通用语言建模 →\rightarrow 对话对齐 →\rightarrow 长上下文稳定 →\rightarrow 工具调用与智能体交互 →\rightarrow 推理与工程化编码能力。

这条路线的本质是:让模型不仅“会说”,还要“会做”,并且在可控计算成本下持续提升推理与执行效率。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐