Transformer 架构详解:写给初学者的入门指南

这是一份写给初学者的 Transformer 架构系统性介绍。我们将用尽可能通俗易懂的语言、恰当的比喻和清晰的结构,来剖析这个当今人工智能领域最重要的模型之一。


想象一下,你在做一篇很长的英文阅读理解。传统的做法(就像旧的 AI 模型 RNN/LSTM)是你一个词一个词地读,读到后面可能会忘记前面的细节。但如果让你先把整篇文章通读一遍,然后在回答问题时,你可以随时回头查看文章的任何部分,并重点关注与问题最相关的句子,效率和准确性是不是就高多了?

Transformer 架构就是后面这种“聪明的读者”。它彻底改变了 AI 处理序列数据(尤其是文本)的方式。

一、核心思想:告别“按顺序”,拥抱“全局视野”

在 Transformer 出现之前,主流的模型如循环神经网络(RNN)和长短期记忆网络(LSTM)都是顺序处理文本的。它们像一个一个地读单词,试图在脑中维持一个“记忆”来理解上下文。

RNN/LSTM 的两大痛点:

  1. 效率低下:必须一个词处理完才能处理下一个,无法并行计算,处理长文本时速度很慢。
  2. 长期依赖问题:当句子很长时,模型很难记住最开始的信息。比如,“我出生在法国……(中间省略一万字)……所以我最擅长的语言是法语。” 模型可能已经忘记了开头的“法国”。

Transformer 的革命性思想:

  1. 并行计算:一次性读取所有单词,就像把整篇文章铺在桌上。
  2. **自注意力机制 (Self-Attention)**:通过一种绝妙的机制,让模型在处理每个单词时,都能“关注”到句子中所有其他单词,并判断它们之间的关联性强弱。

二、宏观架构:一个高效的翻译系统

Transformer 最初是为机器翻译任务设计的。它的经典结构是一个编码器-解码器 (Encoder-Decoder) 架构。

  • **编码器 (Encoder)**:左侧部分。它的任务是“理解”输入的句子。比如输入“I am a student”,编码器会阅读并消化这句话,将其转换成一堆包含丰富语义信息的数字向量(可以理解为“思想精华”)。
  • **解码器 (Decoder)**:右侧部分。它的任务是根据编码器提炼的“思想精华”,生成目标语言的句子。比如生成“我是一个学生”。

编码器和解码器都不是单一的组件,而是由 N 层(原论文中 N=6)完全相同的结构堆叠而成。这就像把一篇文章让 6 个专家轮流阅读和批注,每一层都会在前一层的基础上进行更深入的理解。


三、深入内部:三大关键组件(以编码器为例)

让我们打开一个编码器层(Encoder Layer),看看里面到底有什么。每个编码器层主要由两大部分组成:多头自注意力机制前馈神经网络

1. 准备工作:词嵌入 (Word Embedding) 与位置编码 (Positional Encoding)

在进入编码器之前,输入的文本需要做两步预处理。

  • **词嵌入 (Word Embedding)**:计算机不认识单词,只认识数字。词嵌入就是用一个向量(一串数字)来表示一个单词。例如,“猫”可能被表示为 [0.1, -0.5, 1.2, ...],“狗”可能被表示为 [0.2, -0.4, 1.1, ...]。意思相近的词,它们的向量也更接近。
  • 位置编码 (Positional Encoding):由于 Transformer 一次性看所有词,它本身不知道词的顺序。但语序至关重要(“我打你”和“你打我”完全不同)。位置编码就是给每个词的向量再额外加上一个代表其位置信息的“标签”向量。这样,模型既知道了每个词的意思,也知道了它们的顺序。

2. 核心引擎:自注意力机制 (Self-Attention)

这是 Transformer 最核心、最天才的部分。它让模型知道在理解一个词时,应该重点关注句子中的哪些其他词。

工作原理(Q, K, V类比法):
想象你在图书馆查资料。

  • **Query (Q, 查询)**:你当前正在研究的主题(比如,你想理解句子中的 “it” 这个词)。
  • **Key (K, 键)**:图书馆里每本书的书名或标签(句子中的每一个词都有一个 Key)。
  • **Value (V, 值)**:书本的具体内容(句子中的每一个词也都有一个 Value,通常是它的词嵌入向量)。

过程如下:

  1. 生成 Q, K, V:对于输入句子中的每个词,我们都通过三个不同的权重矩阵,从它的词嵌入向量生成三个新的向量:Query 向量、Key 向量和 Value 向量。
  2. 计算注意力分数:要理解 “it” 这个词 (它的 Q),你需要将它的 Q 向量与句子中所有词的 K 向量进行点积计算。这个得分代表了 “it” 与其他每个词的关联程度。
  3. **归一化 (Softmax)**:将这些分数通过 Softmax 函数转换成 0到1 之间的权重,且所有权重加起来等于1。权重越高的词,说明关联性越强。
  4. 加权求和:将每个词的 V 向量乘以它对应的权重,然后全部加起来。

最终得到的这个加权平均向量,就是 “it” 这个词在当前语境下的全新表示。如果句子是 “The animal didn’t cross the street because it was too tired”,那么 “animal” 这个词的 V 向量会被赋予很高的权重,最终的新向量就会包含大量 “animal” 的信息,模型从而知道 “it” 指的是 “animal”。

