一、Transformer 是什么?
Transformer 是 Google 在 2017 年提出的革命性神经网络架构,它完全基于注意力机制,抛弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)。现在所有主流的大语言模型(GPT、BERT、Llama 等)都是基于 Transformer 架构构建的。
核心思想比喻:
想象你要理解一篇文章:
-
传统方法:像逐字阅读,看到后面可能忘了前面(RNN)
-
Transformer:像把文章铺在桌上,一眼看到所有词的关系,通过划重点(注意力)来理解
二、Transformer 的整体架构
Transformer 是一个编码器-解码器结构,主要用于序列到序列的任务(如翻译)。下面是完整的数据流向:
输入序列 → 词嵌入 + 位置编码 → [编码器 × N] → 编码器输出
↓
目标序列 → 词嵌入 + 位置编码 → [解码器 × N] → 线性层 → 输出概率
关键特点:
完全并行:所有词同时处理,训练速度快
全局注意力:每个词能看到整个序列
堆叠结构:多层编码器/解码器逐步精炼表示
三、核心组件详解
1. 词嵌入(Word Embedding)
# 将离散的词ID转为连续的向量
# 例如:"cat" → [0.2, -0.5, 0.8, …]
-
作用:让模型理解词的语义
-
维度:通常 512 或 768 维
-
学习:随训练一起优化
2. 位置编码(Positional Encoding)
python
# 告诉模型词的位置信息
def get_positional_encoding(position, d_model):
# 使用正弦和余弦函数生成
angle = position / (10000^(2i/d_model))
PE[pos, 2i] = sin(angle)
PE[pos, 2i+1] = cos(angle)
-
为什么需要:Transformer 没有循环结构,不知道词序
-
设计原理:不同位置有不同的编码模式
-
特点:相对位置关系容易学习(平移不变性)
3. 注意力机制(Attention)—— Transformer 的灵魂
3.1 自注意力(Self-Attention)
# 计算一个词与其他所有词的关系
注意力 = softmax( (Q·K^T) / √d_k ) · V
-
Q(Query):我要找什么
-
K(Key):我有什么
-
V(Value):我给出什么
示例:理解句子 "The cat sat on the mat"
-
"cat" 会关注 "The"(冠词)、"sat"(动作)
-
形成权重:cat → The:0.3, sat:0.5, on:0.1, mat:0.1
3.2 缩放点积注意力
-
缩放因子 √d_k:防止点积过大导致梯度消失
-
Softmax:将注意力权重归一化为概率分布
3.3 多头注意力(Multi-Head Attention)
# 多个注意力头并行工作
头1:关注语法关系(主谓宾)
头2:关注语义关系(同义词)
头3:关注指代关系(代词指代)
头4:关注情感倾向
…
# 结果拼接后通过线性层融合
优势:
-
并行计算:多个头同时处理
-
多视角理解:每个头学习不同的关注模式
-
增强表达能力:组合多种关系
4. 前馈网络(Feed-Forward Network)
python
# 对每个位置独立应用
FFN(x) = max(0, x·W1 + b1)·W2 + b2
-
位置独立:每个词单独处理
-
两层全连接:先扩展维度(如512→2048),再压缩回原维度
-
非线性激活:ReLU 增加模型表达能力
5. 残差连接与层归一化
残差连接(Residual Connection)
输出 = x + 子层(x)
作用:
-
防止梯度消失:梯度可以直接回流
-
保留原始信息:网络可以"跳过"某些层
-
训练更稳定:深层网络更容易优化
层归一化(Layer Normalization)
LN(x) = γ * (x – μ) / σ + β
与批归一化的区别:
-
批归一化:跨样本同一特征
-
层归一化:同一样本所有特征(更适合序列数据)
四、编码器(Encoder)详细结构
编码器由 N 个相同的层堆叠而成(原论文 N=6):
输入 → 词嵌入 → 位置编码 → [编码器层 × N] → 编码器输出
单个编码器层:
输入
↓
[多头自注意力] → 残差连接 → 层归一化
↓
[前馈网络] → 残差连接 → 层归一化
↓
输出
编码器的作用:理解输入序列,提取高层次表示
五、解码器(Decoder)详细结构
解码器也由 N 个相同的层堆叠:
单个解码器层:
输入
↓
[带掩码的多头自注意力] → 残差连接 → 层归一化
↓
[多头交叉注意力] → 残差连接 → 层归一化
↓
[前馈网络] → 残差连接 → 层归一化
↓
输出
关键区别:
带掩码的自注意力:防止看到未来信息
# 训练时,第 t 个词只能看到前 t-1 个词
掩码 = [[1, 0, 0, 0],
[1, 1, 0, 0],
[1, 1, 1, 0],
[1, 1, 1, 1]]
交叉注意力:连接编码器和解码器
-
Q 来自解码器
-
K, V 来自编码器输出
-
让解码器知道该关注输入序列的哪些部分
六、Transformer 的工作流程
以机器翻译为例(英译中):
训练阶段:
英文句子 → 编码器 → 上下文表示
↓
中文句子(目标)→ 解码器 → 预测下一个词
推理阶段(自回归生成):
输入:"Hello world" → 编码器 → 上下文表示
↓
解码器开始生成:
Step 1: 输入 <开始> → 输出 "你"(概率最大)
Step 2: 输入 <开始> "你" → 输出 "好"
Step 3: 输入 <开始> "你好" → 输出 "世界"
Step 4: 输入 <开始> "你好世界" → 输出 <结束>
七、Transformer 的变体
1. 仅编码器架构(如 BERT)
用途:文本理解(分类、问答)
结构:只有编码器
特点:双向注意力,能看到完整上下文
2. 仅解码器架构(如 GPT)
用途:文本生成
结构:只有解码器(去掉交叉注意力)
特点:自回归生成,因果注意力掩码
3. 编码器-解码器架构(原版 Transformer、T5)
用途:序列到序列任务(翻译、摘要)
结构:完整编码器+解码器
八、为什么 Transformer 如此成功?
1. 并行计算
-
RNN:必须顺序处理,t 时刻依赖 t-1 时刻
-
Transformer:所有词同时计算注意力
2. 长距离依赖
-
RNN:长序列会梯度消失/爆炸
-
Transformer:任意两个词直接相连(通过注意力)
3. 可扩展性
-
层数、头数、维度可轻松调整
-
适合大规模预训练
4. 通用性
-
同一架构可用于多种任务
-
只需调整输入输出格式
九、数学细节(想深入了解可以看看)
注意力计算:
Attention(Q, K, V) = softmax( Q·K^T / √d_k ) · V
其中:
Q = X·W_Q [n×d_k]
K = X·W_K [n×d_k]
V = X·W_V [n×d_v]
多头注意力:
MultiHead(Q, K, V) = Concat(head₁, head₂, …, head_h)·W_O
head_i = Attention(Q·W_Qᵢ, K·W_Kᵢ, V·W_Vᵢ)
前馈网络:
FFN(x) = max(0, x·W₁ + b₁)·W₂ + b₂
# 通常 d_ff = 4×d_model
十、实际考虑
1. 计算复杂度
-
自注意力:O(n²)(n 为序列长度)
-
优化方法:稀疏注意力、分块计算
2. 内存使用
-
存储注意力矩阵:n×n×batch_size
-
长序列需要优化
3. 训练技巧
-
学习率预热
-
标签平滑
-
梯度裁剪
总结
Transformer 的核心创新在于完全基于注意力机制,它通过:
自注意力让每个词直接关注所有其他词
多头机制从不同角度理解关系
位置编码引入顺序信息
残差连接稳定深层网络训练
前馈网络增强每个位置的表示
这种设计使得 Transformer 能够并行处理整个序列,捕获长距离依赖,并且高度可扩展,成为现代大语言模型的基石。
理解 Transformer 是理解所有现代 LLM 的关键。虽然看起来复杂,但其核心思想很简单:让模型自己决定该关注什么,而不是像 RNN/CNN 那样强加固定的处理模式。





