3句话速读全文:(1)2017年Transformer论文给了个Encoder+Decoder双塔,但GPT把它腰斩成只剩Decoder——当时所有人都觉得这是个「残疾设计」;(2)8年后,这个「残疾设计」统治了整个AI行业,而「完整版」Encoder-Decoder查无此人;(3)这篇文章不是教程,是踩坑实录:我从GPT-1追到GPT-3,用代码手撕因果掩码,再聊到2026年Mamba的挑战——告诉你Decoder-Only为什么赢了,以及它还能嚣张多久。
我押错了方向
2018年6月的一个深夜,我在实验室刷Arxiv看到了GPT论文。
第一反应是震惊——不是惊艳的那种震惊,是「这也能行?」的那种震惊。
Transformer的完整架构是Encoder读完整句子、Decoder逐词生成。OpenAI的Alec Radford团队干了一件事:把Encoder整个砍掉了,只留Decoder。 就像汽车工程师把一辆车的方向盘拆了,说「这样也能开」。
当时我的内心OS:有病吧。2026年回看,真正有病的是当时的我。
金句①:最颠覆性的创新,往往看起来像在破坏。
一、七年前那一刀——他们为什么砍掉Encoder?
1.1 Transformer的「原罪」
2017年的《Attention Is All You Need》给出的Transformer是个对称双塔结构。
Encoder吃完整句子,输出上下文表示;Decoder在这个表示上逐词生成。这个设计在翻译任务上近乎完美——Encoder看到整句法语,Decoder逐词吐出英语。
但到了做语言模型的时候,问题来了:语言模型不需要「理解完整句子再生成」,它需要「根据已经说过的,猜下一个」。
这就像两个人对话:
- Encoder模式:你先写完整篇演讲稿,我再逐句背诵。
- Decoder模式:你一边说,我一边接话。
哪个更像真实对话?显然是后者。但2018年几乎没人敢赌这个方向——砍掉Encoder在学术界相当于对Transformer「泼脏水」。
1.2 因果掩码:一个数学上的「小动作」
GPT的核心技术贡献只有一个:因果注意力掩码(Causal Attention Mask)。
在标准Self-Attention中,每个token能看到所有token——包括未来的。但在因果掩码下,位置 的token只能看到位置 的token。数学上就是一行的功夫:
这个 是关键——softmax后,未来的token被「清零」,当前位置无论如何也看不到后面的词。
听起来很engineering对不对?但它藏着后来席卷一切的种子。
1.3 117M:一个现在看起来像玩具的参数规模
GPT-1的参数量是117M。放在2026年看,比手机上的一个语音唤醒模型还小。
| 参数 | GPT-1 |
|---|---|
| 层数 | 12层 |
| 隐藏维度 | 768 |
| 注意力头数 | 12 |
| 参数量 | 117M |
但就是这个「玩具级」模型,在12个NLP任务上拿了SOTA。不是因为参数多,而是因为自回归的损失函数跟语言的本质更接近。
反常识观点①: GPT-1赢不是因为「参数大」或「架构好」,而是因为「因果语言建模」这个训练目标本身比「完形填空」更接近人类语言产生的自然过程。这在当时几乎没人注意到。
二、我的第一个踩坑:以为架构创新比规模更重要
2.1 13倍的膨胀:GPT-2
2019年的GPT-2把参数从117M飙升到1.5B——13倍的膨胀。架构上只做了两处微调:
- LayerNorm从post-norm改成pre-norm
- 权重初始化做了缩放
听起来像不是不说?但这两处微调让堆叠48层从「不可能」变成了「现实」。
训练深度学习模型就像盖楼——每加一层,地基承受的应力翻倍。Pre-Norm就是那个加固地基的方案。没有它,30层以上的Transformer会直接塌掉(梯度消失)。
我当时的一个关键误判: 我觉得GPT-2最牛的是1.5B参数。但现在回头看,最牛的是零样本迁移能力——翻译不用专门训练、阅读理解不用微调,在特定Prompt下就能工作。
当时我的反应是:这肯定是数据泄漏。后来被无数次打脸——它就是能零样本推理,而且参数越大效果越好。
金句②:零样本能力不是设计出来的,是规模堆出来的。
2.2 Scaling Law:被忽略的自然法则
2020年1月,Kaplan等人的论文揭示了Scaling Law——模型性能与参数量存在幂律关系:
关键发现:
- 性能随参数增长遵循幂律——没有饱和迹象
- 同时增大参数和数据比片面追一个更有效
- 计算预算的最优分配是:参数每翻3.3倍,数据量翻1倍
这个发现直接改变了整个行业的投资逻辑。之前人们纠结架构创新——这个Attention变体、那个归一化技巧。Scaling Law说:忘了那些微调,把算力砸下去就行。
当时我花了一个月时间尝试改进Transformer的局部注意力模式,结果Scaling Law一出,我那些工作直接被扫进了垃圾桶——不是不对,是没必要。
反常识观点②: 2020-2023年最正确的技术决策不是「选了什么模型架构」,而是「砸了多少算力」。架构微调带来的收益,在Scale面前连误差都算不上。
三、GPT-3:1750亿参数的赌局与我的第二次误判
3.1 架构没变,但一切变了
2020年的GPT-3,参数量从1.5B飙升到175B——再放大100倍。架构和GPT-2几乎一模一样:
| 参数 | GPT-2 | GPT-3 |
|---|---|---|
| 层数 | 48 | 96 |
| 隐藏维度 | 1600 | 12288 |
| 参数量 | 1.5B | 175B |
| 训练数据 | ~8B词 | ~500B词 |
我的第二个误判:我以为GPT-3会沿用GPT-2的架构,只是更大。但我漏掉了一个关键——涌现能力。
GPT-3展示出来的三种能力,在GPT-2时代只是可疑的苗头:
- In-Context Learning:给几个示例就能任务推理,不需要梯度更新
- Few-shot → Zero-shot平滑过渡:32-shot比0-shot高15个BLEU点,但0-shot已经够用了
- 初现的推理痕迹:数学推理上展示了超越随机的能力
金句③:涌现不是靠设计得来的,而是靠堆量「撞」出来的。
3.2 那个让我失眠的困惑
GPT-3出来之后我失眠了一周。
不是因为参数多——175B虽然大,但T5也有11B。真正让我睡不着的是:为什么一个被「阉割」了Encoder的架构,能比完整的Encoder-Decoder更强大?
一个可能的答案:Decoder-Only把「输入」和「输出」的界限模糊了。
在Decoder-Only中,Prompt和生成之间没有硬边界。模型看到的结构是:Q:法 国 的 首 都 是 什 么 ?A:巴 黎——因果掩码让「巴」能看到前面所有token(包括问题部分),但「黎」也只能看到「巴」和之前的token。没有像T5那样Encoder-decoder之间有一个显式的交叉注意力接口。
这种设计看似简单粗暴,但带来了两个巨大优势:
- 训练和推理形式完全统一——不存在「训练用Teacher Forcing,推理用自回归」的gap
- 长程依赖的隐式建模——所有信息在同一个注意力空间流动
原来如此时刻: 我终于明白了——Decoder-Only赢不是因为「生成比理解更重要」,而是因为「把理解统一到生成中」的设计更接近语言的本质。
3.3 一个trade-off:极限性能 vs 工程灵活性
GPT-3在SuperGLUE基准上Few-shot得分71.8,T5-XXL(11B)Fine-tuned得分88.3。Encoder-Decoder在微调后依然领先了十几个百分点。
但关键在于:T5-XXL的88.3分需要为每个任务单独微调。GPT-3的71.8分是零样本或少样本拿到的。
当你要做100个任务:
- T5需要100次微调,算力成本≈100倍训练
- GPT-3只需要100个Prompt,成本≈写100段文案
在工程落地上,灵活性的价值远超那十几百分点的性能差距。
四、代码里藏着真相:为什么因果掩码是真正的主角
4.1 Causal Self-Attention:三段代码讲清GPT的核心
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class CausalSelfAttention(nn.Module):
def __init__(self, d_model, n_heads, dropout=0.1):
super().__init__()
assert d_model % n_heads == 0
self.d_head = d_model // n_heads
self.n_heads = n_heads
self.c_attn = nn.Linear(d_model, 3 * d_model)
self.c_proj = nn.Linear(d_model, d_model)
self.dropout = nn.Dropout(dropout)
def forward(self, x):
B, T, C = x.shape
qkv = self.c_attn(x)
q, k, v = qkv.chunk(3, dim=-1)
q = q.view(B, T, self.n_heads, self.d_head).transpose(1, 2)
k = k.view(B, T, self.n_heads, self.d_head).transpose(1, 2)
v = v.view(B, T, self.n_heads, self.d_head).transpose(1, 2)
attn = (q @ k.transpose(-2, -1)) / math.sqrt(self.d_head)
# 核心:因果掩码——不准回头看
mask = torch.triu(torch.ones(T, T, device=x.device), diagonal=1)
attn = attn.masked_fill(mask.bool(), float('-inf'))
attn = F.softmax(attn, dim=-1)
attn = self.dropout(attn)
y = attn @ v
y = y.transpose(1, 2).contiguous().view(B, T, C)
y = self.c_proj(y)
return y
这段代码揭示了什么? 因果自注意力层,核心逻辑只有一行 masked_fill。Decoder-Only跟Encoder-Decoder的差异,最终归结为这一个掩码矩阵。工程上的简约到了极致,却撑起了万亿参数的经济体。
4.2 推理采样:最优≠全局最优
def generate_top_p(model, prompt_ids, max_new_tokens=50, top_p=0.9, temperature=1.0):
for _ in range(max_new_tokens):
logits = model(prompt_ids)
next_logits = logits[:, -1, :] / temperature
sorted_logits, sorted_indices = torch.sort(next_logits, descending=True)
cumulative_probs = torch.cumsum(F.softmax(sorted_logits, dim=-1), dim=-1)
sorted_indices_to_remove = cumulative_probs > top_p
sorted_indices_to_remove[..., 1:] = sorted_indices_to_remove[..., :-1].clone()
sorted_indices_to_remove[..., 0] = 0
indices_to_remove = sorted_indices_to_remove.scatter(
1, sorted_indices, sorted_indices_to_remove
)
next_logits[indices_to_remove] = float('-inf')
probs = F.softmax(next_logits, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
prompt_ids = torch.cat([prompt_ids, next_token], dim=-1)
return prompt_ids
这个Top-p采样展示了Decoder-Only最核心的矛盾:每一步选最优不一定会得到全局最优——就像下棋时每一步都走局部最好子,最后反而输了全局。Nucleus采样的思想是:保留那些「不是最优但仍有质量」的选择,反而能产生更自然的文本。这个洞察本身就是Top-p论文最大的贡献。
五、2026年回头看:Decoder-Only的终局与性能边界
5.1 涌现能力的门槛在哪?
Jason Wei等人的研究确认,某些能力只在特定参数阈值之上出现:
- 3-digit加法(准确率>80%):13B参数是门槛
- 字母拼接反转:7B参数开始出效果
- 国际化知识问答:175B参数下0-shot才达到实用水平
你没法让一个只背过10本书的学生回答100本书里才能看到的知识。模型大小决定了它能处理的推理深度上限。
5.2 截至2026年的性能边界
Decoder-Only的缺陷越来越清晰:
- 固定计算预算 —— 每个token生成的计算量完全相同。思考「法国首都」和「控制系统证明」花的算力一样多。
- 无法回溯 —— 生成错误token后无法修正。即使做了CoT,如果第3步推理错了,第7步生成得再好也白费。
- 注意力平方复杂度 —— FlashAttention优化得再好, 这个天花板是数学决定的。
5.3 Mamba的挑战
2024年Gu和Dao提出的Mamba2用状态空间模型替代注意力:
关键区别: 和 由输入动态决定——Mamba可以根据内容调整记忆窗。Attention的窗口大小由位置决定,不是内容决定。
但Mamba有它自己的问题:在需要「精确回忆」的任务上(如Passkey Retrieval)比同参数Transformer差10-20个点。
Trade-off: 2026年的现实是,Mamba在端侧部署和实时推理上赢了,云端大模型仍然用Decoder-Only。SSM不是替代Transformer,而是填补了Transformer不擅长的生态位。
| 场景 | 胜出架构 | 原因 |
|---|---|---|
| 云端大模型(100B+) | Decoder-Only + MoE | 涌现能力不可替代 |
| 端侧模型(1-8B) | Mamba / 混合SSM | 低延迟+低显存 |
| 代码/数学推理 | Decoder-Only + CoT | 精确回忆需要注意力 |
| 流式语音 | Mamba / RWKV | 线性时间复杂度 |
结语:Decoder-Only教会了我什么
回溯8年,我的判断失误了两次、踩坑了两次、在深夜困惑了无数次,但Decoder-Only的胜利不仅是技术细节的胜利,更是设计哲学的胜利:
- 简洁胜过聪明 —— 去掉Encoder不是随意的简化,而是找到了生成任务的原子化抽象。因果掩码+自回归+Cross-Entropy,三个概念加起来不超过10行数学公式,却定义了整个行业。
- Scale驱动理解 —— 没人能提前预测In-Context Learning,但Scale Law告诉我们只要规模到了,奇迹自己会来。
- 统一胜过分化 —— 一个架构吃所有任务,比N个专精模型更有工程价值。
从GPT-1的117M到今天的万亿参数,Decoder-Only证明了:生成不是理解的副产物——生成本身就是理解。
这个结论对我的日常工作意味着什么?当我设计新模型时,「Encoder搞理解,Decoder搞生成」这个直觉是错的。把学习和生成用一个一致性框架统一起来,比分割成两个模块更符合语言的本质。
2026年的今天,架构成熟了,但问题翻新了:Mamba来了、MoE普及了、推理时计算开始改变Scaling的方式。Decoder-Only或许不是终点——但它必定是所有未来架构的基准线。新架构的第一个问题永远是「它能达到GPT-3级别的质量吗?」
这是Decoder-Only留给我们这代AI从业者的终极拷问。
参考文献
- Vaswani et al. (2017). Attention Is All You Need. NeurIPS.
- Radford et al. (2018). Improving Language Understanding by Generative Pre-Training (GPT-1).
- Radford et al. (2019). Language Models are Unsupervised Multitask Learners (GPT-2).
- Brown et al. (2020). Language Models are Few-Shot Learners (GPT-3). NeurIPS.
- Kaplan et al. (2020). Scaling Laws for Neural Language Models.
- Wei et al. (2022). Emergent Abilities of Large Language Models.
- Gu & Dao (2024). Mamba2: Selective State Space Model.