2. 全批量梯度下降(BGD):原理详解、优缺点分析、适用场景
2.1 先聊聊直觉:什么是“全批量”?
全批量梯度下降,英文叫 Batch Gradient Descent,简称 BGD。
说白了,它的核心就一句话:每次更新参数,都要看遍所有样本。
你想想看,假设你有 10 万张猫狗图片。BGD 的做法是:先把这 10 万张全部算一遍,算出一个总的损失,然后才更新一次模型参数。嗯,就是这么“实在”。
我刚开始接触深度学习时,觉得这方法挺笨的——明明看几张图就能学,为啥非要全看完?后来踩了坑才明白,这种“笨办法”在某些场景下反而是最稳的。
核心公式:
θ = θ - η · ∇θ J(θ)
其中 J(θ) 是所有样本的损失之和,∇θ 是梯度。
2.2 原理详解:一步步拆解
咱们把 BGD 的流程拆开来看,其实就三步:
- 前向传播:把所有样本喂进模型,算出每个样本的损失。
- 计算总梯度:把所有样本的梯度加起来,取平均。
- 更新参数:用这个平均梯度去更新模型权重。
举个例子,假设你有一个线性回归模型 y = wx + b,训练集有 1000 个样本。BGD 的做法是:
# 伪代码示意
for epoch in range(epochs):
total_grad_w = 0
total_grad_b = 0
for i in range(1000):
y_pred = w * x[i] + b
loss = (y_pred - y[i]) ** 2
total_grad_w += 2 * (y_pred - y[i]) * x[i]
total_grad_b += 2 * (y_pred - y[i])
# 取平均梯度
avg_grad_w = total_grad_w / 1000
avg_grad_b = total_grad_b / 1000
# 更新参数
w -= lr * avg_grad_w
b -= lr * avg_grad_b
看到了吗?每更新一次 w 和 b,都要遍历全部 1000 个样本。这就是“全批量”的含义。
2.3 优缺点分析:别急着否定它
优点
- 梯度方向最准:因为用了全部样本,算出来的梯度是全局最优方向。我在做图像分类时对比过,BGD 的收敛曲线是最平滑的,没有那种“上蹿下跳”的感觉。
- 容易收敛到全局最优:尤其对于凸函数,BGD 保证能找到全局最小值。这一点 SGD 做不到。
- 训练过程稳定:损失函数单调下降,调参时特别好判断——如果损失不降了,那就是真的不降了,不是随机波动。
缺点
- 慢,非常慢:这是最大的痛点。我曾在 100 万级别的数据集上跑 BGD,一次迭代就要等十几分钟。你想想看,一天能迭代几次?
- 内存扛不住:所有样本的中间结果都要存着。我遇到过显存爆掉的惨案——32G 的 V100 都撑不住。
- 不适合在线学习:如果数据是流式进来的,BGD 根本没法用。你得等数据攒够了才能更新一次。
避坑指南:我曾经在一个推荐系统项目里强行用 BGD,结果每次训练要 3 小时。后来换成 Mini-batch,20 分钟就搞定了。所以,数据量超过 1 万条时,我建议你慎重考虑 BGD。
2.4 适用场景:什么时候该用它?
说实话,现在纯用 BGD 的场景不多了。但以下情况,它依然是首选:
| 场景 | 原因 |
|---|---|
| 小数据集(< 1000 条) | 计算量小,BGD 反而更稳定 |
| 凸优化问题 | 需要精确的全局最优解 |
| 需要精确梯度分析 | 研究梯度行为时,BGD 的梯度最干净 |
| 硬件资源充足 | 显存够大,不在乎时间 |
我个人习惯是:做实验验证算法时先用 BGD 跑一遍,看看理论上能不能收敛。如果 BGD 都不收敛,那其他方法基本也没戏。
2.5 知识体系图
下面这张图帮你理清 BGD 的核心逻辑:
2.6 一个真实的教训
最后分享一个我自己的经历。有次做金融风控模型,数据量只有 500 条,我习惯性地用了 Mini-batch。结果模型死活不收敛,损失曲线像心电图一样。
后来我换成 BGD,一次迭代后损失就稳定下降了。为什么?因为数据太少,Mini-batch 的随机性反而成了干扰。BGD 的全局梯度让模型稳稳地找到了方向。
小技巧:如果你不确定该用哪种梯度下降,先试试 BGD。如果数据量小,它往往是最省心的选择。如果数据量大,BGD 跑不动了,再换 Mini-batch 也不迟。
嗯,BGD 就聊到这儿。它虽然慢,但稳。在合适的场景下,它依然是那个最可靠的“老黄牛”。