11.6 综合练习
练习设计理念:从基础理解→方法应用→错误诊断→开放设计,形成完整的知识掌握闭环。每道练习都映射到前章节概念,强化知识递进。
11.6.1 练习结构概览
练习分层设计:
┌─────────────────────────────────────────────┐
│ 第一层:基础理解(5题) │
│ 目标:理解核心概念 │
│ 类型:计算、预测、解释 │
│ │
│ 第二层:方法应用(3题) │
│ 目标:应用算法解决问题 │
│ 类型:实现、设计、优化 │
│ │
│ 第三层:错误诊断(2题) │
│ 目标:诊断并修复问题 │
│ 类型:案例分析、方案设计 │
│ │
│ 第四层:开放设计(2题) │
│ 目标:综合设计解决方案 │
│ 类型:系统设计、实验报告 │
└─────────────────────────────────────────────┘
知识卡片覆盖:所有20张卡片均有练习对应
跨章节关联:每题标注关联章节11.6.2 基础理解题(5题)
练习 1:注意力矩阵计算与可视化
【知识卡片】C11-01(自注意力=软检索)、C11-02(注意力矩阵热图)
给定4个token的Q、K向量(简化为2维):
Q = [[1, 0], [0, 1], [1, 1], [-1, 0]]
K = [[1, 0], [0, -1], [2, 0], [0, 1]]
任务:
a) 计算 QK^T 注意力分数矩阵
b) 应用 softmax 归一化
c) 绘制注意力热图
d) 观察:哪个token最"被关注"?为什么?
e) 思考:如果Q和K的维度增加,注意力模式如何变化?
【关联章节】Ch3 查找(软检索vs硬检索)
【预期答案】
a) QK^T:
= [[1, 0, 2, 0],
[0, -1, 0, 1],
[1, -1, 2, 1],
[-1, 0, -2, 0]]
b) softmax(按行归一化):
第1行:[1, 0, 2, 0] → softmax → [0.09, 0.05, 0.76, 0.05]
第2行:[0, -1, 0, 1] → softmax → [0.27, 0.10, 0.27, 0.27]
第3行:[1, -1, 2, 1] → softmax → [0.12, 0.04, 0.64, 0.12]
第4行:[-1, 0, -2, 0] → softmax → [0.11, 0.24, 0.03, 0.24]
d) 最被关注的token:
观察列总和:
列0:0.09+0.27+0.12+0.11 = 0.59
列2:0.76+0.27+0.64+0.03 = 1.70 ← 最高
token2(K=[2,0])最被关注
原因:K向量长度最长(|K|=2),内积更容易大
e) 维度增加的影响:
更高维 → 更精细的语义匹配
可能出现更复杂的注意力模式(而非单一焦点)
【评分标准】
计算正确:40分
热图绘制:20分
分析合理:40分练习 2:复杂度分析
【知识卡片】C11-04(O(n²)复杂度瓶颈)、C11-05(KV-cache增量计算)
模型参数:
序列长度:n
模型维度:d
注意力头数:h
任务:
a) 计算自注意力时间复杂度
b) 计算多头注意力时间复杂度
c) 计算KV-cache的空间复杂度
d) 对比标准注意力与KV-cache生成的计算量
【关联章节】Ch2 复杂度分析、Ch2 缓存策略
【预期答案】
a) 自注意力时间复杂度:
投影:Q/K/V各 O(n×d²) → 总共 O(3n×d²)
注意力分数:O(n²×d)
Softmax:O(n²)
聚合:O(n²×d)
总计:O(n²×d + n×d²)
当n >> d时,主导项为 O(n²×d)
b) 多头注意力:
每个头:O(n²×d/h × d/h) = O(n²×d²/h²)
h个头:O(h × n²×d²/h²) = O(n²×d²/h)
合并:O(n×d×h×d) = O(n×d²)
总计:O(n²×d²/h + n×d²) ≈ O(n²×d²)
c) KV-cache空间复杂度:
K_cache: [seq_len, d] × layers
V_cache: [seq_len, d] × layers
总空间:O(seq_len × d × layers × 2)
d) 对比:
标准注意力生成:
每生成1个token:O(n²×d)(重新计算所有)
总生成n个token:O(n³×d)
KV-cache生成:
每生成1个token:O(d² + n×d)(只计算新token)
总生成n个token:O(n×d² + n²×d) ≈ O(n²×d)
速度提升:从O(n³)降到O(n²)
【评分标准】
复杂度正确:50分
对比分析合理:50分练习 3:线性注意力原理
【知识卡片】C11-07(线性注意力原理)
传统注意力:Attention(Q,K,V) = softmax(QK^T)V
任务:
a) 解释为什么复杂度是O(n²×d)
b) 线性注意力如何降到O(n×d²)
c) 分析牺牲了什么?
【关联章节】Ch3 近似查找、Ch10 近似算法
【预期答案】
a) O(n²×d)来源:
QK^T:n×d矩阵 × d×n矩阵 = n×n矩阵 → O(n×d×n) = O(n²×d)
这是瓶颈:需要计算所有n×n对的相似度
b) 线性注意力降复杂度:
核心思想:softmax(QK^T)V ≈ φ(Q)(φ(K)^T V)
利用矩阵结合律:
softmax(QK^T)V = [n×n]×[n×d] → 先算n×n矩阵
φ(Q)(φ(K)^T V) = [n×d]×([d×n]×[n×d])
= [n×d]×[d×d]
→ 先算 φ(K)^T V [d×d]
→ 再算 Q×[d×d]
复杂度:
φ(K)^T V:O(n×d²)
Q×[d×d]:O(n×d²)
总计:O(n×d²)
关键:避免中间的n×n矩阵
c) 牺牲:
1. 精度损失:核函数φ是softmax的近似
2. 长距离依赖表达能力下降
3. 核函数选择影响质量
【评分标准】
复杂度解释正确:40分
数学推导合理:40分
牺牲分析完整:20分练习 4:Token化与向量空间
【知识卡片】C11-10(Token化算法)、C11-11(向量空间几何)
词表:{cat: 1, dog: 2, animal: 3}
向量:cat=[0.8,0.2], dog=[0.7,0.3], animal=[0.5,0.5]
任务:
a) 计算"cat"和"dog"的余弦相似度
b) 计算"cat"和"animal"的余弦相似度
c) 解释语义关系
d) 如果"tiger"向量=[0.75,0.25],它与哪些词相似?
【关联章节】Ch3 哈希映射、Ch4 图嵌入
【预期答案】
a) cat vs dog:
cat=[0.8,0.2], dog=[0.7,0.3]
内积:0.8×0.7 + 0.2×0.3 = 0.56 + 0.06 = 0.62
|cat|=√(0.64+0.04)=√0.68≈0.82
|dog|=√(0.49+0.09)=√0.58≈0.76
cosine = 0.62/(0.82×0.76) = 0.62/0.62 = 1.0
(注:这些向量设计为相似,实际可能<1.0)
b) cat vs animal:
cat=[0.8,0.2], animal=[0.5,0.5]
内积:0.8×0.5 + 0.2×0.5 = 0.5
|animal|=√(0.25+0.25)=√0.5≈0.71
cosine = 0.5/(0.82×0.71) ≈ 0.86
c) 语义解释:
cat和dog:高相似度(≈1.0)→ 都是宠物/动物
cat和animal:中等相似度(≈0.86)→ cat是animal的子类
向量空间编码了语义层级关系
d) tiger相似性:
tiger=[0.75,0.25]
与cat:
内积:0.75×0.8 + 0.25×0.2 = 0.65
cosine ≈ 0.65/√(0.56+0.06)×√(0.56+0.06) ≈ 0.98
与dog:
cosine ≈ 0.96
tiger与cat、dog都高相似 → 都属于猫科/犬科类动物
与animal:
cosine ≈ 0.85
【评分标准】
计算正确:40分
解释合理:30分
tiger分析:30分练习 5:采样策略对比
【知识卡片】C11-13(温度采样权衡)、C11-14(Top-K/Top-P采样)
logits = [3.0, 2.0, 1.0, 0.1]
任务:
a) T=1.0时的概率分布
b) Top-K=2时的候选token
c) Top-P=0.9时的候选token
d) 分析三种策略的优劣
【关联章节】Ch5 贪心算法、Ch10 蓄水池采样
【预期答案】
a) T=1.0:
softmax([3.0, 2.0, 1.0, 0.1])
exp([3.0, 2.0, 1.0, 0.1]) = [20.1, 7.4, 2.7, 1.1]
sum = 31.3
P = [20.1/31.3, 7.4/31.3, 2.7/31.3, 1.1/31.3]
≈ [0.64, 0.24, 0.09, 0.03]
b) Top-K=2:
保留前2个:token1(0.64)、token2(0.24)
归一化:P' = [0.64/0.88, 0.24/0.88] = [0.73, 0.27]
c) Top-P=0.9:
累积概率:
token1: 0.64
token1+2: 0.88 ← 还没到0.9
token1+2+3: 0.97 ← 超过0.9
候选:token1、token2、token3
归一化:P' = [0.64/0.97, 0.24/0.97, 0.09/0.97]
d) 优劣分析:
温度采样:
优点:简单,全局调整
缺点:可能选中极低概率token(T高时)
Top-K:
优点:固定候选数,简单
缺点:不自适应(分布集中/分散时效果不同)
Top-P:
优点:自适应候选数
缺点:需要额外计算累积概率
建议:温度+Top-P组合(T=0.9, P=0.95)
【评分标准】
计算正确:40分
优劣分析合理:40分
建议方案:20分11.6.3 方法应用题(3题)
练习 6:KV-cache实现
【知识卡片】C11-05(KV-cache增量计算)、C11-06(缓存溢出策略)
任务:实现KV-cache生成器
要求:
a) 支持增量生成
b) 支持缓存清空
c) 支持缓存大小限制
d) 测试生成速度对比(有缓存 vs 无缓存)
【关联章节】Ch2 缓存策略
【实现框架】
class KVCache:
def __init__(self, d_model, layers, max_seq_len):
# 初始化缓存结构
def update(self, layer, K_new, V_new):
# 增量添加
def truncate(self, max_len):
# 滑动窗口淘汰
def clear(self):
# 清空缓存
【测试方案】
生成1000 token对比:
无缓存时间 vs 有缓存时间
内存占用对比
【评分标准】
实现正确:40分
功能完整:30分
测试对比:30分练习 7:长上下文方案设计
【知识卡片】C11-07(线性注意力)、C11-08(FlashAttention)、C11-09(稀疏注意力)
场景:处理100K token文档
需求:
内存不超过16GB
保留长距离依赖
生成质量可接受
任务:
a) 分析内存限制
b) 选择优化策略(线性/Flash/稀疏)
c) 实现简化版本
d) 评估效果
【关联章节】Ch10 流式算法、Ch10 内存约束
【设计方案】
a) 内存分析:
标准注意力:100K²×4 = 40GB → 不可行
KV-cache:100K×d×layers×2×4
若d=4096, layers=32
= 100K×1MB = 100GB → 也超出
必须优化!
b) 策略选择:
推荐:稀疏注意力 + KV-cache压缩
稀疏参数:
window=1024(局部)
global=10(全局token)
random=20(随机探索)
每位置关注约1054个 → 复杂度可行
KV-cache压缩:
int8量化(空间减半)
c) 实现框架:
def sparse_attention_with_compression(Q, K, V, params):
# 混合稀疏模式
# 增量缓存(int8)
d) 评估指标:
生成质量(与标准对比)
内存占用
生成速度
【评分标准】
分析完整:30分
策略合理:30分
实现正确:20分
评估合理:20分练习 8:RAG系统实现
【知识卡片】C11-16(RAG两阶段流程)、C11-17(向量相似度检索)
任务:实现简化RAG系统
组件:
a) 向量编码器(可用预训练)
b) 相似度检索
c) 上下文组装
d) 答案生成(可用API)
测试:
准备10个测试问题
准备知识库(100篇文档)
测试检索准确率和生成质量
【关联章节】Ch3 查找算法、Ch4 信息聚合
【实现框架】
class SimpleRAG:
def __init__(self, encoder, generator, knowledge_base):
# 初始化
def retrieve(self, query, top_k=5):
# 向量检索
def generate(self, query, retrieved_docs):
# 答案生成
def answer(self, query):
# 完整流程
【测试方案】
问题示例:
"什么是自注意力?"
"KV-cache如何工作?"
"线性注意力原理?"
检索准确率:
Top-5中包含正确文档的比例
生成质量:
答案是否正确、完整
【评分标准】
实现完整:40分
测试合理:30分
分析深入:30分11.6.4 错误诊断题(2题)
练习 9:OOM错误诊断
【知识卡片】C11-05(KV-cache)、C11-06(缓存溢出)
错误:生成10000 token时OOM(内存溢出)
场景:
GPU内存:8GB
模型参数:4GB(固定占用)
其他组件:2GB
可用:8-4-2=2GB
KV-cache在生成6000 token时超出可用空间
任务:
a) 分析可能的原因
b) 检查KV-cache大小
c) 提出解决方案
d) 实现修复并测试
【关联章节】Ch2 缓存溢出、Ch10 内存约束
【诊断报告框架】
a) 原因分析:
KV-cache大小计算:
n × d × layers × 2 × 4 bytes
= 6000 × 4096 × 32 × 2 × 4
= 6000 × 1MB
= 6GB
但可用只有2GB → 溢出
b) 检查:
监控内存增长曲线
确认是KV-cache导致
c) 解决方案:
方案1:滑动窗口(保留最近2000 token)
方案2:int8量化(空间减半)
方案3:选择性保留(Sink token优先)
d) 实现测试:
选择方案1(滑动窗口)
测试生成10000 token无OOM
检查生成质量(长距离依赖影响)
【评分标准】
诊断正确:40分
方案合理:30分
实现成功:30分练习 10:生成重复诊断
【知识卡片】C11-13(温度采样)、C11-14(Top-K采样)
问题:生成的文本重复单调
场景:
输入:"这个产品"
输出:"这个产品很好很好很好..."
任务:
a) 分析采样策略
b) 检查温度设置
c) 提出改进方案
d) 测试改进效果
【关联章节】Ch5 贪心算法局限、Ch10 随机算法
【诊断报告框架】
a) 分析:
重复原因:
贪心采样(温度T=0)
"很好"概率最高 → 连续选中
或:温度过低(T=0.1)
分布陡峭 → 高概率词主导
b) 检查:
确认当前温度设置
检查是否有重复惩罚
c) 改进方案:
方案1:提高温度(T=0.9)
方案2:添加Top-P采样(P=0.95)
方案3:重复惩罚:
if token in recent_10:
logits[token] -= 1.0
d) 测试:
应用方案(温度+Top-P+惩罚)
测试生成不再重复
保持连贯性和相关性
【评分标准】
诊断正确:40分
方案合理:30分
测试验证:30分11.6.5 开放设计题(2题)
练习 11:注意力可视化工具设计
【知识卡片】C11-02(注意力矩阵热图)、C11-03(多头注意力)
任务:设计注意力可视化工具
功能:
a) 可视化注意力矩阵
b) 交互式探索(点击位置查看注意力分布)
c) 对比不同层/头的注意力
设计:
a) 数据结构设计
b) 可视化方案
c) 交互设计
可选实现:鼓励尝试实现
【关联章节】Ch4 图可视化
【设计报告框架】
a) 数据结构:
AttentionData:
matrix: [n, n] 权重矩阵
tokens: [n] token列表
layer: int 层数
head: int 头数
b) 可视化方案:
热图:sns.heatmap(matrix, tokens)
交互:
点击热图单元格 → 显示该位置的详细信息
对比:
多头并排展示
或:滑块切换层/头
c) 交互设计:
用户操作:
查看全局模式(热图)
探索特定位置(点击)
对比不同层/头(切换)
信息展示:
权重值
关注的token列表
前章节关联解释
【评分标准】
设计完整:50分
创新性:30分
可行性:20分
(若实现:额外20分加分)练习 12:自适应采样策略设计
【知识卡片】C11-13(温度采样)、C11-20(采样分布可视化)
任务:设计自适应采样策略
需求:
生成开始时:高温度,探索
生成中期:中温度,平衡
生成结束:低温度,确定
设计:
a) 温度调整策略
b) 判断阶段的依据
c) 与固定温度对比
提交设计文档和实验报告
【关联章节】Ch5 贪心vs随机、Ch10 流式算法
【设计框架】
a) 温度调整策略:
方案1:线性衰减
T(progress) = T_start × (1 - progress)
方案2:阶梯衰减
if progress < 0.3: T = 1.5
elif progress < 0.7: T = 1.0
else: T = 0.5
方案3:基于熵自适应
entropy = compute_entropy(probs)
if entropy > threshold: T降低(更确定)
else: T保持
b) 判断阶段依据:
已生成token数 / 目标总数
或:语义完整性检测
或:重复检测(生成稳定)
c) 对比实验:
固定温度T=1.0 vs 自适应
指标:
生成多样性(熵)
生成连贯性(人工评分)
重复率
【实验报告要求】
测试场景:产品描述生成(100字)
对比数据:
固定温度:重复率X%,连贯性Y分
自适应:重复率X'%,连贯性Y'分
结论分析:
自适应是否优于固定?
何种衰减策略最优?
【评分标准】
设计合理:40分
实验完整:40分
分析深入:20分11.6.6 练习答案汇总
基础理解题答案要点
| 练习 | 核心答案 | 关联章节 |
|---|---|---|
| 练习1 | 注意力矩阵计算+热图绘制 | Ch3查找 |
| 练习2 | O(n²×d)复杂度分析 | Ch2复杂度 |
| 练习3 | 线性注意力O(n×d²)原理 | Ch3近似查找 |
| 练习4 | 向量相似度计算+语义解释 | Ch4图嵌入 |
| 练习5 | 温度/Top-K/Top-P对比 | Ch5贪心 |
方法应用题答案要点
| 练习 | 核心实现 | 关联章节 |
|---|---|---|
| 练习6 | KV-cache类实现 | Ch2缓存 |
| 练习7 | 稀疏注意力+压缩方案 | Ch10流式 |
| 练习8 | RAG两阶段系统 | Ch3查找 |
错误诊断题答案要点
| 练习 | 诊断要点 | 关联章节 |
|---|---|---|
| 练习9 | OOM→滑动窗口修复 | Ch2缓存溢出 |
| 练习10 | 重复→温度+惩罚修复 | Ch5贪心局限 |
开放设计题答案要点
| 练习 | 设计要点 | 关联章节 |
|---|---|---|
| 练习11 | 可视化工具设计 | Ch4图可视化 |
| 练习12 | 自适应温度策略 | Ch10流式 |
11.6.7 知识卡片完整映射
| 卡片编号 | 卡片标题 | 练习覆盖 |
|---|---|---|
| C11-01 | 自注意力=软检索 | 练习1、3 |
| C11-02 | 注意力矩阵热图 | 练习1、11 |
| C11-03 | 多头注意力=并行检索 | 练习1、11 |
| C11-04 | O(n²)复杂度瓶颈 | 练习2、7 |
| C11-05 | KV-cache增量计算 | 练习2、6、9 |
| C11-06 | 缓存溢出策略 | 练习6、9 |
| C11-07 | 线性注意力原理 | 练习3、7 |
| C11-08 | FlashAttention分块 | 练习7 |
| C11-09 | 稀疏注意力模式 | 练习7 |
| C11-10 | Token化算法 | 练习4 |
| C11-11 | 向量空间几何 | 练习4 |
| C11-12 | 位置编码设计 | 练习4 |
| C11-13 | 温度采样权衡 | 练习5、10、12 |
| C11-14 | Top-K/Top-P采样 | 练习5、10 |
| C11-15 | 上下文压缩策略 | 练习7 |
| C11-16 | RAG两阶段流程 | 练习8 |
| C11-17 | 向量相似度检索 | 练习8 |
| C11-18 | 注意力Sink现象 | 练习9 |
| C11-19 | 语义方向向量 | 练习4 |
| C11-20 | 采样分布可视化 | 练习12 |
11.6.8 设计反思
练习设计原则
| 原则 | 本节体现 |
|---|---|
| 分层递进 | 理解→应用→诊断→设计 |
| 知识卡片覆盖 | 20张卡片均有练习 |
| 跨章节关联 | 每题标注关联章节 |
| 开放性 | 设计题鼓励创新 |
| 可验证性 | 代码题可测试 |
教学建议
- 基础题:课堂练习,即时反馈
- 应用题:课后作业,提交代码
- 诊断题:小组讨论,方案分享
- 设计题:开放项目,报告展示
Ch11 撰写完成 | 总计六节约3000行