AI 工程地基 15|统计:0.02 的差距,是改进还是噪声

「AI 工程地基」系列第十六篇。把 GitHub 上 58k star 的开源课 AI Engineering from Scratch(MIT 协议)一课一课啃完、核完、讲完。今天第 15 课:机器学习统计,Build 型,120 分钟,前置是概率与贝叶斯那两课。

目录
  1. AI 工程地基 15|统计:0.02 的差距,是改进还是噪声
  2. 0.87 对 0.89,你敢不敢上线
  3. 过一遍海关
  4. 算完再说话

AI 工程地基 15|统计:0.02 的差距,是改进还是噪声

「AI 工程地基」系列第十六篇。把 GitHub 上 58k star 的开源课 AI Engineering from Scratch(MIT 协议)一课一课啃完、核完、讲完。今天第 15 课:机器学习统计,Build 型,120 分钟,前置是概率与贝叶斯那两课。

0.87 对 0.89,你敢不敢上线

一个具体场景。你训练了两个模型,A 在测试集上 0.87,B 是 0.89。你把 B 上了线。三周后生产指标反而掉了。为什么?因为那 0.02 的差距可能根本不是改进,是噪声。测试集太小,或者方差太大,或者两者都有。你把随机波动包装成功能发了出去。

这课讲的就是怎么在上线之前把这笔账算清楚。工具箱里最核心的几件,一件件过。

先看描述统计。均值、中位数、众数都在回答「中间在哪」。数据是 [1, 2, 3, 4, 1000],均值 202,中位数 3——均值被那个大数拽走了,中位数站在原地。两者分道扬镳,说明分布是偏的。离散程度看方差和 IQR,百分位数看尾巴:做延迟监控时,P50 是普通用户的体验,P99 是长尾,常常是中位数的好几倍。安全关键的应用里,一个 P99 糟糕的模型可能不如一个均值平庸的模型。

然后是相关。Pearson 量线性关系,Spearman 量单调关系。y 等于 x 的立方,一条完美的单调曲线,Pearson 算出来小于 1(它只认直线),Spearman 给 1(它先换成排名再算,单调就满分)。协方差矩阵是相关性的全家福:对角线是方差,非对角是两两协方差。上一课的 PCA 分解的就是它。

重头戏是假设检验。逻辑不复杂:先立一个「没差别」的零假设,然后问——如果真没差别,我看到的这组数据有多反常?这个概率就是 p 值。p 值小于 0.05,你说「差异显著」。但课程反复强调一件事,值得原样记下来:p 值不是「零假设为真的概率」。它是「假设零假设为真,数据这么极端的概率」。方向反了,这是统计学里被读错最多的一行字。

t 检验比均值,卡方检验比频率,这两件是标准件。真正的主角是两件新工具。

第一件,效应量。数据够多时,再琐碎的差异都会显著。0.9234 对 0.9237,差 0.03%,一百万样本,p 值很漂亮——但值得为它换个模型吗?Cohen's d 把差异除以合并标准差,得到一个与样本量无关的「这事儿多大」的数:0.2 小,0.5 中,0.8 大。p 值管真不真,效应量管要不要紧。两个都报。

第二件,bootstrap。它的主张很大胆:不做任何分布假设,任何一个统计量——中位数、F1、两个模型 AUC 之差——我都能给你配出置信区间。办法是暴力:从你的数据里有放回地抽一遍,算一次统计量;重复一千次,把这一千个结果排序,掐头去尾取中间 95%。完事。它背后的底气是算力,不是公式。

还有一条中心极限定理的实际推论值得单独说:小批量梯度下降能工作,是因为一批样本上的平均梯度收敛到真梯度。另外它还有一条难得的自我警告——CLT 不救重尾分布,柯西分布(方差无穷大)不在保的范围里。这句警告在本系列第 06 课审计时是缺席的,这一课自己补上了。

过一遍海关

老规矩,代码全跑,数字逐条核。先说这课干净的部分,干净得很扎实:t 分布和卡方的 p 值是手写正则化不完全 beta 函数算的,跟 scipy 对账到小数点后十六位,零误差;正文那个卡方例子(120 对 80,卡方值 8,自由度 1)p 值 0.00468,正文写「小于 0.005」,精确;多重比较的 demo 跑出 1/20 个未校正假阳性、Bonferroni 后 0/20,与正文预言的「期望 1 个」严丝合缝;功效模拟 0.32 和 0.84,与理论值 0.32、0.85 几乎重合。教科书级的实现。

但这一课有个奇怪的规律:它教的东西,比它自己用的东西准。

第一个发现,教「统计显著性」的那个示例,自己就不显著。正文说:模型 A 准确率 0.9234,模型 B 是 0.9237,一百万测试样本,p 值 0.001,统计显著。我把这三个数放进最标准的双比例检验里算了一遍:z 等于 0.80,p 值 0.425。离 0.001 差着三倍多的 z——真想拿到 0.001,差距得是现在的四倍(0.9234 对 0.9246 那个量级)。这组数字也不是没有救:如果两个模型是在同一批测试样本上配对比较,B 修对了 300 道 A 做错的题、一道没错,用 McNemar 检验 p 值又能小到没边。问题就在这里——示例没说它站在哪个口径上,独立读法不显著,配对读法极显著,一个天上一个地下。而按它自己写的叙事(两个模型、同一测试集),该用的是配对口径。一个讲「你算过才知道」的章节,示例数字是没算过的。本系列第 07 课那笔「97% chance B is better」的旧账,同款。

