Skip to content

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查找
练习2O(n²×d)复杂度分析Ch2复杂度
练习3线性注意力O(n×d²)原理Ch3近似查找
练习4向量相似度计算+语义解释Ch4图嵌入
练习5温度/Top-K/Top-P对比Ch5贪心

方法应用题答案要点

练习核心实现关联章节
练习6KV-cache类实现Ch2缓存
练习7稀疏注意力+压缩方案Ch10流式
练习8RAG两阶段系统Ch3查找

错误诊断题答案要点

练习诊断要点关联章节
练习9OOM→滑动窗口修复Ch2缓存溢出
练习10重复→温度+惩罚修复Ch5贪心局限

开放设计题答案要点

练习设计要点关联章节
练习11可视化工具设计Ch4图可视化
练习12自适应温度策略Ch10流式

11.6.7 知识卡片完整映射

卡片编号卡片标题练习覆盖
C11-01自注意力=软检索练习1、3
C11-02注意力矩阵热图练习1、11
C11-03多头注意力=并行检索练习1、11
C11-04O(n²)复杂度瓶颈练习2、7
C11-05KV-cache增量计算练习2、6、9
C11-06缓存溢出策略练习6、9
C11-07线性注意力原理练习3、7
C11-08FlashAttention分块练习7
C11-09稀疏注意力模式练习7
C11-10Token化算法练习4
C11-11向量空间几何练习4
C11-12位置编码设计练习4
C11-13温度采样权衡练习5、10、12
C11-14Top-K/Top-P采样练习5、10
C11-15上下文压缩策略练习7
C11-16RAG两阶段流程练习8
C11-17向量相似度检索练习8
C11-18注意力Sink现象练习9
C11-19语义方向向量练习4
C11-20采样分布可视化练习12

11.6.8 设计反思

练习设计原则

原则本节体现
分层递进理解→应用→诊断→设计
知识卡片覆盖20张卡片均有练习
跨章节关联每题标注关联章节
开放性设计题鼓励创新
可验证性代码题可测试

教学建议

  • 基础题:课堂练习,即时反馈
  • 应用题:课后作业,提交代码
  • 诊断题:小组讨论,方案分享
  • 设计题:开放项目,报告展示

Ch11 撰写完成 | 总计六节约3000行

新时代的算法课程