跳转至

第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》