大模型主流架构对比
概述
基于Transformer发展出了三种主流架构:Encoder-Only、Decoder-Only、Encoder-Decoder,以及后来的Prefix Decoder。不同架构适合不同任务,现在大语言模型主流是Decoder-Only架构。
三类基本架构
1. Encoder-Only
特点
- 只有Encoder堆叠,使用双向自注意力,每个位置可以看到整个序列所有位置
- 预训练通常用掩码语言建模(MLM):随机mask掉一些token,预测被mask的token
- 适合自然语言理解任务(NLU):分类、实体识别、情感分析、信息抽取等
代表模型
- BERT、RoBERTa、ALBERT、Electra 等
优缺点
- ✅ 双向编码理解充分,NLU任务效果好
- ✅ 参数量相对小,推理速度快
- ❌ 不适合直接做生成任务,自回归生成效率低
2. Decoder-Only (Causal Decoder)
特点
- 只有Decoder堆叠,使用因果掩码自注意力(Causal Attention)
- 每个位置只能看到自己及前面的位置,看不到未来位置
- 预训练使用自回归语言建模(AR):根据前面token预测下一个token
- 适合文本生成任务,这也是现在大语言模型的主流范式
代表模型
- GPT-1/2/3/3.5/4、LLaMA、LLaMA2、Mistral 等
优缺点
- ✅ 预训练和推理都是自回归,一致,工程实现简单
- ✅ 训练效率高,Zero/Few-shot能力强,容易涌现能力
- ✅ 仅生成任务就统一了几乎所有NLP任务,范式简单
- ❌ Encoder双向编码理解可能不如Encoder-Only,但大模型参数量够大,弥补了这个缺点
3. Encoder-Decoder
特点
- 一部分是Encoder(双向编码源序列),一部分是Decoder(自回归生成目标序列)
- Decoder有两个注意力:掩码自注意力 + Encoder-Decoder交叉注意力(关注Encoder输出)
- 适合序列到序列任务:翻译、摘要、问答等
代表模型
- T5、Flan-T5、BART、Transformer原始翻译模型 等
优缺点
- ✅ Encoder双向理解源文本,Decoder生成,理论上对seq2seq任务更适合
- ❌ 训练效率比Decoder-Only低,通常需要多任务微调才能发挥最佳性能
- ❌ Zero-shot能力不如Decoder-Only,不适合大规模无监督预训练
4. Prefix Decoder(GLM/ChatGLM架构)
Prefix Decoder是介于因果Decoder和Encoder-Decoder之间的折中架构,也叫Encoder-Decoder 轻量版:
特点
- Prefix部分(输入上下文):双向注意力,所有prefix token互相可见
- 生成部分(输出):因果注意力,每个位置只能看到前面
- 相当于Encoder编码部分整合到Decoder里,只需要Decoder结构,不需要单独Encoder
- 兼具双向理解和自回归生成的特点
代表模型
- ChatGLM、ChatGLM2、GLM、U-PaLM 等
优缺点
- ✅ prefix双向理解比纯因果更好,对比Encoder-Decoder结构更简单
- ✅ 只用Decoder,工程实现比Encoder-Decoder简单
- ❌ 训练效率还是比纯Causal Decoder低
注意力Mask对比
| 架构类型 | Attention Mask 特点 | 每个位置能看到 |
|---|
| Causal Decoder (Decoder-Only) | 下三角掩码 | 只能看到当前位置及之前所有位置,看不到后面 |
| Encoder (Encoder-Only/Encoder-Decoder) | 无掩码(全可见) | 所有位置都能互相看见 |
| Prefix Decoder | 混合掩码 | prefix部分互相可见,prefix能被生成部分看见,生成部分只能看见前面 |
| Encoder-Decoder Cross Attention | KV来自Encoder,Q来自Decoder | Decoder每个位置都能看到Encoder所有位置 |
图示:
三种架构整体对比
| 特性 | Encoder-Only | Decoder-Only | Encoder-Decoder | Prefix Decoder |
|---|
| 预训练目标 | MLM | AR语言模型 | 序列到序列 | 自编码+AR混合 |
| 注意力 | 双向 | 因果掩码 | 双向Encoder + 掩码Decoder | 前缀双向 + 生成因果 |
| 适合任务 | NLU理解 | 通用文本生成 | Seq2seq翻译摘要 | 对话,理解生成混合 |
| Zero-shot能力 | 差 | 强 | 中 | 中 |
| 训练效率 | 中 | 最高 | 低 | 中 |
| 代表模型 | BERT | GPT, LLaMA | T5, BART | ChatGLM |
为什么现在主流是Decoder-Only?
主要原因:
- 预训练和推理一致:预训练就是自回归语言模型,推理生成也是自回归,行为一致,不需要改变范式
- Zero/Few-shot能力强:大规模无监督预训练后,Decoder-Only在零样本少样本上表现远好于Encoder-Decoder
- 训练效率高:只需要Decoder,不需要双部分,工程实现简单,训练速度更快
- 数据利用高效:大规模无标注语料上,自回归预训练最直接,能充分利用海量无标注数据
- 涌现能力:尺度上去之后,Decoder-Only更容易涌现出复杂能力
- 理论上的优势:有观点认为Encoder双向注意力会带来低秩问题,削弱表达能力;生成任务双向注意力本身没什么好处
- 工程实现优势:KV缓存推理简单,只需要一路,比Encoder-Decoder容易部署
在同等参数量、同等推理成本下,Decoder-Only整体表现最优,所以现在大模型主流都是Decoder-Only。
训练效率对比:
训练效率:Prefix Decoder < Causal Decoder
- Causal Decoder 会在所有 token 上计算损失
- Prefix Decoder 只会在输出部分计算损失
- 所以相同计算量下,Prefix Decoder训练更慢
训练目标对比
大模型训练目标主要有三种:
1. 自回归语言模型(AR)
- 目标:根据已有词预测下一个词,最大化似然
- 用于:Decoder-Only模型(GPT、LLaMA)
- 优点:简单直接,适合无监督大规模预训练,Zero-shot能力强
2. 去噪自编码器(DAE)
- 目标:随机替换/打乱一些文本段,训练模型恢复原文本
- 用于:T5、GLM-130B等
- 优点:适合处理填空,对理解任务好
- 缺点:实现更复杂,预训练成本更高
3. 掩码语言模型(MLM)
- 目标:随机mask一些token,预测被mask的token
- 用于:BERT、Encoder-Only模型
- 优点:双向编码,NLU效果好
- 缺点:不适合生成任务
面试常见问题
1. Causal Decoder 和 Prefix Decoder 和 Encoder-Decoder 区别是什么?
回答要点:
- 区别主要在于attention mask不同
- Encoder-Decoder:Encoder双向注意力编码输入,Decoder因果注意力生成,需要Encoder+Decoder两部分,训练效率低
- Causal Decoder (Decoder-Only):全程因果掩码,每个token只能看到前面,结构最简单,训练效率最高,Zero-shot最好
- Prefix Decoder:prefix输入双向,生成因果,是Encoder-Decoder和Causal之间的折中,结构比纯Decoder只需要一点点修改,理解更好但训练效率比Causal低
2. 为什么现在大模型大部分是Decoder-Only结构?
回答要点:
- Decoder-Only在大规模无监督预训练中Zero/Few-shot表现最好
- 预训练和推理都是自回归,行为一致,工程实现简单
- 训练效率更高,容易规模化
- 同等参数量推理成本下,Decoder-Only综合表现最优
- Encoder双向注意力可能存在低秩表达问题,对生成任务没有实质好处
- Encoder-Decoder通常需要多任务微调才能发挥好,不适合纯无监督大规模预训练
3. Encoder-Only适合什么场景?
回答要点:
- 纯自然语言理解任务(分类、实体识别、信息抽取)
- 对推理速度要求高,参数量不需要太大
- 单GPU就能部署,成本低
- 这种场景没必要上大Decoder-Only模型,用BERT系列足够,效果好速度快
4. Prefix Decoder的优势在哪里?
回答要点:
- 输入prefix用双向注意力,理解更充分
- 不需要单独Encoder,结构还是Decoder,工程比Encoder-Decoder简单
- 适合对话场景,输入context双向编码理解,输出自回归生成,是不错的折中
5. 涌现能力产生的原因可能是什么?
回答要点:
- 目前没有定论,主要两种解释:
- 任务评价指标不平滑,当模型增大,各个子任务效果平滑增长,最终整体任务效果突然提升,看起来像"涌现"
- 复杂任务由多个子任务构成,每个子任务随模型增大效果逐步提升,累积到一定程度整体任务效果才显现出来
6. 三大架构你会怎么选择?
回答要点:
- 如果是纯理解任务,小模型需求 → Encoder-Only(BERT系列)
- 如果是通用大语言模型,生成任务,需要Zero-shot → Decoder-Only(LLaMA/GPT系列)
- 如果是序列到序列任务(翻译、摘要),可以考虑Encoder-Decoder(T5)
- 如果是对话任务,想要兼顾理解和生成,可以考虑Prefix Decoder(ChatGLM)