第2章扩展:高级优化话题
版本: v2.0
最后更新: 2026-05-26
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
本文档包含第2章的深度扩展内容,适合想深入理解优化算法的读者。
E2.1 二阶优化方法
牛顿法(Newton's Method)
思想: 用二阶导数(Hessian矩阵)加速收敛。
更新规则:
其中
优点:
- 收敛速度快(二阶收敛)
- 对学习率不敏感
缺点:
- 计算Hessian矩阵很贵(
) - 对大规模问题不实用
拟牛顿法(Quasi-Newton Methods)
思想: 用一阶导数近似Hessian矩阵。
常见方法:
- BFGS:用秩2更新近似Hessian
- L-BFGS:内存高效的BFGS
优点:
- 比梯度下降快
- 比牛顿法便宜
缺点:
- 仍然比Adam慢
- 对深度学习不如Adam有效
E2.2 随机优化理论
收敛速度分析
梯度下降的收敛速度:
随机梯度下降的收敛速度:
含义: SGD的收敛速度比GD慢,但计算成本更低。
方差缩减
问题: SGD的梯度有噪音,导致收敛慢。
解决方案: 用历史梯度信息缩减方差。
方法:
- SVRG(Stochastic Variance Reduced Gradient)
- SAG(Stochastic Average Gradient)
效果: 在凸优化中达到线性收敛速度。
E2.3 非凸优化
深度学习中的非凸性
问题: 神经网络的损失函数是非凸的,有很多局部最优。
关键观察: 在许多过参数化深度网络中,可达的局部解往往已经足够好;实际训练更常被鞍点、平坦区域和病态曲率影响。
鞍点(Saddle Points)
定义: 梯度为0,但不是最优点的地方。
问题: 梯度下降容易被困在鞍点。
解决方案:
- 加入噪音(SGD自然有噪音)
- 用二阶信息检测鞍点
过度参数化(Over-parameterization)
观察: 在许多过参数化模型中,实际训练更容易找到可用的低损失解,但这不是所有非凸问题的通用保证。
启示: 大模型(如LLM)的优化景观在实践中可能更容易训练,但仍依赖初始化、数据、优化器和训练策略。
E2.4 学习率调度的高级技巧
预热(Warmup)
为什么需要:
- 初期梯度不稳定
- 小学习率避免发散
实现:
# 前1000步:线性增加
# 之后:余弦衰减余弦退火(Cosine Annealing)
公式:
优点: 平滑的学习率衰减
周期性重启(Periodic Restart)
思想: 定期重置学习率,帮助跳出局部最优。
效果: 在某些问题上能找到更好的解。
E2.5 正则化与优化
L2正则化(权重衰减)
公式:
效果: 防止过拟合,也影响优化过程。
L1正则化
公式:
效果: 产生稀疏解(某些权重为0)。
批归一化(Batch Normalization)
作用: 稳定训练,允许更大的学习率。
机制: 标准化每层的输入,减少内部协变量转移。
E2.6 优化与泛化的关系
双重下降现象(Double Descent)
观察: 随着模型复杂度增加:
- 训练误差先下降(欠拟合)
- 然后上升(过拟合)
- 再下降(过度参数化)
启示: 大模型不一定过拟合。
隐式正则化(Implicit Regularization)
观察: SGD本身就有正则化效果。
机制: 梯度噪音引导优化器找到"平坦"的最优点。
启示: 不需要显式正则化,SGD就能泛化。
E2.7 分布式优化
数据并行
方法: 多个GPU各处理一个批次,梯度平均。
通信开销: 每步需要同步梯度。
模型并行
方法: 大模型分割到多个GPU。
挑战: 需要特殊的优化算法来处理通信。
联邦学习
方法: 在多个客户端上训练,只传输模型更新。
应用: 隐私保护的分布式训练。
E2.8 与LLM训练的连接
大规模训练的实践
LLM训练的典型配置:
- 优化器:AdamW(Adam + 权重衰减)
- 学习率:1e-4 到 1e-3
- 预热步数:总步数的1-10%
- 学习率衰减:余弦衰减
梯度检查(Gradient Checking)
目的: 验证反向传播的正确性。
方法: 用数值梯度与自动微分梯度比较。
损失曲线分析
健康的训练曲线:
- 损失平稳下降
- 没有突然的跳跃
- 最后收敛到稳定值
问题信号:
- 损失NaN或Inf:学习率太大
- 损失不下降:学习率太小或模型有问题
- 损失震荡:批大小太小或学习率不稳定
E2.9 推荐论文
经典论文
Kingma & Ba (2014) - "Adam: A Method for Stochastic Optimization"
- Adam优化器的原始论文
- 深度学习中最常用的优化器
Ruder (2016) - "An overview of gradient descent optimization algorithms"
- 优化算法的综合综述
- 很好的入门资料
现代进展
Loshchilov & Hutter (2019) - "Decoupled Weight Decay Regularization"
- AdamW优化器
- 改进了Adam的权重衰减
You et al. (2019) - "Large Batch Optimization for Deep Learning: Training BERT in 76 minutes"
- 大批量训练的技巧
- 对LLM训练很有参考价值
E2.10 进一步学习
书籍
"Optimization for Machine Learning" by Beck
- 优化理论的深度讲解
- 适合想理解理论的读者
"Deep Learning" by Goodfellow, Bengio, Courville
- 第8章讲优化(书中章节,非本教程)
- 很好的综合资源
在线资源
- Stanford CS231n - Lecture 7: Optimization
- MIT 6.036 - Optimization for Machine Learning
- Distill.pub - 关于优化的可视化文章
实践项目
实现优化器
- 从SGD开始
- 逐步实现Momentum、RMSprop、Adam
学习率调度实验
- 对比不同的调度策略
- 观察对收敛的影响
大规模训练
- 用多GPU训练模型
- 实践梯度累积和混合精度
与深度学习的联系
为什么深度学习不使用二阶方法
虽然二阶方法(牛顿法、拟牛顿法)在理论上收敛更快,但在深度学习中很少使用。原因如下:
1. 计算成本太高
Hessian矩阵的计算复杂度:
- 对于
个参数的模型,Hessian矩阵是 的 - 计算Hessian需要
的时间和空间 - 对于LLM(数十亿参数),这是不可行的
具体例子:
GPT-3: 175B参数
Hessian矩阵大小: 175B × 175B = 3×10^19 元素
内存需求: 约 3×10^20 字节 = 300 EB(艾字节)2. 内存占用太大
一阶方法(Adam)的内存需求:
- 参数:
- 一阶矩(梯度均值):
- 二阶矩(梯度平方均值):
- 总计:
的内存
二阶方法的内存需求:
- 参数:
- Hessian矩阵:
- 总计:
的内存
对比:
Adam: 175B × 3 = 525B 参数
二阶方法: 175B × 175B = 3×10^19 参数
比例: 二阶方法需要 5.7×10^10 倍的内存!3. 对大规模问题不实用
深度学习的特点:
- 参数数量巨大(数十亿到数万亿)
- 数据量巨大(数万亿tokens)
- 需要快速迭代
二阶方法的局限:
- 每次迭代都需要计算和存储Hessian
- 即使用拟牛顿法近似,仍然很贵
- 对于超大规模模型,通常不可行
何时使用二阶方法
虽然在深度学习中不常用,但二阶方法在某些场景仍然有价值:
1. 小规模问题
适用场景:
- 参数数量 < 100K
- 需要精确的最优解
- 计算资源充足
例子:
- 传统机器学习(SVM、逻辑回归)
- 小规模神经网络
- 科学计算中的优化问题
2. 需要快速收敛
优势:
- 二阶收敛速度(quadratic convergence)
- 在最优点附近收敛非常快
- 需要的迭代次数少
应用:
- 需要精确解的问题
- 计算每次迭代成本很高的问题
3. 计算资源充足
条件:
- 有足够的内存存储Hessian
- 有足够的计算能力计算Hessian
- 时间不是主要限制
例子:
- 高性能计算集群
- 离线优化问题
- 研究和实验
与Adam的对比
| 方面 | 二阶方法 | Adam |
|---|---|---|
| 收敛速度 | 二阶(快) | 一阶(慢) |
| 迭代次数 | 少(10-100) | 多(1000-100000) |
| 每次迭代成本 | 高,需要 Hessian 或其近似 | 低,状态量随参数规模线性增长 |
| 总计算成本 | 中等 | 低 |
| 内存需求 | 巨大,完整 Hessian 近似为 | 较小,一阶/二阶矩状态为 |
| 可扩展性 | 差 | 好 |
| 超参数敏感性 | 相对低 | 中等,仍需调学习率和调度 |
| 实现复杂度 | 高 | 低 |
具体对比
小规模问题(n=1000):
二阶方法:
- 迭代次数: 50
- 每次迭代成本: 1000×1000 = 100万操作
- 总成本: 50 × 100万 = 5000万操作
Adam:
- 迭代次数: 10000
- 每次迭代成本: 1000 = 1000操作
- 总成本: 10000 × 1000 = 1000万操作
结论: 二阶方法快5倍大规模问题(n=1亿):
二阶方法:
- 迭代次数: 50
- 每次迭代成本: 1亿×1亿 = 10^16操作
- 总成本: 50 × 10^16 = 5×10^17操作
- 内存: 10^16 × 8字节 = 80 PB(不可行)
Adam:
- 迭代次数: 100000
- 每次迭代成本: 1亿 = 10^8操作
- 总成本: 100000 × 10^8 = 10^13操作
- 内存: 3 × 1亿 × 8字节 = 2.4 GB(可行)
结论: 二阶方法在这个规模下通常不可行,Adam/AdamW 这类一阶方法更现实深度学习为什么选择Adam
可扩展性
- 内存需求线性增长
- 可以处理数十亿参数的模型
计算效率
- 每次迭代成本低
- 可以快速迭代
工程鲁棒性
- 相比基础 SGD,通常更容易调到可用收敛
- 仍然需要配合学习率调度、权重衰减和数值稳定策略
实践效果
- 单步成本低,适合大规模迭代
- 在深度学习中是强基线,但不是所有任务的唯一正确选择
总结
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 小规模问题 | 二阶方法 | 收敛快,内存可承受 |
| 中等规模问题 | L-BFGS | 平衡收敛速度和内存 |
| 大规模深度学习 | Adam / AdamW | 强基线,易于扩展 |
| 超大规模LLM | AdamW | Adam + 改进的权重衰减 |
相关资源
文件位置
本文档是第2章的高级扩展内容,位于:
docs/02_optimization/extensions/advanced_optimization.md相关主文档
- 主文档: 第2章:优化算法与传统机器学习
- 2.1 梯度下降基础: 01_gradient_descent.md
- 2.2 自适应优化器: 02_adaptive_optimizers.md
- 2.3 优化与传统ML: 03_optimization_and_traditional_ml.md
- 2.4 数值方法: 04_numerical_methods.md
相关扩展文档
- 凸分析基础: convex_analysis.md
- 树数据结构: tree_data_structures.md
代码实验
- LMS vs Adam:
code/ch02_optimization/lms_vs_adam.py - MMSE vs NN:
code/ch02_optimization/mmse_vs_nn.py - SVM核方法:
code/ch02_optimization/svm_kernel.py
后续阅读建议
如果你对以下话题感兴趣,可以继续阅读:
深度学习基础
- 第3章:深度学习基础
- 了解如何在实践中应用这些优化算法
Transformer和LLM
- 第7章:Transformer架构
- 第5章:LLM基础
- 了解现代深度学习中的优化实践
数学基础
- 附录A:数学参考
- 了解更多关于Hessian矩阵、凸性等数学概念
优化理论
- Boyd & Vandenberghe, "Convex Optimization"
- Nesterov, "Introductory Lectures on Convex Optimization"
- 深入学习优化理论
返回: 第2章:优化与机器学习
