AI 很难理解?一文带你搞懂 Transformer:现代大模型到底是怎么来的

18 阅读18分钟

AI 很难理解?一文带你搞懂 Transformer:现代大模型到底是怎么来的

很多人第一次学 Transformer,都会卡在同一个地方:一上来就是 Q、K、V,接着是 Multi-Head Attention,再接着是 Add & Norm、FFN、Encoder、Decoder、Mask,最后扔出一个公式:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

你盯着这个公式看半天,感觉每个字母都认识,但不知道它为什么要长成这样。

这不是你理解能力的问题。Transformer 之所以难,很多时候不是因为它本身不可理解,而是因为它经常被当成一个“成品机器”来讲:把论文图贴出来,把每个模块逐个解释一遍,然后告诉你“这就是现代 AI 的核心”。可如果不知道它是从什么问题里长出来的,你当然会觉得它像外星科技。

Transformer 不是从天上掉下来的。它是自然语言处理长期演化到 2017 年时,一个非常工程化、非常聪明的解法。它解决的不是一个抽象问题,而是当时机器翻译和序列建模里的几个老麻烦:句子太长记不住,词与词的关系绕太远,RNN 训练太慢,模型很难同时利用全句信息和 GPU 并行能力。

这篇文章不把 Transformer 当成一个神秘架构来背,而是从它出现前的技术困境讲起。你只要抓住一条主线:人类一直在想办法让机器更好地表示语言里的“关系”。理解这条线,QKV、Attention、FFN、Decoder 都会顺下来。

Transformer 原论文架构图

图源:Vaswani et al., 2017, Attention Is All You Need, Figure 1。第一次看这张图很容易被吓住,因为它把最后的工程成品一次性摆在你面前。换个角度看,左边是 Encoder,右边是 Decoder,中间反复出现的 Attention、FFN、Add & Norm,其实都是为了解决前面那些历史问题。

先把问题说清楚:语言模型到底在干什么

语言对机器来说,一开始不是“意思”,而是一串符号。

比如这句话:

我 今天 想 学 Transformer

机器最早能看到的只是一些离散的 token。它不知道“今天”和“昨天”接近,也不知道“学 Transformer”和“理解 AI”有关,更不知道“它”在句子里可能指代前面某个名词。

所以自然语言处理的核心问题,一直不是简单地“让机器看懂文字”,而是把文字变成一种可以计算的表示。这个表示最好满足几个条件:相似的词距离近,不同语境下同一个词能有不同含义,长句子里的远距离依赖不能断,模型还要能高效训练。

早期统计语言模型更多依赖 n-gram,也就是看前几个词来猜下一个词。它有一个明显问题:窗口太短,语义太浅。后来神经语言模型开始把词变成向量,Word2Vec、GloVe 这类词向量让“词的相似性”第一次变得很直观。你可以把“国王”“王后”“男人”“女人”放进同一个向量空间里,模型不再只是在数词频,而是在学习分布里的关系。

但词向量仍然有一个根本缺陷:它通常给一个词一个相对固定的向量。可真实语言里,同一个词在不同上下文里意思可能完全不同。

“我在银行取钱”和“我坐在河岸边”,英文里都可能出现 bank。一个固定词向量很难同时处理这两种语义。于是下一个问题出现了:能不能让一个词的表示随着上下文变化?

这就是 RNN、LSTM、Seq2Seq 那一代方法要解决的问题。

RNN 的想法很自然,但它天生跑不快

RNN 的直觉很好理解:读句子就像人看书一样,从左到右,一个词一个词读。每读一个词,就把当前看到的信息更新到一个隐藏状态里。

我 -> 今天 -> 想 -> 学 -> Transformer
      状态不断更新

这样做的好处是,模型不再孤立地看每个词,而是能把前文信息带到后面。LSTM 又进一步缓解了普通 RNN 容易遗忘长距离信息的问题。到了 2014 年左右,Seq2Seq 模型开始流行:一个 RNN 负责把源句子编码成向量,另一个 RNN 负责从这个向量生成目标句子。

