AI 问答
记录不太清楚的地方,询问AI后的答案。
梯度下降需要带入数值吗?如果要带入是如何代入的?
用户一直好奇,梯度下降需要带入数值吗?如果要带入是如何代入的?希望以一元线性回归为例进行说明。
问题设定:预测房价
假设我们有 3 个样本(房屋面积 vs 价格):
| 样本 | 面积 \(x\) (㎡) | 价格 \(y\) (万元) |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 2 | 4 |
| 3 | 3 | 5 |
模型:\(\hat{y} = wx + b\)
损失函数(MSE):\(J(w,b) = \frac{1}{2m}\sum_{i=1}^m (\hat{y}^{(i)} - y^{(i)})^2\)
梯度下降公式(带数值)
1️⃣ 先求梯度(偏导数)
\[
\frac{\partial J}{\partial w} = \frac{1}{m}\sum_{i=1}^m (wx^{(i)} + b - y^{(i)}) \cdot x^{(i)}
\]
\[
\frac{\partial J}{\partial b} = \frac{1}{m}\sum_{i=1}^m (wx^{(i)} + b - y^{(i)})
\]
2️⃣ 更新规则
\[
w = w - \alpha \cdot \frac{\partial J}{\partial w}
\]
\[
b = b - \alpha \cdot \frac{\partial J}{\partial b}
\]
第一次迭代:数值代入全过程
初始设置
- 初始值:\(w = 0, b = 0\)
- 学习率:\(\alpha = 0.1\)
- 样本数:\(m = 3\)
Step 1:计算预测值 \(\hat{y}\)
样本1: ŷ¹ = 0×1 + 0 = 0
样本2: ŷ² = 0×2 + 0 = 0
样本3: ŷ³ = 0×3 + 0 = 0
Step 2:计算误差 \((\hat{y} - y)\)
样本1: 0 - 2 = -2
样本2: 0 - 4 = -4
样本3: 0 - 5 = -5
Step 3:计算梯度 \(\frac{\partial J}{\partial w}\)
\[
\begin{aligned}
\frac{\partial J}{\partial w} &= \frac{1}{3} [(-2)×1 + (-4)×2 + (-5)×3] \\
&= \frac{1}{3} [-2 - 8 - 15] \\
&= \frac{-25}{3} \\
&\approx -8.33
\end{aligned}
\]
Step 4:计算梯度 \(\frac{\partial J}{\partial b}\)
\[
\begin{aligned}
\frac{\partial J}{\partial b} &= \frac{1}{3} [(-2) + (-4) + (-5)] \\
&= \frac{-11}{3} \\
&\approx -3.67
\end{aligned}
\]
Step 5:更新参数(这里就是代入数值!)
\[
\begin{aligned}
w_{\text{new}} &= 0 - 0.1 \times (-8.33) = 0 + 0.833 = 0.833 \\
b_{\text{new}} &= 0 - 0.1 \times (-3.67) = 0 + 0.367 = 0.367
\end{aligned}
\]
✅ 第一次迭代完成! \(w\) 从 0 变成 0.833,\(b\) 从 0 变成 0.367
第二次迭代:用新参数继续
新的初始值
- \(w = 0.833, b = 0.367\)
Step 1:重新计算预测值
样本1: ŷ¹ = 0.833×1 + 0.367 = 1.20
样本2: ŷ² = 0.833×2 + 0.367 = 2.03
样本3: ŷ³ = 0.833×3 + 0.367 = 2.87
Step 2:重新计算误差
样本1: 1.20 - 2 = -0.80
样本2: 2.03 - 4 = -1.97
样本3: 2.87 - 5 = -2.13
Step 3:重新计算梯度
\[
\begin{aligned}
\frac{\partial J}{\partial w} &= \frac{1}{3}[(-0.80)×1 + (-1.97)×2 + (-2.13)×3] \\
&= \frac{1}{3}[-0.80 - 3.94 - 6.39] \\
&\approx -3.71
\end{aligned}
\]
\[
\begin{aligned}
\frac{\partial J}{\partial b} &= \frac{1}{3}[(-0.80) + (-1.97) + (-2.13)] \\
&\approx -1.63
\end{aligned}
\]
Step 4:再次更新参数
\[
\begin{aligned}
w_{\text{new}} &= 0.833 - 0.1 \times (-3.71) = 0.833 + 0.371 = 1.204 \\
b_{\text{new}} &= 0.367 - 0.1 \times (-1.63) = 0.367 + 0.163 = 0.530
\end{aligned}
\]
✅ 第二次迭代完成! \(w\) 变成 1.204,\(b\) 变成 0.530
Python 代码实现(自动代入数值)
import numpy as np
# 数据
x = np.array([1, 2, 3])
y = np.array([2, 4, 5])
m = len(x)
# 初始化参数
w, b = 0, 0
alpha = 0.1
# 梯度下降迭代
for iteration in range(100):
# 1. 计算预测值
y_pred = w * x + b
# 2. 计算梯度(代入当前 w, b 的数值)
dw = (1/m) * np.sum((y_pred - y) * x)
db = (1/m) * np.sum(y_pred - y)
# 3. 更新参数(代入梯度和学习率)
w = w - alpha * dw
b = b - alpha * db
# 打印前 3 次迭代
if iteration < 3:
print(f"迭代 {iteration+1}: w={w:.4f}, b={b:.4f}, 梯度 dw={dw:.4f}, db={db:.4f}")
print(f"\n最终结果: w={w:.4f}, b={b:.4f}")
print(f"模型: y = {w:.4f}x + {b:.4f}")
输出:
迭代 1: w=0.8333, b=0.3667, 梯度 dw=-8.3333, db=-3.6667
迭代 2: w=1.2037, b=0.5304, 梯度 dw=-3.7037, db=-1.6370
迭代 3: w=1.3868, b=0.6118, 梯度 dw=-1.8309, db=-0.8137
最终结果: w=1.6111, b=0.7222
模型: y = 1.6111x + 0.7222
关键总结
| 步骤 | 代入什么数值 |
|---|---|
| 计算预测值 | 当前的 \(w, b\) 和训练数据 \(x\) |
| 计算梯度 | 预测值 \(\hat{y}\) 和真实值 \(y\) |
| 更新参数 | 学习率 \(\alpha\) 和计算出的梯度 |
| 重复迭代 | 用新的 \(w, b\) 重新开始 |
✅ 核心要点
- 每次迭代都要代入当前的 \(w, b\) 数值
- 梯度告诉方向,学习率控制步长
- 参数更新后,下一次迭代用新数值继续
- 直到收敛(梯度接近 0 或达到最大迭代次数)
这就是梯度下降的数值迭代本质——不断用当前数值计算梯度,再代入更新公式,一步步逼近最优解!🚀