42 分钟
AI 数学精要

最小二乘与线性回归的闭式解

从高中的 y=wx+b 出发,把「误差平方和最小」一步步求导解出 β=(XᵀX)⁻¹Xᵀy,再看清神经网络为何改用梯度下降

  • 说清「最小二乘」到底在最小化什么,并能对 w、b 分别求导令其为 0 解出直线
  • 把高中直线写成矩阵形式,推出正规方程与闭式解 β=(XᵀX)⁻¹Xᵀy
  • 用 3 个数据点手算出 w、b 的具体数值,并与矩阵解法相互验证
  • 解释为什么浅层线性问题能写闭式解,深层网络却只能靠梯度下降迭代

给一堆散点画一条最贴合的直线——最小二乘就是这个直觉的严格化

生活里你早做过最小二乘:身高和体重摆在坐标系里是一簇散点,你想画一条直线「大致穿过这群点」,让每个点到直线的竖直距离都别太大。这节要做的,就是把「画一条最贴合的直线」这件凭感觉做的事,变成可以一步步推导、能算出确定答案的数学。

因果线如下:先用高中的 y=wx+b 写出这条直线 → 定义「误差平方和」作为衡量贴合好坏的分数 → 对 w、b 分别求导、令导数等于 0,解出最优直线 → 再把这组方程改写成紧凑的矩阵形式,得到机器学习里反复出现的闭式解 β=(XᵀX)⁻¹Xᵀy → 最后问一句:既然有这么漂亮的闭式解,神经网络为什么不直接套公式,非要一圈圈迭代?

1.1 生活直觉:为什么要「平方」误差,而不是直接相加

拿到三个点 (1,2)、(2,2)、(3,4),每条直线 y=wx+b 都对应一组竖直误差:预测值减去真实值。直接把误差相加有个大毛病——正误差和负误差会互相抵消,一条「一半偏高、一半偏低」的直线也能加出 0,看起来完美,其实很差。

平方一下就干净了:每个误差先平方再加起来,正负号一律变正,再也无法互相抵消。这个「误差平方和」记作 S,谁的 S 最小,谁就是最贴合的直线。平方还有个好处:它处处光滑可导(m2 学过,光滑才好求导找最低点),而取绝对值 |误差| 在折线处不可导。这就是「最小二乘」名字的由来——最小化误差平方和。

ℹ️为什么是「竖直」误差而不是「垂直」直线的距离

最小二乘默认只惩罚 y 方向(预测值与真值)的偏差,x 被当成给定的、不含噪声的输入。点到直线的垂直距离在几何上更对称,但那是另一套方法(总体最小二乘)。线性回归的工程标准就是竖直残差,残差 = 真实 y − 预测 ŷ。

1.2 从高中知识搭桥:直线、斜率与「求导=0 找最低点」

先把要用的旧知识摆出来,每个首次出现的符号都标读法:直线 y = w·x + b:w 是斜率(每多 1 单位 x,y 多多少),b 是截距(x=0 时的高度)。残差 rᵢ(读「r i」)= 真实 yᵢ − 预测值 = yᵢ − (w·xᵢ + b)。平方和 S = Σᵢ rᵢ²,Σ 是求和号,把所有样本的残差平方加起来。「对 w 求导令其等于 0」:m2 讲过,光滑函数在最低点处切线水平、导数为 0。把 S 看成只关于 w 的函数(b 暂时固定),S 对 w 的导数为 0 的那个 w,就是让 S 最小的斜率。对 b 同理。两个方程联立,就能同时解出 w 和 b。

推导

从「一元求导」到「二元求导」的那一小步

高中里你对一个函数 f(x) 求导,是看「x 动一点点,f 怎么变」。这里 S 同时依赖 w 和 b 两个旋钮。怎么办?分别来:固定 b,只拧 w,看 S 怎么变,这就是 S 对 w 的偏导(∂S/∂w);再固定 w,只拧 b,就是 ∂S/∂b。m2 已讲过这个「每次只拧一个旋钮」的偏导思想。两个偏导同时为 0,意味着不管你单独拧 w 还是单独拧 b,S 都不再下降——这就是二维平面里的谷底。下面直接动手算。