机器翻译里可以这么理解:

英文句子 -> Encoder 读完整句 -> 压成一个向量 -> Decoder 生成中文句子

这已经很厉害了。Sutskever、Vinyals、Le 的 Seq2Seq 工作证明,深层 LSTM 可以把一个可变长度序列映射到另一个可变长度序列。Cho 等人的 RNN Encoder-Decoder 也证明,这类模型可以学习到有意义的短语表示。

问题也很明显:你让一个向量背完整个句子,负担太重。

如果源句子很短,问题不大。可如果句子很长,前面的信息经过很多步传到后面,容易损失。更麻烦的是,RNN 必须按顺序读。第 10 个词的计算要等第 9 个词算完,第 100 个词要等前面 99 个词一路传过来。GPU 擅长大规模并行矩阵计算,但 RNN 的顺序结构天然不够友好。

所以很多人觉得 Transformer 难,其实是因为少了一段铺垫:Transformer 首先不是为了“造一个大模型”,而是在回答一个非常现实的问题:如果语言里的词与词关系很复杂,我们能不能不要一步一步传话,而是让每个词直接看见全句?

这个想法,就是 Attention。

Attention 的出现:别把整句话塞进一个箱子,让模型自己回头看

Attention 最早在神经机器翻译里变得重要,是因为它解决了 Seq2Seq 的一个痛点:Decoder 生成每个词时,不应该只依赖那个被压缩过的固定向量,而应该能回头看源句子的不同位置。

翻译“the bank of the river”时,生成“岸边”还是“银行”,关键要看 river。传统 RNN 需要通过隐藏状态一步步把这个信息传过来;Attention 的思路更直接:当模型要处理 bank 时,就去看整句话里哪些词和它最相关。

这一步非常关键。Attention 不是“注意力很像人类注意力”这么简单,它在工程上做了一件事:把信息传递路径变短。

以前的信息流像接力:

river -> ... -> ... -> bank

Attention 让它变成直连:

bank <------> river

这就是为什么 Google 在介绍 Transformer 时会强调,RNN 处理远距离词关系要走很多步,而 Transformer 的 self-attention 可以直接建模句子里任意两个词的关系。

先记住这句话:Attention 的核心不是“玄学注意力”,而是“让当前位置按相关性从其他位置取信息”。

Q、K、V:最容易被讲玄的地方,其实像一次检索

现在终于可以讲 QKV 了。

很多教程一上来讲 Q、K、V,会让人觉得这三个字母像某种数学咒语。其实它们可以先按“检索系统”理解。

假设你在资料库里查东西。你会提出一个查询,这就是 Query。资料库里的每条资料会有一个可匹配的标签,这就是 Key。真正要拿走的内容,是 Value。

Query:我现在想找什么?
Key:每条信息拿什么来和我匹配?
Value:如果匹配上了,我真正取走什么内容?

放回 Transformer 里,每个 token 原本都有一个向量。模型会用三组不同的线性变换,把同一个 token 向量投影成 Q、K、V:

x -> Q = xWq
x -> K = xWk
x -> V = xWv

为什么同一个词要拆成三份?因为“我拿什么去问”“我拿什么被别人匹配”“我提供什么内容给别人使用”,这三件事不一定应该用同一个表示。

比如句子:

The animal didn't cross the street because it was too tired.

这里 it 指 animal。模型处理 it 时,它的 Query 可以理解成:“我需要找一个能解释我指代对象的词”。animal 的 Key 可能和这个 Query 匹配得很高。匹配后,animal 对应的 Value 就会被更多混入 it 的新表示里。

真正的计算就是三步。

第一步,算相似度:

score = QK^T

第二步,缩放后做 softmax,把分数变成权重:

weight = softmax(score / sqrt(d_k))

第三步,用权重加权求和 Value:

new representation = weight * V

