第 8 章 正则化与模型选择

第 7 章把泛化误差拆成了偏差、方差与不可约噪声三部分。本章处理其中唯一可被工程手段压制的那一项——方差,以及随之而来的问题:正则化手段这么多,凭什么选它、参数怎么定、模型怎么比。

学习目标

读完本章,你应当能够:

  1. 说明正则化从"限制假设空间"到"MAP 视角"的两条等价解释路径,并写出它们之间的对应关系;
  2. 推导 L2 与 L1 正则的解形式,用等高线与约束域相切的几何图像解释为什么 L1 产生稀疏解而 L2 不产生;
  3. 辨析高斯先验与拉普拉斯先验如何分别导出 L2 与 L1,并说明弹性网和 λ 的选择方法;
  4. 论证早停与 L2 正则的等价性思路,解释 patience 的作用以及"用验证集挑轮数"为什么带来轻微乐观偏差;
  5. 推导 Dropout 训练与推理的期望一致性,说明它为什么等价于集成、以及与 BN 同时使用时为什么方差会失配;
  6. 设计超参搜索流程:网格/随机/贝叶斯优化的取舍,以及用嵌套交叉验证消除选择偏差的方法。

前置知识检查

你需要知道在哪一节补齐
偏差、方差与泛化误差的分解8.1.1 从"方差可干预"切入;第 7 章 7.3.1 给出完整推导
拉格朗日乘子与约束优化8.2.2 约束域视角;第 6 章 6.6.1 给出乘子法与 ν 的含义
最大后验估计(MAP)8.1.2 从贝叶斯公式重新导出;第 4 章 4.6 节给出 MLE/MAP 的基础
多元高斯与拉普拉斯分布的概率密度8.2.3 列出两个密度的具体形式并取对数
期望的线性性与全期望公式8.4.1 Dropout 的期望一致性推导
二次型的梯度与矩阵求逆8.2.1 岭回归闭式解;第 2 章 2.4 节给出最小二乘的正规方程
交叉验证与数据划分8.5.1 早停需要验证集;第 7 章 7.4 节给出全部划分方案

8.1 正则化的动机

8.1.1 从限制假设空间看

第 7 章的结论是 R(f̂) − min_{f∈H} R(f) ≈ 近似误差 + 估计误差。估计误差的来源是假设空间 H 太大:候选函数越多,越容易找到恰好拟合训练集噪声的那一个。

于是有两条思路压制估计误差:缩小 H(换更简单的模型族),或在 H 上施加偏好(保留大 H 的表达力,但惩罚"复杂"的解)。后者就是正则化(regularization):

min_f R̂(f) + λ·Ω(f)

其中 Ω(f) 是复杂度度量(penalty),λ ≥ 0 控制惩罚强度。λ = 0 退化为纯 ERM;λ → ∞ 则解被压向 Ω 的最小值点(通常是 f = 常数)。这条式子可以用一句直觉概括:

重要

正则化 = 用"可容忍的偏差增加"去换"更大幅度的方差下降"。 它并不追求训练误差最小——它追求的是 Bias²(λ) + Var(λ) 之和最小。这也解释了为什么 λ 存在一个非零的最优值:太小则方差未被压住,太大则偏差被抬高过多。

复杂度 Ω 的几种常见选择:参数范数(L2/L1)、参数个数、模型描述长度(MDL)、函数的光滑程度(如惩罚二阶导),以及在深度学习中"隐式"起作用的训练过程本身(早停、Dropout、SGD 噪声)。本章会逐一说明它们为什么都可以被解释为"限制有效容量"。

8.1.2 从 MAP 视角看

同一件事换贝叶斯视角看,结论更清晰。由贝叶斯公式,参数的后验为

P(w|D) = P(D|w)·P(w)/P(D),取对数并丢掉与 w 无关的 P(D):

log P(w|D) = log P(D|w) + log P(w) + const

最大后验估计(Maximum A Posteriori, MAP) 就是最大化右侧。关键观察:log P(D|w) 正是对数似然(对 i.i.d. 数据等于负的交叉熵/MSE 之和,第 4 章 4.6 节),而 log P(w) 是先验。于是

1
2
3
4
5
6
MAP 目标  =  argmax_w [ log P(D|w) + log P(w) ]
          =  argmin_w [ −log P(D|w) − log P(w) ]
              ↑ 经验风险(NLL)      ↑ 正则项 = −log 先验

⟹ 正则化 = 给参数加先验分布
   先验越"偏好小参数",正则项越强地把解拉向小参数

这个视角的价值在于它把"选择正则项"变成了"声明先验假设",先验是否有道理可以直接讨论。8.2.3 会用这个工具精确地区分 L2 与 L1。

注意

MAP 与 MLE 的唯一差别就是先验项。 第 4 章的 MLE 是 argmax_w log P(D|w),MAP 多了一项 log P(w)。当 N → ∞ 时似然项按 O(N) 增长而先验项是 O(1),先验的影响被逐渐淹没——这与 8.2.4 中"λ 的作用随数据量增大而减弱"的结论完全一致。

8.2 L2 正则与 L1 正则

8.2.1 岭回归与 Lasso 的解

对线性模型 f(x) = wᵀx,两种正则化分别对应:

名称目标函数别称解
岭回归(ridge regression)‖y − Xw‖² + λ‖w‖₂²L2 正则、Tikhonov 正则ŵ = (XᵀX + λI)⁻¹Xᵀy(闭式)
Lasso‖y − Xw‖² + λ‖w‖₁L1 正则无闭式解,用坐标下降/近端梯度

岭回归闭式解的推导(同时说明了它为什么能治共线性):目标函数为

J(w) = (y − Xw)ᵀ(y − Xw) + λwᵀw

对 w 求梯度并令其为零:

1
2
3
∂J/∂w = −2Xᵀ(y − Xw) + 2λw = 0
⟹ (XᵀX + λI)w = Xᵀy
⟹ ŵ = (XᵀX + λI)⁻¹Xᵀy

对比最小二乘的 (XᵀX)⁻¹Xᵀy,差别就是 +λI。这个改动的效果可以直接看特征值:若 XᵀX 的特征值为 σ_i²,则 XᵀX + λI 的特征值为 σ_i² + λ。于是

1
条件数:κ = σ_max²/σ_min²      →      κ_ridge = (σ_max² + λ)/(σ_min² + λ)

σ_min² 接近 0(特征高度共线)时,原问题的 κ → ∞,(XᵀX)⁻¹ 的数值爆炸;加 λ 后 κ_ridge ≈ σ_max²/λ 有限,解变得稳定。这就是"岭(ridge)“这个名字的来源——它沿病态方向给损失面加了一道"山脊”,把解从"几乎任意的平坦谷底"推到唯一的确定点。第 5 章 5.5 节讨论的病态问题正是同一现象。

L1 为什么没有闭式解:|w| 在 w = 0 处不可导,∂J/∂w = 0 这个条件在原点处失效,因此必须用近端梯度或坐标下降。以坐标下降为例,固定其他维、只优化 w_j 时,解是一个**软阈值(soft-thresholding)**算子:

ŵ_j = sign(z_j)·max(|z_j| − λ/2, 0),其中 z_j 是与 w_j 对应的最小二乘偏残差相关量

注意 max(·, 0):只要 |z_j| 不超过阈值 λ/2,ŵ_j 就被精确置为 0。这已经不是"变小",而是"归零"——稀疏性的来源就在这里。

8.2.2 几何解释:等高线与约束域相切

正则化问题可以等价地写成约束优化(由第 6 章 6.6.1 的乘子法,λ 与约束半径 c 一一对应):

min ‖y − Xw‖²,s.t. ‖w‖₂ ≤ c(L2)或 ‖w‖₁ ≤ c(L1)

于是几何图像变成了:损失函数的等高线从最小二乘解出发向外扩张,第一次碰到约束域的那个点就是正则解。两个约束域的形状差异决定了一切:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
二维参数空间(w₁, w₂)中的相切过程

   L2 约束域:圆                L1 约束域:菱形(顶点在坐标轴上)
     w₂                            w₂
      │   ╱等高线                  │    ╱等高线
      │  ╱                        │   ╱
   ───┼─●──── w₁               ───┼──◆──── w₁
      │  ╲  ← 切点可能在圆上任意   │  ╲ ← 切点极可能在**顶点**上
      │   ╲     位置(一般 w₁,w₂   │   ╲    (顶点处 w₁=0 或 w₂=0)
                   都非零)       │
   圆是光滑的:没有"特殊点"        菱形有 4 个尖角,且尖角落在坐标轴上
   切点落在 w₁=0 上的概率为 0      切点落在尖角上的概率**不为零**

核心论证:等高线是一个光滑凸曲线,约束域是一个凸多面体。切点在多面体边界上的位置取决于等高线的形状与方向。对圆形约束域,边界处处光滑、曲率相同,没有任何位置是"特殊"的,所以切点落在 w₁ = 0 这条线上的概率为零(是一个零测集)。对菱形约束域,顶点是不可导的尖角——在这些点上,约束域的"法向"不是一个方向而是一个锥,因此它"更容易"与等高线相切;而菱形的顶点恰好都在坐标轴上(w₁ = 0 或 w₂ = 0)。

把这个几何直觉推广到 d 维:ℓ₁ 球在 d 维空间中有 2d 个顶点、每条棱都在坐标子空间上,随着维度升高,“切点落在低维面(某些坐标为 0)上"的概率迅速上升。而 ℓ₂ 球处处光滑,切点几乎总是所有坐标都非零。这就是 L1 产生稀疏解、L2 只把系数压小但不归零的几何原因。

提示

一句话记忆:L1 的约束域有尖角,尖角在坐标轴上;切点倾向落在尖角,于是某些系数恰好为 0。 圆没有尖角,所以 L2 只能"压小”,不能"清零"。

8.2.3 贝叶斯解释:先验分布决定正则项

用 8.1.2 的框架,−log P(w) 就是正则项。给参数指定不同先验,就得到不同的正则:

1
2
3
4
5
6
高斯先验(Gaussian)          拉普拉斯先验(Laplace)
  P(w_j) = (1/√(2πσ²))·exp(−w_j²/(2σ²))    P(w_j) = (1/(2b))·exp(−|w_j|/b)

  −log P(w) = Σ_j w_j²/(2σ²) + const       −log P(w) = Σ_j |w_j|/b + const
             ∝ ‖w‖₂²                                  ∝ ‖w‖₁
             ⟹ L2 正则                                 ⟹ L1 正则

为什么拉普拉斯先验给出稀疏解:拉普拉斯分布在 w = 0 处有一个尖峰(不可导的峰),概率密度在 0 附近远高于高斯分布——它先验地认为"大多数参数本来就应该是 0"。MAP 估计在"拟合数据"与"贴近先验"之间平衡,而这个尖峰让"把参数精确压到 0"成为一个有吸引力的解。高斯先验在 0 处是光滑的极大值,密度随 |w| 平方衰减,对"参数恰好为 0"没有特殊偏好,因此只把参数整体缩小。

注意

