第2章 梯度下降原理:从数学直觉到工程实践
梯度下降,说白了就是让模型一步步「下山」的过程。我刚开始接触时也觉得这名字挺唬人,其实核心就三件事:往哪走、走多远、怎么走得更稳。
这一章我们就把梯度下降的数学推导、学习率的作用、批量与随机梯度下降的区别,一次性讲透。
核心认知:梯度下降不是某个公式,而是一套「用导数指导参数更新」的迭代策略。理解它,你就掌握了90%优化算法的底层逻辑。
2.1 梯度下降的数学推导
先看一个最简单的场景。假设我们有一个损失函数 J(θ),目标是找到一组参数 θ 让 J(θ) 最小。
泰勒展开告诉我们,在 θ 附近做一小步移动 Δθ,损失的变化近似为:
J(θ + Δθ) ≈ J(θ) + ∇J(θ) · Δθ
想让损失下降,就要让 ∇J(θ) · Δθ 为负。最直接的做法?让 Δθ 与梯度方向相反。
于是得到参数更新公式:
θ_new = θ_old - η · ∇J(θ_old)
其中 η 是学习率,∇J(θ_old) 是梯度向量。
我个人习惯把这个公式拆成三步记:
- 算梯度:对当前参数求偏导
- 定步长:梯度乘以学习率
- 反方向更新:参数减去步长
嗯,就这么简单。但简单不代表容易用好——坑都在后面。
小技巧:写代码调试时,我习惯把每次迭代的梯度范数打印出来。如果梯度范数突然爆炸,八成是学习率太大;如果梯度范数一直很小但损失不降,可能是陷入了鞍点。
2.2 学习率的作用
学习率 η 决定了每一步迈多大。它是最重要的超参数,没有之一。
我在项目中遇到过这样的场景:模型训练了三天,损失曲线像心电图一样剧烈震荡。排查了半天,最后发现就是学习率设大了0.01。
学习率的影响可以用下表总结:
| 学习率 | 收敛行为 | 典型后果 |
|---|---|---|
| 过大 | 损失震荡或发散 | 模型不收敛,甚至 NaN |
| 适中 | 平稳下降,快速收敛 | 理想状态 |
| 过小 | 下降极慢 | 训练时间翻倍,容易过拟合 |
| 衰减策略 | 先快后稳 | 兼顾速度和精度 |
为什么会这样?你想想看:
- 学习率太大,参数跳过最优点,在谷底来回震荡
- 学习率太小,参数像蜗牛爬,迭代几百轮还在原地
- 学习率衰减,前期大步探索,后期小步精调
避坑指南:我曾经在调一个推荐系统模型时,把学习率从0.001改到0.01,结果损失直接飞到了1e8。后来养成习惯——每次改学习率,先跑10个batch看看梯度范数是否稳定。
2.3 批量梯度下降与随机梯度下降
梯度计算需要遍历所有样本吗?不一定。这里就引出了两种主流策略。
批量梯度下降(BGD)
每次更新用全部训练样本计算梯度。
θ = θ - η · (1/m) · Σ ∇J_i(θ) // i从1到m
优点:梯度方向准确,收敛稳定。
缺点:数据量大时,每步计算太慢,内存也扛不住。
随机梯度下降(SGD)
每次更新只用一个样本计算梯度。
θ = θ - η · ∇J_i(θ) // 随机选一个i
优点:计算快,能跳出局部最优。
缺点:梯度噪声大,收敛路径曲折。
我刚开始做深度学习时,总觉得SGD太「糙」了。后来发现,正是这种噪声帮助模型逃离了鞍点——你想想看,在高维空间中,鞍点远比局部极小点多得多。
小批量梯度下降(Mini-batch GD)
这是工程中最常用的方案。每次取一个batch(比如32、64、128个样本)计算梯度。
θ = θ - η · (1/b) · Σ ∇J_i(θ) // b为batch size
三种方法的对比:
| 方法 | 每次使用样本数 | 梯度精度 | 收敛速度 | 内存需求 |
|---|---|---|---|---|
| BGD | 全部 | 高 | 慢(每步耗时) | 高 |
| SGD | 1 | 低(噪声大) | 快(每步快) | 低 |
| Mini-batch | batch size | 中等 | 均衡 | 可控 |
工程建议:我个人的默认配置是batch size=32,学习率从0.01开始,配合StepLR每30个epoch衰减0.1。这个组合在大部分CV和NLP任务上都能快速收敛。
2.4 三种梯度下降的收敛路径对比
下面这张SVG图直观展示了BGD、SGD和Mini-batch GD在二维损失面上的收敛路径差异。
2.5 工程实践中的选择策略
说了这么多理论,到底怎么选?我总结了一套经验法则:
- 数据量 < 1万:用BGD,稳定且容易调试
- 数据量 1万~100万:用Mini-batch,batch size取32~256
- 数据量 > 100万:用SGD或小batch的Mini-batch,配合学习率衰减
- 在线学习场景:必须用SGD,因为数据是流式到达的
调参建议:我习惯先固定batch size=64,用0.01的学习率跑50个epoch。如果损失震荡,把学习率降到0.001;如果损失下降太慢,把batch size降到32。这个「先调学习率,再调batch size」的顺序,能省下大量试错时间。
2.6 本章小结
梯度下降的核心就三句话:
- 沿着梯度反方向更新参数
- 学习率控制步长,太大震荡、太小蜗牛
- BGD稳定但慢,SGD快但噪,Mini-batch是工程首选