第二个发现,代码 demo 现场翻车,翻得很有教学价值。「统计 vs 实际显著性」的演示想讲:小样本测不出小效应,大样本能测出但效应量微不足道。实际跑出来:小样本组(n=30,真实效应 0.01 个标准差)p 值 0.028,显著;Cohen's d 高达 0.58,中档效应。大样本组(n=10 万)p 值 0.002,d 只有 0.014。demo 的上半场演砸了——它想展示「测不出」,结果展示了假阳性活生生发生:30 个样本里恰好抽出了 0.58 个标准差的随机差。这恰恰是正文十条错误清单里第 8 条(小测试集不报方差)的现场案例,和第 4 条(混淆统计显著与实际显著)的完美对照:一边是显著的假货,一边是显著的真琐碎。课程没接住这个球。你把 seed 换一个数,这个故事就换了剧本。

第三个发现,推荐撞上数学。正文说:ML 实验里你通常只有 5 折或 10 折交叉验证,所以 Wilcoxon 符号秩检验这类非参数方法常常比 t 检验更合适。问题:5 折的时候,Wilcoxon 双侧 p 值的数学下限是 2 除以 2 的 5 次方,0.0625。大于 0.05。也就是说,五折全胜——每一折都是 B 赢——p 值也到不了显著线。推荐的最典型参数,让推荐的方法物理上不可能在 0.05 水平拒绝零假设。六折才刚过线(0.031)。scipy 实测确认:五个全正的差值,p 等于 0.0625,纹丝不动。五折党想用 Wilcoxon,先把折数加到六。

第四个发现,一个函数的静默退化。demo 数据是 15 个互不相同的数,众数函数对它跑了一遍,打印「Mode: 12」。12 不是出现最多的数——每个数都只出现了一次,众数不存在。函数内部把所有数都当成「并列第一」,排序后返回最小的那个。12 是这组数据的最小值。正文自己写过「众数对连续数据很少有意义」,但代码没设这道卡:没有重复值时它不报错、不警告,安静地变成一个 min()。接口不设卡这个家族,本系列见第四次了。

第五个发现,口径没写,坑就埋下了。Pearson 的公式写成 r 等于分子除以 n 乘 s_x 乘 s_y,s 是标准差。哪个标准差?这课前两页刚教完贝塞尔修正:样本方差除 n 减 1,不是 n。学生顺手用刚学的样本标准差代进去,r 会系统性缩小——缩小的倍数恰好是 (n-1)/n。十折交叉验证那组数据,算出来的 r 偏小 10%。课程代码自己用的是总体口径(除 n),恰好等于标准 Pearson,没出错;但公式没标注口径,前脚教 n-1 后脚用 n,两个口径在相邻两节之间静默切换。同一件事还发生在协方差上:正文公式分母是 1/n,代码的 covariance 函数默认除 (n-1),协方差矩阵函数又硬编码 (n-1),Pearson 内部又用 1/n——四处三种写法。同一组五个数,正文公式算方差 2.0,代码算出 2.5,差 25%。好在相关系数分子分母口径约掉了,不受影响;受影响的是每一个直接读协方差数值的人。

第六个发现,bootstrap 正文教一套,代码跑一套。正文的模型比较流程写得很清楚:重采样测试集索引,两个模型在同一批重采样索引上各自算指标,存下差值。这是配对做法,保住了「两个模型看同一批数据」的天然结构。代码实现的是另一回事:两组各自独立重采样。在配对数据上,独立版把差异的置信区间撑宽了 1.89 倍(实测:配对版宽 0.016,独立版宽 0.031),白白损失功效。教的是配对,码的是独立,跑出来的数字差着近一倍。

小账三条。正文说训练时的损失分布「均值远小于中位数(易样本造成的左偏)」——方向反了。损失以下界 0 为界,易样本堆在 0 附近,难样本把尾巴拖向右边,这是右偏,均值大于中位数,和课程自己写对的收入分布(右偏,均值被富人拉高)是同一个形状。课程对收入写对了,对 loss 写反了。第二,demo 输出里符号打架:观测差异打印的是 B 减 A(正 5.73),Cohen's d 和 t 统计量是 A 减 B(负 0.56、负 2.46),同一个输出两个方向,读的人自己统一。第三,Bonferroni 的注脚安错了地方:正文说它「检验独立时有效」——实际上 Bonferroni 对任意相依结构都控制错误率(它是纯粹的并集界),真正需要独立性的是前面那个 1 减 0.95 的 20 次方等于 0.64 的公式,那个前提正文反而没提。

给一句好评收尾这节:这课的 CLT 一节带了三条「不做什么」的清单——不把你的数据变正态、不救无穷方差的重尾、不适用有相关性的数据。第三条尤其难得,本系列第 06 课审计时那条「对任何起点分布成立」的口号缺的就是这个限定词,这一课自己补上了。一门课的后半程给前半程补漏,算系列内首见。

算完再说话

把这一课压缩成一句:点估计是断言,置信区间是给断言标注的带宽。你下次说「B 比 A 好」,把 0.02 和它的置信区间一起说出来;只有十折的话,配对差值过一遍 Wilcoxon,记住六折是底线;差异不到 0.02 的,先算 Cohen's d 再决定要不要开会。想亲眼看看那个不显著的示例,把 0.9234 和 0.9237 代进双比例检验,z 是 0.80——这个数会替这门课把没说完的话说完。


*原课:ai-engineering-from-scratch 第 15 课 Statistics for Machine Learning(Rohit Ghumare,MIT 协议)。系列前篇见主页。全文翻译已存档。*

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens