通俗易懂讲透批量梯度下降法(BGD)|本科生/研究生都能看懂
本文用大白话+下山比喻+公式拆解+完整代码+可视化,把批量梯度下降(Batch Gradient Descent)从原理、流程、优缺点到适用场景讲得明明白白,适合机器学习入门、面试复习、课程笔记。
一、先搞懂:什么是批量梯度下降(BGD)?
一句话定义:
批量梯度下降 = 每一步都用「全部训练数据」算梯度,再统一更新一次参数。
超级形象比喻:
你在下山找最低点(最小损失):
- BGD:每走一步,都把整座山的地形看一遍,再决定往哪走、走多远
- 优点:方向准、不跑偏
- 缺点:走一步超级慢
二、核心思想(超简单)
- 看所有样本的误差
- 算平均梯度
- 沿梯度反方向更新参数
- 重复直到损失不再下降
三、为什么要用 BGD?
- 方向最准确:用全体数据,梯度无噪声
- 稳定不震荡:更新路径平滑
- 凸问题一定收敛到全局最优
- 实现最简单、理论最扎实
四、数学公式一步步看懂
1. 损失函数(以均方误差 MSE 为例)
J(θ)=1m∑i=1m(hθ(x(i))−y(i))2 J(\theta)=\frac{1}{m}\sum_{i=1}^m\left(h_\theta(x^{(i)})-y^{(i)}\right)^2 J(θ)=m1i=1∑m(hθ(x(i))−y(i))2
- m:样本总数
- hθ(x):模型预测值
2. 梯度(对每个参数求偏导)
∂J∂θj=1m∑i=1m(hθ(x(i))−y(i))xj(i) \frac{\partial J}{\partial\theta_j}=\frac{1}{m}\sum_{i=1}^m\left(h_\theta(x^{(i)})-y^{(i)}\right)x_j^{(i)} ∂θj∂J=m1i=1∑m(hθ(x(i))−y(i))xj(i)
3. 参数更新(核心公式)
θj=θj−η⋅∂J∂θj \theta_j = \theta_j - \eta \cdot \frac{\partial J}{\partial\theta_j} θj=θj−η⋅∂θj∂J
- η:学习率(步长)
- 方向:沿梯度反方向下降
五、BGD 完整算法流程(4步背会)
- 初始化参数 θ(随机)
- 用全部数据计算梯度
- 按学习率更新参数
- 重复直到损失收敛
六、代码实战:批量梯度下降训练线性回归(房价预测)
直接复制可运行,包含:
- 数据生成
- 标准化
- BGD 训练
- 损失曲线 + 预测对比图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# ===================== 1. 生成模拟房价数据 =====================
np.random.seed(42)
def generate_data(num_samples):
area = np.random.normal(1500, 500, num_samples)
age = np.random.normal(20, 10, num_samples)
rooms = np.random.randint(1, 6, num_samples)
price = area*300 + age*(-1500) + rooms*10000 + np.random.normal(0,50000,num_samples)
return pd.DataFrame({'area':area,'age':age,'rooms':rooms,'price':price})
data = generate_data(100000)
# 标准化
data = (data - data.mean()) / data.std()
# 可视化:价格分布 + 相关性
plt.figure(figsize=(14,5))
plt.subplot(121)
sns.histplot(data['price'],kde=True)
plt.title('房价分布')
plt.subplot(122)
sns.heatmap(data.corr(),annot=True,cmap='coolwarm')
plt.title('特征相关性')
plt.show()
# ===================== 2. 构建 X、y =====================
X = data[['area','age','rooms']].values
y = data['price'].values.reshape(-1,1)
m = len(X)
# 添加偏置项(截距)
X = np.hstack((np.ones((m,1)), X))
# ===================== 3. 批量梯度下降 BGD =====================
theta = np.random.randn(4,1)
lr = 0.01
iters = 1000
cost_history = []
def compute_cost(X,y,theta):
pred = X.dot(theta)
return np.mean((pred-y)**2)/2
for i in range(iters):
# 计算梯度(全部样本)
grad = X.T.dot(X.dot(theta)-y) / m
# 更新参数
theta -= lr * grad
# 记录损失
cost = compute_cost(X,y,theta)
cost_history.append(cost)
if i%100 ==0:
print(f"Iter {i:4d} | Cost: {cost:.6f}")
# ===================== 4. 损失曲线 =====================
plt.figure(figsize=(12,5))
plt.plot(cost_history,'b-',linewidth=2)
plt.title('批量梯度下降 损失收敛曲线')
plt.xlabel('迭代次数')
plt.ylabel('损失')
plt.grid()
plt.show()
# ===================== 5. 预测 vs 真实 =====================
pred = X.dot(theta)
plt.figure(figsize=(12,5))
plt.scatter(y,pred,alpha=0.2)
plt.plot([y.min(),y.max()],[y.min(),y.max()],'r-',linewidth=2)
plt.title('真实价格 vs 预测价格')
plt.xlabel('真实')
plt.ylabel('预测')
plt.grid()
plt.show()
七、批量梯度下降(BGD)优点
- 梯度最准确:无噪声,方向最稳
- 收敛可靠:凸问题必到全局最优
- 更新平滑:不震荡、不抖动
- 理论保证强:最容易分析收敛性
八、BGD 缺点(非常关键)
- 速度极慢:每步都要遍历全量数据
- 占内存大:必须把数据全部放进内存
- 无法在线学习:不能流式处理数据
- 大数据不适用:千万级别样本基本跑不动
九、BGD vs SGD vs Mini-batch GD(速记表)
| 算法 | 每次用多少数据 | 速度 | 梯度噪声 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| BGD | 全部 | 最慢 | 无 | 最稳 | 小数据集、凸优化 |
| SGD | 1个 | 最快 | 大 | 震荡 | 大数据、深度学习 |
| Mini-batch | 一小批 | 中 | 中 | 较稳 | 深度学习通用 |
十、BGD 适用场景(直接照抄)
✅ 适合用 BGD
- 数据集较小(万级以内)
- 线性回归、逻辑回归等凸优化
- 希望训练过程最稳定
- 教学、实验、推导
❌ 不适合
- 大数据集
- 深度学习(CNN、Transformer)
- 内存有限设备
十一、一句话总结
批量梯度下降(BGD)是最原始、最稳定、最准确的梯度下降版本,但因为每一步都要跑完所有数据,速度极慢,只适合小数据集与教学演示。
&spm=1001.2101.3001.5002&articleId=160005458&d=1&t=3&u=4e14dc2cd71549f289f9dcb90159a65b)
455

被折叠的 条评论
为什么被折叠?



