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

2.1 梯度下降基础

核心问题: 什么是梯度下降?为什么它这么重要?

在线 Notebook

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


优化问题

问题设定

给定一个损失函数 L(w),找到使损失最小的参数 w

w=argminwL(w)

为什么重要

  • 机器学习:训练模型就是最小化损失函数
  • 深度学习:神经网络有数百万个参数,需要高效的优化算法
  • LLM:训练一个LLM就是优化数十亿个参数

梯度下降的直观理解

类比:下山

想象你在山上,想找到最低点。

  1. 看周围:计算梯度(最陡的下坡方向)
  2. 往下走:沿着梯度方向走一步
  3. 重复:直到到达山底

数学表达

wt+1=wtαL(wt)

其中:

  • wt:第t步的参数
  • α:学习率(步长)
  • L(wt):损失函数在 wt 处的梯度

偏导数与梯度基础

什么是偏导数

对于多元函数 f(x1,x2,...,xn)偏导数是指对其中一个变量求导,其他变量视为常数。

例子: 对于函数 f(x,y)=x2+2xy+y2

  • x 的偏导数:fx=2x+2y
  • y 的偏导数:fy=2x+2y

与普通导数的区别:

  • 普通导数:对一元函数求导
  • 偏导数:对多元函数中的一个变量求导

梯度的几何意义

梯度向量定义为所有偏导数组成的向量:

f=[fx1fx2fxn]

关键性质: 梯度向量指向函数增长最快的方向。

为什么梯度下降有效:

  1. 梯度 L 指向损失函数增长最快的方向
  2. 梯度的反方向 L 指向下降最快的方向
  3. 沿着梯度反方向移动,能最快地减小损失函数值
  4. 这就是梯度下降的核心原理

数学表达:

wt+1=wtαL(wt)

其中:

  • α 是学习率(步长)
  • L(wt) 是下降最快的方向

梯度的计算

什么是梯度

梯度是函数在某点的方向导数,指向函数增长最快的方向。

L=[Lw1Lw2Lwn]

链式法则

对于复合函数,用链式法则计算梯度:

Lw=Lyyw

反向传播(Backpropagation)

在神经网络中,用反向传播高效计算梯度。

思想: 从输出层开始,逐层计算梯度,复用中间结果。

复杂度: O(n)(n是参数数量),而不是 O(n2)


学习率的影响

学习率太小

收敛很慢,需要很多步才能到达最优点。

学习率太大

可能跳过最优点,甚至发散。

学习率合适

快速收敛到最优点。

梯度下降的变种

批量梯度下降(Batch GD)

用所有数据计算梯度:

wt+1=wtαi=1NLi(wt)

优点: 梯度准确,收敛稳定

缺点: 计算慢,内存占用大

随机梯度下降(SGD)

用一个样本计算梯度:

wt+1=wtαLi(wt)

优点: 计算快,内存占用小

缺点: 梯度有噪音,收敛不稳定

小批量梯度下降(Mini-batch GD)

用一小批数据计算梯度:

wt+1=wtαibatchLi(wt)

优点: 平衡速度和稳定性

缺点: 需要调整批大小


本节小结

梯度下降是机器学习的基础:

  • 沿着梯度方向下降
  • 学习率控制步长
  • 反向传播高效计算梯度

MMSE vs Neural Network

图2.1:MMSE估计器与神经网络估计器的性能对比。它直观展示了优化目标相同时,不同模型结构在误差和信噪比上的表现差异,也帮助理解为什么后续需要更强的优化器与更灵活的模型。

代码实验

完整的代码示例位于:code/ch02_optimization/mmse_vs_nn.py

运行方式:

bash
python code/ch02_optimization/mmse_vs_nn.py

代码包含:

  • 最小均方误差(MMSE)估计器的实现
  • 神经网络估计器的实现
  • 性能对比(MSE、SNR)
  • 可视化对比

关键输出:

  • MMSE的输出MSE和SNR
  • 神经网络的输出MSE和SNR
  • 两者的性能差异

与深度学习的联系

梯度下降 → 神经网络训练

梯度下降(基础)
    ↓ (应用到神经网络)
反向传播(高效计算梯度)
    ↓ (优化神经网络参数)
神经网络训练(深度学习)
    ↓ (扩展到大规模模型)
LLM训练(数十亿参数)

反向传播的核心

反向传播就是在神经网络中应用梯度下降和链式法则:

  1. 前向传播:计算预测值
  2. 计算损失:比较预测值和真实值
  3. 反向传播:从输出层开始,逐层计算梯度
  4. 参数更新:用梯度下降更新参数

为什么梯度下降对深度学习重要

  • 参数众多:神经网络有数百万个参数,需要高效的优化算法
  • 非凸优化:神经网络的损失函数通常是非凸的,梯度下降类方法是最常用、最可扩展的训练方法
  • 可扩展性:梯度下降可以扩展到任意大的模型
  • 反向传播:梯度下降的高效实现(反向传播)使大规模训练成为可能

在LLM中的应用

梯度下降在LLM训练中的核心作用

LLM的训练以梯度下降类优化和反向传播为核心:

  1. 大规模参数优化

    • GPT-3: 175B参数
    • 需要高效的梯度计算和参数更新
    • 反向传播使这成为可能
  2. 反向传播的效率

    • 计算复杂度:O(参数数量)
    • 使得数十亿参数的模型训练可行
    • 是LLM训练的基础
  3. LLM训练的典型流程

    输入tokens → 前向传播 → 计算损失 → 反向传播 → 梯度更新
    • 每个batch重复这个过程
    • 数十亿个tokens的训练数据
    • 需要高效的梯度计算

学习率在LLM训练中的重要性

  • 预热阶段:前1000-10000步逐步增加学习率
  • 主训练阶段:使用较大的学习率加快收敛
  • 衰减阶段:逐步降低学习率以精细调整
  • LLM典型配置:学习率从1e-4到1e-3

梯度累积在LLM中的应用

由于内存限制,LLM训练常使用梯度累积:

  • 多个小batch的梯度相加
  • 在不改变其他训练细节时,可近似模拟更大的有效 batch
  • 内存占用不增加
  • 是LLM训练的标准技巧

常见问题

Q: 为什么梯度下降会陷入局部最优? A: 对非凸问题,梯度下降不能保证找到全局最优。深度网络中更常见的困难包括鞍点、平坦区域和病态曲率;过参数化模型中的许多可达解效果不错,但这不是所有问题都成立的定理。

Q: 学习率如何选择? A: 常见的做法是从 α=0.01α=0.001 开始,然后根据训练曲线调整。如果损失不下降,减小学习率;如果收敛缓慢,增大学习率。在实际应用中,通常使用学习率调度(learning rate schedule)来动态调整。

Q: 为什么需要反向传播? A: 反向传播用反向模式自动微分一次性计算所有参数的梯度,成本通常和前向传播同量级。相比逐个参数做数值差分,它使大规模神经网络训练成为可能。

Q: 梯度下降和随机梯度下降有什么区别? A: 梯度下降用所有数据计算梯度,收敛稳定但计算慢。随机梯度下降用一个样本计算梯度,计算快但梯度有噪音。小批量梯度下降是两者的折中。

Q: 为什么神经网络需要梯度下降? A: 神经网络的损失函数通常是非凸的,没有通用闭式解。梯度下降类方法能和反向传播高效结合,因此成为深度学习训练的主流方法。


下一节: 2.2 自适应优化器

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