面试官:正则化都有哪些经典的方法?

推荐直接网站在线阅读:aicoting.cn

在训练神经网络的过程中,我们经常遇到一个让人头疼的问题:训练集上精度高得离谱,测试集却一塌糊涂。

这就是过拟合(Overfitting)。模型在训练集上死记硬背了样本,却没有真正学到可泛化的规律。

要解决这个问题,除了多加数据、做数据增强之外,另一个关键武器就是------正则化(Regularization)。

所有相关文档、源码示例、流程图与面试八股,我也将持续更新在AIHub,欢迎关注收藏!

1. 正则化的目的

一句话总结就是正则化的目标是让模型学得简单一点。

在深度学习中,模型通常拥有成千上万个参数,如果不加约束,它会努力去拟合训练集中的每一个小细节,甚至连噪声都不放过。

正则化通过在损失函数中增加一个惩罚项(Penalty Term),让模型在追求拟合能力的同时,也要为复杂性付出代价。

这种代价的形式可以是参数的大小、变化的平滑程度、网络的稀疏性,甚至结构本身的约束。

形式上,我们通常在原始损失函数 中加入一个正则项

其中:

  • :原始损失(比如交叉熵)
  • :正则项(约束模型复杂度)
  • :权衡系数,决定惩罚强度

2. 常见的正则化方法

2.1 L1 正则化(Lasso)

L1 正则化的形式是:

它鼓励参数接近 0,从而让模型变得稀疏。

它鼓励参数接近 0,从而让模型变得稀疏。

也就是说,很多不重要的权重会被压成 0,达到特征选择的效果。

L1 正则化适用于希望模型自动筛选特征的场景,比如高维线性回归。

在 PyTorch 中可以直接写为:

scss 复制代码
loss = loss_fn(output, target)
l1_reg = torch.tensor(0.)
for param in model.parameters():
    l1_reg += torch.sum(torch.abs(param))
loss += 1e-5 * l1_reg

2.2 L2 正则化(Ridge)

L2 正则化更常见,它的形式是:

L2 会惩罚大的权重值,让所有参数都趋向于较小的范围。它不会让参数直接变成 0,而是整体缩小参数分布。

这有助于提高模型的稳定性;防止梯度爆炸;让模型更平滑。

几乎所有优化器(如 AdamW)都内置了 L2 权重衰减机制(weight decay)。

2.3 Dropout

Dropout 可以看作是一种结构上的正则化。

在训练过程中,它会随机地把部分神经元丢弃(设为 0),相当于让网络在每次迭代中训练不同的子网络:

ini 复制代码
nn.Dropout(p=0.5)

这样做的效果是:

  • 防止神经元之间过度协同;
  • 提升模型的泛化能力;
  • 类似于集成学习思想(每次都是不同子模型)。

在推理阶段(eval 模式)会自动关闭 Dropout,使用所有神经元参与预测。

2.4 Batch Normalization / Layer Normalization

BN(批归一化)和 LN(层归一化)虽然本质是标准化操作,但它们也具备一定的正则化效果。

原因是它们在训练中引入了随机性(比如 mini-batch 的统计波动),相当于一种轻量的扰动,能抑制模型过拟合。

2.5 数据增强(Data Augmentation)

严格来说,这不是对参数的正则化,而是对数据的隐式正则化。

通过对输入样本进行随机变换(旋转、裁剪、翻转、加噪声等),模型被迫学习对多样化样本的鲁棒表示,从而降低过拟合风险。

比如图像任务常见的:

scss 复制代码
transforms.RandomHorizontalFlip()
transforms.ColorJitter()
transforms.RandomResizedCrop()

2.6 Early Stopping

另一个非常实用的技巧。

如果你发现训练集 loss 还在下降,而验证集 loss 开始上升,说明模型开始过拟合 ------ 此时应该立刻停止训练。

在 PyTorch 中可以通过手动监控验证集损失实现,也可以封装在训练循环中:

kotlin 复制代码
if val_loss > best_val_loss:    
      patience_counter += 1    
      if patience_counter > patience:        
           break

从优化角度看正则化的话,正则化其实就是给优化器加上约束。它让梯度下降不再单纯追求损失最小,而是同时考虑模型的简洁性。

没有正则化时,优化器只管快速到达最低点;有了正则化后,优化器会更倾向于平滑而稳健的谷底,而不是陡峭的深坑。

这就解释了为什么加了正则化的模型,在验证集上表现更好。

📚推荐阅读

一文搞懂深度学习中的通用逼近定理!

一文搞懂深度学习中的表征学习理论!

一文搞懂深度学习中的信息论!

一文搞懂深度学习的反向传播与优化理论!

一文搞懂深度学习中的张量与自动微分!

一文彻底搞懂深度学习和机器学习的区别!

最新的文章都在公众号aicoting更新,别忘记关注哦!!!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!

相关推荐
rit843249912 分钟前
基于博弈论的小区分簇算法MATLAB实现
开发语言·算法·matlab
华清远见成都中心14 分钟前
C 语言内存管理深度解析:malloc/free 与嵌入式堆栈分配策略
java·c语言·算法
一行代码一行诗++19 分钟前
关系操作符
算法
卡死我了29 分钟前
零散记录,ros实际开发中需要考虑的点
面试
xsgbbx31 分钟前
我在 Windows 上把 DeepSeek-TUI 从安装跑到了代码生成
面试
生成论实验室1 小时前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第五章 事:行在时空中的具体化
人工智能·算法·架构·知识图谱·创业创新
Liangwei Lin1 小时前
LeetCode 283. 移动零
算法
Lenyiin1 小时前
《LeetCode 顺序刷题》61 - 70
java·c++·python·算法·leetcode·lenyiin
岁岁的O泡奶2 小时前
NSSCTF_crypto_[LitCTF 2023]babyLCG
经验分享·python·算法·密码学·crypto·流密码
Hesionberger2 小时前
LeetCode 78:子集生成全攻略
java·开发语言·数据结构·python·算法·leetcode·职场和发展