5.1 GLM 系列:从 Autoregressive Blank Infilling 到 Agentic MoE
GLM 的关键在于 attention mask 的设计。Part A 内 tokens彼此可见(双向注意力)不可见Part B tokens(避免“偷看答案”)可见Part A(需要条件信息)可见Part B 中过去 tokens,不可见未来 tokens(因果自回归)如果将拼接后的序列记为A;B[A;B]A;B,对任意两个位置iji,jij若i∈Ai \in Ai∈A且j∈Aj \in Aj∈
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 Ai∈A 且 j∈Aj \in Aj∈A:允许 attention
- 若 i∈Ai \in Ai∈A 且 j∈Bj \in Bj∈B:禁止 attention
- 若 i∈Bi \in Bi∈B 且 j∈Aj \in Aj∈A:允许 attention
- 若 i∈Bi \in Bi∈B 且 j∈Bj \in Bj∈B:仅当 j≤ij \le ij≤i 允许 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_1Q1→A1
- Q1A1Q2→A2Q_1A_1Q_2 \rightarrow A_2Q1A1Q2→A2
- Q1A1Q2A2Q3→A3Q_1A_1Q_2A_2Q_3 \rightarrow A_3Q1A1Q2A2Q3→A3
这样会带来:
- 数据膨胀(同一对话被拆成多条样本)
- 不同轮次权重/学习信号分布不均匀
- 工程上更复杂
(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−logp(xt∣x<t) \mathcal{L} = \sum_{t \in A_1 \cup A_2 \cup A_3} -\log p(x_t | x_{<t}) L=t∈A1∪A2∪A3∑−logp(xt∣x<t)
这意味着:
- 一条样本就覆盖多轮训练信号
- 实现简单,生态兼容(与 LLaMA 类架构一致)
- 也解释了二维位置编码等 prefix-decoder 特有机制逐步淡出:对话训练范式变了,不再需要那套结构
4. GLM3:延续 ChatGLM2 架构,做词表与细节优化
GLM3(ChatGLM3)整体架构延续 ChatGLM2,更多是“系统化的工程与细节收敛”。
你列出的关键差异点:
- 词表变小:从 ChatGLM 的 150528 缩到 65024
- 词表更小通常意味着 embedding 与 LM head 参数减少,加载/推理更快
- 对中文与多语混合的覆盖策略更精炼
- 位置编码从每个 block 一份提升为全局一份
- 更一致、更省参数、实现更简洁
- 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 的路线通常包含三步(你提到的关键词非常到位):
- 位置编码扩展(让模型结构上“能放下更长序列”)
- 长文本继续预训练(让模型统计上“学会在长序列里工作”)
- 长文本对齐(让模型行为上“在长上下文里更可控、更符合人类偏好”)
在长上下文场景,一个典型问题是:模型可能“能读到”,但不一定“会用好”,例如:
- 重要信息被远距离稀释
- 召回错误段落
- 在长文里出现自相矛盾与遗忘
因此继续预训练与对齐是必要步骤。
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、图像理解等)完成任务。
一个典型的工具调用闭环可以概括为:
- 意图识别:把用户目标拆解为子目标
- 工具选择:决定何时用 Web、何时用计算、何时用图像理解
- 执行与读取:调用工具、读取输出
- 纠错与迭代:发现信息不足时再次调用
- 汇总回答:把证据组织成最终结果
这类能力的训练关键不在“会不会调用”,而在“什么时候调用、调用什么、以及如何把工具结果转化为可解释输出”。
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,可以用三条主线概括:
-
目标函数演进:
从 Autoregressive Blank Infilling(统一理解与生成)走向更贴合对话、代码与智能体的数据与目标组合。 -
架构演进:
从 prefix-decoder 的“统一体”到 decoder-only 的“生态标准化”,再到 GLM4/4.5 的长上下文、GQA 与 MoE 的高效推理体系。 -
能力重心迁移:
从通用语言建模 →\rightarrow→ 对话对齐 →\rightarrow→ 长上下文稳定 →\rightarrow→ 工具调用与智能体交互 →\rightarrow→ 推理与工程化编码能力。
这条路线的本质是:让模型不仅“会说”,还要“会做”,并且在可控计算成本下持续提升推理与执行效率。
更多推荐
所有评论(0)