# 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》知识点全解 > AI生成|2026年10月28日|codebuddy|原书:Aurélien Géron,《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》, 3rd Edition, O'Reilly, 2022 > **我的阅读**:进度 99%|累计 14小时51分钟|开始 2021-09-21|最近 2026-10-21|读完 2022-12-21 > > 注:微信读书在读版本为原书第 2 版;本文按第 3 版结构整理,版本差异见正文版本提示。 **一句话总结**:这本书用一条完整的工程流水线把机器学习串起来——前半本用 scikit-learn 走完"数据 → 特征 → 模型 → 评估 → 调参",后半本用 Keras/TensorFlow 从感知机一路做到 CNN、RNN、Transformer、扩散模型和部署。它的价值不在推导,而在**每一个环节都给出可运行的默认做法和判断标准**。 **前置知识**:Python、NumPy、pandas 基本操作;线性代数(矩阵乘法、特征值)与概率(条件概率、期望);能看懂偏导符号即可,书里不要求手推。深度学习部分建议有 GPU 或 Colab,CPU 也能跑完前 14 章。 **版本提示**:原书第 1 版(2017)只讲 Scikit-Learn 与 TensorFlow 1.x,共 16 章;第 2 版(2019)改为 TF 2.0 + Keras,扩到 19 章;第 3 版(2022)在第 17 章加入扩散模型、更新到 TF 2.x 与 Keras 2.x,并重写了部署章节。中文版沿用同一书名,第 1 版中文名为《机器学习实战:基于 Scikit-Learn 和 TensorFlow》。不同印次的译者、页码有差异,本文只按**第 3 版章节结构**组织,引用原文请以手头纸本为准;评分、销量不作引用。 --- ## 〇、全书地图:两部分,19 章,一条流水线 ```text 第一部分(第 1–9 章)传统机器学习,工具是 scikit-learn 第1章 机器学习概览 —— 建立分类框架与评估语言 第2章 端到端项目 —— 从原始 CSV 到一个能上线的模型 第3章 分类 —— 指标:precision/recall/ROC 第4章 训练模型 —— 线性/逻辑回归、梯度下降、正则 第5章 支持向量机 —— 间隔、核技巧 第6章 决策树 —— CART、不纯度 第7章 集成学习 —— 随机森林、Boosting、Stacking 第8章 降维 —— PCA、核 PCA、流形 第9章 无监督学习 —— k-means、DBSCAN、GMM │ │ 同一套方法论:划分数据 → 建基线 → 看残差 → 调参 → 防泄漏 ▼ 第二部分(第 10–19 章)深度学习,工具是 Keras + TensorFlow 第10章 Keras 人工神经网络入门 第11章 训练深层神经网络 —— 初始化、BN、优化器、迁移学习 第12章 自定义模型与训练 —— GradientTape、自定义层/损失 第13章 数据加载与预处理 —— tf.data、TFRecord、预处理层 第14章 卷积神经网络 —— CNN、检测、分割 第15章 序列处理 —— RNN、LSTM、GRU、1D 卷积 第16章 NLP 与注意力 —— 词嵌入、Seq2Seq、Transformer 第17章 自编码器/GAN/扩散 —— 生成模型三条路线 第18章 强化学习 —— Q-learning、DQN、策略梯度 第19章 规模化训练与部署 —— TF Serving、TFLite、分布式 ``` 三个必须先建立的整体认知: 1. **两部分的评价语言是同一套**。不管模型是线性回归还是 Transformer,都看训练/验证/测试三段划分、看泛化误差、看学习曲线、防数据泄漏。 2. **sklearn 是"选模型 + 调参"的工具,Keras 是"搭结构 + 训练"的工具**。前者 API 高度统一(`fit/predict/score`),后者需要自己控制张量形状与训练循环。 3. **书里的代码是"教材正确",不是"生产正确"**。它默认数据能装进内存、单机单卡、离线训练;第 19 章才补上规模化与部署,且只是入口。 ### 配套代码与数据 | 资源 | 地址 | 说明 | | --- | --- | --- | | 第 3 版官方仓库 | [github.com/ageron/handson-ml3](https://github.com/ageron/handson-ml3) | 全书 notebook、习题答案、环境文件;与章节一一对应 | | 第 2 版仓库 | [github.com/ageron/handson-ml2](https://github.com/ageron/handson-ml2) | 读第 2 版纸书时对照用,TF 2.0 时代代码 | | 数据集 | 仓库内 `datasets/` 目录 | 加州房价、MNIST、Fashion MNIST、CIFAR-10 等,多数由脚本自动下载 | 仓库目录与章节对应(第 3 版):`02_end_to_end_machine_learning_project`、`03_classification`、`04_training_models` …… `19_training_and_deploying_at_scale`,编号即章号;习题答案在同目录的 `exercise_*.ipynb`。 **Keras 版本警告**:书中代码基于 Keras 2(`tf.keras`)。2023 年后的 Keras 3 支持多后端(TF/JAX/PyTorch),部分 API 有变化(如 `tf.keras` 与独立 `keras` 包、`model.fit` 的某些参数、保存格式)。照书敲代码时优先装与仓库 `environment.yml` 一致的版本,不要用最新版硬套。 ### 三条阅读路线 | 路线 | 读法 | 适合 | | --- | --- | --- | | 只补传统 ML | 第 1–9 章 + 附录 A 清单 | 数据分析、风控、业务建模 | | 只补深度学习 | 第 10–17 章,第 2–4 章速读 | 已有 ML 基础,转 DL | | 完整走一遍 | 19 章全读,按 notebook 逐章跑 | 转行、系统补齐、做课程设计 | --- ## 一、第 1 章:机器学习概览 ### 1.1 按"有没有标签"分类 | 类型 | 数据 | 任务 | 典型算法 | | --- | --- | --- | --- | | 监督学习 | 有标签 | 分类、回归 | 线性/逻辑回归、SVM、树、神经网络 | | 无监督学习 | 无标签 | 聚类、降维、异常检测 | k-means、PCA、DBSCAN、GMM | | 半监督 | 少量标签 + 大量无标签 | 分类 | 自训练、标签传播 | | 自监督 | 无标签,但标签从数据本身构造 | 预训练 | 掩码语言模型、对比学习 | | 强化学习 | 环境反馈的奖励 | 决策序列 | Q-learning、策略梯度 | **关键判断**:自监督不是"第四种范式",它是无监督的一种特例——把数据的一部分当标签(预测下一个词、预测被遮住的像素)。这也是大模型预训练的本质。 ### 1.2 按"怎么学"分类 - **批量学习(batch)**:一次在全量数据上训练,之后不再更新。简单,但数据更新要重训。 - **在线学习(online)**:数据流式到达,逐条或逐小批更新。适合概念漂移、数据量超内存的场景,学习率要随time衰减,否则会被坏数据带偏。 - **基于实例 vs 基于模型**:k 近邻是"记住样本、投票决定";线性回归是"拟合参数、丢弃样本"。前者对特征尺度敏感,后者需要假设模型形式。 ### 1.3 泛化问题的四个来源 书里把"模型效果不好"拆成可操作的四类: | 症状 | 诊断 | 处方 | | --- | --- | --- | | 训练集表现就差 | 欠拟合 | 更强模型、更好特征、减少正则 | | 训练好、测试差 | 过拟合 | 更多数据、正则、简化模型、早停 | | 训练测试都好、上线差 | 数据分布不一致 / 泄漏 | 检查采样、时间切分、特征来源 | | 指标忽高忽低 | 样本太少 / 划分不稳 | 交叉验证、分层抽样、固定随机种子 | 其余四个"主要挑战":数据量不足、数据不具代表性、数据质量差、特征不相关——书里反复强调:**这四条造成的损失,通常比换模型大**。 ### 1.4 评估的三条纪律 1. **留出测试集,且只用一次**。测试集一旦参与调参,它就不再是测试集("数据窥探")。 2. **验证集用于选择,测试集用于报告**。交叉验证替代验证集,是为了让选择更稳。 3. **没有免费午餐定理**:不存在对所有问题都最优的算法,只能假设"数据有结构",再针对结构选模型。 --- ## 二、第 2 章:端到端项目(加州房价) 这一章是全书的骨架,方法可以套到任何表格任务上。 ### 2.1 八个步骤 1. **框定问题**:是回归还是分类?用批量还是在线?误差怎么定义?——书里明确区分"预测房价"与"给房价分档",前者回归、后者分类,指标不同。 2. **看大局**:画目标分布、看特征含义、确认标签来源与时效。 3. **划分数据**:先留 20% 测试集,再动任何特征。 4. **探索性分析**:相关矩阵、地理散点、缺失值、异常值。 5. **准备数据**:缺失值填补、类别编码、缩放、组合特征,全部写进 Pipeline。 6. **选模型并训练**:先线性回归做基线,再树模型、集成。 7. **调参**:GridSearchCV / RandomizedSearchCV,交叉验证。 8. **评估与交付**:测试集只跑一次,保存模型(joblib),写清假设与局限。 ### 2.2 两个核心工程点 **分层抽样(stratified sampling)**:按收入中位数分箱后分层,保证训练/测试的收入分布一致。数据量小(2 万条左右)时随机抽样容易偏,分层是廉价保险。 **Pipeline + ColumnTransformer**: ```python num_pipe = Pipeline([ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()), ]) cat_pipe = Pipeline([ ("encoder", OneHotEncoder(handle_unknown="ignore")), ]) prep = ColumnTransformer([ ("num", num_pipe, num_cols), ("cat", cat_pipe, cat_cols), ]) model = Pipeline([("prep", prep), ("reg", RandomForestRegressor())]) ``` **为什么一定要用 Pipeline**:它把"训练时 fit、推理时 transform"的成对操作绑在一起,避免最常见的泄漏——在全量数据上算均值/中位数/编码表,再切分。 ### 2.3 指标选择 ```text RMSE = sqrt( (1/m) Σ (ŷ⁽ⁱ⁾ − y⁽ⁱ⁾)² ) MAE = (1/m) Σ |ŷ⁽ⁱ⁾ − y⁽ⁱ⁾| ``` - RMSE 对大误差惩罚更重,适合"大错不可接受"的场景;MAE 对离群点稳健。 - 目标若长尾分布(房价、收入),先取对数再回归,等价于优化相对误差。 - 书里用 RMSE 作为主指标,并强调:**指标必须在项目开始前定好,不能事后挑一个好看的**。 ### 2.4 高频坑 1. 先标准化再切分 → 测试集信息泄漏到训练。 2. 用 `train_test_split` 时不设 `random_state`,导致结果不可复现。 3. 缺失值用全量中位数填,而不是训练集中位数。 4. 类别特征 `OneHotEncoder` 没设 `handle_unknown="ignore"`,上线遇到新类别直接报错。 5. 特征重要性高就认定"因果",实际上只是模型在该数据上的切分偏好。 6. 调参在测试集上做,最后报告的分数虚高。 --- ## 三、第 3 章:分类(MNIST) ### 3.1 从二分类到多分类的指标体系 | 指标 | 公式/含义 | 用在哪 | | --- | --- | --- | | 准确率 | 预测对的比例 | 类别均衡时 | | 精确率 P | TP/(TP+FP) | 误报代价高(垃圾邮件、风控拒绝) | | 召回率 R | TP/(TP+FN) | 漏报代价高(疾病筛查、欺诈) | | F1 | 2PR/(P+R) | 需要单一折中指标 | | ROC AUC | TPR-FPR 曲线下面积 | 排序能力,与阈值无关 | | PR AUC | P-R 曲线下面积 | **类别极不均衡时更可信** | **必须记住的反例**:99% 负样本的数据集,全预测负类就有 99% 准确率。书里用"垃圾邮件分类器"说明:此时看准确率等于自欺,应看 PR 曲线。 ### 3.2 阈值不是模型的一部分 分类器输出的是分数,阈值是**业务决策**。书里的做法:先画出 P-R 随阈值变化的曲线,再根据"能接受多少误报"反推阈值。阈值调优必须在验证集上做。 ### 3.3 多分类与多标签 - **OvR(一对多)**:N 类训 N 个二分类器,选分数最高;**OvO(一对一)**:N(N−1)/2 个分类器,投票。SVM 偏好 OvO(单次训练快),大多数其他模型默认 OvR。 - **多标签**:一个样本可有多个标签(一张图里有猫也有狗),输出层用 sigmoid + 每个标签独立阈值,损失用 binary cross-entropy。 - **多输出**:一个样本输出多个值(图像去噪:每个像素一个值),输出维度即输出个数。 ### 3.4 误差分析 书里的标准动作:把混淆矩阵画出来,按"错得最多的类对"抽样看原图,归纳错误类型(如 3/5 混淆、笔画太细、标注错误)。**先看错例再谈模型**,比盲目换模型有效得多。 ### 3.5 高频坑 1. 类别不均衡还用准确率选模型。 2. 用测试集反复调阈值。 3. `cross_val_score` 默认不 stratified,分类任务要显式 `StratifiedKFold`。 4. 多分类的 `predict_proba` 在某些模型(如 SVM)上不存在或需要 `probability=True`(代价是慢)。 5. 把 `decision_function` 的分数当概率。 --- ## 四、第 4 章:训练模型 ### 4.1 线性回归的两条解法 ```text 模型:ŷ = θ₀ + θ₁x₁ + … + θₙxₙ = θᵀx 闭式解(正规方程):θ̂ = (XᵀX)⁻¹ Xᵀ y ``` - 正规方程复杂度约 O(n^2.4)~O(n^3)(n 为特征数),特征上万时不可用。 - 实际实现用 SVD 伪逆,比直接求逆稳定。 - 梯度下降每轮 O(mn),适合大样本;**必须先缩放特征**,否则等高线被拉长,收敛极慢。 ```text 批量梯度下降:θ ← θ − η · (2/m) · Xᵀ(Xθ − y) ``` 学习率太小 → 收敛慢;太大 → 发散(损失变大)。书里建议画损失曲线判断,并用网格搜索找量级(10⁻⁴、10⁻³……)。 ### 4.2 三种梯度下降 | 类型 | 每步用多少样本 | 特点 | | --- | --- | --- | | 批量 BGD | 全部 m | 稳定、慢、内存吃紧 | | 随机 SGD | 1 | 快、抖、可跳出局部极小 | | 小批量 MBGD | b(32–256) | 工程默认,GPU 友好 | SGD 的学习率要配**学习率调度**:先用大学习率快速下降,再逐步衰减;否则最优点附近会一直震荡。 ### 4.3 正则化三件套 ```text Ridge(L2):J = MSE + α · Σθᵢ² 闭式解 θ̂ = (XᵀX + αA)⁻¹Xᵀy Lasso(L1):J = MSE + α · Σ|θᵢ| 可产生稀疏解(特征选择) Elastic Net:J = MSE + r·α·Σ|θᵢ| + (1−r)/2·α·Σθᵢ² ``` - **L2 把系数压小但不为 0**;**L1 把部分系数压到 0**。特征多且怀疑大量无效时用 Lasso,特征相关性强时 Lasso 会随机保留一个、丢掉其他,改用 Elastic Net 更稳。 - `α` 越大正则越强。必须标准化后再正则,否则惩罚会随特征量纲变化。 - 早停(early stopping)是另一种正则:验证损失连续若干轮不降就停。 ### 4.4 逻辑回归与 Softmax ```text 概率:p = σ(θᵀx) = 1 / (1 + e^(−θᵀx)) 损失(对数损失):J = −(1/m) Σ [ y log p + (1−y) log(1−p) ] 多分类:softmax(z)ₖ = e^(zₖ) / Σⱼ e^(zⱼ) ``` - 逻辑回归输出的是概率,不是类别;阈值默认 0.5 只是约定。 - 对数损失是凸函数,梯度下降能到全局最优;不要用 MSE 训练逻辑回归(非凸、梯度消失)。 - Softmax 配合交叉熵,是深度分类的默认组合;`from_logits=True` 时不要再手动 softmax(数值更稳)。 ### 4.5 高频坑 1. 正则化前不标准化。 2. 用 `LinearRegression` 处理强共线性(系数会剧烈摆动),应换 Ridge。 3. 学习率直接照搬别人的 0.01,不画损失曲线。 4. 逻辑回归用 accuracy 评估不均衡数据。 5. 多项式特征阶数太高,训练集 R² 很好、验证集崩(过拟合的经典形态)。 --- ## 五、第 5 章:支持向量机 ### 5.1 一句话原理 在两类之间找**最宽的那条街**:决策边界由少数"支持向量"决定,最大化间隔 `2/||w||`。 ```text 硬间隔:min ½||w||² s.t. y⁽ⁱ⁾(wᵀx⁽ⁱ⁾ + b) ≥ 1 软间隔:min ½||w||² + C · Σζ⁽ⁱ⁾ s.t. y⁽ⁱ⁾(wᵀx⁽ⁱ⁾ + b) ≥ 1 − ζ⁽ⁱ⁾ ``` ### 5.2 两个必须调的超参数 | 超参数 | 作用 | 调大 | 调小 | | --- | --- | --- | --- | | `C` | 惩罚误分类 | 间隔窄、易过拟合 | 间隔宽、更容忍噪声 | | `gamma`(RBF) | 单个样本影响半径 | 边界扭曲、过拟合 | 边界平滑、欠拟合 | **经验起点**:先标准化,再对 `C` ∈ {0.1, 1, 10, 100}、`gamma` ∈ {0.001, 0.01, 0.1, 1} 做网格搜索。RBF 核不做缩放基本等于随机。 ### 5.3 核技巧 把样本映射到高维后做内积,但**不显式计算映射**,只算核函数 `K(x,z)`: - 线性核:`xᵀz`,高维稀疏数据(文本)常常够用。 - 多项式核:`(γxᵀz + r)^d`,d 大时数值不稳。 - RBF/高斯核:`exp(−γ||x−z||²)`,默认首选,能拟合复杂边界。 ### 5.4 复杂度与选型 | 实现 | 复杂度 | 适用 | | --- | --- | --- | | `LinearSVC` | 约 O(m) | 样本多、线性可分、文本 | | `SVC(kernel="rbf")` | 训练 O(m²)~O(m³),预测 O(n_SV) | 中小样本、非线性 | | `SGDClassifier` | 在线、O(m) | 超大数据、流式 | **结论**:样本超过十万,优先线性模型或树/集成;SVM 在几千到几万样本、特征维度中等时仍然很强。 ### 5.5 高频坑 1. 不标准化直接用 RBF 核。 2. 用 `SVC` 跑几十万样本,训练几小时不动。 3. 把 `gamma` 当"正则强度"调反(gamma 大 = 更复杂 = 更易过拟合)。 4. 需要概率输出却直接 `predict_proba`(需 `probability=True`,且内部用 Platt 校准,慢且不准)。 5. 多分类用 `SVC` 默认 OvO,类别很多时训练数量爆炸。 --- ## 六、第 6 章:决策树 ### 6.1 CART 的切分准则 ```text 分类 Gini:G = 1 − Σₖ pₖ² 分类 熵: H = −Σₖ pₖ log₂ pₖ 回归 MSE:MSE = (1/m) Σ (yᵢ − ȳ)² ``` 每次选"切完后不纯度下降最多"的特征与阈值,递归切分,直到满足停止条件。**Gini 与熵效果通常接近**,Gini 计算略快(无 log);熵的树稍平衡一些。 ### 6.2 复杂度 - 训练:约 O(n · m log₂ m)(n 特征、m 样本),每次切分要排序。 - 预测:约 O(log₂ m),从根走到叶。 ### 6.3 正则化参数(sklearn) | 参数 | 含义 | 调小/调大的效果 | | --- | --- | --- | | `max_depth` | 最大深度 | 小 → 欠拟合;大 → 过拟合 | | `min_samples_split` | 节点再分所需最小样本 | 大 → 更保守 | | `min_samples_leaf` | 叶子最小样本 | 大 → 更平滑 | | `max_leaf_nodes` | 最大叶子数 | 直接控制复杂度 | | `max_features` | 每次切分考虑的特征数 | 小 → 更随机、更抗过拟合 | ### 6.4 特点 - **白盒**:可以画树、导出规则,适合需要解释的场景(信贷、医疗)。 - **不需要缩放**,对特征单调变换不敏感;能处理混合类型。 - **不稳定**:数据小改动可能长出完全不同的树 → 这正是随机森林存在的理由。 - **不能外推**:回归树预测值永远落在训练标签范围内,预测房价上涨趋势时会失真。 - **偏好正交切分**:对斜向的线性边界要用很多台阶逼近。 ### 6.5 高频坑 1. 不做任何剪枝,树长到每个叶子一个样本。 2. 用默认参数在训练集上评估(决策树训练集准确率几乎 100%)。 3. 拿决策树的特征重要性当因果解释。 4. 回归任务用树去外推时间趋势。 --- ## 七、第 7 章:集成学习 ### 7.1 四类方法 | 方法 | 思路 | 代表 | 降低 | | --- | --- | --- | --- | | Voting | 多个模型投票/平均 | VotingClassifier | 方差 | | Bagging | 有放回抽样,并行训练 | RandomForest、ExtraTrees | 方差 | | Boosting | 串行纠错,后一个拟合前一个的残差 | AdaBoost、GradientBoosting | 偏差 | | Stacking | 用元模型学习基模型的输出 | StackingClassifier | 两者 | ### 7.2 随机森林的两个随机 1. **样本随机**:每棵树用 bootstrap 抽样(约 63.2% 样本被抽到)。 2. **特征随机**:每次切分只从随机子集里选特征(分类默认 `sqrt(n)`,回归默认 `n/3` 或全部)。 两个随机让树之间去相关,平均后方差显著下降。`ExtraTrees` 更进一步:切分阈值也随机,训练更快、方差更低,偏差略高。 ### 7.3 Boosting 的直觉 - **AdaBoost**:提高被分错样本的权重,每个弱学习器有权重,最终加权投票。对噪声和离群点敏感。 - **梯度提升(GBDT)**:每个新树拟合当前模型的**负梯度(残差)**,学习率 `learning_rate` 控制每棵树贡献。现代实现(XGBoost、LightGBM、CatBoost)在此之上加了二阶导、正则、直方图分裂等工程优化。 - **调参顺序**:先定 `n_estimators` 与 `learning_rate`(二者反向搭配),再调树深/叶子数,最后调行/列采样。 ### 7.4 Stacking 把基模型的**折外预测**(out-of-fold)作为元模型的特征,避免基模型在训练集上的过拟合分数污染元模型。`StackingClassifier` 的 `cv` 参数就是干这个的。**直接用 `predict` 结果堆叠是错的**,会泄漏。 ### 7.5 高频坑 1. 随机森林 `n_estimators` 越大越好,但收益递减,先看 OOB 分数再决定。 2. 不做特征重要性筛选就上几百个噪声特征,树模型也会被稀释。 3. Boosting 不调学习率,直接上 1000 棵树 → 过拟合且慢。 4. Stacking 用训练集预测当元特征(泄漏)。 5. 集成后仍用单模型的解释方式,忘记"整体重要性"要用 permuted importance 或 SHAP。 --- ## 八、第 8 章:降维 ### 8.1 为什么降维 - **可视化**:高维数据投到 2D/3D。 - **加速**:特征少,训练快、内存省。 - **去噪**:丢掉方差小的方向,常能提升泛化。 - **维数灾难**:维度升高,样本稀疏,距离失去区分度。 ### 8.2 PCA 的数学 ```text 1. 中心化:X ← X − mean(X) 2. 协方差矩阵:C = (1/m) XᵀX 3. 特征分解:C = V Λ Vᵀ,取前 k 个最大特征值对应的向量 4. 投影:Z = X · V_k ``` - `explained_variance_ratio_` 是每个主成分解释的方差比例,累加到目标(如 95%)即选 k。 - sklearn 的 `PCA` 自动中心化,但**不自动标准化**;量纲差异大时必须先 `StandardScaler`,否则 PCA 会被大方差特征主导。 - 选择 k 的另一种做法:画累计解释方差曲线找拐点。 - **PCA 是有损的、不可逆的**(`inverse_transform` 只能近似还原)。 ### 8.3 其他降维 | 方法 | 类型 | 特点 | | --- | --- | --- | | Kernel PCA | 非线性 | 用核技巧,样本大时慢 | | LLE | 流形学习 | 保留局部邻域关系,适合 Swiss roll | | Isomap / MDS | 流形/距离 | 保留测地距离或成对距离 | | t-SNE | 可视化 | 局部结构极好,**不能用于下游建模**,超参数敏感 | | LDA | 有监督 | 最大化类间/类内散度比,可当分类前的降维 | **t-SNE 的三条纪律**:只用于可视化;perplexity 要试多个值;不同运行的簇间距离没有意义,不能据此判断"哪类更相似"。 ### 8.4 高频坑 1. 不标准化就 PCA,结论被量纲最大的特征绑架。 2. 在切分前对全量数据 `fit` PCA(泄漏)。 3. 认为"降到 2 维还能保持分类精度"。 4. 用 t-SNE 的输出训练分类器。 5. 把主成分当原始特征解释(主成分是线性组合,语义模糊)。 --- ## 九、第 9 章:无监督学习 ### 9.1 k-means ```text 目标:最小化惯性 inertia = Σᵢ ||xᵢ − μ_{c(i)}||² 迭代:分配每个点到最近质心 → 用簇内均值更新质心 → 重复 ``` - 复杂度 O(m·n·k·迭代数),大数据可用小批量 k-means。 - **对初始化敏感**:sklearn 默认 `n_init=10`(多次随机初始化取最优)。k-means++ 初始化能显著改善。 - 选 k:肘部法(inertia 拐点)+ 轮廓系数(silhouette,−1~1,越大越好)。 - **局限**:假设簇是凸的、大小相近、方差相近;对长条形、密度差异大的簇效果差。 ### 9.2 DBSCAN 基于密度:核心点(ε 邻域内至少 `min_samples` 个点)、边界点、噪声点。 - 优点:不用指定簇数、能识别任意形状、能标出噪声。 - 缺点:对 ε 和 `min_samples` 敏感;密度差异大时参数难统一;高维效果差。 ### 9.3 高斯混合模型(GMM) 假设数据由若干个高斯分布混合生成,用 EM 算法估计参数: ```text E 步:计算每个点属于每个簇的责任度 rₖ⁽ⁱ⁾ M 步:用责任度加权更新 μₖ、Σₖ、πₖ ``` - 输出是**软分配**(概率),比 k-means 的硬分配信息多。 - 选簇数用 BIC/AIC(越小越好),或看似然。 - 可用于异常检测:低概率样本判为异常;也可用于生成新样本。 ### 9.4 高频坑 1. 不标准化就跑 k-means/DBSCAN/GMM。 2. 用 k-means 处理非球形簇,然后怪算法不准。 3. 只看 inertia 选 k(inertia 永远随 k 增大而减小)。 4. DBSCAN 用默认 ε,不做 k-距离图。 5. 把聚类结果当"真实类别"解释。 --- ## 十、第 10 章:Keras 人工神经网络入门 ### 10.1 从感知机到 MLP ```text 单个神经元:z = Σ wᵢxᵢ + b,a = φ(z) MLP 前向:h⁽¹⁾ = φ(XW₁ + b₁),…,ŷ = φ_out(h⁽ᴸ⁾W_L + b_L) ``` - 单个感知机只能画线性边界;**多层 + 非线性激活**才能逼近任意连续函数(万能近似定理,但定理不保证能训出来)。 - 反向传播 = 链式法则 + 动态规划,复用中间梯度。 ### 10.2 三种建模型方式 | 方式 | 写法 | 适合 | | --- | --- | --- | | Sequential | `Sequential([Dense(...), ...])` | 线性堆叠 | | Functional | 显式定义输入输出、可分支/共享 | 多输入多输出、残差 | | Subclassing | 继承 `keras.Model`,写 `call` | 动态结构、研究 | ### 10.3 激活函数选择 | 函数 | 特点 | 用在哪 | | --- | --- | --- | | ReLU | 计算快、缓解梯度消失 | 隐藏层默认 | | LeakyReLU | 负半轴有斜率,避免"死亡 ReLU" | 深层网络 | | ELU / SELU | 负半轴平滑,SELU 配合 LeCun 初始化可自归一化 | 全连接深层 | | GELU / Swish | 平滑,Transformer 常用 | NLP、现代架构 | | sigmoid | 输出 (0,1) | 二分类输出层 | | softmax | 输出概率分布 | 多分类输出层 | | tanh | 零中心,饱和 | RNN 内部 | ### 10.4 损失函数与输出层配对 | 任务 | 输出层 | 损失 | | --- | --- | --- | | 二分类 | 1 个 sigmoid | `binary_crossentropy` | | 多分类(互斥) | n 个 softmax | `sparse_categorical_crossentropy`(标签是整数) | | 多标签 | n 个 sigmoid | `binary_crossentropy` | | 回归 | 1 个 linear | `mse` / `huber` | **配对错了 loss 不降**,这是新手最常见的错误之一。 ### 10.5 训练三件套 ```python model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) history = model.fit(X_train, y_train, epochs=30, batch_size=32, validation_data=(X_valid, y_valid)) model.evaluate(X_test, y_test) ``` ### 10.6 高频坑 1. 忘记 `Flatten` 或 reshape,把 (28,28) 直接喂 Dense。 2. 标签没做 one-hot,却用 `categorical_crossentropy`。 3. 不标准化输入(像素缩放到 [0,1] 是最低要求)。 4. 用训练集当验证集,曲线一片大好。 5. 隐藏层用 sigmoid,深层直接梯度消失。 6. 回归任务输出层用 sigmoid,预测永远出不了 [0,1]。 --- ## 十一、第 11 章:训练深层神经网络 ### 11.1 梯度消失/爆炸的四个对策 | 对策 | 做法 | 原理 | | --- | --- | --- | | 好的初始化 | Glorot(tanh)/ He(ReLU) | 保持各层方差稳定 | | 换激活 | ReLU 系替代 sigmoid/tanh | 正区间导数恒为 1 | | 批归一化 | 每层激活前归一化 | 稳定分布,允许更大学习率 | | 梯度裁剪 | `clipnorm` / `clipvalue` | 防止爆炸一步毁掉权重 | ```text He 初始化:std = sqrt(2 / n_in) Glorot 初始化:std = sqrt(2 / (n_in + n_out)) 批归一化:x̂ = (x − μ_B) / sqrt(σ_B² + ε),y = γ·x̂ + β ``` ### 11.2 优化器演进 | 优化器 | 核心 | 适用 | | --- | --- | --- | | SGD | 原始梯度 | 需要精细调、CV 传统任务 | | Momentum | 累积历史梯度,冲过平坦区 | 通用加速 | | Nesterov | 先按动量看一步再算梯度 | 收敛更稳 | | AdaGrad | 按参数历史梯度缩放 | 稀疏特征 | | RMSProp | 指数移动平均缩放 | RNN 常用 | | Adam | 动量 + RMSProp + 偏差校正 | **默认首选** | | AdamW | Adam + 解耦权重衰减 | Transformer 标配 | ```text Momentum:m ← βm + η∇θJ,θ ← θ − m Adam:m ← β₁m + (1−β₁)g,v ← β₂v + (1−β₂)g² m̂ = m/(1−β₁ᵗ),v̂ = v/(1−β₂ᵗ),θ ← θ − η·m̂/(√v̂ + ε) ``` ### 11.3 学习率调度 - **幂次/指数衰减**:简单,但要调初始值和衰减率。 - **分段常数**:在固定 epoch 降一档。 - **1cycle**:先升后降,常配合动量反向变化,收敛快。 - **余弦退火**:平滑下降,现代训练常用。 ### 11.4 正则化 | 方法 | 做法 | 注意 | | --- | --- | --- | | L1/L2 | 在损失里加权重惩罚 | 需调 `λ`,与 batch size 有关 | | Dropout | 训练时随机置零,推理时缩放 | 一般放在激活之后;卷积层用 SpatialDropout | | 早停 | 验证损失不降就停 | 恢复最佳权重 | | 数据增强 | 随机变换输入 | 最有效的正则之一 | | 最大范数 | 限制权重范数 | 与 Dropout 互补 | **Dropout 的关键细节**:Keras 的 `Dropout` 用 inverted dropout——训练时除以 keep_prob,推理时不做任何缩放。所以推理必须 `model.eval()`(或 `training=False`),否则结果随机。 ### 11.5 迁移学习 流程:加载预训练模型(如 ImageNet 上的 ResNet)→ 冻结主干 → 换新分类头 → 训练头 → (可选)解冻顶层微调,用小学习率。 - 数据少且相似:只训头。 - 数据多但差异大:解冻更多层,甚至全量微调。 - 微调时学习率要比从头训练小 1–2 个数量级,否则会破坏预训练特征。 ### 11.6 高频坑 1. BatchNorm 放在激活之后(书里用"先 BN 再激活",两种都行,但同一网络要统一)。 2. 微调时忘了 `trainable=False`,或解冻后仍用大学习率。 3. Dropout 加在输出层前,导致预测不稳定。 4. 用训练模式的 BN 统计量做推理(`training=True` 忘了关)。 5. 早停监控错指标(监控 loss 而非业务指标)。 --- ## 十二、第 12 章:用 TensorFlow 自定义模型与训练 ### 12.1 自动微分 ```python with tf.GradientTape() as tape: y_pred = model(X) loss = loss_fn(y, y_pred) grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) ``` - `GradientTape` 默认只记录一次,需要多阶导要 `persistent=True`。 - 自定义训练循环 = 前向 → 算损失 → 求梯度 → 更新,四步写死,便于加梯度裁剪、EMA、对抗训练。 ### 12.2 自定义层/模型/损失 - 自定义层:继承 `keras.layers.Layer`,在 `build()` 里创建权重,在 `call()` 里做计算。 - 自定义模型:继承 `keras.Model`,可用 Functional 组合。 - 自定义损失:普通函数即可,输入 `(y_true, y_pred)`。 - 自定义指标:继承 `keras.metrics.Metric`,用 `add_state_variable` 累积状态。 ### 12.3 tf.function - 把 Python 函数编译成图,提速。 - **首次调用会追踪(tracing)**,Python 侧参数变化会重新追踪;张量形状变化也会重追踪。 - 不要在 `tf.function` 里做 Python 副作用(print、list.append),追踪期只执行一次。 - 调试时先关掉 `tf.function` 跑通,再开。 ### 12.4 保存 - `model.save("m.keras")` 保存结构 + 权重 + 优化器状态。 - `model.save_weights(...)` 只存权重,加载前必须先建同样的结构。 - SavedModel 格式用于 TF Serving / TFLite 转换。 ### 12.5 高频坑 1. 在 `build()` 之外创建变量,导致变量重复创建。 2. `tf.function` 里用 Python `if` 判断张量值(应改用 `tf.cond`)。 3. 自定义层忘了 `super().__init__()`。 4. `GradientTape` 在循环外创建,梯度不断累积。 5. 保存后加载结构不一致,权重对不上。 --- ## 十三、第 13 章:用 TensorFlow 加载与预处理数据 ### 13.1 tf.data 的五步流水线 ```python ds = tf.data.Dataset.from_tensor_slices((X, y)) ds = ds.shuffle(buffer_size).repeat().batch(32).prefetch(tf.data.AUTOTUNE) ``` | 操作 | 作用 | 注意 | | --- | --- | --- | | `shuffle` | 打乱 | buffer 要足够大,否则打乱不充分 | | `batch` | 组批 | 最后一批可能不满 | | `prefetch` | 训练时准备下一批 | 必加,几乎零成本提速 | | `map` | 逐样本变换 | 用 `num_parallel_calls` 并行 | | `interleave` | 多文件并行读取 | 读 TFRecord 分片 | | `cache` | 缓存到内存/磁盘 | 数据能装下时必加 | ### 13.2 TFRecord 把样本序列化成 protobuf(`tf.train.Example`),适合大规模数据:顺序读快、可压缩、可并行分片。代价是可读性差,需要写解析函数,字段类型必须与写入时一致。 ### 13.3 Keras 预处理层 | 层 | 作用 | | --- | --- | | `Normalization` | 用 `adapt()` 学均值方差 | | `StringLookup` | 字符串 → 整数 id | | `IntegerLookup` | 整数 → 连续 id | | `CategoryEncoding` | id → one-hot / 多热 | | `Discretization` | 连续值分箱 | | `Hashing` | 哈希到固定维度,免词表 | **为什么要放进模型里**:预处理成为模型的一部分,导出后推理端不用重复实现,训练/服务一致,避免"训练时用 A 方案、上线用 B 方案"的经典事故。 ### 13.4 高频坑 1. `shuffle` 的 buffer 太小(如 100),等于没打乱。 2. 预处理层在 `adapt` 时用了全量数据(泄漏)。 3. `prefetch` 忘了加,GPU 等 CPU。 4. TFRecord 字段类型写错,解析报形状错误。 5. 图像解码与 resize 顺序反了,先 resize 再 decode 会失败。 --- ## 十四、第 14 章:卷积神经网络 ### 14.1 卷积的四个参数 ```text 输出尺寸 = floor((n + 2p − f) / s) + 1 ``` - `f` 卷积核大小(常用 3×3)、`s` 步长、`p` 填充。 - `padding="same"` 输出与输入同尺寸(需 p 使公式成立);`valid` 不填充。 - 参数量 = `f × f × C_in × C_out + C_out`(每个输出通道一个偏置)。 - 感受野随层数增大;堆两个 3×3 的感受野等于一个 5×5,但参数更少、非线性更多。 ### 14.2 池化 - 最大池化:保留最显著特征,常用 2×2、步长 2。 - 平均池化:更平滑,现代网络常用全局平均池化替代全连接层(参数量骤降)。 - 池化**没有参数**,不改变通道数。 ### 14.3 典型架构 | 网络 | 关键点 | | --- | --- | | LeNet-5 | 最早的 CNN,手写数字 | | AlexNet | ReLU + Dropout + GPU 训练 | | VGG | 全部 3×3 堆叠,结构规整、参数多 | | GoogLeNet | Inception 模块,多尺度并行,1×1 降维 | | ResNet | 残差连接,解决深层退化,可训上百层 | | Xception | 深度可分离卷积,参数效率高 | | EfficientNet | 用复合缩放统一调深度/宽度/分辨率 | ### 14.4 三大视觉任务 - **分类**:整图一个标签。 - **目标检测**:框 + 类别。YOLO(单阶段、快)、SSD、Faster R-CNN(两阶段、准)。 - **语义分割**:逐像素分类。FCN、U-Net(编码-解码 + 跳跃连接);实例分割用 Mask R-CNN。 ### 14.5 数据增强 翻转、旋转、裁剪、缩放、色彩抖动、MixUp、CutMix。**增强要符合任务不变性**:数字识别不能随便水平翻转(6 变 9),医学影像不能随意旋转(方向有解剖意义)。 ### 14.6 高频坑 1. 卷积层后忘记 Flatten/GlobalAveragePooling,维度对不上。 2. 输入没归一化(像素 0–255 直接进网络)。 3. 增强用了会改变标签的变换。 4. 迁移学习时输入尺寸与预训练模型不一致。 5. 用 accuracy 评估极度不均衡的检测/分割任务(应看 mAP、IoU)。 --- ## 十五、第 15 章:用 RNN 和 CNN 处理序列 ### 15.1 RNN 的基本式 ```text h⟨t⟩ = tanh(W_x x⟨t⟩ + W_h h⟨t−1⟩ + b) y⟨t⟩ = softmax(W_y h⟨t⟩ + b_y) ``` - 参数在时间步间共享,序列再长参数量不变。 - 训练用 BPTT(沿时间反向传播),长序列梯度会消失/爆炸。 - 输出模式:序列→向量(分类)、向量→序列(生成)、序列→序列(翻译)、同步序列(视频逐帧)。 ### 15.2 LSTM 与 GRU LSTM 用三个门 + 细胞状态控制信息流: ```text f = σ(W_f [h_{t−1}, x_t] + b_f) 遗忘门 i = σ(W_i [h_{t−1}, x_t] + b_i) 输入门 o = σ(W_o [h_{t−1}, x_t] + b_o) 输出门 c_t = f ⊙ c_{t−1} + i ⊙ tanh(W_c [h_{t−1}, x_t] + b_c) h_t = o ⊙ tanh(c_t) ``` - 细胞状态是"传送带",梯度可以沿它长距离流动,缓解消失。 - GRU 把遗忘/输入合并为更新门,少一个门,参数更少,效果常与 LSTM 相当。 - **LSTM 不是万能**:极长依赖仍会衰减,Transformer 用注意力直接建模任意距离。 ### 15.3 1D 卷积处理序列 - 用 `Conv1D` + `MaxPooling1D` 堆叠,感受野随层数增长,训练比 RNN 快、可并行。 - WaveNet 用**空洞卷积(dilated convolution)**指数级扩大感受野,是语音生成的经典结构。 - 实践中:短序列分类用 1D CNN 往往比 RNN 又快又好;长序列、强顺序依赖再用 RNN/Transformer。 ### 15.4 高频坑 1. 输入形状搞错:RNN 需要 `(batch, time, features)`。 2. 不定长序列不 padding/masking,把填充值当真实数据。 3. `return_sequences` 用错,导致下一层维度不匹配。 4. 用 `stateful=True` 时 batch 顺序没打乱/没重置状态。 5. 序列很长还硬训 vanilla RNN。 --- ## 十六、第 16 章:NLP 与注意力 ### 16.1 词嵌入 - **word2vec**:CBOW(用上下文预测中心词)与 Skip-gram(用中心词预测上下文)。 - **GloVe**:基于共现矩阵分解。 - 嵌入维度常见 100–300;语义关系可用向量运算体现(king − man + woman ≈ queen)。 - 静态嵌入的局限:一词多义无法区分 → 上下文嵌入(ELMo、BERT)。 ### 16.2 Seq2Seq 与注意力 编码器把源序列压成一个向量,解码器逐词生成。**瓶颈**是单个向量装不下长句,于是引入注意力: ```text score(s_t, h_i) = s_tᵀ W h_i (或点积/加性) α = softmax(score) context = Σ α_i h_i ``` 解码每一步都重新"看"一遍编码器输出,长句不再丢信息。 ### 16.3 Transformer 的核心 ```text Attention(Q, K, V) = softmax(QKᵀ / √d_k) V ``` - **多头**:把 Q/K/V 投影到多个子空间并行算注意力,再拼接。 - **位置编码**:注意力本身无序,必须注入位置信息(正弦编码或可学习嵌入,现代多用 RoPE)。 - **残差 + LayerNorm**:让深层可训。 - **掩码**:解码器用因果掩码,防止看到未来。 - 复杂度 O(n²)(序列长度的平方),长文本是主要瓶颈。 ### 16.4 高频坑 1. 忘记 `√d_k` 缩放,softmax 饱和、梯度消失。 2. 位置编码加错维度或没加。 3. 训练/推理的 mask 不一致(padding mask 漏了)。 4. 用 `softmax` 后再算交叉熵(应传 logits)。 5. 微调预训练模型时学习率过大,灾难性遗忘。 --- ## 十七、第 17 章:自编码器、GAN 与扩散模型 ### 17.1 自编码器 结构:编码器 `f: x → z`,解码器 `g: z → x̂`,目标是最小化重构误差。 | 类型 | 约束 | 用途 | | --- | --- | --- | | 欠完备 | 瓶颈维度 < 输入 | 降维、去噪 | | 堆叠 | 多层 | 学层次特征 | | 卷积 | CNN 编解码 | 图像 | | 去噪 | 输入加噪,目标原图 | 学鲁棒表示 | | 稀疏 | 加稀疏惩罚 | 学离散特征 | | VAE | 隐变量是分布 | 生成、插值 | **VAE 的损失**: ```text L = E_{q(z|x)}[log p(x|z)] − KL(q(z|x) || p(z)) = 重构损失 + 正则项(让隐空间接近标准正态) ``` KL 项让隐空间连续,才能采样生成;但也会导致生成图像偏模糊。 ### 17.2 GAN ```text min_G max_D E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1 − D(G(z)))] ``` - 生成器骗判别器,判别器分辨真假,二者对抗达到纳什均衡。 - 训练难点:模式崩塌(只生成少数样本)、训练不稳、超参数敏感。 - 改进:DCGAN(卷积结构约束)、WGAN(用 Wasserstein 距离,训练更稳)、StyleGAN(风格分层控制)。 ### 17.3 扩散模型 - **前向过程**:逐步加高斯噪声,T 步后变成纯噪声。 - **反向过程**:训练网络预测每一步加的噪声,逐步去噪还原。 - 训练目标(简化版): ```text L = E_{t, x₀, ε} || ε − ε_θ(x_t, t) ||² ``` - 优点:训练稳定、生成质量高、多样性好;缺点:采样慢(需多步迭代)。 - 加速:DDIM、蒸馏、潜空间扩散(Latent Diffusion,先编码到低维再扩散)。 ### 17.4 高频坑 1. VAE 只看重构损失,忽略 KL,隐空间不可采样。 2. GAN 判别器太强,生成器梯度消失(可换 WGAN 或调整训练比例)。 3. 扩散模型时间步编码错误(t 没归一化或没嵌入)。 4. 生成任务用像素 MSE 评估(与人眼感知不一致,应看 FID/IS 或人评)。 5. 忘了生成模型也需要固定随机种子才能复现。 --- ## 十八、第 18 章:强化学习 ### 18.1 基本要素 - **智能体 / 环境**、**状态 s**、**动作 a**、**奖励 r**、**策略 π(a|s)**。 - **回报**:`G_t = Σ γ^k r_{t+k}`,γ 是折扣因子(0 短视,1 长远)。 - **价值函数**:`V(s)` 状态价值,`Q(s,a)` 动作价值。 - **MDP**:马尔可夫决策过程,假设下一状态只依赖当前状态与动作。 ### 18.2 Q-learning ```text Q(s,a) ← Q(s,a) + α [ r + γ · max_{a'} Q(s',a') − Q(s,a) ] ``` - 离线(off-policy):用贪心目标更新,但行为策略可以探索。 - 探索策略:ε-greedy(以 ε 概率随机)、softmax、UCB。 - 表格法只适合小状态空间。 ### 18.3 DQN 的三个稳定技巧 1. **经验回放**:把 (s,a,r,s') 存进缓冲区,随机采样,打破相关性。 2. **目标网络**:用一份延迟更新的 Q 网络算目标,避免"追着自己的尾巴"。 3. **奖励裁剪 / 梯度裁剪**:防止 Q 值爆炸。 改进:Double DQN(解耦选动作与估价值,缓解高估)、优先经验回放(TD 误差大的样本多采)、Dueling DQN(拆分状态价值与优势)。 ### 18.4 策略梯度 ```text ∇J(θ) ≈ (1/m) Σ Σ ∇log π_θ(a_t|s_t) · G_t ``` - REINFORCE:用完整回报加权,方差大。 - 加基线(如 V(s))降方差 → Actor-Critic。 - PPO:限制策略更新幅度(clip),稳定、易调,工业界常用。 ### 18.5 高频坑 1. 奖励设计错误,智能体学会"钻空子"(reward hacking)。 2. 不做探索,策略早期就收敛到次优。 3. 回报不归一化,梯度爆炸。 4. 训练/评估环境不一致。 5. 用监督学习的调参直觉套 RL(样本效率极低,需要大量交互)。 --- ## 十九、第 19 章:规模化训练与部署 ### 19.1 部署形态 | 形态 | 工具 | 适用 | | --- | --- | --- | | REST/gRPC 服务 | TF Serving | 服务端在线推理 | | 云托管 | Vertex AI / SageMaker | 免运维、自动扩缩容 | | 移动/嵌入式 | TFLite + 量化 | 手机、IoT | | 浏览器 | TF.js / WebAssembly | 前端推理、隐私敏感 | | 批处理 | 离线任务 | 大规模打分 | ### 19.2 分布式训练 - **MirroredStrategy**:单机多卡,参数同步(All-Reduce)。 - **MultiWorkerMirroredStrategy**:多机多卡。 - **TPUStrategy**:TPU 集群。 - **数据并行 vs 模型并行**:前者每卡一份完整模型、切分数据;后者切分模型层/张量,适合单卡放不下的模型。 ### 19.3 量化与压缩 - **训练后量化**:权重从 float32 → int8,模型小 4 倍、推理快 2–4 倍,精度略降。 - **量化感知训练**:训练时模拟量化误差,精度损失更小。 - **剪枝 / 蒸馏**:去掉小权重,或用大模型教小模型。 ### 19.4 上线前的检查清单 1. 输入 schema 固定,预处理与训练完全一致。 2. 冷启动延迟、P99 延迟、吞吐压测。 3. 模型版本可回滚,A/B 流量可切。 4. 监控:输入分布漂移、预测分布漂移、业务指标。 5. 定期重训策略与数据版本管理。 ### 19.5 高频坑 1. 训练用 pandas 预处理、上线用另一套代码,特征错位。 2. 量化后没做精度回归测试。 3. 只压测平均延迟,忽略 P99。 4. 模型更新没有版本与回滚机制。 5. 忽略数据漂移,模型上线半年后悄悄失效。 --- ## 二十、公式速查 | 主题 | 公式 | | --- | --- | | RMSE | `sqrt(mean((ŷ−y)²))` | | 正规方程 | `θ̂ = (XᵀX)⁻¹Xᵀy` | | 岭回归 | `θ̂ = (XᵀX + αA)⁻¹Xᵀy` | | 逻辑回归损失 | `−(1/m)Σ[y log p + (1−y)log(1−p)]` | | Softmax | `e^{z_k} / Σ_j e^{z_j}` | | Gini | `1 − Σ p_k²` | | 熵 | `−Σ p_k log₂ p_k` | | PCA | `C = (1/m)XᵀX`,取前 k 特征向量 | | k-means 惯性 | `Σ‖x−μ_c‖²` | | 动量 | `m ← βm + η∇J; θ ← θ − m` | | Adam | `θ ← θ − η·m̂/(√v̂+ε)` | | 批归一化 | `γ(x−μ)/√(σ²+ε) + β` | | He 初始化 | `std = √(2/n_in)` | | 卷积输出 | `⌊(n+2p−f)/s⌋+1` | | 注意力 | `softmax(QKᵀ/√d_k)V` | | Q-learning | `Q ← Q + α[r + γ max Q′ − Q]` | | VAE | `E[log p(x|z)] − KL(q(z|x)‖p(z))` | | GAN | `min_G max_D E log D(x) + E log(1−D(G(z)))` | | 扩散损失 | `E‖ε − ε_θ(x_t,t)‖²` | --- ## 二十一、术语对照 | 英文 | 中文 | 一句话 | | --- | --- | --- | | bias / variance | 偏差 / 方差 | 欠拟合 vs 过拟合的两个来源 | | regularization | 正则化 | 给模型加约束,换泛化 | | cross-validation | 交叉验证 | 轮换验证集,评估更稳 | | data leakage | 数据泄漏 | 训练时用到了预测时拿不到的信息 | | pipeline | 流水线 | 预处理与模型绑定的封装 | | bagging / boosting | 装袋 / 提升 | 并行降方差 / 串行降偏差 | | embedding | 嵌入 | 离散对象映射为稠密向量 | | logits | 未归一化分数 | softmax 之前的输出 | | batch norm | 批归一化 | 按批标准化激活 | | dropout | 随机失活 | 训练时随机丢神经元 | | fine-tuning | 微调 | 在预训练模型上小步训练 | | teacher forcing | 教师强制 | 训练时喂真实上一词 | | beam search | 束搜索 | 保留 top-k 候选序列 | | reward hacking | 奖励作弊 | 智能体钻奖励函数空子 | --- ## 二十二、自测题 1. **训练集 R²=0.95、验证集 R²=0.55,最可能是什么问题?先做什么?** 过拟合。先看学习曲线确认是"数据不足"还是"模型过复杂",再依次尝试加数据、加正则、简化模型、早停。 2. **为什么标准化必须在切分之后、且只 fit 训练集?** 否则测试集的均值方差信息进入训练,属于数据泄漏,评估会偏乐观。 3. **类别 1% 的正负样本,为什么准确率不可信?该看什么?** 全预测负类就有 99%。看 PR 曲线、召回率在固定精确率下的表现,以及业务成本加权的混淆矩阵。 4. **Ridge 和 Lasso 的核心区别?** L2 把系数压小但不为零;L1 能把系数压到零,起到特征选择作用。特征相关性强时 Lasso 不稳定,用 Elastic Net。 5. **随机森林为什么比单棵树稳?** 两个随机(样本 bootstrap + 特征子集)让树之间去相关,平均后方差下降,而偏差基本不增。 6. **PCA 之前为什么要标准化?** PCA 找方差最大的方向,量纲大的特征会主导方差,导致主成分被它绑架。 7. **k-means 的 k 怎么选?** 肘部法看 inertia 拐点,配合轮廓系数;同时结合业务可解释性。不能只看 inertia(单调下降)。 8. **BatchNorm 在训练和推理时的行为差异?** 训练用当前 batch 的均值方差并更新滑动统计;推理用滑动统计。忘了切模式会导致结果不稳定。 9. **Dropout 推理时要不要乘 keep_prob?** Keras 的 inverted dropout 不需要,训练时已缩放;但必须确保处于推理模式。 10. **迁移学习为什么要用小学习率微调?** 预训练权重已接近好的解,大学习率会破坏特征,造成灾难性遗忘。 11. **Transformer 为什么要除以 √d_k?** 点积方差随维度线性增长,softmax 会饱和;缩放把方差拉回 1 附近。 12. **GAN 的模式崩塌是什么?怎么缓解?** 生成器只产出少数几种样本。可用 WGAN、调整判别器/生成器训练比例、加多样性正则、minibatch discrimination。 13. **Q-learning 的 target 为什么要用目标网络?** 避免目标随当前网络同步移动,减少震荡与发散。 14. **模型离线指标很好、上线效果差,先查什么?** 训练/服务预处理是否一致、特征时序是否泄漏、线上数据分布是否漂移、评估口径是否与业务一致。 --- **一句话判断**:这本书不适合当"算法推导书",但非常适合当**工程手册**——遇到"数据怎么切、指标怎么选、模型怎么调、上线怎么防坑"的具体问题时,它给的答案通常可以直接照做。读完第 2、4、7、11、14 章,就已经覆盖了日常表格建模与图像任务 80% 的决策点。