第24章 · 数值分析与凸优化补遗 · 阶段测试题答案¶
章节: 数值分析与凸优化补遗 题量: 单选 × 8 + 多选 × 4 + 简答 × 5 + 编程 × 2 = 19 题 关联:
阶段测试题/第24章.md
一 · 单选题答案 (8 题)¶
| 题号 | 答案 | 解析要点 |
|---|---|---|
| 1.1 | B | bfloat16 指数位 8 vs FP16 指数位 5,范围更大 |
| 1.2 | A | Hessian ≥ μI, μ > 0 是强凸定义 |
| 1.3 | B | Slater 条件是强对偶的充分条件(strictly feasible) |
| 1.4 | B | 内存 O(mn) 适合大模型 |
| 1.5 | B | 无锁异步 SGD |
| 1.6 | B | Ring AllReduce 是最优实现 |
| 1.7 | B | 联邦学习上传模型参数(不传数据,保隐私) |
| 1.8 | A | ZeRO-1 优化器状态 / ZeRO-2 +梯度 / ZeRO-3 +参数 |
二 · 多选题答案 (4 题)¶
| 题号 | 答案 | 解析要点 |
|---|---|---|
| 2.1 | AB | Hessian 半正定 + 一阶条件;梯度为零不是,Lipschitz 也不直接 |
| 2.2 | ABCD | Stationarity + Primal + Dual + Complementary Slackness |
| 2.3 | ABCD | Newton/BFGS/Trust Region/K-FAC+Shampoo |
| 2.4 | ABCD | DDP/FSDP/DeepSpeed/Pipeline |
三 · 简答题答案 (5 题)¶
3.1 Mixed Precision Training¶
为什么: 权重/激活/梯度用 FP16(省内存 + 快 Tensor Core),但主副本 FP32(避免精度损失)。 技术: - Loss Scaling: loss × scale(典型 65536),防止 FP16 梯度下溢 - GradScaler: 检测 inf/nan,动态调整 scale - 关键算子(Loss/Softmax/BN)FP32 计算
3.2 优化器对比¶
- SGD: 简单,泛化好,慢,需手动调 lr;适合 CNN/RL
- Adam: 自适应,快,泛化略差,默认首选;适合 Transformer
- L-BFGS: 二阶近似,收敛快但内存大,需小 batch;适合小数据集 / 经典 ML
- Shampoo: 二阶 preconditioner,加速 2-3×;适合大模型
3.3 SVM 对偶与 KKT¶
原始: min (1/2)||w||² s.t. yᵢ(w·xᵢ+b)≥1。 Lagrangian: L = (1/2)||w||² - Σαᵢ[yᵢ(w·xᵢ+b)-1]。 对 w, b 求偏导 = 0: w = Σαᵢyᵢxᵢ, Σαᵢyᵢ = 0。 代入得对偶: max Σαᵢ - (1/2)ΣΣαᵢαⱼyᵢyⱼ(xᵢ·xⱼ) s.t. αᵢ≥0。 KKT 互补松弛: αᵢ[yᵢ(w·xᵢ+b)-1]=0, 即 yᵢ(w·xᵢ+b)>1 时 αᵢ=0(非支持向量),=1 时 αᵢ≥0(支持向量)。
3.4 DDP vs FSDP¶
- DDP: 每 worker 完整模型 + AllReduce 梯度。内存 = 模型 + 优化器。通信 1 次/步
- FSDP: 模型/优化器/梯度都分片。内存 ≈ (模型+优化器)/world_size。通信 2-3 次/步
- 选 DDP: 模型 < 1.5B,显存够
- 选 FSDP: 模型 > 7B,单卡放不下(等价 ZeRO-3)
3.5 Catastrophic Cancellation¶
典型场景: - Softmax 溢出: exp(1000) = inf → 全 0 - CrossEntropy: log(0) = -inf - 梯度消失: 梯度小到 fp16 无法表示(下溢) - SVD 退化: 矩阵太病态
避免: - Softmax 减 max: e^(xᵢ-max) / Σe^(xⱼ-max) - CrossEntropy 内部 log_softmax - 用 bfloat16(更大动态范围)替代 FP16 - Loss Scaling + GradScaler
四 · 编程题答案 (2 题)¶
4.1 数值稳定 Softmax¶
import numpy as np
def softmax_stable(x):
x = np.array(x)
x_shifted = x - np.max(x) # 关键: 减 max
exp_x = np.exp(x_shifted)
return exp_x / np.sum(exp_x)
4.2 DDP 训练循环¶
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
def train_ddp(rank, world_size, model, optimizer):
# 1. 初始化进程组
dist.init_process_group("nccl", rank=rank, world_size=world_size)
torch.cuda.set_device(rank)
model = model.to(rank)
ddp_model = DDP(model, device_ids=[rank])
# 2. 训练循环
for epoch in range(num_epochs):
for batch in dataloader:
outputs = ddp_model(**batch)
loss = outputs.loss
# 3. DDP 自动在反向时 AllReduce 梯度
optimizer.zero_grad()
loss.backward() # 自动同步
optimizer.step()
dist.destroy_process_group()
五 · 评分标准¶
- 单选每题 5 分,共 40 分
- 多选每题 5 分(少选/错选 0 分),共 20 分
- 简答每题 8 分(公式 + 推导 + 应用),共 40 分
- 编程每题 10 分(正确性 5 + 数值稳定 3 + 可读性 2),共 20 分
总分 120。
六 · 通过门槛¶
| 等级 | 分数 | 含义 |
|---|---|---|
| 优秀 | ≥ 100 | 数值优化 + 分布式训练双优 |
| 合格 | 80-99 | 基础扎实,可进大模型训练 |
| 需重学 | < 80 | 建议重读 Ch24 + Boyd《Convex Optimization》 |