跳转至

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\) 重新开始

✅ 核心要点

  1. 每次迭代都要代入当前的 \(w, b\) 数值
  2. 梯度告诉方向,学习率控制步长
  3. 参数更新后,下一次迭代用新数值继续
  4. 直到收敛(梯度接近 0 或达到最大迭代次数)

这就是梯度下降的数值迭代本质——不断用当前数值计算梯度,再代入更新公式,一步步逼近最优解!🚀