跳转至

什么是拟合

原文(免费):什么是拟合 —— 建议先读原文,本页是我的笔记

一句话结论:拟合就是「参数 → 预测 → 损失」这条链反过来用:用一个数字(损失)给一组参数打分,然后去找分数最低的那组参数。

核心要点

  1. 模型 = 结构 + 参数:结构是人写的 ŷ = wx + b(一元线性回归),参数 w(权重,斜率)和 b(偏置,上下平移)由数据决定。换一组参数就是换一条直线。
  2. 单点准不算准:某组参数可能恰好把 2 公里那条记录预测得最好,但模型必须兼顾所有样本,所以需要一个「全局打分」。
  3. 误差 e_i = ŷ_i − y_i:正 = 高估,负 = 低估。直接求和会正负抵消——一个 +10 一个 −10 加起来是 0,但其实错得离谱。
  4. 均方误差 MSE:先平方(去掉符号、放大大错)再平均。写成 L(w, b) 是在强调:数据固定时,损失是参数的函数。这个视角转换是整个 ML 的核心——我们优化的不是 x,而是 w, b。
  5. 损失(loss) 是「模型有多差」的单一数字;MSE 是回归最常用的一种损失函数。
  6. 拟合(fitting) = 根据已有数据调整参数让损失尽量小。原文对比三组手选参数:A (2, 5) → 19.8,B (4, 2) → 2.0,C (3.5, 4.3) → 0.86。
  7. 损失不为 0 是正常的:数据点本来就不在一条直线上,拟合追求的是「整体最好」,不是「穿过每个点」(追求后者会通向过拟合)。
  8. 代码只有两行:pred = w * x + b;loss = ((pred - y) ** 2).mean()。真正的难题留给下一篇——怎么让程序自己找到 w, b。
参数 w, b预测 ŷ误差 e = ŷ − y损失 L(w, b) ŷ = wx + b与真实 y 比较平方再平均拟合:调参数让 L 变小
参数 w, b预测 ŷ误差 e = ŷ − y损失 L(w, b) ŷ = wx + b与真实 y 比较平方再平均拟合:调参数让 L 变小

⚠️ 补充(本机实测):原文把模型 C 描述成「三组候选里最好」的手选参数,其实 C 恰好就是这份数据的最小二乘最优解,不是「还能再调」的候选。用 torch.linalg.lstsq 直接解:

lstsq w,b = [3.5, 4.3]
2 5 19.8
4 2 2.0
3.5 4.3 0.86

也就是说 0.86 已经是这条直线结构能达到的最小 MSE;在原文编辑器里怎么手调都不会低于它。手算验证:距离均值 3、时间均值 14.8,w = Σ(x−x̄)(y−ȳ) / Σ(x−x̄)² = 35 / 10 = 3.5,b = 14.8 − 3.5×3 = 4.3。这正是下一篇最小二乘法要推出的公式。

📝 作者是怎么讲的

  • 开场是一个具体问题:6 公里的新订单要多久送到? 先承认人凭经验知道「越远越久」,再指出模型需要「一条明确的计算规则」。直觉和形式化之间的落差,就是全文要填的坑。借用:开场用一个要算出数的具体问题,比用一个抽象目标有力。
  • 先手算一个点,再暴露「只看一个点」的问题。 先拿一组参数算 2 公里的预测,比真实值少了 2 分钟;再换三组参数比较,发现第三组对这一点最准。马上追问:模型不能只照顾一条数据,需要一个衡量全部数据的标准。问题链就是这么往前推的。
  • 用一个反例逼出公式。 为什么不能把误差直接相加?举「一个少 10 分钟、一个多 10 分钟,加起来是 0」的反例,读者自己就会想到要平方。MSE 不是被宣布出来的,是被逼出来的。借用:介绍一个规则或约束前,先给出不这么做会出错的具体例子。
  • 图把公式画出来。 三张同坐标范围的图里,橙色竖虚线的长度就是误差,「平方后求平均」就是 MSE。公式的每一项在图上都有对应的东西。
  • 结尾压缩成一条因果链,再留一个悬念。 「参数决定预测,预测产生损失,数据帮助我们找到损失更小的参数」作为收束;然后点破三组参数都是手写的,抛出「程序怎样自己找到参数?」引向下一篇最小二乘。借用:章末留一个本章没解决、下一章解决的问题。

回到主线

LLM 的训练就是一次规模大到离谱的「拟合」:结构是 Transformer,参数是千亿级的权重,损失不是 MSE 而是「预测下一个 token 的交叉熵」——数据里真实的下一个 token 拿到的概率越低,损失越大。所以「LLM 本质是预测下一个 token 的概率模型」这句话,在训练侧的精确含义是:它的参数是被拟合到「让训练文本里每个下一个 token 都尽量可能」的。而在你用它的推理侧,参数已经冻结,唯一还能调的变量就是上下文——这就是为什么 Agent 工程全部是上下文工程。

对照你的环境

  • 「先定义一个可计算的分数,再去优化它」这件事你天天在做:你的周报 skill 统计「误报率」、code review 平台看 finding disposition,本质都是先把「好不好」压成一个数字,才谈得上改进。拟合只是把「改进」这一步也交给了算法。
  • 可以在 code/ml 里直接复现上面的补充:uv run python -c 跑 torch.linalg.lstsq(A, y),其中 A 是 [x, 1] 两列拼起来的矩阵——这也是第一次看到「偏置 = 一列全 1 的特征」这个常用技巧。

自测题

  1. 为什么不用「误差之和」做损失?如果改用「误差绝对值的平均」(MAE),和 MSE 相比对异常点更敏感还是更不敏感?
  2. 对原文的数据,w = 3.5, b = 4.3 时 6 公里预测多少?如果来一笔 50 公里的订单,你敢信这个预测吗?为什么?
  3. 把 MSE 写成 L(w, b) 而不是 L(x, y),这个写法背后的视角是什么?
参考答案
  1. 正负误差会抵消,大错也可能得 0 分。MAE 对异常点更不敏感:MSE 把误差平方,一个误差 8 的点贡献 64,会把直线强行往它那边拉。
  2. 3.5 × 6 + 4.3 = 25.3 分钟。50 公里远超训练数据的 1–5 公里范围,属于外推,线性关系在那里很可能不成立(要上高速、换交通工具……),不可信。
  3. 训练时数据是固定的已知量,参数才是变量;损失被看作「参数空间上的一张曲面」,拟合就是在这张曲面上找最低点——这直接引出梯度下降。

相关章节