引子:没有约束,就没有泛化
“L1 正则化为什么会产生稀疏解?从几何和贝叶斯两个角度解释。”
“Dropout 训练时为什么要除以 1-p?推理时权重要缩放吗?”
“Early Stopping 和 L2 正则化有什么数学联系?”
“Label Smoothing 为什么能提高模型校准性能?”
“Weight Decay 和 L2 正则化等价吗?在 Adam 优化器下呢?”
“Spectral Norm 是怎么稳定 GAN 训练的?”
正则化是机器学习中对抗过拟合的核心技术。面试中,正则化不仅考察你是否知道各种方法,更考察你是否理解每种方法背后的数学原理。本章从经典 L1/L2 正则化出发,深入 Dropout、Early Stopping、数据增强等现代深度学习正则化技术,涵盖从传统 ML 到 CV、NLP、GAN 等各领域的正则化手段。
4.1 L1 与 L2 正则化
4.1.1 基础定义
在标准损失函数中添加惩罚项,限制模型权重的复杂度:
| 类型 | 惩罚项 | 损失函数 | 优化器视角 |
|---|---|---|---|
| L2 (Ridge) | lamda * sum(w_j^2) | L = L0 + lamda * | |
| L1 (Lasso) | lamda * sum( | w_j | ) |
| Elastic Net | lamda1* | w |
4.1.2 梯度更新对比
无正则化: w_{t+1} = w_t - eta * grad L0(w_t)
L2 正则化(权重衰减):
w_{t+1} = w_t - eta * (grad L0(w_t) + 2lamdaw_t) = (1 - 2etalamda)w_t - etagrad L0(w_t)
可以看到 L2 在每次更新前先将权重乘以 (1 - 2etalamda) —— 这是"权重衰减"名称的来源。这个系数恒小于 1,意味着权重的范数被持续压缩。
L1 正则化(软阈值):
w_{t+1} = w_t - eta * (grad L0(w_t) + lamda * sign(w_t))
因为 d||w||_1/dw = sign(w),L1 的梯度更新方向与 w 的符号有关。当 w 为正时减去一个正数(推向 0),为负时加上一个正数(也推向 0)。整理后得到:
w_{t+1} = sign(w_t - etagrad L0) * max(0, |w_t - etagrad L0| - eta*lamda)
这就是软阈值算子(Soft Thresholding)——当权重绝对值小于 eta*lamda 时直接被置零。这是 L1 产生稀疏解的核心机制。
Q:L1 正则化的梯度为什么用 sign 函数?它在 w=0 处不可导怎么处理?
初级回答:L1 的梯度是 w 的符号,w=0 处用次梯度,取 [-1, 1] 之间的任意值。
进阶回答:L1 正则化在 w=0 处确实不可导,但在优化中我们使用次梯度(subgradient)来处理。次梯度是凸函数在不可导点处所有支撑超平面斜率的集合。对于 f(w) = |w|,在 w=0 处的次梯度是 [-1, 1] 区间。实际实现中,通常取 0 作为次梯度的值。更稳定的做法是使用近端梯度法(Proximal Gradient Descent),它通过近端算子直接求解带 L1 惩罚的优化问题,避免处理不可导点:
prox_{lamda*||.||_1}(z) = sign(z) * max(0, |z| - lamda)
源码级回答:在 sklearn 的 Lasso 实现中,默认使用 coordinate_descent 算法(坐标下降法),而不是次梯度下降。坐标下降法每次只优化一个参数,其他参数固定,可以解析地求解每个参数的闭式解。其核心更新公式为:
w_j_hat = sign(sum_i x_ij(y_i - y_i_hat(-j))) * max(0, |sum_i x_ij(y_i - y_i_hat(-j))| - lamda) / sum_i x_ij^2
其中 y_i_hat(-j) 是不使用第 j 个特征的预测值。这个公式天然包含了软阈值操作。
4.1.3 为什么 L1 产生稀疏解?几何解释
Q:L1 和 L2 的约束区域形状不同,怎么导致稀疏性的差异?
初级回答:L1 的约束区域是菱形(有尖角),L2 是圆形(平滑)。等高线在菱形顶点接触时,解落在坐标轴上,某些权重变为 0。
进阶回答(详细推导):
带正则化的优化问题等价于约束优化问题:
min_w L0(w) s.t. ||w||_p <= C
其中 p=1 是 L1,p=2 是 L2。约束区域的定义:
- L1 约束:|w1| + |w2| <= C --> 菱形(定义域有尖角)
- L2 约束:w1^2 + w2^2 <= C^2 --> 圆形(定义域光滑)
损失函数的等高线是椭圆形(因为 Hessian 矩阵通常是正定的)。最优解在等高线与约束区域首次相切的位置:
L2(圆形):切点一般不会在坐标轴上,因为圆形表面光滑,等高线的梯度方向在坐标轴附近很难恰好与圆的法线方向一致。结果 w1 和 w2 通常都不为零,但都比无正则化时小。
L1(菱形):菱形的角在坐标轴上(如 (C,0) 或 (0,C))。当椭圆等高线膨胀到与菱形内切时,首次接触点很可能发生在这些尖角处——此时一个权重为 0,产生稀疏解。
源码级回答:L1 正则化的解路径具有**分段线性(piecewise linear)**性质——LARS 算法(Least Angle Regression)利用这一性质可以高效计算出 Lasso 的完整解路径。随着 lamda 从大到小变化,特征会逐个进入模型,每个进入点称为"knot"。而在 Ridge 中,所有特征始终在模型中,只是权重被均匀收缩。
4.1.4 贝叶斯视角
Q:从贝叶斯角度理解,L1 和 L2 分别对应什么先验?
初级回答:L2 对应高斯先验,L1 对应拉普拉斯先验。
进阶回答(MAP 估计推导):
从贝叶斯角度看,正则化等价于对参数施加先验分布,求最大后验估计(MAP):
w_MAP = argmax_w log P(y|X,w) + log P(w)
L2 正则化 = 高斯先验:
假设先验 P(w_j) 正比于 exp(-lamda/2 * w_j^2)(均值为 0 的高斯分布),则:
log P(w) = -lamda/2 * sum w_j^2 + const
代入 MAP 公式得到 L = L0 + lamda/2 * ||w||_2^2,即 L2 正则化。
L1 正则化 = 拉普拉斯先验:
假设先验 P(w_j) 正比于 exp(-lamda * |w_j|)(拉普拉斯分布),则:
log P(w) = -lamda * sum |w_j| + const
代入 MAP 公式得到 L = L0 + lamda * ||w||_1,即 L1 正则化。
拉普拉斯分布和高斯分布的关键区别:
| 特性 | 高斯分布 N(0, sigma^2) | 拉普拉斯分布 Lap(0, b) |
|---|---|---|
| PDF 形式 | 指数平方衰减 | 指数衰减 |
| 在 0 处形状 | 平滑,二阶可导 | 尖峰,不可导 |
| 尾部 | 快速衰减 | 慢速衰减 |
| 产生稀疏性 | 否 | 是 |
追问:为什么拉普拉斯先验比高斯先验更容易产生 0 权重?
拉普拉斯分布在 0 处的概率密度远高于高斯分布——拉普拉斯有"尖峰",高斯是"圆顶"。这意味着拉普拉斯先验更"相信"参数为 0。在 MAP 估计中,拉普拉斯先验对非零参数施加更重的惩罚。关键在于:拉普拉斯先验在 w=0 处的概率集中质量,使得 MAP 估计趋向于让不重要的参数精确为 0,而不是仅仅缩小。
4.1.5 Elastic Net
Q:什么时候该用 Elastic Net 而不是单纯的 L1 或 L2?
进阶回答:Elastic Net 结合了 L1 和 L2 的优点:
L = L0 + lamda1 * ||w||_1 + lamda2 * ||w||_2^2
适用场景:
- 特征数 >> 样本数(p >> n):Lasso 最多只能选出 n 个特征(受限于约束区域维度),Elastic Net 没有此限制。
- 特征分组相关:Lasso 会从一组高度相关的特征中随机选一个,Elastic Net 会同时选入或剔除整个组(因为 L2 项促进分组效应)。
- 希望稀疏但不止于稀疏:Elastic Net 能在保持稀疏性的同时,让选中的特征系数更稳定。
源码级回答:sklearn 中的 ElasticNet 使用 l1_ratio 参数控制 L1 和 L2 的混合比例(l1_ratio=1 是 Lasso,l1_ratio=0 是 Ridge)。实际计算中,Elastic Net 的求解也使用坐标下降法,其更新公式是 Lasso 软阈值和 Ridge 收缩的混合。
4.1.6 Group Lasso
Q:如果你想对特征分组施加稀疏性(如一个 One-hot 编码的类别变量应该一起选或不选),该用什么?
进阶回答:Group Lasso。它对预先定义的特征组施加 L2 范数惩罚,但组之间施加 L1 惩罚——一个组要么全部为 0,要么全部非 0:
L = L0 + lamda * sum_{g=1}^{G} sqrt(p_g) * ||w_g||_2
其中 p_g 是第 g 组的特征数。Group Lasso 不会在组内产生稀疏性(组内用 L2 惩罚),但会在组间(用 L1 惩罚)产生稀疏性。
4.2 Dropout
4.2.1 原理与原始论文
Dropout 由 Srivastava、Hinton 等人在 2014 年提出(“Dropout: A Simple Way to Prevent Neural Networks from Overfitting”)。核心思想:在每次训练迭代中,以概率 p 随机丢弃(置零)每个神经元的输出。
Q:训练时为什么要除以 1-p?
初级回答:为了保持训练和推理时输出的期望一致。
进阶回答(数学推导):
假设神经元在训练时的输出为 h,丢弃概率为 p。训练时神经元的输出是随机变量:
h_train = h/(1-p) 以概率 (1-p) 保留
h_train = 0 以概率 p 丢弃
推理时所有神经元都保留,输出为 h。为了保持一致性,需要 E[h_train] = h_infer:
E[h_train] = (1-p) * h/(1-p) + p * 0 = h = h_infer
如果不做缩放,即训练时直接丢弃:h_train = h 或 0,则 E[h_train] = (1-p)h,推理时需要乘 (1-p) 来补偿。两种方式等价,只是缩放位置不同。PyTorch 和 TensorFlow 都采用"训练时缩放"的方式(Inverted Dropout)。
importtorchimporttorch.nnasnnclassDropoutLayer(nn.Module):"""从零实现 Dropout(Inverted Dropout)"""def__init__(self,p=0.5):super().__init__()self.p=p# 丢弃概率defforward(self,x):ifself.training:# 伯努利掩码:每个元素独立以 (1-p) 保留mask=torch.rand_like(x)>self.p# 训练时缩放returnx*mask/(1-self.p)returnx追问:为什么 Dropout 能防止过拟合?有三层解释。
第一层:集成学习(Ensemble)视角
每次 dropout 相当于从完整网络中采样出一个子网络。训练 T 步相当于训练了 T 个不同的子网络(权重复用)。推理时全部保留相当于对这些子网络的输出做几何平均(而非算术平均)。Hinton 等人证明了几何平均对应集成学习的 Bagging 思想,而且比算术平均更合理(因为神经网络输出是概率时,几何平均对应概率乘积)。
对于有 N 个神经元的网络,可能的子网络数量为 2^N。虽然实际采样有限,但 Dropout 的集成效果远超显式训练少数模型。
第二层:协同适应(Co-adaptation)视角
没有 Dropout 时,神经元可能形成"相互依赖"的关系——某个神经元依赖另一个神经元的存在来纠正它的错误。Dropout 强制每个神经元独立工作,不能依赖其他神经元的"补位"。这迫使每个神经元学到更鲁棒的特征,类似于正则化中的"独立性强"。
第三层:隐式数据增强视角
Dropout 为每个神经元的输出添加了乘性噪声(Bernoulli 噪声)。这可以看作是一种隐式的数据增强——通过噪声迫使网络学习更平滑的决策边界。
4.2.2 为什么 Dropout 在 CNN 中效果有限?Spatial Dropout
Q:原始 Dropout 在 CNN 上效果不好怎么办?
初级回答:CNN 中使用 Spatial Dropout,在通道层面丢弃整个特征图。
进阶回答:CNN 的卷积层中,相邻像素高度相关。原始 Dropout 随机丢弃单个像素几乎不会破坏空间结构——被丢弃的像素可以被相邻像素"弥补"(因为卷积核是共享且滑动的)。Spatial Dropout 以概率 p 丢弃整个通道(整张特征图),迫使网络不依赖于某个通道的信息。
classSpatialDropout2d(nn.Module):"""在通道层面丢弃整个特征图"""def__init__(self,p=0.5):super().__init__()self.p=pdefforward(self,x):# x shape: (batch, channels, height, width)ifself.training:mask=torch.rand_like(x[:,:,0:1,0:1])>self.preturnx*mask/(1-self.p)returnx4.2.3 Stochastic Depth for ResNet
Stochastic Depth 是 Dropout 在 ResNet 中的变体,由 Huang 等人 2016 年提出。核心思想:训练时以概率 p 随机丢弃(跳过)整个残差块(Residual Block),只保留 shortcut 连接:
H_l(x) = F_l(x) + x 以概率 (1-p_l) 保留
H_l(x) = x 以概率 p_l 丢弃
其中 p_l 随层数的增加线性增大(底层小,顶层大),因为浅层提取基础特征更重要。
| 特性 | Dropout | Stochastic Depth |
|---|---|---|
| 丢弃粒度 | 神经元 | 整个残差块 |
| 推理时 | 全部保留 | 全部保留 |
| 有效深度 | 不变 | 变浅(加速训练) |
| 效果 | 防止过拟合 | 训练更深网络 |
Stochastic Depth 解决了深层 ResNet(如 1202 层)的训练困难问题,同时训练速度提高了约 40%。
4.3 Early Stopping
4.3.1 什么是 Early Stopping?
在验证集上的性能不再提升时停止训练,是最简单也最常用的正则化方法。实现时需要设置 patience(容忍步数),防止在验证 loss 的局部波动中误停。
classEarlyStopping:"""Early Stopping 实现"""def__init__(self,patience=10,min_delta=0.001):self.patience=patience self.min_delta=min_delta self.counter=0self.best_loss=float('inf')self.early_stop=Falsedef__call__(self,val_loss):ifval_loss<self.best_loss-self.min_delta:self.best_loss=val_loss self.counter=0else:self.counter+=1ifself.counter>=self.patience:self.early_stop=Truereturnself.early_stop4.3.2 Early Stopping 与 L2 正则化的数学联系
Q:面试官的经典追问——Early Stopping 为什么可以被看作是一种正则化?它跟 L2 正则化有什么关系?
进阶回答(关键洞察):
考虑一个线性模型 y = Xw,使用梯度下降优化 MSE 损失。假设 X 的 SVD 分解为 X = U * Sigma * V^T,权重更新为:
w^{(t)} = w^{(t-1)} - eta * grad L(w^{(t-1)})
对于 MSE 损失,梯度下降的解可以写为:
w^{(t)} = sum_{i=1}^{p} (1 - eta * sigma_i2)t * (u_i^T y / sigma_i) * v_i
其中 sigma_i 是 X 的奇异值。这个公式的关键含义:每个奇异值方向上的衰减速度是 (1 - eta * sigma_i2)t。奇异值越小(对应方差小的方向),衰减越快。
L2 正则化的解析解为:
w_ridge = sum_{i=1}^{p} (sigma_i^2 / (sigma_i^2 + lamda)) * (u_i^T y / sigma_i) * v_i
对比发现:
| 方法 | 衰减因子 | 含义 |
|---|---|---|
| Early Stopping (t 步后) | (1 - eta * sigma_i2)t | 小奇异值方向先被压缩 |
| L2 正则化 (lamda) | sigma_i^2 / (sigma_i^2 + lamda) | 小奇异值方向被压缩更多 |
两者都在小奇异值方向(方差小、噪声可能大的方向)衰减更快,这解释了为什么 Early Stopping 等价于隐式 L2 正则化。对于 MSE 损失和线性模型,Early Stopping 的解与 Ridge 的解之间存在一一对应的关系——迭代步数 t 对应 lamda 与 1/t 成正比。
4.4 数据增强
4.4.1 为什么数据增强算正则化?
Q:数据增强明明是"增加数据",为什么会被归类为正则化方法?
进阶回答:数据增强虽然没有修改损失函数,但它通过引入先验知识(如平移不变性、旋转不变性)来扩展训练分布,本质上降低了模型对特定输入模式的过拟合。每个增强操作相当于告诉模型:“这个样本在某种变形下应该保持相同的预测。” 这与正则化的目标一致——提高泛化能力、降低对训练数据特定模式的依赖。Bishop 在 1995 年证明,在输入上添加小噪声等价于一种 L2 类型正则化。
4.4.2 图像数据增强
基础方法:
| 方法 | 操作 | 适用场景 | 超参数 |
|---|---|---|---|
| 水平翻转(Flip) | 左右镜像 | 一般物体识别 | p=0.5 |
| 随机旋转(Rotation) | 0-360 度旋转 | 方向无关任务 | [-30, +30] 度 |
| 随机裁剪(Random Crop) | 截取随机区域后缩放 | 分类/检测 | 裁剪比例 0.08-1.0 |
| 颜色抖动(Color Jitter) | 调整亮度/对比度/饱和度/色调 | 颜色鲁棒任务 | 各参数 +/- 0.2 |
| 随机擦除(Random Erasing) | 随机遮挡矩形区域 | 行人重识别 | 遮挡比例 0.02-0.4 |
高级方法:
Cutout(DeVries & Taylor, 2017):随机擦除输入图像中的正方形区域,防止网络过度依赖局部特征。
Mixup(Zhang et al., 2018):将两张图像按随机比例混合,标签也按相同比例混合:
x_tilde = lamda * x_i + (1-lamda) * x_j
y_tilde = lamda * y_i + (1-lamda) * y_j
其中 lamda 服从 Beta(alpha, alpha) 分布,alpha 控制混合强度(通常 0.2-0.4)。Mixup 的数学直觉:强制模型在样本之间线性插值,相当于隐式地学习了线性决策边界区域。
CutMix(Yun et al., 2019):结合 Cutout 和 Mixup——用另一张图像的 patch 替换被裁剪区域,标签按像素比例混合。CutMix 在分类和目标检测上同时有效,性能通常优于单独使用 Mixup 或 Cutout。
Q:Mixup 为什么有效?从理论角度解释。
进阶回答:
- Vicinal Risk Minimization (VRM):Mixup 不是经验风险最小化(ERM),而是邻域风险最小化。ERM 只在训练点上坍塌 Dirac delta 分布,VRM 在样本间定义连续的标签分布。
- 模型校准性:Mixup 降低了模型的预测置信度,使预测概率更接近真实准确率(Expected Calibration Error 降低)。
- 对对抗样本鲁棒:Mixup 学到的决策边界更平滑,不易被小的对抗扰动"欺骗"。
4.4.3 文本数据增强
文本数据增强比图像更难——因为文本是离散的,微小改动可能改变语义。
| 方法 | 操作 | 效果与限制 |
|---|---|---|
| 同义词替换(SR) | 随机替换词为同义词 | 简单但可能改变语境 |
| 回译(Back Translation) | 翻译到另一语言再译回 | 质量高但计算成本大 |
| EDA(Easy Data Augmentation) | SR + RI(随机插入)+ RS(随机交换)+ RD(随机删除) | Wei & Zou 2019,简单有效 |
| 对抗增强 | 在词嵌入空间加扰动 | 需要额外训练 |
Q:EDA 的参数怎么设置?为什么它有效?
进阶回答:EDA 有四个操作,每个按概率执行。Wei & Zou 建议的默认参数:
- 同义词替换:每个句子随机替换 10% 的词
- 随机插入:在随机位置插入随机词的同义词,比例 10%
- 随机交换:随机交换两个词的位置,比例 10%
- 随机删除:以概率 0.1 删除每个词
EDA 的效果在小数据集(<500 样本)上最明显,平均提升 3% 准确率,在更大数据集上提升有限。局限性:对于情感分析等语义敏感任务,同义词替换可能反转情感极性。
4.4.4 音频数据增强
| 方法 | 操作 | 典型参数 |
|---|---|---|
| 噪声叠加(Noise Injection) | 加高斯白噪声 | SNR=15-30dB |
| 时间拉伸(Time Stretch) | 改变播放速度不改变音高 | 0.8x-1.2x |
| 音高偏移(Pitch Shift) | 改变音高不改变速度 | +/- 2 半音 |
| SpecAugment | 在频谱图上随机掩码时间/频率段 | 掩码宽度 F=10, T=20 |
SpecAugment(Park et al., 2019)是语音识别中最有效的增强方法——直接在 Mel-spectrogram 上应用时间掩码和频率掩码,灵感来自 Cutout 在图像上的应用。
4.5 Label Smoothing
4.5.1 原理
Q:Label Smoothing 是什么?为什么能提高模型泛化能力?
进阶回答:Label Smoothing(标签平滑)由 Szegedy 等在 Inception-v2 论文中提出。核心思想:不要用 one-hot 硬标签训练模型,而是用软标签(soft label):
y_i_smooth = (1 - epsilon) * y_i_onehot + epsilon / K
其中 K 是类别数,epsilon 是平滑系数(通常 0.1)。例如三分类时:
- One-hot: [1, 0, 0]
- Smoothed: [0.9, 0.05, 0.05] (epsilon=0.15)
4.5.2 为什么有效?
- 防止过置信:softmax 输出会趋向于 one-hot(因为交叉熵在 logit 足够大时饱和),Label Smoothing 抑制了 logit 的无限增长。
- 校准性提升:模型的预测概率更接近真实准确率。未平滑模型在预测 0.99 时可能只有 90% 的准确率,平滑后预测 0.9 时就能达到约 90% 的准确率。
- 模型鲁棒性:对错误标签更不敏感——即使训练集中有错误标注,平滑后的标签不会要求模型死记硬背错误。
追问:Label Smoothing 的缺点是什么?
- 知识蒸馏中不适用:Student 模型需要从 Teacher 的硬预测中学习类别间关系,Label Smoothing 会模糊这些关系。
- 影响 Top-1 准确率:有些任务中 LS 会轻微降低 Top-1 准确率,但提高 Top-5。
- 在小数据集上效果有限:数据足够时模型自然校准,LS 的增益减小。
4.6 各种正则化方法的对比与选择
| 方法 | 原理 | 适用场景 | 训练成本 | 推理影响 |
|---|---|---|---|---|
| L2 正则化 | 权重衰减 | 几乎所有模型 | 无额外成本 | 无 |
| L1 正则化 | 产生稀疏性 | 特征选择、高维数据 | 无额外成本 | 无 |
| Dropout | 随机丢弃神经元 | 全连接网络 | 少量增加 | 无 |
| Spatial Dropout | 丢弃整个通道 | CNN | 少量增加 | 无 |
| Stochastic Depth | 随机跳过残差块 | ResNet 系列 | 减少训练时间 | 无 |
| Early Stopping | 提前停止训练 | 几乎所有模型 | 降低训练时间 | 无 |
| 数据增强 | 扩展训练分布 | CV/NLP/Audio | 在线增强有额外成本 | 无 |
| Label Smoothing | 软化标签分布 | 分类任务 | 无额外成本 | 无 |
| Spectral Norm | 限制 Lipschitz 常数 | GAN | 少量额外计算 | 无 |
正则化的组合使用
在实践中,深度模型通常组合使用多种正则化方法:
图像分类(ResNet/DenseNet): 数据增强(Random Crop + Flip + Color Jitter + Mixup/CutMix) + Weight Decay(L2) + Label Smoothing(epsilon=0.1) + Stochastic Depth(ResNet 深度 > 100 时) 文本分类(BERT): + Dropout (p=0.1) + Weight Decay (lamda=0.01) + 有时用回译增强 GAN 生成器: + Spectral Norm(在判别器的每层) + Label Smoothing(用 0.9/0.1 代替 1/0)4.7 Spectral Norm 与 Virtual Adversarial Training
4.7.1 Spectral Norm
Q:Spectral Norm 是什么?它如何稳定 GAN 的训练?
进阶回答:Spectral Norm 由 Miyato 等人在 2018 年提出(“Spectral Normalization for Generative Adversarial Networks”),用于约束判别器(Discriminator)的 Lipschitz 常数。
对于线性层 W,其谱范数定义为最大奇异值:
sigma(W) = max_{||x||_2 <= 1} ||Wx||_2
谱归一化(Spectral Normalization)将权重矩阵除以其谱范数:
W_SN = W / sigma(W)
这样保证了 sigma(W_SN) = 1,即 Lipschitz 常数为 1。
为什么这对 GAN 重要?
在 WGAN-GP 中,判别器需要满足 1-Lipschitz 约束。谱范数是满足这一约束的最优雅方式——每次权重更新后直接除以谱范数。与梯度惩罚(Gradient Penalty)相比:
| 方法 | 实现复杂度 | 计算成本 | 效果 |
|---|---|---|---|
| Weight Clipping | 简单 | 无 | 容易破坏网络容量 |
| Gradient Penalty | 中等 | 高(需要计算额外梯度) | 效果好 |
| Spectral Norm | 中等 | 低(只需 SVD 近似) | 效果好,稳定 |
源码级回答:Spectral Norm 的实际实现使用幂迭代法(Power Iteration)近似最大奇异值,避免每次更新都做完整的 SVD:
defspectral_norm(W,u,num_iters=1):"""幂迭代法近似最大奇异值"""for_inrange(num_iters):v=W.T @ u v=v/torch.norm(v)u=W @ v u=u/torch.norm(u)sigma=u @ W @ v# 最大奇异值的近似returnW/sigma,u# 返回归一化后的 W 和更新后的 u其中 u 是随机初始化的向量,在训练过程中持续更新。
4.7.2 Virtual Adversarial Training (VAT)
Q:Virtual Adversarial Training 是如何工作的?它和对抗训练有什么区别?
进阶回答:VAT 由 Miyato 等人在 2018 年提出,是一种半监督正则化方法。核心思想:模型的输出分布应该在输入的局部邻域内平滑——即使对输入施加小的对抗性扰动,输出分布也不应剧烈变化。
VAT 的损失是 KL 散度的对抗版本:
L_VAT(x) = KL[p(y|x) || p(y|x + r_adv)]
其中对抗扰动 r_adv 是使 KL 散度最大的方向(约束 ||r||_2 <= epsilon):
r_adv = argmax_{||r||_2 <= epsilon} KL[p(y|x) || p(y|x + r)]
与标准对抗训练的区别:
| 方面 | 标准对抗训练 | VAT |
|---|---|---|
| 需要标签 | 是(对抗样本必须有真实标签) | 否(只用模型当前输出) |
| 适用场景 | 监督学习 | 半监督/无监督 |
| 扰动目标 | 最大化真实标签的损失 | 最大化输出分布的 KL 散度 |
| 正则化效果 | 对特定攻击鲁棒 | 整体决策边界平滑 |
VAT 的优势在于它可以在未标注数据上工作——只需要计算模型当前预测作为"伪标签",然后寻找使 KL 散度最大的方向。这在半监督学习中非常有效。
4.8 正则化的物理学直觉
用一个直观的比喻来总结各种正则化方法:
- L2 正则化:给权重加了一个"弹簧",拉力与权重大小成正比,防止权重过大。
- L1 正则化:给权重加了一个"摩擦力",微小的权重会被摩擦消耗到 0。
- Dropout:模拟"团队中没有固定依赖关系,每个人都要能独立解决问题"。
- Early Stopping:相当于"限时训练"——时间不够长就不会学会噪声模式。
- 数据增强:相当于"多角度训练"——在更多样化的环境中学到不变性。
- Label Smoothing:模拟"导师不给出 100% 确定的答案,避免学生过度自信"。
面试速查表
| 考点 | 核心要点 | 常见追问 | 面试频度 |
|---|---|---|---|
| L1 vs L2 | 稀疏 vs 衰减 | 几何解释、梯度推导、贝叶斯先验 | ⭐⭐⭐⭐⭐ |
| Elastic Net | L1+L2 混合 | 何时用、分组效应 | ⭐⭐⭐ |
| Group Lasso | 组级稀疏性 | 与 L1/L2 的区别 | ⭐⭐ |
| Dropout | 丢弃 + 缩放 | 为什么除 1-p、集成视角、co-adaptation | ⭐⭐⭐⭐⭐ |
| Spatial Dropout | 通道级别丢弃 | CNN 为什么用 | ⭐⭐⭐ |
| Stochastic Depth | 跳过残差块 | ResNet 训练加速 | ⭐⭐ |
| Early Stopping | 验证 loss 上升前停止 | 与 L2 的数学联系 | ⭐⭐⭐⭐ |
| 数据增强 | 图像/文本/音频 | Mixup/CutMix/EDA | ⭐⭐⭐⭐ |
| Label Smoothing | 软标签 | 校准性提升、缺点 | ⭐⭐⭐ |
| Spectral Norm | 谱范数归一化 | GAN 稳定性、幂迭代 | ⭐⭐⭐ |
| VAT | 对抗性正则化 | 半监督学习 | ⭐⭐ |
本章总结
正则化是机器学习面试中"看似简单、实则需要深度"的话题。你需要从多个维度理解每种正则化方法:
- 数学形式:L1/L2 的损失函数、梯度更新公式
- 几何直观:L1 的菱形与 L2 的圆形的约束区域差异
- 贝叶斯视角:L1 = 拉普拉斯先验,L2 = 高斯先验
- 工程实现:Dropout 的 Inverted Dropout 实现、Spectral Norm 的幂迭代
- 适用场景:不同正则化方法适用的模型架构和数据类型
面试中的典型追问路径是:从 L1/L2 的正则化公式出发,追问 L1 为什么产生稀疏性(几何),再追问贝叶斯解释,然后转到 Dropout(原理 + 缩放),再问 Early Stopping(与 L2 的关系),最后问数据增强或高级变体。这条追问链覆盖了本章的绝大部分核心知识点。
下一章预告:第五章将深入降维与特征选择,探索 PCA 的数学推导、t-SNE 的可视化力量,以及各类特征选择方法的实战技巧。