两个视角是同一件事。 几何视角(约束域形状)与贝叶斯视角(先验密度形状)描述的是同一个数学事实:ℓ₁ 范数的不可导尖角 ⟺ 拉普拉斯先验的对数密度尖峰。考试中两种问法都可能出现,看到"稀疏"就应同时想到这两条线索。

8.2.4 弹性网与 λ 的选择

弹性网(Elastic Net) 同时使用两种惩罚:

J(w) = ‖y − Xw‖² + λ₁‖w‖₁ + λ₂‖w‖₂²

它解决的问题是 Lasso 的两个已知缺陷:

缺陷表现弹性网为什么能救
高相关特征组Lasso 倾向任选一个保留、其余归零(选择不稳定,换一批数据选的可能不同)L2 部分让相关特征"共同进退",形成分组效应(grouping effect)
d > N 且相关性强Lasso 最多选出 N 个非零系数(饱和)加入 L2 后不再有 N 的上限

λ 怎么选:λ 是超参数,必须在验证集上选,常用的三种做法:

  • k-fold 交叉验证:对每个候选 λ 跑交叉验证,取平均验证误差最小的(RidgeCV / LassoCV 的做法)。注意把标准化放进 CV 的每一折内部,否则数据泄漏(第 7 章 7.4.1);
  • 正则化路径(regularization path):从大到小扫一串 λ,一次算出整条解路径(坐标下降的 warm start 使整条路径的代价约等于单个 λ),再在路径上挑最优点;
  • 1-SE 规则:不取交叉验证误差最小的 λ,而取"误差不超过最小值的 1 个标准误"的最大 λ。理由是更简单的模型方差更小、更稳健,且通常泛化不差。

λ 与数据量 N 的关系:由 8.1.2 的讨论,似然项按 O(N) 增长而先验项是 O(1),因此数据越多,能承受的 λ 越小(先验的相对影响被稀释)。实践中 λ 通常取 O(1/√N) 量级的缩放形式。

8.3 早停:最便宜的隐式正则

8.3.1 与 L2 正则的等价性论证

早停(early stopping)的做法是:每训练若干步就在验证集上评估一次,记录验证误差最低的那组参数,若连续 patience 次评估都没有改善就停止训练。它不需要改动损失函数、不需要额外超参以外的计算,因此被称为"最便宜的正则化"。

为什么它等价于 L2 正则:考虑从初值 w₀(通常是零附近的小随机数)出发的梯度下降。在 w₀ 附近对损失做二次近似,沿特征方向分解后可以得到一个关键结论:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
在 w₀ = 0 附近做二次近似,梯度下降第 t 步的解(沿第 i 个特征方向):
    w_i(t) = w_i* · [1 − (1 − η·λ_i)^t]        (w_i* 是该方向的无穷步解,
                                                λ_i 是 Hessian 在该方向的曲率)

若把 L2 正则的闭式解也沿同一方向展开(λ 为正则强度):
    w_i^ridge = w_i* · λ_i/(λ_i + λ)

两者形式相同:都表现为"对无约束解 w_i* 乘上一个收缩因子"。
令两个收缩因子相等,解出
    1 − (1 − ηλ_i)^t = λ_i/(λ_i + λ)
⟹  (1 − ηλ_i)^t = λ/(λ_i + λ)
⟹  λ ≈ λ_i/[(1 − ηλ_i)^(−t) − 1]
⟹ λ 是 t 的单调递减函数:训练步数 t 越大,等效的正则强度 λ 越小
⟹ 早停 t 步 ≈ 用某个有效的 λ 做 L2 正则

三个直接推论,都与【08-05 选择 Q17】的选项一一对应:

  1. 早停限制的是"权重从初值出发能走多远",即限制参数范数 ‖w − w₀‖,不是限制训练数据量。因此"早停限制了模型能学习的数据量"是错的(选项 D 错)——每一轮见到的数据量完全没变。
  2. 早停的效果近似于约束参数范数,与 L2 正则同源。λ 小(弱正则)对应"可以多训练一会儿",λ 大对应"要早点停"。
  3. 收缩只发生在与初值有关的子空间上。梯度下降在 λ_i ≈ 0 的方向(数据中缺乏信息的方向)根本不移动,因此这些方向天然被"正则化"掉了——这正是 GAN、深层网络等"零初始化 + 梯度下降"本身就具有隐式正则的原因。

重要

早停与 L2 的等价性建立在三个前提上:二次近似(损失在极小点附近近似二次)、w₀ = 0(或至少接近解空间的中心)、以及"训练损失正在单调下降"。若学习率过大导致损失震荡,或初值远离原点,这种对应关系会被破坏。等价性是近似意义下的,不是恒等式。

为什么三个前提都必要:二次近似保证"梯度下降的轨迹"可以用特征方向上的几何级数刻画(否则收缩因子不是 (1−ηλ_i)^t 这种形式);w₀ = 0 保证"早停所限制的范数 ‖w − w₀‖“就等于 ‖w‖,从而与 L2 的 ‖w‖² 惩罚可比——若初值已经在某个非零的预训练点上,早停限制的是"离预训练点的距离”,而 L2 惩罚的是"离原点的距离",两者指向不同;训练损失单调下降保证"验证误差的最低点出现在训练足够久之后",否则早停可能只是截断了一个尚未收敛的过程。

8.3.2 patience 与选择偏差

patience(耐心) 的作用是过滤验证误差的随机波动。验证集本身是有限的,其误差序列会有随机起伏;若"一回升就停",就会在偶然的一次波动处误停,丢掉后面可能的改善。设 patience = p,则允许连续 p 次评估无改善才停止。等价地,patience 把"停止"这个决策建立在长度为 p+1 的局部最小值上,而不是单点比较。

为什么"用验证集挑轮数"会带来轻微乐观偏差:早停本质上是把训练轮数当作一个超参数,用验证集挑出让验证误差最低的那一轮(这正是【08-05 选择 Q17】选项 B 的正确表述)。但"取最小值"这个动作本身有系统性偏差:

1
2
3
4
5
设第 t 轮的验证误差 = 真实验证误差(t) + 噪声_t
我们选择 argmin_t [真实验证误差(t) + 噪声_t]
若真实验证误差在若干轮内大致相同(平台期),则
选中那轮的噪声_t 必然偏低(是"运气好"的那一次)
⟹ 报告的验证误差系统性低于真实验证误差

因此【08-05 选择 Q17】选项 C"在验证集上误差最低的模型,在测试集上一定最好"是错的:验证集是有限样本,在其上最优不能保证在测试集上最优;用验证集反复挑选本身还会带来轻微过拟合。偏差幅度随"比较的轮数"和"验证集的大小"变化——轮数越多、验证集越小,偏差越大。缓解手段包括:用更大的验证集、用多折平均而非单折、以及最终在独立测试集上报告。

8.4 Dropout 与其他隐式正则

8.4.1 Dropout 的期望一致性

训练时:以概率 p 保留每个神经元(或以 1 − p 的概率把它置零),即用一个独立的伯努利掩码 m_j ∼ Bernoulli(p) 乘上激活 h_j:

h̃_j = m_j·h_j,其中 P(m_j = 1) = p、E[m_j] = p、Var(m_j) = p(1−p)

推理时为什么必须把激活乘上 p(或用"反向 Dropout"在训练时除以 p)?关键在于保持输出的期望一致。由期望的线性性:

1
E[h̃_j] = E[m_j]·E[h_j] = p·E[h_j]

训练时神经元的期望输出被缩小了 p 倍。推理时不再有掩码,实际输出是 E[h_j],与训练时差一个因子 p。因此推理时必须采用 权重缩放(weight scaling):把 h_j 乘以 p,使 p·E[h_j] = E[h̃_j]。

现代实现用"反向 Dropout"(inverted dropout),把缩放挪到训练时:训练时 h̃_j = m_j·h_j/p,则 E[h̃_j] = h_j,推理时什么都不用改。代价是训练时的激活尺度被放大 1/p 倍(也是为什么 p 不能太小——p = 0.1 会让激活放大约 10 倍)。理解这两者只是缩放位置不同、期望一致的道理相同,是回答"Dropout 为什么推理时要乘 p"这个经典问题的关键。

8.4.2 Dropout 为什么是集成学习

把 Dropout 看成对 2^n 个不同子网络的采样:每个掩码对应一个"删掉部分神经元"的稀疏子网络,它们共享权重。训练时每个 mini-batch 相当于训练了其中一个子网络(且不同 batch 训练的是不同子网络);推理时用的是完整网络、权重按 p 缩放——这正好近似于对所有子网络输出的平均。

这解释了 Dropout 的两个经验性质:

  • 它主要降方差(集成/平均的典型效果),符合 7.3.1 的框架;
  • 它让神经元不能依赖任何一个特定的同伴,因为它们可能随时被删掉。这迫使网络学出冗余、独立的特征——这与 L2 正则迫使权重变小虽路径不同,但都在压制"过度依赖训练集特有巧合"的解。

与 BN(Batch Normalization)的相互作用是常见考点。原始 Dropout 直接作用在激活上,会改变激活的方差(Var(h̃) = p(1−p)E[h²] + p²Var(h),与 p 有关),而 BN 正是靠"用当前 batch 的均值方差做归一化"工作的。二者叠加会造成方差失配(variance shift):训练时 BN 看到的方差统计与推理时的分布不一致,导致推理表现变差。因此现代卷积网络(如 ResNet 系列)通常用 BN 替代 Dropout(在卷积层后不用 Dropout,只在最后全连接层用较小的 p);Transformer 中则常用 Dropout + LayerNorm 的组合,因为 LN 是在特征维上归一化、不与 batch 统计耦合,冲突小得多(第 13 章 13.3 节)。

组合冲突程度原因
Dropout → BN高Dropout 改变激活方差,BN 又按 batch 统计重算方差,两者互相干扰
BN → Dropout中BN 之后 Dropout 只影响"归一化后的激活",作用被部分削弱
Dropout + LN低LN 在特征维归一化,不依赖 batch 统计,与 Dropout 的随机性解耦
只用 BN,不用 Dropout无现代 CNN 的默认做法

8.4.3 数据增强、标签平滑与噪声注入

四类手段的共同点是:它们都不改变模型结构,而是通过改变训练数据/目标的分布来限制有效容量。

手段做法为什么算正则化代价
数据增强(data augmentation)对图像翻转/裁剪/色彩抖动、对文本回译/同义替换等效于大幅扩充训练集 ⟹ 直接压低方差;同时把"不改变语义的变换"编码成了先验变换必须保持标签不变,否则注入错误标签
标签平滑(label smoothing)把硬标签 y ∈ {0,1} 换成 (1−ε)y + ε/C阻止模型输出极端置信的概率,改善校准、抑制"过度自信"与需要精确概率的下游(如蒸馏)可能冲突
噪声注入(noise injection)在输入、激活或权重上加高斯噪声输入加噪声等价于对输入做数据增强;权重加噪声与 L2 有理论联系噪声尺度难调,过大会破坏训练
归一化层(BN/LN/RMSNorm)用 batch/特征统计量做标准化使损失面对参数尺度不敏感,等效于自适应地压低有效学习率与条件数;同时限制了激活的尺度范围引入 batch 依赖(BN),小 batch 时统计不稳

标签平滑的推导直觉:用硬标签 y = 1 训练交叉熵时,最优解要求 logit → +∞(因为只有 p = 1 才能让交叉熵为 0),这在有限数据上会驱动权重范数无限增大。改成 y_smooth = 1 − ε + ε/C 后,最优解变为有限值——模型被明确告知"不要那么自信"。这既降低了有效容量(正则),又改善了概率校准(第 7 章 7.5.1 中 LogLoss 惩罚的正是过度自信)。

归一化为什么是隐式正则:这一点值得单独强调,因为它常被误解为"只是让训练更快"。BN/LN 对每个特征做 (h − μ)/σ,使得后续权重的缩放不变——把 w 和 h 同时放大 c 倍,输出不变。这种缩放不变性把损失面上"沿径向的平坦方向"压掉了,直接降低了第 6 章 6.2.3 中的条件数,让优化更快;同时它也限制了激活的尺度,从而限制了有效容量。因此归一化层在统计上扮演了正则化的角色,尽管它的动机是优化稳定性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

def dropout_forward(h, keep_prob, training, rng=None):
    """Dropout 前向:返回激活,并保证训练与推理的输出期望一致。

    用 inverted dropout(训练时缩放),推理路径无须任何改动,
    这是 TensorFlow / PyTorch 的默认实现方式。
    """
    if not training:
        return h                      # 推理:直接返回,不做任何缩放
    if rng is None:
        rng = np.random.default_rng(0)
    # 以 keep_prob 的概率保留;除以 keep_prob 把期望拉回 E[h]
    mask = (rng.random(h.shape) < keep_prob).astype(h.dtype)
    return h * mask / keep_prob       # E[h*mask/p] = h*E[mask]/p = h


# 用常向量便于观察期望;训练态与推理态的均值都应接近 3.0
h = np.full((200_000,), 3.0)
train_out = dropout_forward(h, keep_prob=0.6, training=True)
eval_out = dropout_forward(h, keep_prob=0.6, training=False)
print(train_out.mean(), eval_out.mean())

上面这段代码同时解释了 8.4.1 的两个结论:E[h·mask/p] = h·E[mask]/p = h·p/p = h,所以推理无须缩放;而若把除法去掉(原始 Dropout 的写法),训练输出均值会变成 3.0 × 0.6 = 1.8,推理时必须乘 0.6 才能对齐——两种写法等价,只是缩放位置不同。

8.5 模型选择与超参搜索

8.5.1 三种搜索策略

给定超参空间(学习率、λ、层数、p……),要找到配置使验证性能最好。三种主流策略:

策略做法优点缺点适用维度
网格搜索(grid search)每个超参取若干离散值,做笛卡尔积实现简单、可并行、覆盖均匀代价随维度指数增长;不重要维度浪费大量预算≤ 3~4 维
随机搜索(random search)从分布中独立采样配置同样预算下覆盖更多不同的"重要维度取值"不保证覆盖到最优点中高维
贝叶斯优化(Bayesian optimization)用代理模型(高斯过程/树模型)建模"配置 → 性能",用采集函数选下一个点样本效率高,几十次评估就能找到好点有串行依赖、难以大规模并行;代理模型本身有成本评估极贵时

随机搜索为什么优于网格搜索:这依赖一个经验事实——通常只有少数几个超参真正重要(学习率、正则强度往往主导,而层数、批大小的次之)。网格搜索在每个维度上只取固定几个值;若 5 个维度各取 10 个值,则每个重要维度只被探索了 10 个取值,且大量组合花在无所谓的维度上。随机搜索在同样 100 次评估中,让每个维度都能取到 100 个不同的值,因此更有机会命中重要维度的最优区间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
网格 vs 随机(2 个超参,各 5×5 = 25 次评估,但只有"学习率"真正重要)

  网格:lr 只被测了 5 个不同取值      随机:lr 被测了 25 个不同取值
   batch                        batch
     ↑                            ↑
     │ ×  ×  ×  ×  ×              │  ×   × ×
     │ ×  ×  ×  ×  ×              │ ×  × ×   ×
     │ ×  ×  ×  ×  ×              │   ×  × ×  ×
     │ ×  ×  ×  ×  ×              │ × ×   ×  ×
     │ ×  ×  ×  ×  ×              │×  × ×  ×
     └──────────────→ lr          └──────────────→ lr
     lr 方向只有 5 个刻度          lr 方向有 25 个刻度 ⟹ 更容易找到最优 lr

贝叶斯优化的两个核心部件:代理模型(surrogate,通常是高斯过程,给出"该点性能的均值与不确定性")与采集函数(acquisition function,如 Expected Improvement、UCB),后者在"利用已知好区域"与"探索未知区域"之间权衡。它适合"单次评估要几小时"的场景(如大模型微调),不适合"评估只需几秒"的场景(此时随机搜索的简单性和可并行性更划算)。

搜索空间的参数化也很重要:学习率、λ、Dropout 的 p 这类量应当在对数尺度上采样(log-uniform),因为"1e−3 与 1e−4 的差别"和"1e−4 与 1e−5 的差别"在效果上是等价的,而在线性尺度上采样会把绝大多数预算堆在量级偏大的一端。相反,层数、头数这类整数超参应在整数格点上采样并加约束(如 d_model 必须能被头数整除)。

逐层差异化正则是深度网络的进阶实践:对嵌入层与输出层通常用更小的权重衰减甚至不用(嵌入矩阵的每一行只被少量 token 更新,过度衰减会伤及低频词;输出层直接决定 logits 尺度,衰减会改变初始的预测分布),对中间的注意力/前馈权重用标准衰减。这背后的判据仍然来自 8.1.1——正则化强度应当与"该参数的估计方差"匹配:更新次数少、样本支持弱的参数(低频 token 的嵌入)更需要小 λ 以避免欠拟合。