1.3 严格表述:对 w、b 求导 = 0,解出正规方程

设三个点 (1,2)、(2,2)、(3,4),把残差平方和逐项写开:S = (2 − w − b)² + (2 − 2w − b)² + (4 − 3w − b)²。对 b 求导(每项用链式法则:先对括号整体求导乘 2 倍,再乘括号里对 b 的系数 −1):∂S/∂b = −2[(2−w−b) + (2−2w−b) + (4−3w−b)] = −2[8 − 6w − 3b]。令它等于 0:8 − 6w − 3b = 0,即 6w + 3b = 8。对 w 求导(第二项括号里对 w 的系数是 −2,第三项是 −3):∂S/∂w = −2[1·(2−w−b) + 2·(2−2w−b) + 3·(4−3w−b)] = −2[18 − 14w − 6b]。令它等于 0:14w + 6b = 18。于是得到两个二元一次方程(这就叫正规方程的雏形): 6w + 3b = 8 14w + 6b = 18从第一式解出 b = (8 − 6w)/3,代入第二式:14w + 6·(8−6w)/3 = 18,即 14w + 2(8−6w) = 18 → 14w + 16 − 12w = 18 → 2w = 2 → w = 1。回代得 b = (8−6)/3 = 2/3 ≈ 0.667。

示例代码(可运行)
预测输出
在上面的推导中,若把残差平方和改成「残差绝对值之和」S=Σ|rᵢ|,为什么就不能用「求导=0」这套方法求光滑解?

1.4 手算小例:从「竖直误差」到 SSE,再到矩阵形式

把刚解出的 w=1、b=2/3 代回每个点,看预测与残差(每步中间值都写出来,你拿纸笔能复现):点1 x=1:ŷ₁ = 1·1 + 2/3 = 5/3 ≈ 1.667;残差 r₁ = 2 − 5/3 = 1/3 ≈ 0.333。点2 x=2:ŷ₂ = 1·2 + 2/3 = 8/3 ≈ 2.667;残差 r₂ = 2 − 8/3 = −2/3 ≈ −0.667。点3 x=3:ŷ₃ = 1·3 + 2/3 = 11/3 ≈ 3.667;残差 r₃ = 4 − 11/3 = 1/3 ≈ 0.333。误差平方和 SSE = (1/3)² + (−2/3)² + (1/3)² = 1/9 + 4/9 + 1/9 = 6/9 = 2/3 ≈ 0.667。这就是「所有直线里最小的那个分数」。

示例代码(可运行)

现在把它写成矩阵形式,这是机器学习教材里的标准长相。把每个样本的截距项 1 和特征 x 并排,排成设计矩阵 X(3 行 2 列):X = [[1,1],[1,2],[1,3]],目标向量 y = [2,2,4]ᵀ,待求参数 β = [b, w]ᵀ。严格结论:最小二乘的解是 β = (XᵀX)⁻¹Xᵀy,读作「β 等于 X 转置乘 X 的逆,再乘 X 转置乘 y」。其中 Xᵀ 是把 X 行列互换;上标 −1 表示矩阵求逆(类比数的倒数)。

手算验证这台机器确实给出 β=[2/3, 1]:XᵀX = [[1,1,1]·X 按列点积] = [[3, 6],[6, 14]](3 是 3 个 1 相加;14 = 1²+2²+3²)。Xᵀy = [1·2+1·2+1·4, 1·2+2·2+3·4] = [8, 18]。det(XᵀX) = 3·14 − 6·6 = 42 − 36 = 6(非 0,所以可逆)。二阶矩阵求逆公式 (1/det)[[d,−b],[−c,a]]:(XᵀX)⁻¹ = (1/6)[[14,−6],[−6,3]] = [[7/3,−1],[−1,1/2]]。β = (XᵀX)⁻¹(Xᵀy) = [[7/3,−1],[−1,1/2]]·[8,18] = [7/3·8 − 1·18, −1·8 + 1/2·18] = [56/3−18, −8+9] = [2/3, 1]。矩阵法与逐点求导法得到完全一样的 b=2/3、w=1,互相印证。

