什么是梯度下降?批量、随机和小批量梯度下降有什么区别?
简化版
梯度下降(Gradient Descent) 是最小化损失函数、求最优参数的核心优化算法——思路是:沿着损失函数「下降最快的方向」(负梯度方向)一步步更新参数,直到走到损失的最低点。就像下山时每一步都朝最陡的下坡方向走。按「每次更新用多少数据算梯度」分三种:BGD(批量) 用全部数据算梯度,准但慢、内存大;SGD(随机) 每次只用一个样本,快但震荡;MBGD(小批量) 每次用一小批(如 32、64 个),兼顾速度和稳定,是实践中的默认选择。关键超参数是学习率(步子大小)。
详细版
梯度下降的核心更新公式:
θ = θ - η · ∇L(θ)
↑ ↑
参数 学习率 × 损失对参数的梯度(下降最快方向的反方向)
- ∇L(θ):损失函数对参数的梯度,指向上升最快的方向。
- 负梯度 -∇L(θ):下降最快的方向——朝这个方向更新参数,损失下降。
- η(学习率):步长,控制每步走多远。
三种梯度下降对比:
| 类型 | 每次更新用的数据 | 速度 | 稳定性 | 内存 | 适用 |
|---|---|---|---|---|---|
| BGD(批量) | 全部样本 | 慢 | 稳(朝真实梯度) | 大 | 小数据 |
| SGD(随机) | 1 个样本 | 快 | 震荡大 | 小 | 在线学习 |
| MBGD(小批量) | 一小批(如 32~256) | 快 | 较稳 | 适中 | 默认选择 |
学习率 η 的影响:
- 太大 → 步子太大,可能震荡、越过最低点甚至发散。
- 太小 → 收敛极慢,还可能卡在局部最优。
完整版教学
一、梯度下降要解决什么问题
机器学习训练模型,本质是找一组参数,让损失函数最小(损失衡量预测和真实的差距,见「损失函数」专题)。问题是:损失函数往往很复杂(高维、非线性),没有公式能直接算出最优参数。
梯度下降就是一种迭代求最优参数的方法——不直接求解,而是从一个初始参数出发,一步步朝「让损失下降」的方向调整,逐渐逼近最低点。它是机器学习和深度学习最核心的优化算法,几乎所有需要「训练」的模型都靠它(或它的变体)。
二、核心思想:沿负梯度方向下山
用下山来理解梯度下降:
- 你站在山上(当前参数),想走到山谷最低处(损失最小的参数),但大雾弥漫看不见全局,只能感知脚下哪个方向最陡。
- 策略:每一步都朝「最陡的下坡方向」走一小步,重复很多次,最终走到谷底。
数学上,「最陡的上坡方向」就是梯度 ∇L(θ)(损失对参数的偏导),那么「最陡的下坡方向」就是负梯度 -∇L(θ)。更新公式:
θ_new = θ_old - η · ∇L(θ_old)
每次沿负梯度方向、走 η 大小的一步,损失就下降一点,反复迭代直到收敛(梯度接近 0,到了「平地」——极小值点)。
三、学习率:步子迈多大(关键超参数)
学习率 η(learning rate) 控制每一步走多远(步长),是梯度下降最重要的超参数:
- 学习率太大:步子迈太大,可能一步跨过最低点、在谷底两侧来回震荡,甚至越走越高、发散(损失爆炸)。
- 学习率太小:步子太小,收敛极慢(要走很多很多步),还容易卡在局部最优/鞍点出不来。
所以要调到合适的学习率——不大不小。实践中还常用学习率衰减(一开始大步快速接近、后期小步精细逼近)和自适应学习率(如 Adam 自动调整每个参数的学习率,见「深度学习」专题)。
四、批量梯度下降(BGD)
批量梯度下降(Batch Gradient Descent):每次更新参数时,用「全部训练样本」计算梯度(对所有样本的损失求平均梯度),再走一步。
- 优点:梯度方向准确(是整个数据集上的真实梯度),更新稳定、朝着最优方向平滑下降。
- 缺点:每走一步都要遍历全部数据,非常慢;数据量大时内存吃不消(一次性加载全部);无法在线更新(新数据来了要重新算全部)。
适合小数据集。数据量一大就不实用了。
五、随机梯度下降(SGD)
随机梯度下降(Stochastic Gradient Descent):每次只用「一个随机样本」计算梯度并更新参数。
- 优点:每步计算极快(只算一个样本);内存小;能在线学习(新样本来了直接更新);随机性有助于跳出局部最优(震荡可能帮它逃离不好的局部极小)。
- 缺点:梯度方向噪声大、震荡剧烈(一个样本的梯度不代表整体方向,忽左忽右),收敛路径曲折、可能在最优点附近来回抖不停下来。
「随机」指每次随机抽一个样本。它快但不稳。
六、小批量梯度下降(MBGD)——实践默认
小批量梯度下降(Mini-batch Gradient Descent):每次用「一小批样本」(batch,如 32、64、128、256 个)计算梯度并更新——是 BGD 和 SGD 的折中。
- 兼顾速度和稳定:比 BGD 快得多(不用全部数据),比 SGD 稳得多(一小批的平均梯度噪声比单样本小)。
- 能用向量化/GPU 并行加速:一批样本一起算,充分利用矩阵运算和 GPU,效率高。
- 内存适中:只加载一个 batch。
这是深度学习和大多数机器学习实践的默认选择。「batch size(批大小)」是一个超参数——太小接近 SGD(震荡)、太大接近 BGD(慢、可能泛化变差),常用 32~256。
注意:现在实践里常说的「SGD」,很多时候其实指的是 MBGD(用 mini-batch 的随机梯度下降),术语上有些混用。
七、梯度下降的挑战与改进
梯度下降不是完美的,有几个挑战:
- 局部最优 / 鞍点:非凸损失(如神经网络)有很多局部极小和鞍点,梯度下降可能卡住。SGD 的随机性、动量等有助于逃离。
- 学习率难调:太大发散、太小太慢。
- 各参数尺度不同:不同特征尺度差异大时收敛慢(所以要特征归一化)。
改进的优化器(在 MBGD 基础上):
- Momentum(动量):累积历史梯度方向,像「惯性」一样加速收敛、减少震荡。
- AdaGrad / RMSProp:自适应调整每个参数的学习率。
- Adam:结合动量和自适应学习率,深度学习最常用的优化器(详见「深度学习」专题)。
这些都是为了让梯度下降收敛更快、更稳、更省心。
八、用数字和工程流程校验理解
对 J(w)=(w-3)^2,从 w0=0 出发,梯度为 2(w-3)=-6。学习率 η=0.1 时,w1=0-0.1×(-6)=0.6,损失从 9 降到 5.76;若 η 过大,参数可能跨过最低点反复震荡甚至发散。
| 对象/方案 | 核心机制 | 选择或风险 |
|---|---|---|
| BGD | 每步使用全部 N 个样本 | 方向稳定、单步成本高 |
| SGD | 每步使用 1 个样本 | 噪声大、更新频繁 |
| Mini-batch | 每步使用 B 个样本 | 向量化效率与噪声折中 |
把面试题落到可执行流程:
sample batch B
-> forward -> loss
-> gradient -> w = w - ηg
-> repeat until stopping condition
SGD 在文献中有时泛指小批量随机优化;面试时先说明自己采用“单样本 SGD、批量 BGD、mini-batch”这套定义。
九、常见误区与追问
- 误区:负梯度方向一定一步到达全局最优。 它只是在局部给出最速下降方向,非凸问题中不保证全局最优。
- 误区:batch 越大,训练总是越快越好。 大 batch 减少梯度噪声但占显存、降低更新频率,也可能影响泛化。
- 追问:为什么要打乱训练数据? 避免样本顺序带来的系统性偏差,使小批量梯度更接近随机估计。
- 追问:学习率过小有什么表现? 损失下降缓慢,有限训练预算内可能停在远离最优点的位置。
- 追问:梯度下降需要特征缩放吗? 尺度差异会让损失等高线狭长,统一尺度通常能显著改善收敛。
十、加强记忆
记忆时抓住这条主线:梯度下降 = 最小化损失、求最优参数的核心优化算法:沿负梯度方向(下降最快)一步步更新参数,公式 θ = θ - η·∇L(θ),像下山朝最陡下坡走。学习率 η(步长)关键:太大震荡/发散、太小收敛慢。三种按「每次用多少数据算梯度」分:BGD(批量,全部样本)——准但慢、内存大,适合小数据;SGD(随机,1 个样本)——快、内存小、能在线学习、随机性助跳出局部最优,但震荡剧烈;MBGD(小批量,如 32~256)——折中,兼顾速度和稳定、能 GPU 并行,是实践默认(batch size 是超参数,现在说的 SGD 常指 MBGD)。挑战:局部最优/鞍点、学习率难调、需特征归一化。改进优化器:Momentum(动量加速)、RMSProp、Adam(动量+自适应学习率,深度学习最常用)。记忆锚点:顺着负梯度下山,小批量是默认,学习率要调好。