通俗易懂讲透批量梯度下降法(BGD)

通俗易懂讲透批量梯度下降法(BGD)|本科生/研究生都能看懂

本文用大白话+下山比喻+公式拆解+完整代码+可视化,把批量梯度下降(Batch Gradient Descent)从原理、流程、优缺点到适用场景讲得明明白白,适合机器学习入门、面试复习、课程笔记。


一、先搞懂:什么是批量梯度下降(BGD)?

一句话定义:
批量梯度下降 = 每一步都用「全部训练数据」算梯度,再统一更新一次参数。

超级形象比喻:
你在下山找最低点(最小损失):

  • BGD:每走一步,都把整座山的地形看一遍,再决定往哪走、走多远
  • 优点:方向准、不跑偏
  • 缺点:走一步超级慢

二、核心思想(超简单)

  1. 所有样本的误差
  2. 平均梯度
  3. 沿梯度反方向更新参数
  4. 重复直到损失不再下降

三、为什么要用 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=1m(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)} θjJ=m1i=1m(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ηθjJ

  • η:学习率(步长)
  • 方向:沿梯度反方向下降

五、BGD 完整算法流程(4步背会)

  1. 初始化参数 θ(随机)
  2. 用全部数据计算梯度
  3. 按学习率更新参数
  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)优点

  1. 梯度最准确:无噪声,方向最稳
  2. 收敛可靠:凸问题必到全局最优
  3. 更新平滑:不震荡、不抖动
  4. 理论保证强:最容易分析收敛性

八、BGD 缺点(非常关键)

  1. 速度极慢:每步都要遍历全量数据
  2. 占内存大:必须把数据全部放进内存
  3. 无法在线学习:不能流式处理数据
  4. 大数据不适用:千万级别样本基本跑不动

九、BGD vs SGD vs Mini-batch GD(速记表)

算法每次用多少数据速度梯度噪声稳定性适用场景
BGD全部最慢最稳小数据集、凸优化
SGD1个最快震荡大数据、深度学习
Mini-batch一小批较稳深度学习通用

十、BGD 适用场景(直接照抄)

适合用 BGD

  • 数据集较小(万级以内)
  • 线性回归、逻辑回归等凸优化
  • 希望训练过程最稳定
  • 教学、实验、推导

不适合

  • 大数据集
  • 深度学习(CNN、Transformer)
  • 内存有限设备

十一、一句话总结

批量梯度下降(BGD)是最原始、最稳定、最准确的梯度下降版本,但因为每一步都要跑完所有数据,速度极慢,只适合小数据集与教学演示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值