示例代码(可运行)
最小二乘的完整流水线:从散点到闭式解

散点数据 (xᵢ, yᵢ)

3 个样本

设计矩阵 X(首列全 1,末列放 x)

把截距 b 也收进矩阵

正规方程 XᵀX β = Xᵀy

由 ∂S/∂β=0 推出

闭式解 β = (XᵀX)⁻¹Xᵀy

一步算出,无需迭代

预测 ŷ = Xβ,残差平方和最小

本例 w=1, b=2/3, SSE=2/3

首列补 1,是为了让截距 b 和斜率 w 共用一套矩阵运算

填空题填写空白处的代码
XtX = [[3,6],[6,14]],Xty = [8,18] # det(XtX) = 3*14 - 6*6 = (填 6) # beta = (XtX)^-1 Xty,解得 b=、w=(填 2/3、1) # 若 det=0,说明 X 列线性相关,矩阵(可逆/不可逆)

1.5 为什么 AI / 大模型需要它:从一条直线到一片损失曲面

你刚做的事,就是一切监督学习的原型:假设函数(直线)→ 损失(SSE)→ 求最优参数。stage17 的线性回归课直接调用这个 β=(XᵀX)⁻¹Xᵀy,机器学习入门那一节讲「训练=最小化损失」,根子就在这里——均方误差 MSE 就是最小二乘的损失,而 m3 已讲过它等价于「高斯噪声假设下的极大似然」。

为什么线性回归有闭式解,神经网络却只能迭代
线性回归(浅、凸、参数少)

损失是关于 w、b 的二次函数

开口朝上的抛物面

求导=0 直接解出唯一谷底

β=(XᵀX)⁻¹Xᵀy,一步到位

前提:XᵀX 可逆、问题凸

参数量小,可真求逆

深度神经网络(深、非凸、参数海量)

层层非线性 + 海量参数

损失曲面高维、崎岖

写不出「求导=0」的解析解

方程巨大且非线性,无法闭式求逆

改用梯度下降一圈圈试

沿 m2 的负梯度方向一步步挪

闭式解是「算一次就到底」;梯度下降是「看指南针一小步一小步挪」。深层网络只能选后者。

🐍工程现实:真实里连线性回归也很少真去求 (XᵀX)⁻¹

闭式解好看,但工程上求逆很贵:XᵀX 是 d×d 矩阵(d 为特征数),求逆是 O(d³),且当特征共线、XᵀX 接近奇异时数值极不稳定。真实代码多直接解线性方程组 XᵀX β = Xᵀy(用 LU/QR 分解,不真求逆),或干脆用梯度下降。理解闭式解是为了看清「最优解在数学上长什么样」,不是让你手算逆矩阵。

选择题

关于最小二乘闭式解 β=(XᵀX)⁻¹Xᵀy,下列说法正确的是?

本节小结

串成一条线:用直线 y=wx+b 拟合散点,为避免正负误差互相抵消,平方后相加得到损失 S=Σ(yi−wxi−b)² → 对 w、b 分别求导令其为 0,解出正规方程,本例 w=1、b=2/3、SSE=2/3 → 补一列 1 把截距收进设计矩阵 X,问题紧凑写成 β=(XᵀX)⁻¹Xᵀy,手算 XᵀX=[[3,6],[6,14]]、det=6 验证一致 → 线性回归因损失凸、参数少才有闭式解;深度网络非凸、参数海量,求不出解析式,只能用 m2 的梯度下降一圈圈逼近。下一课把「单个偏导」升级成「多个偏导排成的一张表」——雅可比矩阵。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

一条样本是一个特征向量,一批样本堆成矩阵,神经网络一层的变换本质就是矩阵乘法加激活。换基/特征值分解相当于找数据的主要方向(PCA 降维),GPU 之所以适合深度学习,正是因为它能大规模并行做矩阵运算。把「向量=对象、矩阵=变换」建立起直觉,后面公式就不再抽象。