Scaled Dot-Product Attention 与 Multi-Head Attention 原论文图

图源:Vaswani et al., 2017, Attention Is All You Need, Figure 2。左图就是 Q 和 K 先做匹配,缩放后经过 softmax 变成权重,再去加权取 V;右图是把这件事并行做多次,再拼起来。QKV 难懂,常常只是因为教程跳过了“检索”这个直觉。

所以 Attention 公式不是凭空来的。它就是“先匹配,再归一化,再取内容”。

难点在哪里?难点在很多文章直接从公式讲起,却没有先说:QKV 本质上是模型内部的一套可学习检索机制。你把它看成数据库检索,突然就顺了。

Self-Attention:一句话里的每个词,都重新理解自己

普通 Attention 可以发生在 Decoder 和 Encoder 之间:Decoder 生成目标词时,去看源句子。

Transformer 更重要的创新是 self-attention。Self-attention 的意思是:同一句话内部,每个 token 都拿自己生成的 Query,去和这句话里所有 token 的 Key 匹配,然后从它们的 Value 里取信息,更新自己的表示。

这一步会让每个词都变成“带上下文的词”。

原始表示:
bank = 一个比较模糊的向量

经过 self-attention:
bank + river 的信息 -> 更像“河岸”
bank + money 的信息 -> 更像“银行”

这就是 Transformer 看起来聪明的原因之一。它不是给每个词一个死板标签,而是在每一层里反复重写每个词的表示。第一层可能学局部搭配,后面层可能学指代、句法、语义关系。到了多层之后,一个 token 的向量已经不只是它自己,而是它和全句关系的压缩结果。

这也解释了为什么 Transformer 比早期固定词向量强很多。Word2Vec 时代,一个词大体只有一个向量;Transformer 时代,词向量会被上下文动态改写。

Multi-Head Attention:不是一个人拍脑袋,而是多组视角同时看

如果只有一套 QKV,模型只能用一种方式看关系。但语言关系很多:有的词要看主谓关系,有的要看指代关系,有的要看修饰关系,有的要看位置附近的词,有的要看远处的关键词。

Multi-Head Attention 的想法是:不要只让模型学一套注意力,而是并行学多套。一套 head 可能更容易盯近邻搭配,另一套可能更容易盯主谓关系,还有的 head 可能在训练中学会处理指代或长距离依赖。

每个 head 有自己的 Wq、Wk、Wv。它们分别算自己的 attention,最后把结果拼起来,再经过一次线性变换。

这不是人为指定每个 head 学什么,模型会自己在训练中分工。也不是说每个 head 都一定有清晰的人类可解释含义,但多头机制确实给模型提供了多个关系子空间。语言不是一种关系,多头就是给复杂关系留空间。

这也是很多初学者觉得难的第二个原因:Multi-Head Attention 经常被讲成“多个头并行”,但没有解释为什么需要多个头。其实一句话就够:语言关系太多,一套注意力不够用。

FFN:Attention 负责交流,FFN 负责加工

Transformer 每一层里,Attention 后面通常还会接一个 FFN,也就是前馈神经网络。

很多人会忽略 FFN,觉得 Transformer 的核心只有 Attention。但如果只靠 Attention,模型只是把不同位置的信息混合起来,还需要一个模块对每个位置的新表示做非线性加工。

可以这样理解:

Attention:这个词应该从哪些词那里拿信息?
FFN:拿到信息后,怎么重新加工成更有用的特征?

Attention 是跨 token 的信息交换,FFN 是每个 token 自己内部的特征处理。它通常对每个位置独立应用,但所有位置共享同一套参数。

这就像开会。Attention 是大家互相听取意见,FFN 是每个人把听到的信息消化成自己的新判断。下一层再开会,再消化。重复很多层后,表示就越来越复杂。

这也能解释为什么 Transformer 看起来像一个完整成品。它不是只有一个巧妙公式,而是把几个分工明确的模块拼成了稳定结构:先交流,再加工;再交流,再加工。

