⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

第2章扩展:高级优化话题

版本: v2.0
最后更新: 2026-05-26

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明

本文档包含第2章的深度扩展内容,适合想深入理解优化算法的读者。


E2.1 二阶优化方法

牛顿法(Newton's Method)

思想: 用二阶导数(Hessian矩阵)加速收敛。

更新规则:

wt+1=wtH1L(wt)

其中 H 是Hessian矩阵(二阶导数矩阵)。

优点:

  • 收敛速度快(二阶收敛)
  • 对学习率不敏感

缺点:

  • 计算Hessian矩阵很贵(O(n2)
  • 对大规模问题不实用

拟牛顿法(Quasi-Newton Methods)

思想: 用一阶导数近似Hessian矩阵。

常见方法:

  • BFGS:用秩2更新近似Hessian
  • L-BFGS:内存高效的BFGS

优点:

  • 比梯度下降快
  • 比牛顿法便宜

缺点:

  • 仍然比Adam慢
  • 对深度学习不如Adam有效

E2.2 随机优化理论

收敛速度分析

梯度下降的收敛速度:

E[L(wT)]L(w)=O(1/T)

随机梯度下降的收敛速度:

E[L(wT)]L(w)=O(1/T)

含义: SGD的收敛速度比GD慢,但计算成本更低。

方差缩减

问题: SGD的梯度有噪音,导致收敛慢。

解决方案: 用历史梯度信息缩减方差。

方法:

  • SVRG(Stochastic Variance Reduced Gradient)
  • SAG(Stochastic Average Gradient)

效果: 在凸优化中达到线性收敛速度。


E2.3 非凸优化

深度学习中的非凸性

问题: 神经网络的损失函数是非凸的,有很多局部最优。

关键观察: 在许多过参数化深度网络中,可达的局部解往往已经足够好;实际训练更常被鞍点、平坦区域和病态曲率影响。

鞍点(Saddle Points)

定义: 梯度为0,但不是最优点的地方。

问题: 梯度下降容易被困在鞍点。

解决方案:

  • 加入噪音(SGD自然有噪音)
  • 用二阶信息检测鞍点

过度参数化(Over-parameterization)

观察: 在许多过参数化模型中,实际训练更容易找到可用的低损失解,但这不是所有非凸问题的通用保证。

启示: 大模型(如LLM)的优化景观在实践中可能更容易训练,但仍依赖初始化、数据、优化器和训练策略。


E2.4 学习率调度的高级技巧

预热(Warmup)

为什么需要:

  • 初期梯度不稳定
  • 小学习率避免发散

实现:

python
# 前1000步:线性增加
# 之后:余弦衰减

余弦退火(Cosine Annealing)

公式:

αt=α02(1+cos(πtT))

优点: 平滑的学习率衰减

周期性重启(Periodic Restart)

思想: 定期重置学习率,帮助跳出局部最优。

效果: 在某些问题上能找到更好的解。


E2.5 正则化与优化

L2正则化(权重衰减)

公式:

Lreg=L+λiwi2

效果: 防止过拟合,也影响优化过程。

L1正则化

公式:

Lreg=L+λi|wi|

效果: 产生稀疏解(某些权重为0)。

批归一化(Batch Normalization)

作用: 稳定训练,允许更大的学习率。

机制: 标准化每层的输入,减少内部协变量转移。


E2.6 优化与泛化的关系

双重下降现象(Double Descent)

观察: 随着模型复杂度增加:

  1. 训练误差先下降(欠拟合)
  2. 然后上升(过拟合)
  3. 再下降(过度参数化)

启示: 大模型不一定过拟合。

隐式正则化(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 推荐论文

经典论文

  1. Kingma & Ba (2014) - "Adam: A Method for Stochastic Optimization"

    • Adam优化器的原始论文
    • 深度学习中最常用的优化器
  2. Ruder (2016) - "An overview of gradient descent optimization algorithms"

    • 优化算法的综合综述
    • 很好的入门资料

现代进展

  1. Loshchilov & Hutter (2019) - "Decoupled Weight Decay Regularization"

    • AdamW优化器
    • 改进了Adam的权重衰减
  2. 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 - 关于优化的可视化文章

实践项目

  1. 实现优化器

    • 从SGD开始
    • 逐步实现Momentum、RMSprop、Adam
  2. 学习率调度实验

    • 对比不同的调度策略
    • 观察对收敛的影响
  3. 大规模训练

    • 用多GPU训练模型
    • 实践梯度累积和混合精度

与深度学习的联系

为什么深度学习不使用二阶方法

虽然二阶方法(牛顿法、拟牛顿法)在理论上收敛更快,但在深度学习中很少使用。原因如下:

1. 计算成本太高

Hessian矩阵的计算复杂度:

  • 对于 n 个参数的模型,Hessian矩阵是 n×n
  • 计算Hessian需要 O(n2) 的时间和空间
  • 对于LLM(数十亿参数),这是不可行的

具体例子:

GPT-3: 175B参数
Hessian矩阵大小: 175B × 175B = 3×10^19 元素
内存需求: 约 3×10^20 字节 = 300 EB(艾字节)

2. 内存占用太大

一阶方法(Adam)的内存需求:

  • 参数:n
  • 一阶矩(梯度均值):n
  • 二阶矩(梯度平方均值):n
  • 总计:3n 的内存

二阶方法的内存需求:

  • 参数:n
  • Hessian矩阵:n2
  • 总计:n2+nn2 的内存

对比:

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 近似为 O(n2)较小,一阶/二阶矩状态为 O(n)
可扩展性
超参数敏感性相对低中等,仍需调学习率和调度
实现复杂度

具体对比

小规模问题(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

  1. 可扩展性

    • 内存需求线性增长
    • 可以处理数十亿参数的模型
  2. 计算效率

    • 每次迭代成本低
    • 可以快速迭代
  3. 工程鲁棒性

    • 相比基础 SGD,通常更容易调到可用收敛
    • 仍然需要配合学习率调度、权重衰减和数值稳定策略
  4. 实践效果

    • 单步成本低,适合大规模迭代
    • 在深度学习中是强基线,但不是所有任务的唯一正确选择

总结

场景推荐方法原因
小规模问题二阶方法收敛快,内存可承受
中等规模问题L-BFGS平衡收敛速度和内存
大规模深度学习Adam / AdamW强基线,易于扩展
超大规模LLMAdamWAdam + 改进的权重衰减

相关资源

文件位置

本文档是第2章的高级扩展内容,位于:

docs/02_optimization/extensions/advanced_optimization.md

相关主文档

相关扩展文档

代码实验

后续阅读建议

如果你对以下话题感兴趣,可以继续阅读:

  1. 深度学习基础

    • 第3章:深度学习基础
    • 了解如何在实践中应用这些优化算法
  2. Transformer和LLM

    • 第7章:Transformer架构
    • 第5章:LLM基础
    • 了解现代深度学习中的优化实践
  3. 数学基础

    • 附录A:数学参考
    • 了解更多关于Hessian矩阵、凸性等数学概念
  4. 优化理论

    • Boyd & Vandenberghe, "Convex Optimization"
    • Nesterov, "Introductory Lectures on Convex Optimization"
    • 深入学习优化理论

返回: 第2章:优化与机器学习

本教程采用 CC BY-NC-SA 4.0 许可协议