讲解稿 · 第 06 章 第 02 节 · 梯度机器学习¶
口播时长:约 18 分钟|建议语速:中速,公式处停两拍|字数:约 4100 字
承 Ch05 §05 信息论 → Ch06 §01 经典 ML → Ch06 §02 梯度机器学习 → Ch06 §03 深度学习
导语(约 80 秒)¶
先想象一个场景。
你刚毕业,拿到北京、上海、深圳、杭州各 50 套二手房的成交记录。每套房都有面积、房龄、楼层、地铁距离、学区评分这些特征,以及最后成交价。任务很明确:给一套还没卖出的房子,猜一个合理报价。
如果用 Ch06 §01 的经典方法,房价模型是一条直线 \(y = w \cdot x + b\),那么这 200 条数据就能直接喂给正规方程,一秒出答案。但如果客户说"这直线不太准,房价根本不是线性关系的",你就需要更灵活的工具。
今天的主题就是这种"在损失曲面上小步下山"的方法:从一个初始猜测的权重向量 \(w\) 出发,反复往"坡度最陡的下坡方向"挪一小步,直到找到使损失最小的参数。线性回归、逻辑回归、神经网络、Transformer,背后都是同一条主线——基于梯度的优化。
具体会讲五件事:线性回归 (有闭式解,作为入门)、梯度下降 (BGD/SGD/Mini-batch)、反向传播 (自动算梯度的链式法则)、优化器族 (SGD+Momentum → Adam → AdamW → LION → Muon)、正则化与偏差-方差权衡 (L1/L2/Elastic Net, λ 三义必标)。
复习昨日 & 今日路线(约 50 秒)¶
Ch06 §01 讲了经典 ML 三件套:线性回归那条直线 \(\hat{y} = w \cdot x + b\)、逻辑回归的 Sigmoid 概率、KNN/决策树/朴素贝叶斯这些几何或概率方法。其中线性回归有闭式解 \(w^* = (X^\top X)^{-1} X^\top y\),只需一次矩阵运算。
但闭式解有两个限制:一是要求 \(X^\top X\) 可逆 (特征数大于样本数时直接挂掉);二是逻辑回归的损失函数根本没有闭式解。今天要学的梯度下降 (Gradient Descent) 是通用的迭代方法,适用于任何可微损失函数,也能处理 \(X^\top X\) 奇异的退化情形。路线是:线性回归 → 逻辑回归 → 梯度下降与变体 → 反向传播 → 优化器族 → 正则化与偏差-方差。下一节 §03 将进入 MLP/CNN/RNN/Transformer,神经元从 1 个变成百万个,但梯度下降这一主线不变。
核心概念一 · 线性回归与 MSE:平方误差的统计学意义(约 2 分钟)¶
直觉。 拟合一条直线,最朴素的量是"所有点到线的垂直距离加起来"。但绝对值不方便求导,平方和既平滑又对大误差更敏感,数学上更顺手。
定义。 给定 \(n\) 个样本 \((x_i, y_i)\),预测 \(\hat{y}_i = w \cdot x_i + b\),均方误差 (Mean Squared Error, MSE) 损失是
例子。 假设真实值 \(y = [1.0, 2.0]\),预测 \(\hat{y} = [0.9, 2.1]\),残差是 \([-0.1, 0.1]\),MSE = \((0.01 + 0.01)/2 = 0.01\)。这个数字可心算:两个 0.1 平方得 0.01,求平均还得 0.01。
反例。 不要把 MSE 写成"误差平方/误差"或"差的绝对值平方"。MSE 永远是"差的平方,再平均",三个动作顺序不能换。
一句话总结。 MSE 把"误差"翻译成"非负、可微、对大误差更狠"的标量,成为梯度下降的标准地基。
MSE 还有个语义深解释:给模型 \(y = Xw + \epsilon\),其中 \(\epsilon \sim \mathcal{N}(0, \sigma^2)\) (Ch05 §03 的正态),最大化对数似然恰好等价于最小化 MSE。这就把"为何用平方"从"好求导"升级到了"概率最优"。
核心概念二 · 正规方程:线性回归的闭式解(约 1.3 分钟)¶
直觉。 MSE 是 \(w\) 的二次函数,二次函数有唯一全局最小,直接对 \(w\) 求导令导数为零,就能一步到位。
定义。 对 \(w\) 求偏导并令其为零,得到正规方程:
例子。 三个点 \(X = [[1,1],[1,2],[1,3]]\) (第一列是偏置截距的 1),\(y = [2, 3, 5]\)。Pyodide 验算:
import numpy as np
X = np.array([[1,1],[1,2],[1,3]], dtype=float)
y = np.array([2,3,5], dtype=float)
w = np.linalg.solve(X.T @ X, X.T @ y)
# w ≈ [0.3333, 1.5]
即 \(w_0 \approx 0.333\), \(w_1 = 1.5\),拟合直线是 \(y = 1.5x + 0.333\)。
反例。 当 \(X^\top X\) 不可逆 (奇异) 时,\((X^\top X)^{-1}\) 不存在。所谓"奇异"通常因为特征线性相关,或特征数 \(d\) 大于样本数 \(n\) (高维稀疏数据)。这正是梯度下降登场的原因。
一句话总结。 正规方程一步到位却怕奇异,梯度下降迭代到位却适用范围广,两者互补。
核心概念三 · 梯度下降与三种批量策略(约 3 分钟)¶
直觉。 想象你站在雾里的山坡上,低头看不见全局最低点,但能感觉到脚下的坡度。沿最陡下坡方向迈一步,再感觉一次,再迈一步,反复就滚到山谷。这就是梯度下降。
定义。 损失函数 \(\mathcal{L}(w)\) 关于 \(w\) 的梯度 \(\nabla \mathcal{L}\) 是指向最陡上升方向的向量,我们要下山所以取负号:
学习率 (learning rate) η 控制步长。η 太大,跨过山谷来回乱撞不收敛;η 太小,慢慢蠕动甚至卡在浅坑里。
例子。 \(\mathcal{L} = w^2\),梯度是 \(2w\)。从 \(w=4\) 起步,\(\eta = 0.1\):
数值在向 0 收敛,但速度较慢。如果把 \(\eta\) 调到 0.5,前几步会震荡甚至发散。
反例。 梯度下降要求损失函数可微。若用了不可微的合页损失 (hinge loss) 在原点处,直接套 \(\nabla \mathcal{L}\) 就要小心次梯度。另外,梯度下降只保证收敛到局部极小,不是全局极小——除非函数是凸的。
批量策略三种 (这里 \(n\) 训练样本数,\(B\) 批大小):
- 批量梯度下降 (BGD): 每步用全部 \(n\) 个样本。梯度精确,但 \(n\) 大时算力昂贵。
- 随机梯度下降 (SGD): 每步只用 1 个样本。梯度有噪声,单步极快,噪声有时还能帮跳出浅坑。
- 小批量梯度下降 (Mini-batch GD): 每步用 \(B\) 个样本,常见 \(B=32, 64, 256\)。它是现代深度学习的标配,既能用 GPU/SIMD 做向量化,又有比纯 SGD 更稳定的梯度。
一句话总结。 梯度下降沿 \(\nabla \mathcal{L}\) 反方向迭代;BGD 准而慢,SGD 快而噪,mini-batch 取两者之中。
核心概念四 · 反向传播:链式法则在计算图上自动展开(约 2 分钟)¶
直觉。 神经网络有百万个参数,总不能用数值差分逐个试探每个方向吧。反向传播 (backpropagation) 把 Ch03 的链式法则系统化,让梯度沿计算图自动回流。
定义。 设损失 \(L\) 依赖中间量 \(z\),\(z\) 又依赖参数 \(w\),有
每个节点只算自己的局部导数,回传从上游流下来的梯度值。前向一次算损失,反向一次算所有参数梯度——总代价约为前向的两倍。
例子。 训练 MLP 识别 MNIST,前向 0.1 ms,反向 0.2 ms,一次迭代 ~0.3 ms。如果不用反向传播,用数值差分算 100 万个参数的梯度,每参数两次前向,就是 200 万次前向,慢 60 万倍。
反例。 反向传播不是万能框架。遇到不可微操作 (如 \(\arg\max\)、离散采样) 需要次梯度或重参数化技巧 (VAE 的 reparameterization trick、REINFORCE 估计)。还有,反向传播算的是标量损失对每个参数的梯度,不是"显式构造完整 Jacobian"——这两者的资源消耗差几个数量级。
一句话总结。 反向传播 = 链式法则 + 计算图拓扑排序;前向算损失,反向传梯度,代价约为前向两倍。
核心概念五 · 优化器族:SGD+Momentum → Adam → AdamW → LION → Muon(约 4 分钟)¶
直觉。 原始 SGD 在拉长的二次曲面上会走 Z 字:陡方向来回震荡,平坦方向进展缓慢。优化器通过利用历史梯度给每个方向自动调节步长,治这毛病。
带动量的 SGD (SGD with momentum) 维护过去梯度的指数移动平均:
典型 \(\beta = 0.9\)。想象一个球下坡:一致方向累积速度,侧向抖动被抑制。
Nesterov 加速梯度 (NAG) 是个小改动:不在当前位置算梯度,而在"预看"位置 \(w - \eta \beta v_{t-1}\) 算梯度,减少冲过头:
Adam (Adaptive Moment Estimation, 2014) 把动量和 RMSprop 合并,同时维护一阶矩 (均值) 和二阶矩 (均值平方),其中 \(\beta_1, \beta_2\) (Adam 动量衰减系数, ⚠️ 区别于 Ch04 二类错误率、Ch05 Beta 分布参数 \(a, b\)):
由于 \(m_0 = v_0 = 0\),初期 \(m_t, v_t\) 偏向零,要做偏差修正:
例子。 \(t = 1, \beta_1 = 0.9\) 时,修正因子 \(1/(1 - 0.9) = 10\),把初始 \(m_1\) 放大 10 倍,抵消零初值的偏差。\(t = 5\) 时修正因子 \(1/(1 - 0.9^5) \approx 2.44\),影响已经变小。
反例。 Adam 默认 \(\beta_1 = 0.9, \beta_2 = 0.999, \epsilon = 10^{-8}\) 在很多问题上好,但不等于万能。NLP 大模型训练,推荐 \(\beta_2 = 0.95\) 让前期更快收敛;小数据集上,Adam 比 SGD-Momentum 容易过拟合。
AdamW 把权重衰减从梯度更新里解耦:标准 L2 正则化在 SGD 下等价于权重衰减,但在 Adam 下不等价。AdamW 直接把 \(\lambda w\) 减到参数上,而不是加进梯度:
这是 Transformer 训练的标配。
LION (EvoLved Sign Momentum, 2023) 只用动量更新的符号,让每次更新规模均匀:
比 Adam 省一半内存 (不用存 \(v_t\)),很多任务上能打平甚至超过 AdamW。
Muon (Momentum + Orthogonalisation, 2024) 先做 Nesterov 动量,再用 Newton-Schulz 迭代把更新矩阵正交化,把更新方向拉到 Stiefel 流形上,各奇异方向幅度相等:
Muon 在 Transformer 的注意力/MLP 权重上比 AdamW 收敛更快、质量相当,显存比 AdamW 省约 47% (不存 \(v_t\))。
反例。 没有"哪个优化器永远最好"。CV 任务上 AdamW 经典,LLM 训练上 Muon 崭露头角,小数据集上纯 SGD+Momentum 反而更稳。
一句话总结。 SGD 是裸奔,动量是滑板车,Adam 是自适应减速带,AdamW 是加上刹车的 Adam,LION/Muon 是更省内存的新一代。
核心概念六 · 损失函数:从 MSE 到 BCE/CCE/Huber(约 1.5 分钟)¶
直觉。 损失函数把"预测错多少"翻译成一个非负标量。不同任务该用不同的翻译。
回归损失:
- MSE (L2): \(\frac{1}{n}\sum (y_i - \hat{y}_i)^2\),对大误差狠。
- MAE (L1): \(\frac{1}{n}\sum |y_i - \hat{y}_i|\),抗离群点。
- Huber 损失: 小误差时像 MSE (平滑),大误差时像 MAE (抗离群),阈值 \(\delta\) 控制切换。
分类损失:
- 二元交叉熵 (BCE): 来自 Ch05 §02 的伯努利似然
对数让"自信但错"代价极高。
例子。 真实标签 \(y = 1\):预测 \(\hat{y} = 0.9\) 时,loss = \(-\log 0.9 \approx 0.105\) nat;预测 \(\hat{y} = 0.01\) 时,loss = \(-\log 0.01 \approx 4.605\) nat,差 44 倍。这就是为什么模型不敢"自信地说错"。
- 多类交叉熵 (CCE): 若真实类别为 \(c\),预测为 \(\hat{y}_c\),则 \(\mathcal{L} = -\log\hat{y}_c\)。这就是正确类别的负对数概率。
反例。 BCE 公式里的 \(\log\) 默认是自然对数 (单位 nat),PyTorch 默认也是 nat。如果想和概率论里"信息量为比特"对齐,要换 \(\log_2\)。同一组 \(\hat{y}, y\) 用 nat 算 BCE 比用 bit 算大 1.443 倍——单位必标。
一句话总结。 回归看 MSE/MAE/Huber,二分类看 BCE,多分类看 CCE;所有交叉熵都来自 Ch05 最大似然。
核心概念七 · 正则化:L1/L2/Elastic Net 与偏差-方差(约 2.5 分钟)¶
直觉。 模型太复杂就会过拟合,在训练集上 99% 准确,测试集上 50% 准确。正则化给复杂模型加惩罚,把参数往"小而稳"的方向拽。
定义. 加正则化后的总损失:
这里 \(\lambda\) (正则化系数, ⚠️ 区别于 Ch02 的特征值、Ch05 的 Poisson 率) 控制"压抑参数"的强度。
- L2 正则化 (Ridge): \(R(w) = \|w\|^2 = \sum w_i^2\),把权重拉向零但不置零。对应高斯先验 + MAP 估计。
- L1 正则化 (Lasso): \(R(w) = \|w\|_1 = \sum |w_i|\),鼓励稀疏,很多权重被推为严格零,等价于自动特征选择。对应拉普拉斯先验。
- Elastic Net: \(R(w) = \alpha \|w\|_1 + (1 - \alpha)\|w\|^2\),兼顾稀疏和收缩。
例子. 梯度下降 + L1 优化的近端算子是软阈值:
设 \(w = 0.005, \eta = 0.01, \lambda = 0.1\):\(0.005 - 0.001 = 0.004 > 0\),保留。若 \(\lambda = 1.0\):\(0.005 - 0.01 < 0\),压到 0。\(\lambda\) 一变,结果完全不同——这就是"超参数敏感"的根源。
反例. 千万不要说"\(L^1\) 范数稀疏友好"或"\(L^1\) 天生稀疏"。\(L^1\) 范数本身不诱导稀疏,是优化目标里加了 \(L^1\) 惩罚项,才让解落在坐标轴上。范数与惩罚项是数学不同的对象。
偏差-方差权衡. 模型期望误差可拆为
简单模型高 bias 低 variance (欠拟合),复杂模型低 bias 高 variance (过拟合)。正则化强度 \(\lambda\) 调节这一平衡:甜蜜点是两者之和最小处。
一句话总结. L2 收缩、L1 稀疏、Elastic Net 兼顾;λ 调节偏差-方差的此消彼长,对应不同的先验分布。
核心概念八 · 评估指标:超越准确率(约 1.5 分钟)¶
直觉. 99% 邮件不是垃圾邮件,所以一个永远预测"非垃圾邮件"的模型也能拿 99% 准确率——但它一封都抓不出来。准确率不是万能。
二分类指标的四个数,写在混淆矩阵里:
- 真阳 (TP): 预测正, 实际正
- 假阳 (FP): 预测正, 实际负
- 真阴 (TN): 预测负, 实际负
- 假阴 (FN): 预测负, 实际正
由此定义:
- 准确率 = (TP+TN) / 总数,量整体但类别不平衡时不可靠。
- 精确率 = TP / (TP+FP),"预测为正的有多少真为正",关心误报。
- 召回率 = TP / (TP+FN),"实际为正的有多少被抓",关心漏报。
- F1 = 2·精确率·召回率 / (精确率+召回率),调和均值两者兼顾。
例子. 设 TP=80, FP=10, FN=20, TN=890 (共 1000):精确率 = 80/90 ≈ 0.889,召回率 = 80/100 = 0.800,F1 ≈ 0.842,准确率 = 970/1000 = 0.970。看上去准确率 97% 不错,但 10% 的召回率黑洞隐藏在另 20 个假阴性里。
ROC 与 AUC. 把"阈值从 0 到 1 横扫一次"画成真正例率对假正例率的曲线。AUC (曲线下面积) 浓缩成单数:1.0 完美,0.5 等于瞎猜。
反例. 多分类场景,macro-F1 (各类 F1 平均) vs micro-F1 (全局算) 数值不同,要先说清是哪个。
一句话总结. 类别不平衡时看精确率/召回率/F1,全阈值扫看 ROC AUC,别只盯准确率。
一个走完全程的例子 · 房价预测(约 2.5 分钟)¶
把今天所有概念串起来。任务:用 200 套房数据预测第 201 套的成交价。
第 1 步:线性回归打底. 选 5 个特征 (面积、房龄、楼层、地铁距离、学区),构成 \(X \in \mathbb{R}^{200 \times 5}\),偏置列加在最左。\(y \in \mathbb{R}^{200}\)。MSE 损失
第 2 步:正规方程尝试. 算 \(w^* = (X^\top X)^{-1} X^\top y\)。如果 \(X^\top X\) 非奇异,一秒出解,这就是 §01 经典 ML 的能力。但高维特征互相关时,特征数接近样本数,矩阵接近奇异,正规方程不稳。
第 3 步:梯度下降补位. 改成 mini-batch SGD,\(B = 32\),\(\eta = 10^{-3}\),Adam 优化器从 \(w = 0\) 起步,跑 50 个 epoch。每个 epoch 6 个 batch,共 300 步,损失对数坐标从 ~10 一路降到 ~0.5。
第 4 步:加正则化. 担心过拟合,加 L2 惩罚 \(\lambda = 0.01\) (⚠️ 这里的 λ 是正则化系数,不是 Ch02 的特征值)。训练损失稍微升高到 ~0.8,但测试损失从 ~1.2 降到 ~0.9,泛化变好。
第 5 步:评估指标. 在 50 套测试集上,MSE = 0.91,MAE = 0.78,MAPE ≈ 8%。所有指标都在接受范围,模型上线。
整个流程串起来:线性回归给起点 → 矩阵奇异就上梯度下降 → Adam 自适应步长 → L2 正则化控过拟合 → 多指标评估验证。前面任何一步都可能被绕过,但任何一步都不能跳过。
易错点回头看(约 80 秒)¶
第一条:很多人以为"梯度下降就是机器学习的全部",其实它是优化阶段的组件。模型设计 (线性 vs 神经网络)、损失函数 (MSE vs BCE)、正则化 (L1 vs L2) 都在梯度下降之前就定了。同一个 SGD 能训练简单线性回归,也能训练 GPT——差别不在优化器,在模型结构与损失。
第二条:很多人以为"Adam 永远比 SGD 好",其实新数据小数据集上 Adam 容易过拟合。图像分类少样本时,SGD+Momentum 反而能拿更高的测试准确率。Adam 在大模型、大数据上才是优势区。
第三条:很多人以为"\(L^1\) 范数天生稀疏",其实是\(L^1\) 惩罚项让解稀疏。范数只是个度量函数,稀疏性来自优化目标里 \(L^1\) 那一项——是惩罚机制,不是范数本身。两者数学上不同对象。
与下节的钩子(约 30 秒)¶
今天我们学会了"在损失曲面上小步下山":梯度下降、BGD/SGD/Mini-batch、反向传播、Adam 优化器族、L1/L2 正则化,所有这些都默认 \(w\) 是几十维、几百维的向量。
但如果房价预测非得用 1000 张图片做特征,或者要直接训练一个图像识别模型,\(w\) 就是几百万维——线性回归、正规方程全部失效。我们需要把 \(w\) 变成多层的结构化函数:输入层、隐藏层、输出层,把"线性打分 + 非线性激活"堆叠起来。这就是下一节 §03 深度学习要讲的事:MLP、CNN、RNN、Transformer 注意力机制 (注意力的 \(\sqrt{d_k}\) 必标)。
不变的是主线:梯度下降 + 链式法则 = 反向传播。变的是结构:从 1 个神经元,变成百万个神经元,变成注意力头。从这里开始,深度学习的核心引擎开始轰鸣。