Add & Norm:为什么每层旁边还有残差和归一化

Transformer 论文图里还有 Add & Norm。很多教程讲到这里会变成模块名背诵,但它其实是深层网络训练的工程经验。

Add 是残差连接。意思是每一层不要完全覆盖原表示,而是在原表示基础上加上新变化。

new_x = x + sublayer(x)

这样做可以让深层模型更容易训练。因为如果某层暂时学得不好,至少原来的信息还能通过残差路径传下去。

Norm 是 Layer Normalization,用来稳定每层输出的尺度。深层网络里,如果每层输出分布飘来飘去,训练会很不稳定。归一化就像给每一层的数值做校准。

所以 Add & Norm 不是理解语义的核心,但它是 Transformer 能堆深、能稳定训练的重要工程部件。

Encoder 和 Decoder:原版 Transformer 是为翻译设计的

今天很多人说 Transformer,会直接想到 GPT。但原始 Transformer 不是 GPT,它是机器翻译模型,结构是 Encoder-Decoder。

Encoder 读源语言句子,负责理解输入。Decoder 生成目标语言句子,负责一步步输出翻译。

原始结构大概是这样:

源句子 -> Encoder 层堆叠 -> 源句子的上下文表示
                           ↓
目标句子前缀 -> Decoder 层堆叠 -> 预测下一个目标词

Encoder 里主要是 self-attention:源句子内部每个词互相看。

Decoder 里有三件事。

第一,它也有 self-attention,但必须加 mask。因为生成时不能偷看未来词。模型预测第 5 个词时,只能看前 4 个词。

已生成:我 今天 想
要预测:学
不能看:Transformer

第二,Decoder 有 cross-attention。也就是目标语言这边生成每个词时,要去看 Encoder 输出的源句子表示。

第三,Decoder 后面同样有 FFN、残差连接、归一化。

所以 Decoder 并不是“一个会写字的黑箱”。它的工作方式很明确:先看已经生成的目标前缀,再看源句子,再加工,然后预测下一个 token。

GPT、BERT 为什么都是 Transformer,却长得不一样

理解 Encoder-Decoder 后,再看 BERT 和 GPT 就不乱了。

BERT 基本是 encoder-only。它适合做理解任务,因为它可以双向看上下文。Devlin 等人的 BERT 论文里强调,BERT 通过左右上下文联合预训练深层双向表示,然后可以用很少的任务特定改动适配问答、自然语言推断等任务。

GPT 基本是 decoder-only。它适合生成任务,因为它按从左到右的方式预测下一个 token。GPT 系列后来的惊人能力,本质上来自 decoder-only Transformer、大规模语料、足够模型规模和训练工程的叠加。

所以不要把 Transformer、BERT、GPT 混成一团。Transformer 是架构家族,BERT 和 GPT 是这个家族在不同任务目标下的两条典型路线。

原始 Transformer 是 Encoder + Decoder,主要面向机器翻译;BERT 主要用 Encoder,偏理解;GPT 主要用 Decoder,偏生成。把这三件事分清,很多“大模型架构”的讨论会立刻清爽很多。

大模型时代真正放大的,是 decoder-only Transformer 的生成能力。模型不断读入上下文,预测下一个 token。只要训练数据足够大、参数足够多、指令对齐做得足够好,这个简单目标就能长出写作、代码、翻译、问答、推理等能力。

为什么 Transformer 看起来像一个“成品”

Transformer 容易让人误会,因为它不像一个单点技巧,更像一套一次性拼好的工业结构。

它有表示输入的 embedding,有补位置信息的 positional encoding,有负责关系建模的 attention,有负责特征加工的 FFN,有帮助训练稳定的残差和归一化,有适合翻译的 encoder-decoder,也有适合生成的 masked decoder。

这就是它看起来“成品感”很强的原因。但这个成品不是凭空设计出来的,而是之前很多问题一路逼出来的。