8.5.2 嵌套交叉验证

8.3.2 已经指出:从多个候选中挑最优会带来乐观偏差。这个问题在超参搜索中更严重——可能要比较几百个配置。嵌套交叉验证(nested cross-validation) 用一个两层结构把"选超参"与"估性能"彻底分开:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
嵌套交叉验证(外层估性能,内层选超参)

  全量数据
  ├── 外层第 1 折:验证 = V₁,其余 = T₁
  │      └── 在 T₁ 上做内层 k-fold:选出最优超参 θ₁*
  │      └── 用 θ₁* 在 T₁ 上重训,在 V₁ 上评估 → s₁
  ├── 外层第 2 折:验证 = V₂,其余 = T₂
  │      └── 在 T₂ 上做内层 k-fold:选出 θ₂*(可能与 θ₁* 不同!)
  │      └── 用 θ₂* 在 T₂ 上重训,在 V₂ 上评估 → s₂
  ├── ...
  └── 外层第 K 折 → s_K

  报告:mean(s₁..s_K) ± std(s₁..s_K)        ← 对"整个建模流程"的无偏估计
  注意:V_i 从未参与 θ_i* 的选择,故各 s_i 是干净的

关键理解:嵌套交叉验证估计的不是"某组固定超参的性能",而是"**我这一整套建模流程(含超参搜索)**的性能"。因此各折选出的 θ_i* 可以不同,这恰恰是它诚实的体现——它承认了选择过程本身有随机性。

成本:内层 k₁ 折 × 外层 k₂ 折 = k₁·k₂ 次训练(如 5×5 = 25 次)。因此实践中:报告论文/交付结果时用嵌套 CV;日常开发迭代时用单层 CV + 一个封存的测试集(测试集只在最终确认时用一次)。

场景推荐做法理由
数据很少(N 千级)、需要报告泛化性能嵌套 CV单层 CV 的选择偏差在小数据上最严重
数据充足、有独立测试集单层 CV 选超参 + 测试集报告测试集未被污染,偏差已消除
时间序列外层前向链式 CV + 内层前向链式 CV两层都必须只用过去预测未来(7.4.3)
大模型微调单次划分(train/val/test)交叉验证的训练成本不可承受;靠大数据量压低方差

警告

最常见的流程错误:用测试集选超参。 只要测试集参与过任何一次决策(选超参、选特征、选早停轮数、选阈值),它就不再是测试集。后续所有"模型在测试集上达到 X%“的报告都失去了无偏性。工程上的自保做法是物理隔离——把测试集的文件单独存放,只在最终确认时读取一次,并把这次读取记录下来。

本章小结

关键结论一句话表述常见错误
正则化本质用可容忍的偏差增加换更大幅度的方差下降,故最优 λ ≠ 0认为正则化"总是让模型变差”
MAP 视角正则项 = −log P(w),即给参数加先验把正则化当成纯工程技巧,看不到先验假设
岭回归ŵ = (XᵀX + λI)⁻¹Xᵀy;特征值加 λ 使条件数有限忘记标准化,导致各维惩罚强度不均衡
L1 稀疏性ℓ₁ 球有坐标轴上的尖角 ⟹ 切点常在坐标轴上 ⟹ 系数恰好为 0以为 L1 只是"更强的 L2"
L1 的贝叶斯解释拉普拉斯先验在 0 处有尖峰;高斯先验在 0 处光滑两个视角只记一个
弹性网兼顾稀疏与分组效应,d > N 时不受 N 个非零的饱和限制认为 L1 单调优于 L2
λ 的选择在验证集/交叉验证上选;1-SE 规则偏向更简单的模型标准化放在 CV 之外(数据泄漏)
早停 ≈ L2限制 ‖w − w₀‖(权重能走多远),不限制数据量说"早停限制了训练数据量"
patience容忍验证误差的正常波动,避免误停令 patience = 0 并在每次回升时停
选轮数的偏差训练轮数是超参数,用验证集取最小值必然乐观声称"验证最优 ⟹ 测试最优"
Dropout 期望推理需乘 p;inverted dropout 把缩放挪到训练时训练/推理缩放位置搞混,期望不一致
Dropout vs BNDropout 改变激活方差,与 BN 的 batch 统计冲突在 BN 网络里大量使用 Dropout
超参搜索少量超参用网格,中高维用随机,评估极贵用贝叶斯认为网格搜索总能找到最优
嵌套 CV外层估性能、内层选超参,无偏但成本 k₁·k₂用同一层 CV 的结果既选超参又报性能

自测题

Q1(几何论证)用约束域与等高线相切的图像解释:为什么 L1 正则能得到稀疏解而 L2 不能?再用贝叶斯视角复述同一结论。

答案与解析

几何视角。把正则化写成约束形式 min ‖y − Xw‖² s.t. ‖w‖₁ ≤ c(L1)或 ‖w‖₂ ≤ c(L2),由第 6 章 6.6.1 的乘子法,约束半径 c 与惩罚强度 λ 一一对应。最优解出现在"损失等高线第一次触到约束域"的切点。

  • L2 的约束域是圆(高维为球):边界处处光滑、曲率相同,没有任何位置特殊。因此切点落在 w₁ = 0 这条坐标轴上的情况是零测集,概率为 0。解一般所有分量都非零——只是被整体压小了。
  • L1 的约束域是菱形(高维为交叉多面体):它的顶点恰好在坐标轴上(顶点处某些坐标为 0),而顶点是不可导的尖角。在尖角处约束域的法向不是一个方向而是一个锥,因此等高线更容易在此处相切。随着维度升高,ℓ₁ 球的顶点与低维面数量迅速增加,“切点落在某些坐标为 0 的面上"的概率显著上升。

