内容简介
《LLM 时代的经典机器学习:只讲它在哪里重现》是一组共十篇正文的系列文章,对应《AI 算法工程师学习地图》的第 L2 层(机器学习基础)。它面向读完 L0 数学与 L1 工具箱、准备进入深度学习与 LLM 的读者,讲的是经典机器学习里那些在大模型时代仍然每天在用的概念——它们是什么、在 LLM 工作里以什么形态重现、以及一个能算出来的数字。每个概念都从一个具体的小例子讲起、配一张图、给出十几行能跑的核心代码、再对到 LLM 上——假设读者没有学过任何机器学习。
它回答的问题是:
LLM 工作里的哪些问题其实是经典机器学习的老问题?它们的经典解法在 LLM 上还成立吗?1
“经典机器学习”——线性模型、SVM、决策树、K-Means、交叉验证——在大模型时代最常被跳过。理由听起来成立:今天没有人用 SVM 做 NLP 了,Transformer 也不需要特征工程。但跳过它的人会在 L5 遇到一组熟悉的麻烦:奖励模型训了两个 epoch 之后 RL 开始”钻空子”;benchmark 上涨了 5 个点结果发现测试题在训练数据里;judge 模型给长回答打高分;数据过滤器把某一类文本全滤掉了。这些问题在经典机器学习里各有一个名字——过拟合、测试集泄漏、评估偏差、分类器的类别不平衡——并且有一套成熟的处理方法。
所以这一层的价值不在”模型”而在方法论。本系列不按教科书的顺序复述算法,而是反过来:把 LLM 工作里实际出现的经典机器学习列出来,每一处从概念本身讲起(假设读者没学过),说明它在 LLM 上的重现、要懂到什么程度、以及一个用 scikit-learn 几十行就能跑出来的数字。
举一个例子说明这个系列的取法。”奖励模型会过拟合、导致 reward hacking”是 L5 里一句常见的话;本系列第一篇先用 30 个点拟合一条正弦曲线把过拟合本身画出来(多项式次数从 1 到 25,训练误差一路降、验证误差在次数 15 之后飙升),再讲奖励模型为什么是过拟合的典型(8B 参数的特征提取器 + 几万对偏好数据),最后指出经典解法——更多数据、正则化(RLHF 的 KL 项)、早停、集成——每一条在 L5 里的对应物。第三篇再用逻辑回归拟合一个 Bradley-Terry 模型,看到”奖励模型的 loss 就是逻辑回归的 loss 作用在分差上”,并把标注噪声从小调到大,看模型准确率始终贴着标注一致率的上限走。
系列覆盖的范围可以概括为一张”重现表”:
| 经典概念 | 在 LLM 工作里的重现 | 在哪一篇 |
|---|---|---|
| 训练 / 验证 / 测试集划分、测试集泄漏 | benchmark 污染:测试题混进预训练语料;在同一 benchmark 上反复调参 | 第一篇 |
| 过拟合与欠拟合 | 奖励模型过拟合 → reward hacking;SFT 多 epoch 后的记忆 | 第一篇 |
| 偏差 - 方差权衡、集成 | 多次采样投票(self-consistency)、多个 judge 取平均、模型融合(model soup) | 第一篇 |
| 正则化 | weight decay、dropout、RLHF 里的 KL 惩罚(把参考模型当先验) | 第一篇 |
| 线性回归、梯度下降、Ridge / Lasso |
|
第二篇 |
| 逻辑回归、softmax 回归 |
|
第三篇 |
| 朴素贝叶斯、KNN、决策树 |
|
第四篇 |
| SVM 与核方法 | 间隔思想(margin loss);核 = 相似度加权——attention 是一个核平滑器 | 第五篇 |
| 随机森林、梯度提升 |
|
第六篇 |
| 聚类 | 数据多样性分析、按主题配比、找垃圾簇 | 第七篇 |
| 降维(PCA) |
|
第八篇 |
| MinHash 与 LSH | 万亿 token 的近似去重;三层去重 | 第九篇 |
| 精确率 / 召回率 / F1 / AUC | 过滤器的漏放与误杀、奖励模型与 judge 的评估 | 第十篇 |
| 类别不平衡、校准、Cohen’s κ |
|
第十篇 |
| 交叉验证、置信区间、配对检验、多重比较 | 评测集怎么划、MMLU 的 ±0.8、A/B 差异是否显著、20 个 benchmark 领先 12 个算不算 | 第十篇 |
十五行里的每一个概念都要讲到能亲手实现、能看图说出它的假设与失效方式——但不追求推导的完备(SVM 讲原问题与核技巧,不讲对偶的求解)。这决定了本系列的深度标准。
除了机制,每篇还有两样东西:一节来龙去脉(这个算法是谁、在什么年代、为解决什么问题发明的,前一代败在哪,今天在哪里还在用、什么时候不该用)和一章真实数据的经典案例——历史上真正推动这个算法的那类问题,从数据长什么样、基线是多少,到代码、效果数字、上线还差什么:
| 篇 | 案例 | 数据 | 效果 |
|---|---|---|---|
| 第一篇 | 同一个 KNN,随机划分 vs 按地区划分 | 加州房价 20,640 个街区 | RMSE 5.2 万 vs 8.6 万——它在抄邻居 |
| 第二篇 | 房价预测:从猜均值到 Ridge / Lasso 十步 | 同上 | 114k → 60k;三次项无正则爆到 102k,Ridge 拉回 |
| 第三篇 | 垃圾短信识别:TF-IDF + 逻辑回归 | UCI SMS Spam 5,574 条 | 精确率 100%、召回 87%;阈值按两种错各多贵定 |
| 第四篇 |
|
|
|
| 第五篇 | 重跑 LeCun 1998 那张表:线性 / KNN / RBF-SVM | MNIST 60,000 张 | 7.4% → 2.95% → 1.43%,排序与原表一致 |
| 第六篇 | 人口普查收入预测:树 → 森林 → 梯度提升 | Adult 48,842 人 | AUC 0.772 → 0.917 → 0.930;重要性审计 |
| 第七篇 | RFM 客户分群;照片颜色量化 | Online Retail 54 万行交易 | 714 个冠军贡献 65% 营业额;96,615 色 → 16 色 |
| 第八篇 | Eigenfaces:特征脸、重建、认人 | Olivetti 400 张人脸 | 50 个数重建一张脸;PCA 50 + SVM 94% |
| 第九篇 | 给真实语料去重:MinHash-LSH vs 暴力 | wikitext-2 14,813 段 | 16 分钟 vs 1.5 秒;召回贴着 S 曲线 |
| 第十篇 | 银行营销:泄漏、阈值、校准、配对检验 | Bank Marketing 45,211 次电话 | 最优阈值 0.07 不是 0.5;差 0.001 AUC 不显著 |
案例的数据全部公开、自动下载(openml / UCI / Hugging Face),脚本在 classical-ml/case_*.py,CPU 上几秒到几分钟。
为什么写这个系列?
方法论比模型活得久
SVM 与 LDA 退场了,但”测试集只能看一次”、”参数远多于样本时会过拟合”、”准确率在类别不平衡时会骗人”、”两个模型的差异要看置信区间”没有退场——它们在 LLM 上以更大的规模重现,而且因为规模大,犯错的代价也更大:一次污染的评测能误导一个团队几个月,一个过拟合的奖励模型能让几千 GPU 小时的 RL 白跑。
现有材料的断层
- 经典教材(Bishop、ESL)与课程(CS229)按模型组织,篇幅大半在今天不用的方法上,且不对到 LLM;
- 实践书(Géron 的 Hands-On ML)把 scikit-learn 用得很好,但停在表格数据与图像分类,没有奖励模型、benchmark 污染、去重;
- LLM 的论文与博客假设读者会这些概念,一句”reward hacking 本质是过拟合”带过。
本系列取中间那段路:概念从零讲、每个机制用十几行 NumPy 手写一遍再与 scikit-learn 对数、画出来、对到 LLM 上;十篇正文每篇约一本教材一章的篇幅。
适合哪些读者?
从零开始、准备进 L3 的读者
你读完了 L0 与 L1,还没学过任何机器学习。本系列是”什么是学习”的第一课:过拟合、泛化、评估这些概念在这里第一次出现,之后 L3 的深度网络、L5 的后训练都在用它们。
直接从 LLM 入门、跳过了经典部分的工程师
你在做 SFT / RLHF / 评测,遇到过 reward hacking、benchmark 分数不可信、judge 偏好长回答。本系列告诉你这些问题的经典名字与经典解法——叫出名字,解法就在手边。
做数据工程的人
预训练数据的质量过滤、去重、配比、多样性分析,每一件都是经典机器学习在万亿 token 上的工程化。第六、七、九篇直接对应。
要做评测、要读实验结果的人
第十篇讲评估的全部工具:混淆矩阵、阈值权衡、AUC、校准、Cohen’s κ、置信区间、配对检验、多重比较——以及每一个在 LLM 评测里的陷阱。
系列的整体主线
十篇按”先懂什么是学习与泛化,再看监督模型从最简单到最强,再看无监督的三件事,最后讲怎么评估”的顺序推进:
| 篇 | 主题 | 内容 |
|---|---|---|
| 第一篇 | 什么是学习 | 划分、过拟合与欠拟合、学习曲线、偏差-方差、正则化;benchmark 污染与 reward hacking |
| 第二篇 | 线性回归 | 最小二乘的推导与几何、梯度下降与学习率上限、特征缩放与共线、Ridge / Lasso、Ridge = weight decay |
| 第三篇 | 逻辑回归与奖励模型 | sigmoid 与交叉熵、梯度 \((p - y)x\)、softmax 回归 = 语言模型输出层、奖励模型 = 逻辑回归作用在分差上、标注噪声决定上限 |
| 第四篇 | 三个基础分类器 | 朴素贝叶斯(算概率)、KNN(找邻居,= 检索)、决策树(问问题);各自手写、决策边界、假设与失效 |
| 第五篇 | SVM 与核方法 | 最大间隔、hinge loss、软间隔、核技巧、RBF;核回归 = attention |
| 第六篇 | 集成 | bagging 降方差、随机森林、梯度提升 = 函数空间的梯度下降、特征重要性;数据质量分类器为什么用小模型 |
| 第七篇 | 聚类 | K-Means 的迭代与局部最优、\(k\) 的选择、DBSCAN、层次聚类;真实语料的主题与垃圾簇 |
| 第八篇 | 降维 | PCA = SVD、解释方差与有效维度、重建、t-SNE / UMAP、embedding 的各向异性 |
| 第九篇 | 去重 |
|
| 第十篇 | 评估 | 混淆矩阵、阈值、AUC、类别不平衡、校准、κ、置信区间、配对检验、多重比较;judge 的偏差 |
监督学习按输出分两大类——回归(预测一个连续值:房价 320 万、这条回答得 7.3 分)与分类(预测一个类别:是 / 不是垃圾邮件、这道题答对 / 答错)。两类各有一篇打底:第二篇的线性回归是回归的原型——”特征加权求和”直接当预测值;第三篇的逻辑回归虽然名字里有”回归”,做的是分类——它把同样的加权和再过一个 sigmoid 函数(把任意实数压到 0~1 之间的 S 形曲线,第三篇第二章画它)变成”属于正类的概率”。这里先记住这一对区别就够,两篇会各自从零讲起。回归这一侧只讲线性回归不是遗漏:树模型、梯度提升、KNN 都同时有回归版本(第六篇的梯度提升就是在回归问题上手写的),而 LLM 时代真正常用的回归问题——奖励模型打分、scaling law 拟合——用的正是线性模型与它的变体。
第一篇是方法论的底座:什么是泛化、为什么会过拟合、误差从哪来。第二到六篇是监督学习:从线性模型到三个基础分类器、SVM,再到树的集成,以及它们在 LLM 数据管线与奖励模型里的位置。第七到九篇是无监督学习:不需要标签的三件事——聚类、降维、去重。第十篇是评估:一切结论是否成立的最后一道关。
三条交织的线索:
| 篇 | 概念线 | 这一篇里最该记住的数字 | LLM 线 |
|---|---|---|---|
| 一 | 泛化 → 过拟合 | 多项式次数到 15,验证误差飙升 | benchmark 污染 |
| 二 | 最小二乘与梯度下降 | 学习率上限 = 2/λ_max | weight decay |
| 三 | 概率输出 | 标注噪声 4.0 时准确率只有 71%,但学到的 w 与真值相关 0.995 | 奖励模型与语言模型输出层 |
| 四 | 三种非线性边界 | 1000 维里最近与最远的点距离只差 10% | 检索 |
| 五 | 间隔与核 | 核回归与 attention 的输出差 1e-15 | attention |
| 六 | 集成 | 用 8B 模型给数据打分 = 训练算力的 1/3 | 质量过滤器、数据配比 |
| 七 | 聚类 | 随机初始化最差比最好差 2 倍 | embedding 各向异性 |
| 八 | 降维 | 29 维解释 95% 方差 | — |
| 九 | 相似度估计 | b=14, r=8 的 MinHash-LSH 阈值 0.685 | 万亿 token 去重 |
| 十 | 评估指标 | 500 题配对检验 z=3.1 | judge 偏差与多重比较 |
每一篇都用同样的方法:从一个具体的小例子讲起,画出来,用十几行 NumPy 手写核心机制并与 scikit-learn 对数,指出它在 LLM 工作里的形态与失效方式。
章节结构与分章导读
1. 什么是学习:划分、泛化、过拟合与偏差-方差
第一篇建立整个系列——也是整个算法地图——最基础的概念:泛化。
这一篇会覆盖:
- 学习的定义:从有限样本推断没见过的样本;
fit到底在做什么(三行最小二乘); - 训练 / 验证 / 测试三份数据各干什么;随机切、分层切、按时间切、按组切——近重复样本随机切时 CV 分数虚高 40%;
- 过拟合与欠拟合:30 个点拟合正弦,三种容量的拟合图、训练 / 验证误差随次数的曲线;学习曲线——数据到 100 个点,15 次多项式与 4 次一样好;
- 测试集泄漏:在测试集上选超参数偏乐观多少(200 次重复的直方图);benchmark 污染与”反复调参”;n-gram 污染检测的 10 行代码,抓得住原文、抓不住改写;
- 偏差-方差分解:公式逐项解释、100 个模型的预测带图;集成只降方差;
- 正则化与 reward hacking:在一个过拟合的评估器上做优化,经典解法逐条对应。
核心问题是:
benchmark 涨了 5 个点,怎么知道不是测试题泄漏?奖励模型的准确率 80%,为什么 RL 还会钻空子?
2. 线性回归:最小二乘、梯度下降与 Ridge / Lasso
第二篇讲最简单的模型,它是后面一切的原型,也是唯一能把闭式解、GD、SGD 放在一起对答案的地方。
这一篇会覆盖:
- 一条直线、20 个点:残差、平方和;矩阵写法;
- 闭式解:对损失求导得正规方程;投影的几何;什么时候解不出来;
- 梯度下降:损失是一个碗(等高线与路径图);学习率上限 \(2 / \lambda_{\max}\) 与条件数;GD 与闭式解差 \(10^{-10}\),SGD 到同一邻域但抖动;
- 两种坏地形:特征量纲不同(条件数 540 万,标准化后 1);共线(系数 7.88 / −5.95 乱跳);
- Ridge 与 Lasso:系数路径图;菱形与圆的几何——为什么 \(L_1\) 压到零;
- Ridge = weight decay:推导 + 数值差 \(10^{-13}\);回到上一篇的 15 次多项式;
- 平方误差 = 高斯噪声的最大似然;有离群点时换绝对值。
核心问题是:
lstsq那一行解了什么方程?梯度下降为什么有时几百步、有时发散?weight_decay=0.1和 Ridge 是什么关系?2
3. 逻辑回归与奖励模型:每个分类头的原型
第三篇把线性回归的输出过一个 sigmoid,变成分类器;再证明奖励模型就是它。
这一篇会覆盖:
- sigmoid 与交叉熵:为什么不用平方误差;梯度 \((p - y)x\) 的推导与有限差分验证;
- 12 行手写逻辑回归:二维数据上的决策边界图、与 scikit-learn 系数差 0.001;乳腺癌 30 个特征 96%,系数可读;
- softmax 回归:手写数字 10 类 96%;语言模型的输出层就是一个 vocab 类的 softmax 回归;
- 奖励模型 = 逻辑回归作用在两个回答的特征差上、无偏置:3000 对拟出的 \(w\) 与真实相关 0.999;
- 准确率上限是标注的一致性:错的几乎全在分差最小的 1/4 对上;标注噪声调六档,模型准确率始终贴着上限、\(w\) 相关始终 > 0.96。
核心问题是:
一个预测数的模型怎么变成预测概率的模型?奖励模型和逻辑回归是什么关系?为什么它的准确率到 80% 就上不去了?3
4. 三个基础分类器:朴素贝叶斯、KNN 与决策树
第四篇看三个思路完全不同的分类器,并给出七个分类器在同一份数据上的地图(与第五、六篇共用)。
这一篇会覆盖:
- 七个分类器的成绩表与月牙数据上的决策边界九宫格;
- 朴素贝叶斯:贝叶斯公式的手算例子、”朴素”假设、高斯版每类每特征一条正态曲线、15 行实现;冗余特征为什么让它变差(去掉后反超逻辑回归);
- KNN:4 行实现;\(k\) 是偏差-方差的旋钮(1 / 15 / 150 的边界);维度灾难——1000 维时最近与最远只差 10%;它在 LLM 里就是检索;
- 决策树:第一刀怎么选(Gini 扫描图)、25 行实现、一棵深度 2 的树、深度 vs 过拟合——深度不限训练 100% 测试 0.83。
核心问题是:
“朴素”贝叶斯朴素在哪?一个不训练的分类器为什么在 LLM 工作里到处都是?决策树为什么一定过拟合?4
5. SVM 与核方法:最大间隔、核技巧与 attention 的远亲
第五篇讲另一种画直线的标准,以及把直线变弯的核技巧。
这一篇会覆盖:
- 最大间隔:60 个点里只有 2 个支持向量决定边界;hinge loss 与逻辑回归 loss 的对比;12 行手写线性 SVM 与
LinearSVC的 \(w\) 方向余弦 0.9997; - 软间隔 \(C\):正则化的倒数(0.01 → 82 个支持向量,100 → 36 个);
- 核技巧:圆环数据二维分不开、加一维 \(x_1^2 + x_2^2\) 就能分(三维图);核函数 = 不升维算内积;RBF 与 \(\gamma\)(200 → 训练 1.00 / 测试 0.87);
- 核 = 相似度加权:核回归的三步就是 attention 的三步,公式对到 \(10^{-15}\);
- SVM 在今天:训练时间随 \(n\) 的增长(64000 样本 7.6 s vs 逻辑回归 0.01 s);间隔思想去了 margin loss 与 fastText。
核心问题是:
SVM 凭什么选”间隔最大”的直线?核技巧为什么能不增加计算量就把直线变成曲线?attention 和核回归是什么关系?5
6. 集成:随机森林、梯度提升与数据质量分类器的算力账
第六篇把很多棵树组织起来,成为表格数据上至今最强的模型,再算数据过滤的账。
这一篇会覆盖:
- bagging:一棵树 0.826 → 200 棵 0.905;预测方差 0.094 → 0.007,偏差不变;
- 随机森林:每个节点只看部分特征,树间相关 0.59 → 0.53;袋外估计;
- 梯度提升:一步一步拟合残差的八张图;残差 = 负梯度——在函数空间里做梯度下降;15 行手写与 scikit-learn 同量级;
- 调参:学习率 × 棵数(1.0 第 24 棵到顶后下滑);XGBoost / LightGBM / CatBoost 各改了什么;
- 特征重要性(6/30 占 91%);表格数据上 RF 0.919 vs 不调参的 MLP 0.905;
- 算力账:给 15T token 打分,8B 模型是训练算力的 1/3、线性模型 0.004% → 两级做法;fastText = 词袋 + 线性分类器;小分类器带回来的老问题。
核心问题是:
很多棵都过拟合的树平均起来为什么反而不过拟合?梯度提升为什么叫”梯度”?预训练数据过滤为什么用 fastText 与 GBDT 而不是 LLM?6
7. 聚类:K-Means、DBSCAN 与「这批语料里有什么」
第七篇开始讲没有标签时能做什么。
这一篇会覆盖:
- K-Means 的迭代过程(四帧图)、12 行实现与 scikit-learn 同数(inertia 7281);为什么一定收敛、为什么只到局部最优;
- \(k\) 怎么选:肘部法与轮廓系数(两者不一致时按业务定);
- 初始化:随机 50 次里 1/3 停在差解、最差是最优的两倍;k-means++;
- DBSCAN:核心点 / 边界点 / 噪声;两个月牙 K-Means ARI 0.26 vs DBSCAN 1.00;\(\varepsilon\) 的代价;
- 层次聚类与树状图;
- 真实语料:78 句过 Qwen2.5-0.5B 得句向量 → K-Means → 每簇抽两条人读:\(k = 7\) 主题全对、模板页自成一簇;按簇配比、找垃圾簇、SFT 保多样性——探索,不是预测。
核心问题是:
K-Means 那两步为什么一定收敛,收敛到的一定是最好的吗?怎么知道一个语料里有什么主题、\(k\) 该取多少?
8. 降维:PCA、SVD、t-SNE 与 embedding 的各向异性
第八篇回答”896 维的向量怎么看”。
这一篇会覆盖:
- PCA 的几何:投影后方差最大的方向(三联图);四行手写(中心化 → SVD)与 scikit-learn 差 \(10^{-13}\);
- 解释方差:手写数字 64 维里 29 维解释 95%;用前 \(k\) 维重建一张图;
- 三个名字一件事:协方差特征分解 = 数据矩阵 SVD = PCA,数字全同;
- 低秩:一个真实权重矩阵的奇异值谱 vs 随机矩阵;LoRA 的低秩假设是关于 \(\Delta W\) 的;
- PCA vs t-SNE 的二维图(KNN 0.60 vs 0.98);二维图能信什么、不能信什么;
- 各向异性:78 句真实句向量任意两句余弦均值 0.79、第一主成分占 26%;减均值后同主题 / 不同主题差距从 0.14 拉到 0.64;对检索的影响。
核心问题是:
PCA 为什么等于 SVD?4096 维的 embedding 怎么”看”,二维图上的距离能信吗?为什么任意两句话的余弦都在 0.7 以上?7
9. 去重:MinHash 与 LSH 的概率
第九篇把 L4 数据工程必用的一个算法的概率算清楚。
这一篇会覆盖:
- Jaccard:n-gram 集合的交并比;
- MinHash:一个能手算的例子(3/6)、一行证明、20 行实现;\(k\) 个签名的估计标准差 \(\sqrt{J(1-J)/k}\)——实测与理论逐点吻合;
- LSH:分组分桶(图与代码);S 曲线 \(1 - (1 - s^r)^b\);FineWeb 的 \(b = 14, r = 8\) 在 0.685 过 50%——”Jaccard 大于约 0.7 视为重复”的来源;
- 2000 段文本:200 万对 → 267 个候选;按 Jaccard 分区间的实测召回贴着理论 S 曲线;
- 三层去重:精确 hash → MinHash(模板页 Jaccard 0.70)→ embedding 语义去重(同义句余弦 0.46 vs 无关 −0.20)。
核心问题是:
两段文本”相似”到什么程度算重复?MinHash 的阈值怎么定?为什么不用两两比较?
10. 评估:从混淆矩阵到 judge 的一致性
第十篇讲一切结论是否成立的最后一道关。
这一篇会覆盖:
- 混淆矩阵与精确率 / 召回率 / F1 / AUC:12 行手写与 scikit-learn 全同;AUC 的概率含义实测 0.9721;
- 阈值扫描曲线与 ROC;要求召回 95% 时精确率掉到 90%;
- 类别不平衡:正例 3% 时”全判负”95.6%;
- 校准:可靠性图与 ECE;一个过度自信的模型 AUC 不变、ECE 0.069,Platt / isotonic 校准后 0.019;RLHF 后的置信度;
- judge:Cohen’s κ 手算——永远选 A 的 judge 一致率 92%、κ = 0;位置偏差怎么量(对换顺序差 21 个点)、怎么消;
- 一个分数稳不稳:交叉验证;标准误——MMLU ±0.8、100 题私有集 ±9;bootstrap;
- 两个模型比:独立 \(z = 1.38\) vs 配对 McNemar \(z = 3.13\);多重比较——20 个 benchmark 期望领先 10 ± 2.2。
核心问题是:
一个安全分类器准确率 95%,能上线吗?judge 与人的一致率 80%,够不够?”20 个 benchmark 领先 12 个”算赢吗?8
11. 系列总结与通关自测
最后一篇不讲新内容:把十篇正文压成一张「问题 → 结论 → 必记数字」的表并逐篇回顾,拎出贯穿全系列的几条线与常见误区,然后给一套三段式通关自测——判断与计算、跨篇综合、面试题,答案各自折叠,附「读过 / 掌握 / 能教人」的判据。各篇末尾的自测检验的是一篇读懂了没有,这一篇检验的是十篇能不能连起来用;读完正文再做。
贯穿全系列的实践线
本系列每一篇配两个脚本:一个机制脚本(0X_*.py,scikit-learn 自带的小数据集或合成数据,CPU 上一分钟内跑完)、一个案例脚本(case_0X_*.py,真实数据集,首次运行自动下载),都在 ai-learning-labs/classical-ml。文中每一个数字、每一张图都由这些脚本产生;正文已经包含理解所需的全部代码,脚本是复现用的:
| 篇 | 脚本 | 做的事 |
|---|---|---|
| 第一篇 | 01_learning_and_generalization.py |
|
| 第二篇 | 02_linear_regression.py |
|
| 第三篇 | 03_logistic_regression_and_reward_model.py |
|
| 第四篇 | 04_naive_bayes_knn_and_trees.py |
|
| 第五篇 | 05_svm_and_kernels.py |
|
| 第六篇 | 06_ensembles_and_gradient_boosting.py |
|
| 第七篇 | 07_clustering.py |
|
| 第八篇 | 08_dimensionality_reduction.py |
|
| 第九篇 | 09_minhash_lsh.py |
|
| 第十篇 | 10_evaluation.py |
|
案例脚本(case_01_housing_split.py … case_10_bank_marketing.py)对应上面”各篇的真实数据案例”那张表,数据下载与缓存在 _data.py。
二十个脚本跑完、改过参数,L2 就够了。最值得改着玩的三个:第三篇的奖励模型(把标注噪声调大,看准确率贴着上限走)、第六篇的梯度提升(把学习率调到 1.0 看它过拟合)、第十篇的配对检验(把分歧题数调小,看显著性消失)。
与它平行的阅读线:
| 篇 | 读什么 |
|---|---|
| 第一篇 | Ng, CS229 讲义的偏差-方差与正则化部分 |
| 第二、三篇 | Géron《Hands-On ML》第 4 章(训练模型) |
| 第四至六篇 | Géron 第 5–7 章(SVM、决策树、集成);FineWeb / DCLM 的数据处理章节 |
| 第七、八篇 | Géron 第 8–9 章(降维、无监督) |
| 第九篇 | Leskovec 等《Mining of Massive Datasets》第 3 章(免费) |
| 第十篇 | scikit-learn User Guide “Model selection and evaluation” |
前置要求与说明
前置要求
- L0 数学:第二篇的范数(Ridge / Lasso)、第三篇的 SVD(PCA)、第四篇的贝叶斯公式、第五篇的交叉熵、第六篇的 Bradley-Terry、第七篇的梯度下降、第八篇的置信区间;
- L1 工具箱第一篇:NumPy 与 Pandas 的基本操作;scikit-learn 的接口(
fit/predict/score)在本系列第一篇出现时用一段话介绍。
不要求:学过任何机器学习课程;有 GPU。
版本与基线
- scikit-learn 1.x 的接口;数据全部是它自带的小数据集(乳腺癌 569 条、手写数字 1797 条)或合成数据(
make_classification等);第七、八篇的句向量与权重谱用本地缓存的 Qwen2.5-0.5B(CPU 可跑); - 引用的真实数字:FineWeb 的去重参数(\(b = 14, r = 8\))与 FineWeb-Edu 的分数阈值、Llama-3-8B 的参数量、Chinchilla 的 \(D / N \approx 20\);
- 论文引用以第一作者与年份标注。
章节目录
- 什么是学习:划分、泛化、过拟合与偏差-方差
- 线性回归:最小二乘、梯度下降与 Ridge / Lasso
- 逻辑回归与奖励模型:每个分类头的原型
- 三个基础分类器:朴素贝叶斯、KNN 与决策树
- SVM 与核方法:最大间隔、核技巧与 attention 的远亲
- 集成:随机森林、梯度提升与数据质量分类器的算力账
- 聚类:K-Means、DBSCAN 与「这批语料里有什么」
- 降维:PCA、SVD、t-SNE 与 embedding 的各向异性
- 去重:MinHash 与 LSH 的概率
- 评估:从混淆矩阵到 judge 的一致性
- 系列总结与通关自测
最终目标
读完这套系列之后,面对 LLM 工作里的一个问题,读者应该能够回答:
| 问题 | 答案在 |
|---|---|
| benchmark 涨了 5 个点,是真的还是泄漏? | 第一篇:测试集只能看一次、n-gram 检测;第十篇:置信区间与配对 |
weight_decay=0.1、学习率发散、要不要标准化——这些配置在做什么? |
第二篇:Ridge = weight decay、\(2/\lambda_{\max}\)、条件数 |
| 奖励模型准确率 80% 为什么 RL 还钻空子?上限在哪? | 第一篇:过拟合;第三篇:标注一致性 |
| RAG 为什么是 KNN?attention 为什么是核回归? | 第四篇:检索与维度灾难;第五篇:核 = 相似度加权 |
| 数据过滤为什么用 fastText 而不是 LLM?阈值怎么定? | 第六篇:算力账;第十篇:精确率 / 召回率 |
| 这批语料里有什么主题?某个主题占太多怎么发现? | 第七篇:聚类 |
| 为什么任意两句的余弦都在 0.7 以上?LoRA 的低秩假设从哪来? | 第八篇:各向异性、有效维度 |
| Jaccard 0.7 视为重复是怎么来的? | 第九篇:S 曲线在 0.685 过 50% |
| judge 与人一致率 80% 够不够?长度偏好怎么消? | 第十篇:κ、系统误差 |
| “20 个 benchmark 领先 12 个”算不算领先? | 第十篇:多重比较,随机期望 10 ± 2.2 |
最终目标是三种能力:
- 叫出名字:看到 LLM 上的问题,能说出它是哪个经典概念的重现;
- 算出数字、写出代码:用几十行 NumPy 手写最小二乘、逻辑回归、KNN、决策树、K-Means、PCA、MinHash、混淆矩阵,把过拟合、阈值权衡、去重概率、显著性算出来;
- 用对解法:知道经典解法(更多数据、正则化、早停、集成、配对检验)在 LLM 上各对应什么。
-
至少这些:奖励模型训两个 epoch 后 RL 开始钻空子 = 过拟合;benchmark 涨 5 个点结果测试题在训练数据里 = 测试集泄漏;judge 给长回答打高分 = 评估偏差;数据过滤器把某类文本全滤掉 = 分类器的类别不平衡 / 阈值问题;weight decay = Ridge;attention = 核回归;奖励模型 = 逻辑回归作用在分差上;embedding 各向异性 = 降维前要中心化;去重阈值 = MinHash 的 S 曲线。经典解法基本仍成立——更多数据、正则化(RLHF 的 KL 项)、早停、集成、去污染、校准、分层抽样——变的是规模与成本:不能对 8B 的奖励模型做 10 折交叉验证,所以更依赖小规模消融与置信区间。 ↩
-
lstsq解的是正规方程 \(X^\top X w = X^\top y\),即最小二乘的闭式解 \(w = (X^\top X)^{-1}X^\top y\)(数值上用 SVD / QR 而不是求逆)。梯度下降的步数由条件数决定:特征尺度差异大 → \(X^\top X\) 的最大 / 最小特征值比大 → 沿平坦方向要走几百步;学习率超过 \(2/\lambda_{\max}\) 就沿最陡方向振荡发散,所以要标准化特征、或用自适应步长。weight_decay=0.1就是 Ridge:对 \(L_2\) 正则 \(\lambda\lVert w\rVert^2\) 求导得到每步让 \(w\) 乘 \((1-\eta\lambda)\) 的「衰减」,闭式解变成 \((X^\top X + \lambda I)^{-1}X^\top y\);AdamW 把这一项从梯度里拿出来单独作用于参数,与在 loss 里加 \(L_2\) 在 Adam 下不等价。 ↩ -
把线性输出过一个 sigmoid \(\sigma(z)=1/(1+e^{-z})\) 压到 \((0,1)\),并把 loss 从平方误差换成对数损失(伯努利的负对数似然),这就是逻辑回归。奖励模型就是它:Bradley-Terry 假设 \(P(y_w \succ y_l)=\sigma(r(y_w)-r(y_l))\),pairwise loss \(-\log\sigma(r_w - r_l)\) 正是逻辑回归的 loss 作用在分差上,特征提取器换成了 8B 参数的 Transformer。准确率到 80% 就上不去,是因为它贴着标注一致率的上限走:人与人的偏好一致率本身只有 70–80%,标签里的噪声不可学,第三篇把标注噪声从小调到大,模型准确率始终跟着一致率走。 ↩
-
朴素在条件独立假设:给定类别,假设各特征(词)互相独立,于是 \(p(x\mid c)=\prod_i p(x_i\mid c)\),参数只需数词频——假设明显不真(词之间强相关),但分类结果常常仍对,因为只要排序对就行。不训练的分类器 KNN(看最近的 \(k\) 个邻居投票)在 LLM 工作里到处都是,因为 embedding 检索、few-shot 示例选择、去重判定、RAG 的 top-k 本质上都是 KNN——它的全部成本在推理时的距离计算与索引。决策树一定过拟合是因为它可以一直分裂直到每个叶子只剩一个样本、训练误差为零——深度不限的树是零偏差高方差模型,所以要剪枝、限深,或者用第六篇的集成把方差平均掉。 ↩
-
因为在所有能分开训练集的直线里,离两类最近样本都最远的那条(最大间隔)对扰动最不敏感,泛化误差的上界只依赖间隔而不依赖维度——这是统计学习理论给出的理由;间隔只由少数支持向量决定。核技巧:SVM 的解只用到样本间的内积 \(\langle x_i, x_j\rangle\),把它换成核函数 \(K(x_i,x_j)\) 就等价于在一个(可能无限维的)特征空间里画直线,而从不显式计算那个空间的坐标——计算量仍是 \(O(n^2)\) 个核值。attention 与核回归的关系:Nadaraya-Watson 核回归 \(\hat y(q)=\sum_i \frac{K(q,k_i)}{\sum_j K(q,k_j)} v_i\),取 \(K=\exp(q^\top k/\sqrt d)\) 就是 softmax attention——attention 是以 query 为中心、用指数核加权的核回归。 ↩
-
单棵深树是低偏差、高方差;对 \(B\) 棵在不同 bootstrap 样本与随机特征子集上训出的树取平均,偏差不变、方差按 \(\rho\sigma^2 + (1-\rho)\sigma^2/B\) 下降(树之间相关性 \(\rho\) 越低降得越多)——这就是随机森林不过拟合的原因。梯度提升叫「梯度」是因为每棵新树拟合的是当前 loss 对预测值的负梯度(平方损失下就是残差),整个过程是在函数空间里做梯度下降。预训练数据过滤用 fastText 与 GBDT 而不是 LLM,是算力账:要给 240T token 的网页打分,fastText 每秒几十万文档、GBDT 在几十个统计特征上同样便宜,而一个 LLM 过一遍 240T token 的成本与预训练本身同量级;LLM 只用来给几十万条样本打标签,再训小分类器去过滤全量。 ↩
-
PCA 求的是中心化数据协方差矩阵 \(X^\top X/n\) 的特征向量;对 \(X=U\Sigma V^\top\) 做 SVD,\(X^\top X = V\Sigma^2 V^\top\),所以右奇异向量 \(V\) 就是主成分、奇异值平方正比于方差——SVD 直接给出 PCA 且数值更稳。4096 维 embedding 「看」靠降维到二维(PCA 看全局方差方向,t-SNE / UMAP 看局部邻域);二维图上的距离不能直接信——t-SNE / UMAP 只保局部邻域、簇间距离与簇大小没有意义,PCA 的两个分量通常只解释百分之几的方差。任意两句话余弦都在 0.7 以上是 embedding 的各向异性:所有向量挤在一个窄锥里、共享一个大的公共分量,所以要先减均值 / 白化(或用对比学习训练的模型),再比余弦才有区分度。 ↩
-
不一定能:准确率在类别不平衡下没有信息——若 95% 的输入本来就安全,全判「安全」也有 95%;要看召回(漏放了多少有害)、精确率(误拦了多少正常)、ROC / PR 曲线与阈值,以及每类错误的代价。judge 与人 80% 一致率够不够,取决于人与人之间的一致率——若人际一致率也是 80%,judge 已经到了上限;若人际 95% 则 judge 偏差显著,还要看 Cohen’s \(\kappa\) 而不是原始一致率,并检查偏差是否系统性(偏长、偏自家模型)。「20 个 benchmark 领先 12 个」不算赢:在零假设下(两模型等价)20 次里领先 12 次的概率约 25%(二项检验 \(p\approx 0.25\)),且每个 benchmark 的差距要先过自身的置信区间。 ↩
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/classical-machine-learning-in-the-llm-era.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。