如果 RNN 不慢,Transformer 不会那么有吸引力;如果 Seq2Seq 没有固定向量瓶颈,Attention 不会那么关键;如果词向量不能处理上下文歧义,self-attention 的价值不会那么明显;如果 GPU/TPU 不擅长并行矩阵计算,去掉 recurrence 的收益也不会那么大。

Transformer 的伟大,不是发明了“智能”,而是把当时已经存在的几条线索合成了一个极其适合规模化训练的结构。

为什么别人会觉得它难

很多人觉得 Transformer 难,通常不是卡在某个单独概念,而是被教学顺序坑了。

最常见的问题,是教程从结构图开始讲。结构图当然准确,但它是结果,不是原因。你先看结果,就像第一次学汽车直接看发动机剖面图,很容易被零件淹没。

另一个问题,是很多教程从公式开始讲 QKV。公式是对的,但如果没有“检索”这个直觉,QKV 就像三个强行命名的矩阵。再往前追,很多教程也没有讲 RNN 和 Seq2Seq 的历史问题。你不知道 Transformer 要解决什么,就很难理解为什么它要去掉 recurrence,为什么要 self-attention,为什么要 mask,为什么要多头。

还有一个经常被混淆的地方,是把 GPT 的 decoder-only 架构直接等同于原始 Transformer。结果初学者一边看 encoder-decoder 图,一边听别人讲 GPT 生成,当然混乱。

真正清楚的讲法应该是:先讲语言表示的历史,再讲 RNN 的顺序瓶颈,再讲 Attention 缩短信号路径,再讲 Transformer 如何把 Attention 做成可并行、可堆叠、可规模化的架构。

沿着这条线走,Transformer 就不再像神秘公式,而像一个自然演化出来的答案。

用一句话收束

Transformer 的核心不是“QKV 很高级”,也不是“Attention 很像人类注意力”。它真正厉害的地方,是让句子里的每个 token 都能直接和其他 token 建立关系,并且用高度并行的方式反复更新上下文表示。

Attention 决定该看谁,QKV 决定怎么匹配和取信息,Multi-Head 给不同语言关系留出多个视角,FFN 负责把拿到的信息继续加工,Decoder 负责在不能偷看未来的情况下逐步生成,残差和归一化则保证深层网络更稳定地训练。

当这些部件放在一起,再叠加大规模数据、算力和预训练,现代大模型就出现了。

所以 AI 并不是突然变聪明。它是几十年语言表示、序列建模、注意力机制、并行计算和工程训练共同演化出的结果。Transformer 看起来难,是因为我们经常从成品开始讲;一旦把来龙去脉补上,它其实是一套非常清晰的设计。

参考资料

Vaswani et al., 2017, Attention Is All You Need: arxiv.org/abs/1706.03…

Google Research, 2017, Transformer: A Novel Neural Network Architecture for Language Understanding: research.google/blog/transf…

Cho et al., 2014, Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation: arxiv.org/abs/1406.10…

Sutskever, Vinyals, Le, 2014, Sequence to Sequence Learning with Neural Networks: arxiv.org/abs/1409.32…

Bahdanau, Cho, Bengio, 2014, Neural Machine Translation by Jointly Learning to Align and Translate: arxiv.org/abs/1409.04…

Hochreiter and Schmidhuber, 1997, Long Short-Term Memory: doi.org/10.1162/nec…

Mikolov et al., 2013, Efficient Estimation of Word Representations in Vector Space: arxiv.org/abs/1301.37…

Pennington, Socher, Manning, 2014, GloVe: Global Vectors for Word Representation: www-nlp.stanford.edu/projects/gl…

Devlin et al., 2018, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding: arxiv.org/abs/1810.04…

Radford et al., 2018, Improving Language Understanding by Generative Pre-Training: cdn.openai.com/research-co…

Brown et al., 2020, Language Models are Few-Shot Learners: papers.neurips.cc/paper/2020/…