前面有一篇文章《机器学习-常用的三种梯度下降法》,这篇文章中对于均方误差的求偏导是错误的,为了澄清这个问题,我再写一篇文章来纠正一下,避免误导大家。
一、批量梯度下降法
我们用 批量梯度下降法 来求解一个简单的 线性回归模型,找出最优参数。
假设问题:
假设我们有以下训练数据集(假设是某个小型房屋面积与价格的关系):
房屋面积 (平方英尺) x | 房屋价格 (万元) y |
---|---|
1 | 3 |
2 | 5 |
3 | 7 |
4 | 9 |
我们假设线性模型的形式为:
y=wx+b
我们的目标是找到参数 w(权重) 和 b(偏置),使得预测值 y^最接近真实值 y。
步骤 1:定义损失函数(均方误差 MSE)
批量梯度下降法的目标是最小化损失函数,常见的损失函数是 均方误差(MSE):
其中:
- mm 是样本数量(本例中 m=4)
- x_i 是输入特征
- y_i 是实际输出
- w 是模型权重,b 是偏置
步骤 2:计算损失函数的梯度
对损失函数 J(w,b)进行求导,得到偏导数(梯度):
步骤 3:更新参数公式
使用批量梯度下降法,按照以下公式更新参数:
其中:
- α 是学习率(如 0.01 或 0.1),控制每次更新的步长
- 梯度值表示损失函数对参数 w 和 b 的变化率
步骤 4:具体计算示例(手算)
假设初始参数:
- w=0, b=0
- 学习率 α=0.01
第 1 轮迭代:
计算预测值:
计算误差(预测 - 真实):
计算梯度:
更新参数:
第 2 轮迭代:
使用更新后的参数 w=0.35, b=0.12,重复上述步骤,直到参数收敛。
步骤 5:Python 代码示例
下面是使用 Python 实现批量梯度下降的简单代码:
import numpy as np# 输入数据
X = np.array([1, 2, 3, 4]) # 房屋面积
y = np.array([3, 5, 7, 9]) # 房屋价格# 初始化参数
w = 0
b = 0
learning_rate = 0.01
num_iterations = 1000 # 迭代次数# 梯度下降
m = len(X) # 样本数量
for i in range(num_iterations):y_pred = w * X + b # 预测值error = y_pred - y # 误差# 计算梯度dw = (2/m) * np.sum(error * X)db = (2/m) * np.sum(error)# 更新参数w -= learning_rate * dwb -= learning_rate * dbif i % 100 == 0:loss = np.mean(error ** 2)print(f"Iteration {i}: Loss = {loss}, w = {w}, b = {b}")# 结果输出
print(f"Trained parameters: w = {w}, b = {b}")
步骤 6:应用场景
批量梯度下降适合以下情况:
- 数据量较小(可以快速计算整个数据集的梯度)
- 数据噪声较少(因为每次更新都使用完整数据,减少波动)
- 适用于批量处理场景,如:
- 线性回归(如房价预测、销售预测)
- 机器学习训练时的批处理系统
总结
-
批量梯度下降法的特点:
- 每次使用 全部数据 来计算损失和梯度。
- 收敛速度稳定,但计算量较大,适合小数据集。
- 更新参数时是全局最优的方向,但容易卡在局部最优。
-
示例回顾:
我们通过房屋面积与价格的线性回归模型,演示了如何使用批量梯度下降一步步优化参数 w 和 b,最终使得预测值与真实值尽可能接近。
希望这个例子能帮助你理解批量梯度下降法的实际应用!
二、随机梯度下降法
用随机梯度下降法(SGD)求解线性回归模型的参数:
假设问题:
我们要拟合一个简单的线性回归模型:
y=wx+b
给定一些样本数据:
x | y |
---|---|
1 | 3 |
2 | 5 |
3 | 7 |
4 | 9 |
目标是找到参数 w 和 b,使得均方误差(MSE)最小:
随机梯度下降法的步骤:
实际计算示例:
重复迭代过程:
接下来从数据集中随机抽取样本,比如 (x2=2,y2=5),并重复计算梯度和更新参数,直到收敛(参数变化足够小)。
总结:
- 批量梯度下降 一次使用所有数据计算梯度,而
- 随机梯度下降(SGD) 每次仅使用一个随机样本来更新参数,因此更新速度快,但震荡较大。
- 适用于大规模数据,能够更快接近最优解。
希望这个示例对你有所帮助!
三、再来回顾一下大一高数中导数的求法
求导步骤:
使用 链式法则 进行求导:
最终结果:
机器学习中,梯度和导数是很重要的概念,大家可以回顾一下高等数学中的微分,对于我们学习机器学习有很大的帮助。