3. 升级版:多头注意力机制 (Multi-Head Attention)

如果只用一套 Q, K, V,就好比你只有一个角度去理解句子。但句子的关系是多维度的。比如,“我”和“打”是主谓关系,“打”和“你”是动宾关系。

多头注意力 就是雇佣多个“注意力头”(比如 8 个),让它们各自学习自己的一套 Q, K, V 权重。

  • 头1 可能关注主谓关系。
  • 头2 可能关注代词指代关系。
  • 头3 可能关注形容词修饰关系…

每个头都独立进行一次完整的自注意力计算,得出一个结果向量。最后,我们将这 8 个头的结果拼接起来,再通过一个线性层进行整合。这样,模型就能从多个角度和维度更全面地理解句子。

4. 辅助组件:前馈网络 (Feed-Forward) 和 Add & Norm

  • 前馈神经网络:在多头注意力层之后,每个词的输出向量会再经过一个简单的前馈神经网络。你可以把它看成是一个“加工厂”,对注意力层提炼出的信息进行进一步的非线性变换和加工,增强模型的表达能力。
  • **Add & Norm (残差连接和层归一化)**:
    • Add (残差连接):在每个主要组件(如多头注意力和前馈网络)的输出上,都把它加上该组件的输入。这相当于走了一条“捷径”,保证了原始信息不会在多层处理中丢失,极大地稳定了训练过程。
    • **Norm (层归一化)**:对每个残差连接后的输出进行归一化,使其数据分布更加稳定,好比是统一了度量衡,让模型训练起来更快、更稳定。

四、解码器 (Decoder) 的特殊之处

解码器与编码器结构非常相似,但有两点关键不同:

  1. 带掩码的自注意力 (Masked Self-Attention):解码器在生成译文时,是逐词生成的。在预测第 3 个词时,它只能看到已经生成的第 1、2 个词,不能偷看后面的正确答案。这个“掩码”机制就是用来遮盖未来信息的。
  2. 编码器-解码器注意力 (Encoder-Decoder Attention):这是解码器层中的第二个注意力层。它的 Q 来自解码器自身(前一层的输出),但 K 和 V 来自编码器的最终输出。这一步是解码器“查阅”原始句子“思想精华”的过程。比如,在翻译到某个动词时,它会去关注原始句子中的主语和宾语,以确保翻译的准确性。

五、简单实现思路 (以 PyTorch 为例)

对于初学者,无需从零手写所有数学细节。可以利用深度学习框架中封装好的模块来搭建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import torch
import torch.nn as nn

# 1. 关键模块
# 词嵌入
embedding = nn.Embedding(vocab_size, d_model)
# 多头注意力 (包含了Q,K,V的生成和计算)
multihead_attn = nn.MultiheadAttention(embed_dim=d_model, num_heads=8)
# 前馈网络
feed_forward = nn.Sequential(
nn.Linear(d_model, ff_hidden_dim),
nn.ReLU(),
nn.Linear(ff_hidden_dim, d_model)
)
# 层归一化
layer_norm = nn.LayerNorm(d_model)

# 2. 搭建一个编码器层
class EncoderLayer(nn.Module):
def __init__(self):
super().__init__()
# ... 初始化上面的模块

def forward(self, x, mask):
# 多头注意力 + Add & Norm
attn_output, _ = self.multihead_attn(x, x, x, attn_mask=mask)
x = self.layer_norm(x + attn_output)

# 前馈网络 + Add & Norm
ff_output = self.feed_forward(x)
x = self.layer_norm(x + ff_output)

return x

# 3. 搭建完整的 Transformer
class Transformer(nn.Module):
def __init__(self):
super().__init__()
# ...
# 实例化 N 个编码器层
self.encoder_layers = nn.ModuleList([EncoderLayer() for _ in range(N)])
# 实例化 N 个解码器层
self.decoder_layers = nn.ModuleList([DecoderLayer() for _ in range(N)])
# ...

def forward(self, src, tgt, ...):
# 1. 对 src (源句子) 进行词嵌入和位置编码
# 2. 将结果送入编码器栈
# 3. 对 tgt (目标句子) 进行词嵌入和位置编码
# 4. 将编码器输出和处理过的 tgt 送入解码器栈
# 5. 最终通过一个线性层和 Softmax 得到预测的下一个单词的概率
# ...

对于初学者,最好的学习方式是阅读并运行一份带有详细注释的实现代码,例如 PyTorch 官方的 Transformer 教程


六、总结与展望

Transformer 的成功关键:

  • 自注意力机制:实现了对全局上下文的有效建模。
  • 并行计算能力:极大地提高了训练和推理效率,使得处理海量数据和构建超大规模模型成为可能。

正是因为这两个特点,Transformer 不仅仅局限于机器翻译,它已经成为现代 AI 的基石。

  • BERT 系列模型使用 Transformer 的编码器进行语言理解。
  • GPT 系列模型(包括 ChatGPT)使用 Transformer 的解码器进行文本生成。
  • DALL-E, Midjourney 等图像生成模型,也将图像块(patches)视为一种“单词”,用 Transformer 来理解和生成图片。

希望这份介绍能帮你打开 Transformer 的大门。它初看可能有些复杂,但只要理解了其核心的“全局视野”和“自注意力”思想,其他部分就会变得顺理成章。