核心要点

  • 模型 ŷ = Xw + b,损失用均方误差 MSE = (1/N)·Σ(ŷ−y)²

  • 梯度:dL/dw = (2/N)·Xᵀ(ŷ−y),dL/db = (2/N)·Σ(ŷ−y),全部向量化

  • 更新 w ← w − lr·dw,b ← b − lr·db,迭代至损失收敛

  • 特征需标准化否则不同量纲会让学习率难调;学习率过大发散、过小收敛慢

标准回答

线性回归用梯度下降最小化均方误差。前向计算预测 ŷ=Xw+b,残差 (ŷ−y) 既出现在损失里也出现在梯度里:对权重的梯度是 (2/N)·Xᵀ·残差,对偏置是残差的均值的两倍。每步沿负梯度方向更新参数。注意特征标准化能让损失曲面更接近各向同性,使统一学习率更易收敛。实现如下:

python
import numpy as np

def linear_regression_gd(X, y, lr=0.01, epochs=1000):
    """ŷ = Xw + b,最小化 MSE,全程向量化。"""
    N, D = X.shape
    w = np.zeros(D)          # 权重初始化为 0
    b = 0.0                  # 偏置
    for _ in range(epochs):
        y_hat = X @ w + b              # 前向:预测值
        residual = y_hat - y          # 残差 (ŷ - y)
        # 梯度(MSE 对 w、b 求导,系数 2/N)
        dw = (2 / N) * (X.T @ residual)
        db = (2 / N) * residual.sum()
        # 参数更新:沿负梯度方向
        w -= lr * dw
        b -= lr * db
    return w, b

def mse(X, y, w, b):
    return float(np.mean((X @ w + b - y) ** 2))

if __name__ == '__main__':
    rng = np.random.default_rng(0)
    X = rng.normal(0, 1, (200, 3))
    true_w, true_b = np.array([2.0, -1.0, 0.5]), 3.0
    y = X @ true_w + true_b + rng.normal(0, 0.1, 200)   # 含噪声
    w, b = linear_regression_gd(X, y, lr=0.1, epochs=2000)
    print('w=', np.round(w, 2), 'b=', round(b, 2))      # 接近真值
    print('mse=', round(mse(X, y, w, b), 4))

常见误区

⚠️ 常见踩坑

MSE 梯度的系数是 2/N,漏掉常数 2 不影响最终解但相当于改变有效学习率;更常见的错误是忘记标准化特征导致不同维度梯度量级悬殊、学习率难统一,或把学习率设得过大使损失发散为 NaN。

追问

追问 1复杂度是多少?如何优化?

每个 epoch 的前向与梯度都是 O(N·D),共 O(epochs·N·D)。优化:大数据用 SGD / Mini-batch 每步只用一批样本;用 Adam 等自适应优化器加速;特征标准化改善条件数。若 D 不大,也可直接用正规方程 w=(XᵀX)⁻¹Xᵀy 一步求闭式解,避免迭代。

追问 2梯度下降和正规方程如何取舍?

正规方程 O(D³) 来自矩阵求逆,特征维度高时昂贵且 XᵀX 可能奇异(需正则化);梯度下降按 O(N·D) 扩展、可在线更新、适合大规模和稀疏数据。D 小且 N 适中时正规方程更省心,否则首选梯度下降。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。