第十章:Transformer架构
学习目标
- 理解Transformer架构的革命性意义
- 掌握注意力机制和Self-Attention的工作原理
- 理解多头注意力机制的设计动机和工作方式
- 理解位置编码的必要性及数学公式
- 区分Encoder-only、Decoder-only和Encoder-Decoder架构
前置要求
第五章:深度学习概述(理解神经网络结构)、第二章:数学基础(理解矩阵运算、Softmax函数)。
Transformer概述
Transformer是目前最主流的AI架构,GPT、BERT、Claude等几乎所有大语言模型都基于它。2017年由Google在论文"Attention is All You Need"中提出,彻底改变了自然语言处理领域。
Transformer的革命性突破
之前的模型(RNN)需要逐词处理,慢且难并行。
Transformer可以同时处理整个句子,速度快、效果好。
这让大模型训练成为可能,开启了AI新时代。
Transformer的核心:注意力机制
注意力机制(Attention)让模型能关注输入中最相关的部分,就像人读书时会重点关注某些词句。
通俗理解
阅读句子"我喜欢编程,特别是Python"
处理"Python"这个词时,注意力会关注"编程"
因为它们语义相关,"Python"是"编程"的一种
这就是注意力机制的核心思想:根据当前词,找到相关词,重点参考。
Self-Attention(自注意力)详解
自注意力让序列中的每个词都能关注其他所有词,获取上下文信息。
Query、Key、Value的比喻
图书馆类比
想象你在图书馆找书:
• Query(查询):你想要找什么内容(当前词的需求)
• Key(标签):每本书的标签/目录(其他词的标识)
• Value(内容):书里的实际内容(其他词的信息)
你的Query与每本书的Key对比,找到最匹配的书,取出Value(书的内容)。相似度越高,这本书对你的价值越大。
自注意力计算过程
- 创建向量:每个词生成Query、Key、Value三个向量
- 计算相似度:Query与所有Key的点积,得到注意力分数
- 归一化:分数除以\(\sqrt{d_k}\)(防止数值太大),再通过Softmax变成概率
- 加权求和:用概率权重对所有Value加权,得到新的词表示
注意力分数计算的数学公式
Self-Attention公式
\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V \]
其中:
• \(Q\) 是查询矩阵(Query),形状为 \((n \times d_k)\)
• \(K\) 是键矩阵(Key),形状为 \((n \times d_k)\)
• \(V\) 是值矩阵(Value),形状为 \((n \times d_v)\)
• \(d_k\) 是Key向量的维度,\(\sqrt{d_k}\)用于缩放防止梯度消失
• \(QK^T\) 计算所有词对之间的相似度
• softmax将相似度转为概率分布
• 最终用概率对V加权求和
Self-Attention的Python/NumPy代码实现
import numpy as np
def softmax(x):
"""计算softmax,防止数值溢出"""
exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
return exp_x / np.sum(exp_x, axis=-1, keepdims=True)
def self_attention(Q, K, V):
"""
Self-Attention计算
Q: (seq_len, d_k) 查询矩阵
K: (seq_len, d_k) 键矩阵
V: (seq_len, d_v) 值矩阵
"""
d_k = Q.shape[-1]
# 1. 计算注意力分数: Q * K^T
scores = Q @ K.T # (seq_len, seq_len)
# 2. 缩放
scores = scores / np.sqrt(d_k)
# 3. Softmax归一化
attention_weights = softmax(scores)
# 4. 加权求和
output = attention_weights @ V # (seq_len, d_v)
return output, attention_weights
# 示例:3个词,每个词用4维向量表示
np.random.seed(42)
seq_len = 3
d_k = 4
d_v = 4
Q = np.random.randn(seq_len, d_k)
K = np.random.randn(seq_len, d_k)
V = np.random.randn(seq_len, d_v)
output, weights = self_attention(Q, K, V)
print("注意力权重矩阵:")
print(np.round(weights, 3))
# 每行表示一个词对其他词的关注程度
print(f"\n输出形状: {output.shape}")
多头注意力(Multi-Head Attention)
多头注意力是让模型从多个不同角度理解句子。
为什么需要"多头"?
一个注意力头只能关注一种关系:
• Head 1 可能关注语法关系(主语-谓语)
• Head 2 可能关注语义关系(名词-属性)
• Head 3 可能关注位置关系(上下文)
多个头可以同时关注不同类型的关系,理解更全面。
GPT-3使用了96个注意力头!
多头注意力工作原理
- 把Query、Key、Value分成多份(比如8份)
- 每份独立做一次自注意力计算
- 得到8个不同的"视角"结果
- 把8个结果合并,得到最终表示
位置编码(Positional Encoding)
位置编码告诉模型每个词在句子中的位置,弥补Transformer无法识别顺序的缺陷。
为什么需要位置编码?
Transformer同时处理所有词,不知道"我吃苹果"和"苹果吃我"的区别(词相同,顺序不同)。
位置编码给每个词添加一个"位置标签",让模型能区分:
"我"(位置1)+ "吃"(位置2)+ "苹果"(位置3)
这样模型就知道词的顺序,理解正确含义。
位置编码的数学公式
正弦-余弦位置编码
\[ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]
\[ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]
其中:
• \(pos\) 是词在序列中的位置(0, 1, 2, ...)
• \(i\) 是维度索引
• \(d_{\text{model}}\) 是模型的嵌入维度(如512、768、1024)
这种编码方式使模型能学习到相对位置关系。
Transformer架构详解
Transformer由两个主要部分组成:
Encoder(编码器)——理解输入
Encoder负责理解输入文本,提取其中的信息。
- 输入:原始文本(如"把这段话翻译成英语")
- 处理:多层自注意力+前馈网络,理解每个词及其上下文
- 输出:每个词的深层语义表示
- 代表模型:BERT(双向理解,适合分类、问答)
Decoder(解码器)——生成输出
Decoder负责生成输出文本,逐词预测下一个词。
- 输入:Encoder的输出 + 已生成的词
- 处理:自注意力(看已生成部分)+ 交叉注意力(看Encoder输出)
- 输出:下一个词的概率分布,选择最可能的词
- 代表模型:GPT(单向生成,适合写作、对话)
(理解)
(生成)
Encoder vs Decoder 对比
| 维度 | Encoder | Decoder |
|---|---|---|
| 注意力类型 | 自注意力(看全部输入) | 自注意力(只能看已生成的词)+ 交叉注意力(看Encoder输出) |
| 处理方式 | 双向理解 | 单向生成(从左到右) |
| 代表模型 | BERT、RoBERTa | GPT、LLaMA、Qwen |
| 适合任务 | 分类、问答、命名实体识别 | 写作、对话、代码生成 |
不同架构的应用场景
| 架构 | 模型 | 特点 | 适合任务 |
|---|---|---|---|
| 仅Encoder | BERT、RoBERTa | 双向理解整个文本 | 文本分类、情感分析、问答系统 |
| 仅Decoder | GPT、LLaMA、Qwen | 单向生成,预测下一个词 | 写作、对话、代码生成 |
| Encoder-Decoder | T5、BART | 理解+生成结合 | 翻译、摘要、改写 |
关键创新总结
Transformer的三大创新:
• 自注意力:词与词直接关联,理解全面
• 多头机制:多个角度分析,更丰富
• 并行计算:同时处理,速度快
这三点让Transformer成为现代AI的基石。
本章小结
- Transformer通过注意力机制实现了并行处理序列数据,彻底取代了RNN的逐词处理方式,开启了AI新时代。
- Self-Attention的核心公式为 \(\text{Attention}(Q,K,V) = \text{softmax}(QK^T/\sqrt{d_k})V\),通过Q/K/V机制让每个词关注所有相关词。
- 多头注意力让模型从多个角度理解文本,位置编码通过正弦-余弦函数为词添加位置信息。
- Transformer由Encoder(理解输入)和Decoder(生成输出)组成,不同组合产生了BERT、GPT、T5等不同架构。
- 仅Encoder架构适合理解任务(分类、问答),仅Decoder架构适合生成任务(写作、对话),Encoder-Decoder适合序列转换任务(翻译、摘要)。
练习题
-
Self-Attention公式中,除以\(\sqrt{d_k}\)的目的是什么?
A. 加速计算
B. 防止点积结果过大导致softmax梯度消失
C. 增加模型参数
D. 减少内存使用答案:B。当维度\(d_k\)较大时,点积结果会很大,softmax会进入梯度极小的区域。除以\(\sqrt{d_k}\)进行缩放可以缓解这个问题。
-
GPT系列模型使用的是哪种Transformer架构?
A. 仅Encoder
B. 仅Decoder
C. Encoder-Decoder
D. 不使用Transformer答案:B。GPT使用仅Decoder架构,通过自回归方式逐词生成文本,适合写作和对话等生成任务。
-
为什么Transformer需要位置编码?
A. 因为Transformer的计算速度太慢
B. 因为Transformer同时处理所有词,本身不知道词的顺序
C. 因为位置编码可以减少参数量
D. 因为没有位置编码就无法训练答案:B。Transformer的核心优势是并行处理所有词,但代价是丢失了词序信息。位置编码通过给每个位置添加唯一编码来弥补这一缺陷。