贝叶斯视角。由 8.1.2,−log P(w) 就是正则项。L2 对应高斯先验 P(w_j) ∝ exp(−w_j²/(2σ²)),其对数在 0 处是光滑极大值,密度随 |w| 二次衰减,对"参数恰为 0"没有额外偏好。L1 对应拉普拉斯先验 P(w_j) ∝ exp(−|w_j|/b),其对数在 0 处是尖峰(不可导),密度在 0 附近的取值远高于高斯,即先验地认为"大多数参数本应为 0”。MAP 在拟合与先验之间平衡时,这个尖峰让"精确置零"成为有吸引力的解。

两个视角的对应关系:ℓ₁ 范数的不可导尖角 ⟺ 拉普拉斯先验的对数密度尖峰。它们是同一数学事实的两种表述。

易错点:把稀疏性归因于"L1 惩罚更大"。二者在同一半径 c 下惩罚强度是可比的(都由 c 决定),真正起作用的是约束域的形状(有无坐标轴上的尖角),而不是强度。

Q2(辨析)判断正误并说明理由:

(a) 早停是一种正则化方法,它通过限制模型能学到的数据量来防止过拟合。 (b) 早停可以设置 patience,允许验证误差连续若干轮不下降再停止。 (c) 在验证集上误差最低的那一轮模型,在测试集上也一定最好。 (d) 早停的效果与 L2 正则同源,都是限制参数范数。

答案与解析

这是【08-05 选择 Q17】的四个选项,答案 A、B(对应本题的 (b) 与 (d))。

(a) 错。 早停没有减少每轮见到的数据量——它既不丢样本也不改批大小,限制的是权重从初值出发能走多远,即 ‖w − w₀‖。这个区别是本题的核心考点:把"参数范数"误记成"数据量"。正确的说法见 (d)。

(b) 对。 patience 的作用正是容忍验证误差的正常波动,避免在一次偶然回升处误停。若一回升就停,有限验证集上的随机起伏会频繁触发误停。

(c) 错。 验证集是有限样本,在其上最优不保证在测试集上最优。而且早停把训练轮数当作超参数、用验证集从中挑选,这个"取最小值"的动作本身会带来轻微乐观偏差(见 8.3.2 的推导:选中的那一轮其噪声必然偏低)。

(d) 对。 在 w₀ = 0 附近做二次近似后,梯度下降第 t 步的解形如 w_i(t) = w_i*[1 − (1−ηλ_i)^t],与岭回归解 w_i^ridge = w_i*·λ_i/(λ_i+λ) 形式相同——都是对无约束解乘一个收缩因子,因此存在 t ↔ λ 的一一对应。这就是"早停 ≈ 隐式 L2 正则"的内容。

Q3(计算 + 设计)§8.2.4 提到 1-SE 规则。设某 Lasso 的交叉验证结果如下(简化)。若按"验证误差最小"选 λ,选哪个?按 1-SE 规则呢?并说明后者为什么常被推荐。

λ交叉验证平均误差标准误
0.010.8120.030
0.100.8000.029
0.500.8210.028
1.000.8800.026
答案与解析

最小平均误差是 λ = 0.10 处的 0.800,故最小误差规则选 λ = 0.10。

1-SE 阈值 = 最小值 + 该点的标准误 = 0.800 + 0.029 = 0.829。规则是"在平均值不超过这个阈值的 λ 中,选最大的 λ":

  • λ = 0.10:0.800 ≤ 0.829 ✓
  • λ = 0.50:0.821 ≤ 0.829 ✓
  • λ = 1.00:0.880 > 0.829 ✗

因此 1-SE 规则选 λ = 0.50。

为什么推荐 1-SE:交叉验证误差的差异在标准误范围内时,本质上是噪声。此时我们面对的是"统计上难以区分的两个模型",应当按奥卡姆剃刀选择更简单的那个——λ 更大的模型系数更少(Lasso 中即更多为零),方差更小、更稳健,对新数据的外推行为也更可预测。这正是 8.1.1 的核心思想:不追求训练/验证误差的极小值,而追求偏差与方差之和的最小值。

注意两点:①比较时用的是同一批折的平均与标准误,且标准误应基于折间方差计算;②1-SE 只是启发式规则,若业务明确要求最低误差(如竞赛排名),仍应取最小点。

Q4(推导 + 判断)Dropout 训练时以概率 p 保留神经元。

(a) 推导为什么推理时必须把激活乘 p(或训练时除以 p)。 (b) 把 p 从 0.9 改到 0.1,训练动态会发生什么变化? (c) 在大量使用 BatchNorm 的卷积网络中,为什么通常不再叠加 Dropout?

答案与解析

(a) 训练时激活被掩码 m_j ∼ Bernoulli(p) 乘,输出为 h̃_j = m_j·h_j。因掩码与激活独立,由期望的线性性:

E[h̃_j] = E[m_j]·E[h_j] = p·h_j

即训练时该神经元的期望输出被系统性缩小了 p 倍。推理时不再采样掩码,实际输出就是 h_j(完整网络的激活),它比训练时的期望大了 1/p 倍。若不做任何处理,后续层看到的输入尺度与训练时相差 1/p,所有层间校准关系全部失配。

两种修正方式等价:权重缩放(推理时把输出乘 p,使 p·h_j = E[h̃_j])与 inverted dropout(训练时除以 p,E[h̃_j/p] = h_j,推理时无须任何改动)。现代框架默认用后者,因为它把额外计算留在训练时、让推理路径最干净。

