引言
Transformer 是什么?架构是怎么样的?
正文
Transformer 是什么?架构是怎么样的?
假设 2050 年 AI 取代了人类,成为了蓝星扛把子,而人类正好又发明了时光机。答应我,回到 2017 年阻止那篇名叫《Attention Is All You Need》的论文发表。没有它,就没有 Transformer 架构,也就没有后来的 GPT、Gemini 这些大模型。
今天我们就假装不了解 Transformer 是什么,来看一下它的原理到底是怎么样的。
从翻译问题说起
货拉拉拉布拉多,短短 10 个字里有 6 个”拉”字,含拉量达到惊人的 60%,人一看就能理解它的意思,所以很自然就能翻译成英文:看,货拉拉 carry 了拉布拉多。
注意,关键是理解,所以才能翻译。但计算机却表示很难理解,因为每个”拉”字在不同的位置都代表不同的意思。尤其是中间这个”拉布拉”——在中文里”拉”可以表示拉货,也可以表示拉扯;在英文里,既可以翻译为 carry,也可以是 drag 或 pull。必须结合前面的”货拉拉”和后面的”拉布拉多”,才能准确理解”拉布拉”。
那么问题就来了:计算机该如何理解一句话里每个词的含义?
Token与向量
我们知道计算机只认识 0、1 这样的数字,所以在翻译之前需要把文本变成数字。最简单的方法是将文本汉字转成对应的数字编号,比如 Unicode 的编码。但这有个问题:编号只是个纯数字,不能承载任何语义信息,所以两个数字编号之间也不会有什么语义关联。
那我们需要一种既能数字化又能承载语义的方案,怎么办呢?
首先将这句话切分成很多个词块,每个词块叫一个 Token。然后想象有这么一个二维坐标系:X 轴表示是否和交通相关,Y 轴表示是否和动物相关。那么”货拉拉”会落在 X 轴正方向,”拉布拉多”会落在 Y 轴正方向。”物流平台”“网约车”这类词在坐标系上会更靠近”货拉拉”,而”金毛”“牧羊犬”则会更靠近”拉布拉多”。
但只有两个维度不够,无法表达复杂的语义关系。比如”货拉拉”“物流平台”“网约车”在二维里都和交通相关,靠得很近。但如果加入第三维——是否运货,”货拉拉”和”物流平台”偏向运货物,”网约车”偏向运人,它们就被区分开了。
随着维度的增多,世界上所有已知词汇的 Token 都能在这个多维坐标系里找到属于自己的位置。通过海量语料训练就可以做到:语义相近的词在坐标系空间中靠得很近,与之无关的词则离得很远。
词和词之间的关系还能通过数学方式计算出来。比如:国王的坐标减去男人加上女人,得到的结果会非常接近王后的坐标。
至于”拉布拉”这种多义词,它在坐标系里只是一个模糊的平均位置。只有结合前后词之后,它的位置才会被拉向正确的语义区域。
每个坐标维度都可以表示为数字,所以每个 Token 都可以用一组数字来表示。这种表示方式就是 Embedding,也叫向量。
但语言不仅有词义还有顺序。比如”货拉拉”和”拉布拉多”顺序颠倒,意思就会完全不同。所以模型还会为每个 Token 加入位置信息,让向量同时包含”它是什么”和”它在什么位置”。
QKV 是什么?
知道了每个 Token 对应的向量,我们就可以考虑翻译的事情。但问题就又来了:在翻译”拉布拉”这种多义词时,怎么结合上下文判断这个”拉”究竟是 carry 还是 pull 呢?
我们知道每个词块除了表面上的字面意思,还有背后含义。比如”拉布拉多”除了字面意思,背后的含义有宠物狗等。所以我们可以把一句话抽象成一个词块数据库的查询:Key 就是词块本身,Value 就是词块背后的含义。
那么计算机在理解”拉布拉”时应该重点关注哪些词,就可以抽象为:拿着”拉布拉”这个词去词块数据库里挨个遍历一遍,看哪个词对”拉布拉”参考价值更大。
注意,这个过程中有三个概念:查询、键、值。
但直接拿 Token 的向量去做这三件事不够灵活,因为一个向量要同时扮演三个角色。所以我们通过三个权重矩阵 Wq、Wk、Wv 的变换,让每个 Token 的向量分别变成三个专门的向量,各司其职:
| 角色 | 名称 | 含义 | 类比 |
|---|---|---|---|
| 查询 | Q | 这个 Token 想关注什么? | 数据库的查询接口 |
| 键 | K | 这个 Token 能提供什么信息? | 数据库里的键 |
| 值 | V | 这个 Token 背后的真正含义? | 数据库里键对应的值 |
注意力是什么?
有了每个 Token 的 QKV 之后,我们看一下怎么用它们进行计算。
首先,每个 Token 的 Q 都会遍历句子中所有 Token 的 K,用点积计算相关程度。就像这样——点积,说白了就是相乘。从数学上看,其实就是在计算两个向量在坐标系里指向是否一致,越同向数值就越大。
从效果上看,这是两者相关程度越高,说明这个 Token 越值得被重点参考,可以多关注它。比如针对”拉布拉”这个 Token,计算结束后就能知道”拉布拉”对整个句子中所有 Token 的关注程度。
此时的计算机就会发现:”拉布拉”和”货拉拉”之间的相关性很高,那”拉布拉”就会更关注”货拉拉”,所以后续”拉货”这一含义就会被显著放大。
如果向量维度较大,这些点积结果可能会整体偏大,容易导致某一个 Token 的关注程度被放大得过于极端。为了让不同 token 之间的关注差异更容易被区分,模型会在点积之后除以维度的开方根号 dk。这一步被称为 Scale。
接下来模型会对这些关注程度做一次 Softmax,把它们转换成一组权重。这样一来,”拉布拉”对所有 Token 的关注程度之和就是 1,可以理解为注意力分配比例。
最后再用这组权重去加权所有 Token 的 V 向量。相当于知道了”拉布拉”这个 Token 应该以多大的权重,从其他 Token 那里取哪些信息。最终得到的结果就是”拉布拉”这个 Token 融合了上下文信息之后的表示。我们可以把它记作 H₂。”货拉拉”和”拉布拉多”也会以同样的方式分别得到各自的 H₁ 和 H₃。
对,这一整套计算过程就是所谓的注意力机制。可以用这段公式来表示:
Attention(Q,K,V) = Softmax(QKᵀ / √dk) × V
它可以让每个 Token 根据当前语境自动决定,应该重点参考其他哪些 Token。
怕你们还是理解不了,我再总结下:
| 步骤 | 作用 |
|---|---|
| Q 点积 K | 用来计算 Token 之间关注谁、关注程度 |
| Scale(除以 √dk) | 防止点积数值过大,避免 Softmax max 饱和、梯度消失,让模型训练更稳定 |
| Softmax | 把关注程度转换成注意力权重,也就是概率分布 |
| 乘以 V | 用这些权重从被关注的 Token 中提取并融合具体的语义内容 |
多头注意力
但只算一次注意力是不够的。因为词与词之间的关系是多样的:有的是语义上的关联,有的是语法结构上的依赖,单一角度很难捕捉全面。
所以模型会并行地做多次注意力计算,每一次关注不同的侧重点。这些并行计算的结果最终会被拼接在一起,这就是多头注意力。
Add 和 Norm 是什么?
通过多头注意力,我们就将原句中的各种语义信息通过向量表示了出来。
接着模型首先会把注意力的结果和原始输入相加,确保 Token 自身的信息不会被覆盖掉。这一步叫 Add(残差连接)。接着为了让数值保持在合理范围内,模型会对结果做一次统一调整,这一步通常被称为 Norm(归一化)。这样既保留原有信息,又避免数值在多层计算后失控。
前馈网络(FFN)是什么?
经过残差连接和归一化处理后,从原始输入到当前输出的映射关系仍然是线性的。可以理解为不同 Token 向量的变换路径都是笔直的直线,没法捕捉复杂的语义关联。
为了让模型具备更强的表达能力——拟合自然语言里非线性的语义关系——模型会让向量通过前馈网络 FFN。它的核心作用是通过 ReLU 等激活函数,把线性的映射路径掰弯,变成非线性的曲线。
随后同样会再接一次 Add 和 Norm。
编码器是什么?
多头注意力 → Add & Norm → 前馈网络 → Add & Norm,共同构成了一个编码层。一个编码层能让模型对整句话形成一次上下文理解。多个编码层堆叠起来,模型对语义的理解就会逐层加深。多个编码层组成一个编码器。
编码器的最终输出是一组向量,它们是原句的各个词块融合了上下文语义信息之后的数字表现形式。它是计算机对输入文本的整体语义理解。
翻译原理
接下来就是基于编码器输出的整体语义理解,开始翻译成英文。
生成英文时,我们会放入一个固定的起始符号 BOS(Beginning of Sentence),它表示英文从这里开始翻译。接着模型会结合编码器输出的中文理解,预测最合理的第 1 个英文词。这个例子最终生成的是 can。
接着模型会把 BOS 和 can 一起作为输入,预测下一个词”货拉拉”……以此类推,每一步都是在已有结果的基础上预测下一个最合理的英文词,就像成语接龙。
这个过程需要解决两个问题:
第 1 个问题:新生成的词怎么和已经写下的英文内容衔接,保证语法和表达的连贯?
好办,用注意力机制解决。毕竟大佬说过 Attention Is All You Need。
我们还是将一句话理解成词块数据库:Q 是当前要翻译单词的位置,KV 呢?既然要保证英文衔接自然连贯,那模型只关注已经生成的英文就够了。所以 KV 来自英文构成的词块数据库。这就相当于预测第 n 个词时只依赖前 n-1 个词的结果,保证生成过程从左到右,像掩盖了后面部分做词语预测一样,所以叫带掩码的多头自注意力。
第 2 个问题:在原句已经理解好的整体语义中,此刻翻译最该参考原句哪部分信息?
同样还是用注意力去解决:Q 是当前要翻译单词的位置,而 KV 自然就是来自中文构成的词块数据库。
比如在已经生成 carry 之后,要翻译”拉布拉”时,由于编码器输出的中文理解中,它和运货相关的信息关联更强,因此更可能翻译成 carry 而不是 pull 或 drag。这部分叫多头交叉注意力。
解码器是什么?
这两次注意力计算之后,输出结果都会经过残差网络、归一化以及前馈网络这些流程。每一步的作用都和前面处理中文时几乎一致,我就不重复了。
这些组件共同构成了一个解码层。多个这样的解码层堆叠在一起,形成完整的解码器。每一层都在上一层输出的基础上进一步加工,使得生成的英文在语法、语义和上下文理解上更准确。
最终会将解码器输出的向量通过词表转成可读的文字,也就是英文输出。
Transformer是什么?
编码器和解码器配合工作,共同完成了翻译任务。这就是 Transformer 的经典架构。
之所以说是经典,是因为并不是所有任务都需要编码器和解码器同时存在:
| 架构 | 用途 | 代表模型 |
|---|---|---|
| 仅编码器 | 理解文本,不需要生成 | BERT(文本分类、情感分析) |
| 仅解码器 | 理解 + 生成,省略独立编码器 | ChatGPT、DeepSeek |
| 编码器 + 解码器 | 完整翻译架构 | 早期机器翻译模型 |
而且大模型也能做翻译,所以像前面提到的编码器+解码器的完整架构,在后续更多用于小模型和低资源场景。