(b) p = 0.1 意味着只保留 10% 的神经元,训练时激活被放大 1/p = 10 倍(inverted dropout 下)。后果:①梯度尺度放大,需要相应减小学习率,否则容易发散;②噪声极大(Var(m) = p(1−p) = 0.09,相对方差 Var(m)/E[m]² = 9),有效容量被压得过狠,容易欠拟合;③单个神经元被训练的频次降低,收敛变慢。因此实践中 p 很少低于 0.5,全连接层常用 p = 0.5,输入层用 0.8~0.9。

(c) 因为二者在方差上冲突。Dropout 会改变激活的方差(Var(h̃) = p(1−p)E[h²] + p²Var(h),与 p 有关),而 BN 恰恰是靠"用当前 batch 的实际均值与方差做归一化"工作的。训练时 BN 适应的是带 Dropout 噪声的方差统计,推理时 Dropout 被关闭、方差统计发生变化,BN 的 running statistics 与实际分布不一致,产生 variance shift,推理精度下降。相比之下 LayerNorm 在特征维归一化、不依赖 batch 统计,与 Dropout 的随机性解耦得多,因此 Transformer 中 Dropout + LayerNorm 的组合是可行的(第 13 章 13.3 节)。

Q5(设计)某团队在 5000 条样本上训练一个梯度提升模型,流程是:用 5-fold 交叉验证在 200 组超参中挑出最好的一组,然后报告这组超参的交叉验证平均 AUC = 0.92。请指出这个流程的问题,并给出修正方案。

答案与解析

问题:报告的 0.92 是带乐观偏差的,不是对泛化性能的无偏估计。 原因有两层:

  1. 选择偏差。8.3.2 已说明"取最优"会系统性挑到噪声偏低的那一个。这里的候选有 200 组,比早停的几十轮更多,偏差幅度更大。设 200 组超参的真实性能完全相同,交叉验证分数仍会有随机波动,取最大值必然高于真实值。
  2. 同一份验证数据被重复使用。5-fold 的每一折都参与了全部 200 组的筛选,验证集的信息被反复"消费",其结果是验证分数逐渐从"泛化误差的估计"偏向"对这批数据的拟合质量"。

修正方案(按推荐顺序):

  • 嵌套交叉验证:外层 5 折估性能、内层 5 折选超参,共 25 次训练。报告外层各折的 mean ± std,这才是"整个建模流程"的无偏估计。各折选出的最优超参可以不同,这是正常的。
  • 切出独立测试集:若数据够用,划出 15%~20% 作为测试集并封存,在剩下的数据上做单层 CV 选超参,最后在测试集上评估一次并报告。成本远低于嵌套 CV,是工程上最常用的做法。
  • 报告比较时要带不确定性:任何"A 比 B 好"的结论都应给出差值的配对 bootstrap 置信区间(第 7 章 7.7.2),而不是两个孤立的数字。

额外提醒:若超参搜索过程中还做了特征筛选、做了标准化,这些步骤也必须在每一折内部重新拟合(Pipeline),否则会引入跨折的数据泄漏,让 0.92 进一步虚高。

与真题的关联

真题考查角度对应本章小节
【08-05 选择 Q17】A:可设 patience 允许验证误差连续几轮不下降正确。patience 过滤验证集随机波动,避免误停8.3.2
【08-05 选择 Q17】B:根据验证集表现选择最佳轮数正确。早停把训练轮数当作超参数,用验证集挑8.3.1(t ↔ λ 对应)
【08-05 选择 Q17】C:验证集误差最低 ⟹ 测试集一定最好错误。验证集是有限样本;反复挑选本身还带来轻微过拟合8.3.2(选择偏差推导)
【08-05 选择 Q17】D:早停限制了模型能学到的数据量错误。它限制的是权重从初值出发能走多远(≈ 约束参数范数),不减少每轮数据量8.3.1
【09-02 选择 Q3】增大 L2 权重衰减缓解过拟合过拟合的正确应对;干扰项"增大模型容量"方向相反8.1.1、8.2.1
【09-02 选择 Q3】用早停在验证性能最优处停止早停是应对过拟合的标准手段8.3.1
【09-09 选择 Q4】交叉熵 vs MSEMSE + Sigmoid 非凸;正则化不能修复非凸性,两者是不同层面的问题8.1.1(正则化只压方差)
【08-05 选择 Q20】warmup / 梯度裁剪 / 混合精度这些是优化稳定性手段,与本章的泛化手段层次不同,不能互相替代8.4.3(隐式正则的边界)

延伸阅读

  • Hastie, T., Tibshirani, R. & Friedman, J.《The Elements of Statistical Learning》第 3.4 节(岭回归与 Lasso 的几何与贝叶斯解释)、第 7.10 节(交叉验证与模型选择);
  • Tibshirani, R. “Regression Shrinkage and Selection via the Lasso”(1996)与 Zou, H. & Hastie, T. “Regularization and Variable Selection via the Elastic Net”(2005);
  • Goodfellow, I. et al.《Deep Learning》第 7 章(Regularization for Deep Learning)——早停、Dropout、数据增强、噪声注入的统一处理,本章 8.3、8.4 的直接来源;
  • Srivastava, N. et al. “Dropout: A Simple Way to Prevent Neural Networks from Overfitting”(2014);
  • Ioffe, S. & Szegedy, C. “Batch Normalization”(2015)与 Ba, J. et al. “Layer Normalization”(2016)——归一化的正则化效应;
  • Snoek, J., Larochelle, H. & Adams, R. “Practical Bayesian Optimization of Machine Learning Algorithms”(2012)与 Bergstra, J. & Bengio, Y. “Random Search for Hyper-Parameter Optimization”(2012)。