ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

L1与L2正则化:从原理到实战,如何选择与调优防止过拟合

L1与L2正则化:从原理到实战,如何选择与调优防止过拟合 1. 项目概述从“过拟合”到“正则化”的实战思考做机器学习项目尤其是模型训练最怕什么十个有九个会告诉你过拟合。模型在训练集上表现近乎完美一到测试集就“翻车”这种高方差问题简直是算法工程师的噩梦。为了解决它我们工具箱里有一件利器叫“正则化”。而L1和L2正则项就是这件利器的两种最经典、也最让人纠结的形态。今天我们不谈那些教科书上干巴巴的公式推导就从实际调参、模型部署的视角来掰扯清楚L1和L2到底有什么不同以及在不同场景下我们该怎么选、怎么用。如果你正在为模型泛化能力发愁或者好奇为什么L1能让特征“消失”而L2只是让特征“变小”那这篇从一线踩坑经验里总结出来的对比分析或许能给你一些直接的启发。简单来说L1正则项也叫Lasso和L2正则项也叫Ridge核心目标一致给模型的损失函数加上一个惩罚项限制模型参数权重的大小从而防止模型过于复杂提升泛化能力。但它们实现这一目标的方式和带来的副作用截然不同。L1倾向于产生稀疏解很多权重直接变成0自带特征选择功能而L2倾向于让所有权重都均匀地缩小但不产生严格的零值。理解这个根本差异是你在设计损失函数、进行特征工程乃至模型压缩时做出正确决策的基础。无论是刚入门的新手还是需要优化线上模型的老手理清这两者的特性都至关重要。2. 核心原理与数学直观惩罚的“形状”决定了一切要理解L1和L2的特性差异最直观的方式就是看它们对模型权重的“惩罚”方式这直接体现在损失函数的形式上。2.1 损失函数的构成损失与惩罚的博弈一个典型的带有正则化的损失函数J(θ)可以写成这样J(θ) Loss(θ) λ * R(θ)其中Loss(θ)是原始损失比如均方误差MSE或交叉熵损失它衡量模型预测与真实标签的差距。R(θ)就是正则化项是对模型参数θ的惩罚。λlambda是正则化强度一个超参数。λ越大对模型复杂度的惩罚越重模型就越倾向于简单。L1和L2的正则化项R(θ)定义不同L1正则项R(θ) ||θ||₁ Σ|θᵢ|即所有权重绝对值的和。L2正则项R(θ) ||θ||₂² Σθᵢ²即所有权重平方和。这个公式上的微小差异带来了天壤之别的效果。2.2 几何解释菱形与圆形的约束这是理解两者区别最经典的视角。我们可以把模型训练看作一个优化问题在由Loss(θ)构成的“误差曲面”上寻找一个最低点最小损失。同时正则化项给我们划了一个“可行域”要求最终的参数θ必须落在这个区域内。L1的可行域是一个菱形高维是菱面体。因为Σ|θᵢ| ≤ tt是由λ决定的某个常数在二维平面上画出来就是个菱形。这个菱形在坐标轴上有尖尖的“角”。L2的可行域是一个圆形高维是球体。因为Σθᵢ² ≤ t在二维平面上是个圆形。现在想象Loss(θ)的等值线一圈圈椭圆。最优解发生在等值线与可行域边界首次相切的地方。对于L1菱形由于菱形有尖角等值线非常容易在尖角处与之相切。而尖角的位置恰好对应了某个坐标轴即某个权重θᵢ 0。这就导致了稀疏性——最优解中部分特征对应的权重直接为零相当于模型自动忽略了这些特征。对于L2圆形圆形的边界是光滑的曲线没有尖角。等值线与圆形相切时切点几乎不可能恰好落在坐标轴上。因此所有权重都会被压缩但都不会精确为零只是变得很小。实操心得这个几何解释虽然抽象但非常有助于建立直觉。下次当你调参时犹豫选L1还是L2可以想想你的模型是否需要那些“尖角”来把不重要的特征权重“顶”到零。2.3 梯度下降中的行为差异在实际用梯度下降法优化时L1和L2对权重更新的影响也不同。权重更新公式为θ θ - η * ∇J(θ)其中η是学习率∇J(θ)是损失函数对权重的梯度。L2正则项的梯度∇(λ * Σθᵢ²) 2λθ。所以每次更新时权重会额外减去2ηλθ。这相当于在每一步都让权重乘以一个略小于1的因子(1 - 2ηλ)进行持续的、按比例衰减。这就是“权重衰减”这个名字的由来。L1正则项的梯度∇(λ * Σ|θᵢ|)对于θᵢ是λ * sign(θᵢ)其中sign是符号函数正数为1负数为-10为0。所以每次更新时权重会额外减去一个固定的量ηλ * sign(θᵢ)与权重当前值的大小无关。正是这个“固定量”的削减使得较小的权重更容易被推到零。一旦权重跨越零点符号改变梯度方向也会反转但惩罚项依然会试图将其拉回零点附近最终有很大概率稳定在零。注意事项由于L1梯度在零点处不可导从-1突变到1在实际实现中如TensorFlow, PyTorch通常使用次梯度subgradient方法在零点处取0作为次梯度。这并不影响优化但需要知道框架底层是这么处理的。3. 特性对比与场景选择指南理解了原理我们就能系统地对比它们的特性并指导实际应用。下面的表格是一个快速总结特性维度L1正则项 (Lasso)L2正则项 (Ridge)数学形式权重绝对值之和 (Σ|θᵢ|)权重平方和 (Σθᵢ²)解的特性稀疏解。倾向于产生大量精确为零的权重。稠密解。所有权重被均匀缩小但非零。几何约束菱形/菱面体有尖角圆形/球体光滑梯度行为减去固定步长 (ηλ * sign(θ))按权重比例衰减 (θ * (1 - 2ηλ))核心优势特征选择。能自动识别并剔除不相关特征生成更简单、可解释性更强的模型。稳定训练防止过拟合。能有效处理特征共线性多重共线性问题使解更稳定。主要缺点1. 如果特征高度相关可能随机选择一个而忽略其他。2. 在特征数远大于样本数时最多只能选择与样本数相等的非零特征。3. 由于稀疏性损失函数在零点不可导优化稍复杂。无法进行特征选择。所有特征都会被保留在模型中可能包含冗余信息。典型应用场景1. 高维特征选择如基因数据、文本词袋模型。2. 模型压缩与部署零权重可直接删除。3. 追求模型高度可解释性的场景。1. 处理特征间存在共线性的问题如金融、经济数据。2. 防止过拟合作为大多数情况下的“默认”正则化选择。3. 神经网络中广泛使用权重衰减。3.1 何时选择L1正则项选择L1本质上是你认为你的特征集中存在大量“无关特征”或“冗余特征”你的首要目标是得到一个简洁的模型。特征维度爆炸的领域比如自然语言处理中的词袋模型特征数词汇表大小动辄上万甚至百万但真正对当前任务有用的词可能只有几百个。使用L1可以自动筛选出关键词语。可解释性要求高的场景在医疗诊断、金融风控等领域我们不仅需要模型预测准还需要知道是“哪些因素”导致了预测结果。一个只有几十个非零权重的线性模型远比一个有成千上万个微小权重的模型容易解释。你可以直接对业务方说“看模型认为这5个指标是最关键的。”资源受限的嵌入式或移动端部署模型权重稀疏意味着大量的乘加运算可以跳过因为乘零等于零。这能极大减少计算量和内存占用提升推理速度降低功耗。这是模型压缩和加速的一个重要手段。实操示例Python sklearnfrom sklearn.linear_model import Lasso from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split # 生成数据假设有100个特征但只有10个是真正有用的 X, y make_regression(n_samples200, n_features100, n_informative10, noise0.5, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.25, random_state42) # 使用L1正则项Lasso lasso_reg Lasso(alpha0.1) # alpha 即 λ正则化强度 lasso_reg.fit(X_train, y_train) # 查看非零权重的数量 non_zero_coefs np.sum(lasso_reg.coef_ ! 0) print(fLasso模型非零权重数量: {non_zero_coefs}) # 很可能接近或略大于10 print(f模型在测试集上的R²分数: {lasso_reg.score(X_test, y_test):.4f})3.2 何时选择L2正则项选择L2通常是你认为所有特征都可能包含一定信息或者特征之间存在较强的相关性你的首要目标是获得一个稳定、泛化能力强的模型。特征存在多重共线性这是L2的“杀手级”应用。当两个或多个特征高度相关时普通线性回归的解会变得极不稳定权重方差很大对数据微小变动非常敏感。L2正则化通过对大权重施加严厉惩罚迫使模型将所有相关特征的权重都分配得小一些且平均一些从而稳定了解提高了模型的鲁棒性。作为防止过拟合的默认正则化在深度学习领域L2正则化以“权重衰减”的名字无处不在。它温和地限制权重增长是控制模型复杂度、提升泛化性能最常用、最基础的手段之一。当你没有特别强烈的特征选择需求时先用L2总是一个稳妥的起点。与复杂模型结合在神经网络中L1正则化可能导致过多的神经元失活影响模型容量。L2则提供了一种更平滑的约束方式与Dropout、BatchNorm等技术配合良好。实操示例Python sklearnfrom sklearn.linear_model import Ridge from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split # 生成具有共线性的数据 X, y make_regression(n_samples200, n_features10, noise0.5, random_state42) # 人为制造共线性让特征1和特征2高度相关 X[:, 1] X[:, 0] * 0.95 np.random.normal(0, 0.01, X.shape[0]) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.25, random_state42) # 使用L2正则项Ridge ridge_reg Ridge(alpha1.0) # alpha 即 λ ridge_reg.fit(X_train, y_train) # 对比普通线性回归无正则化 from sklearn.linear_model import LinearRegression lr LinearRegression() lr.fit(X_train, y_train) print(特征0和特征1的权重对比) print(f 普通线性回归: w0{lr.coef_[0]:.4f}, w1{lr.coef_[1]:.4f}) print(f Ridge回归: w0{ridge_reg.coef_[0]:.4f}, w1{ridge_reg.coef_[1]:.4f}) # 通常会看到Ridge的权重绝对值更小且更“平均”。3.3 折中方案Elastic Net有没有可能兼得L1和L2的优点呢答案是Elastic Net。它的正则化项是L1和L2的线性组合R(θ) λ₁ * Σ|θᵢ| λ₂ * Σθᵢ²或者更常见的形式R(θ) λ * (ρ * Σ|θᵢ| 0.5 * (1-ρ) * Σθᵢ²)其中ρ控制L1的比例。Elastic Net适用于特征维度很高且特征间存在分组相关性一组特征彼此相关。纯L1可能会从一组相关特征中随机选一个而Elastic Net的L2部分能促使模型将这一组特征都选上或都不选表现更稳定。当特征数远大于样本数时纯L1能选择的特征数有限而Elastic Net可以突破这个限制。作为一个更通用的正则化器当你对数据特性不太确定时可以将其作为搜索空间的一部分进行超参数调优。4. 超参数λalpha的调优实战正则化的效果严重依赖于超参数λ在sklearn中常被称为alpha的选择。λ0意味着没有正则化模型可能过拟合λ太大则模型被过度惩罚导致欠拟合所有权重都被压得太小模型能力不足。4.1 调优方法网格搜索与交叉验证最可靠的方法是使用交叉验证来寻找最优的λ。import numpy as np from sklearn.linear_model import LassoCV, RidgeCV from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split X, y make_regression(n_samples1000, n_features50, noise10, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 为Lasso设置一个λ的候选范围通常在对数尺度上搜索 alphas np.logspace(-4, 1, 50) # 从10^-4到10^1生成50个对数间隔的值 # 使用LassoCV进行交叉验证选择最佳alpha lasso_cv LassoCV(alphasalphas, cv5, random_state42, max_iter10000) lasso_cv.fit(X_train, y_train) print(fLasso交叉验证选择的最佳 alpha: {lasso_cv.alpha_:.6f}) print(f对应模型在测试集上的R²: {lasso_cv.score(X_test, y_test):.4f}) # 同样可以用于Ridge ridge_cv RidgeCV(alphasalphas, cv5, scoringneg_mean_squared_error) ridge_cv.fit(X_train, y_train) print(fRidge交叉验证选择的最佳 alpha: {ridge_cv.alpha_:.6f})4.2 可视化学习曲线理解λ的影响绘制模型性能如交叉验证分数随λ变化的曲线能直观看到偏差-方差的权衡。import matplotlib.pyplot as plt from sklearn.linear_model import Lasso, Ridge from sklearn.model_selection import cross_val_score # 准备数据 cv_scores_lasso [] cv_scores_ridge [] for alpha in alphas: lasso Lasso(alphaalpha, max_iter10000) ridge Ridge(alphaalpha) # 使用负均方误差越大越好 score_lasso cross_val_score(lasso, X_train, y_train, cv5, scoringneg_mean_squared_error).mean() score_ridge cross_val_score(ridge, X_train, y_train, cv5, scoringneg_mean_squared_error).mean() cv_scores_lasso.append(-score_lasso) # 转为正数越小越好 cv_scores_ridge.append(-score_ridge) plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.semilogx(alphas, cv_scores_lasso, -o) plt.axvline(lasso_cv.alpha_, colorred, linestyle--, labelfBest alpha{lasso_cv.alpha_:.3f}) plt.xlabel(Alpha (λ)) plt.ylabel(Mean Squared Error (CV)) plt.title(Lasso CV Error vs. Alpha) plt.legend() plt.grid(True, whichboth, linestyle--, linewidth0.5) plt.subplot(1, 2, 2) plt.semilogx(alphas, cv_scores_ridge, -o) plt.axvline(ridge_cv.alpha_, colorred, linestyle--, labelfBest alpha{ridge_cv.alpha_:.3f}) plt.xlabel(Alpha (λ)) plt.ylabel(Mean Squared Error (CV)) plt.title(Ridge CV Error vs. Alpha) plt.legend() plt.grid(True, whichboth, linestyle--, linewidth0.5) plt.tight_layout() plt.show()通过这张图你可以清晰地看到随着α增大正则化变强误差先下降后上升。最低点就是偏差和方差取得最佳平衡的位置。实操心得调λ时一定要在验证集或通过交叉验证进行绝对不能在测试集上调否则就等同于数据泄露会严重高估模型在真实未知数据上的性能。测试集只用于最终评估。5. 在深度学习框架中的应用与注意事项在TensorFlow或PyTorch中L1/L2正则化的添加方式更加灵活通常不是在损失函数里手动加而是通过优化器的weight_decay参数或层的内置参数来设置。5.1 TensorFlow/Keras 中的实现在Keras中可以在层级别或模型级别通过kernel_regularizer和bias_regularizer参数添加正则化。import tensorflow as tf from tensorflow.keras import layers, models, regularizers # 方式1在层定义时添加 model models.Sequential([ layers.Dense(128, activationrelu, input_shape(input_dim,), kernel_regularizerregularizers.l1_l2(l11e-5, l21e-4)), # 同时使用L1和L2 layers.Dropout(0.5), layers.Dense(64, activationrelu, kernel_regularizerregularizers.l2(1e-4)), # 仅使用L2 layers.Dense(1) # 输出层 ]) # 方式2使用更通用的权重衰减本质是L2 # 在编译模型时通过优化器传递。这是更现代、更推荐的做法尤其对于Adam等自适应优化器。 # 注意有些资料指出原生的AdamW带权重衰减的Adam与简单的Adamweight_decay在实现上有细微差别。 # 使用TensorFlow Addons或PyTorch的AdamW通常是更准确的选择。 optimizer tf.keras.optimizers.Adam(learning_rate1e-3) # 在Keras中标准的Adam优化器没有直接的weight_decay参数。通常还是用上面的regularizers。 # 对于真正的AdamW可以使用 # import tensorflow_addons as tfa # optimizer tfa.optimizers.AdamW(learning_rate1e-3, weight_decay1e-4) model.compile(optimizeroptimizer, lossmse, metrics[mae])5.2 PyTorch 中的实现在PyTorch中通常直接在优化器中设置weight_decay参数来实现L2正则化。L1正则化则需要手动添加到损失中。import torch import torch.nn as nn import torch.optim as optim class SimpleNet(nn.Module): def __init__(self, input_dim): super(SimpleNet, self).__init__() self.fc1 nn.Linear(input_dim, 128) self.fc2 nn.Linear(128, 64) self.fc3 nn.Linear(64, 1) self.relu nn.ReLU() def forward(self, x): x self.relu(self.fc1(x)) x self.relu(self.fc2(x)) x self.fc3(x) return x model SimpleNet(input_dim50) criterion nn.MSELoss() # 优化器中的weight_decay参数即为L2正则化强度 optimizer optim.Adam(model.parameters(), lr1e-3, weight_decay1e-4) # L2正则化 # 如果需要L1正则化需要在训练循环中手动计算并添加到损失里 l1_lambda 1e-5 for epoch in range(num_epochs): optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) # 手动添加L1正则化项 l1_reg torch.tensor(0., requires_gradTrue) for param in model.parameters(): l1_reg l1_reg torch.norm(param, 1) # L1 norm loss loss l1_lambda * l1_reg loss.backward() optimizer.step()注意事项在深度学习尤其是使用自适应优化器如Adam时关于如何正确实现权重衰减L2正则存在一些历史讨论。简单地在Adam优化器的weight_decay参数中添加值并不完全等同于在损失函数后添加L2项后者被称为“解耦权重衰减”即AdamW算法。在实践中对于大多数问题使用标准的weight_decay也能取得不错效果。但如果追求严谨或遇到相关优化问题可以查阅并使用AdamW优化器。6. 常见问题与排查技巧实录在实际应用中使用L1/L2正则化时总会遇到一些典型问题。下面是我从多次项目实践中总结出来的排查清单。6.1 问题一加了正则化模型效果反而变差了可能原因1正则化强度λ设置过大。这会导致模型严重欠拟合。模型权重被过度压缩无法捕捉数据中的有效模式。排查绘制上面提到的“误差-λ”学习曲线。如果曲线在λ0附近最低然后一直上升说明数据本身可能不容易过拟合或者当前模型复杂度不高不需要强正则化。尝试减小λ或者直接设为0。可能原因2数据和问题本身不适合该正则化类型。例如在一个所有特征都至关重要的场景下强行使用L1可能会把关键特征的权重错误地压到零。排查检查L1正则化后非零权重的特征是否具有业务可解释性。如果发现某个公认的重要特征权重为零就需要反思。可以尝试使用Elastic Net或纯L2。可能原因3与其它超参数冲突。例如在使用L2正则化权重衰减的同时学习率设置得过高可能导致优化过程不稳定。排查进行系统的超参数联合调优可以使用网格搜索或随机搜索同时调整学习率、正则化强度等。6.2 问题二L1正则化后为什么还有大量非零权重稀疏性不明显。可能原因1λ太小。惩罚力度不够不足以将不重要的权重“推”到零。排查逐步增大λ观察非零权重数量的变化曲线。通常会看到一个从全部非零到快速减少再到缓慢减少的平台期。可能原因2特征尺度不一致。L1正则化惩罚的是权重的绝对值。如果特征A的取值范围是[0, 1]特征B是[0, 10000]那么为了拟合特征B其对应的权重自然会非常小。L1惩罚对小权重的“推动力”是固定的符号函数可能难以将这个本身就很小的权重推到零而特征A的权重虽然绝对值可能更大但对模型的贡献未必比特征B大。这会导致特征选择失真。排查与解决务必在应用L1正则化前进行特征标准化如Z-score标准化或Min-Max缩放使所有特征处于同一量级。这是使用L1前最关键的数据预处理步骤之一。可能原因3优化算法未收敛。L1正则化导致损失函数在零点不可导优化路径可能更“曲折”。如果迭代次数max_iter不够优化可能提前停止未能找到真正的稀疏解。排查增加最大迭代次数并监控损失函数是否已稳定。在sklearn的Lasso中可以设置max_iter10000或更大并关注收敛警告。6.3 问题三L2正则化对共线性问题的改善效果不理想。可能原因1λ不够大。对于严重的共线性需要足够大的惩罚才能显著稳定权重。排查观察增大λ后共线性特征之间的权重变化是否变得更稳定、更接近。可以通过检查不同数据子集上训练出的模型权重方差来验证。可能原因2共线性过于严重近乎完全共线。当两个特征几乎是彼此的线性倍数时即使L2也只能提供一个数值解但问题本身是病态的模型可能仍然不稳定。排查与解决计算特征间的相关系数矩阵或方差膨胀因子VIF。对于VIF大于10或更严格的标准如5的特征考虑手动剔除其中一个或使用主成分分析PCA等降维方法先处理特征再进行回归。L2是缓解手段而非根除手段。6.4 一个实用的诊断技巧正则化路径图绘制“正则化路径图”是理解L1/L2行为的一个强大工具。它展示了每个特征的权重系数如何随着正则化强度λ的变化而变化。import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Lasso from sklearn.datasets import make_regression # 生成数据 X, y make_regression(n_samples100, n_features10, n_informative5, noise10, random_state42) alphas np.logspace(-2, 2, 100) # λ从0.01到100 coefs [] for alpha in alphas: lasso Lasso(alphaalpha, max_iter10000) lasso.fit(X, y) coefs.append(lasso.coef_) coefs np.array(coefs) plt.figure(figsize(10, 6)) for i in range(coefs.shape[1]): plt.plot(alphas, coefs[:, i], labelfFeature {i}) plt.xscale(log) plt.xlabel(Alpha (λ) - Log Scale) plt.ylabel(Coefficient Value) plt.title(Lasso Regularization Path) plt.legend(locupper right, fontsizesmall) plt.grid(True, whichboth, linestyle--, linewidth0.5) plt.axhline(y0, colork, linestyle-, linewidth0.5) plt.show()在这张图上你可以看到最右侧λ很大所有系数都被压缩到零。从左向右移动λ增大不重要的特征线条会率先收缩到零。最后剩下的、最晚收缩到零的线条通常对应最重要的特征。 这张图不仅能帮你选λ还能直观验证特征的重要性排序。7. 高级话题与扩展思考7.1 从贝叶斯视角理解拉普拉斯先验与高斯先验从概率统计的角度给模型参数加正则化等价于为参数引入了先验分布。L1正则化等价于假设参数服从拉普拉斯分布Laplace Distribution。这个分布在零点有一个尖峰意味着我们预先认为参数取零的概率很大这直接导致了稀疏性。L2正则化等价于假设参数服从高斯分布正态分布Gaussian Distribution。这个分布是钟形的集中在均值通常设为零附近意味着我们预先认为参数应该接近零但不一定是零且大值的概率呈指数衰减。这个视角非常优美它将正则化纳入了贝叶斯推断的框架。最大后验概率估计MAP就是在最大似然估计MLE的基础上加上了这个先验项即正则化项。7.2 在逻辑回归等分类模型中的应用L1/L2正则化不仅用于线性回归在逻辑回归、支持向量机等分类模型中同样至关重要。在sklearn的LogisticRegression中penalty参数就是用来选择L1、L2或Elastic-Net的。from sklearn.linear_model import LogisticRegression # 使用L1正则化的逻辑回归适用于高维特征选择 logit_l1 LogisticRegression(penaltyl1, solverliblinear, C1.0, random_state42) # 注意C 是正则化强度的倒数C越小正则化越强。 C 1 / λ # 使用L2正则化的逻辑回归更稳定默认选择 logit_l2 LogisticRegression(penaltyl2, solverlbfgs, C1.0, random_state42)对于逻辑回归正则化的作用同样是控制模型复杂度防止在特征空间中对训练数据“过度分割”。7.3 与Dropout、BatchNorm的关系在深度学习领域正则化是一个大家族L1/L2权重衰减只是其中一员。其他如Dropout随机丢弃神经元、Batch Normalization批归一化也都有正则化效果但机制不同。Dropout通过在训练时随机“关闭”一部分神经元强制网络学习冗余的、鲁棒的特征表示是一种集成学习的近似。它主要防止神经元之间的复杂共适应。BatchNorm通过规范化每一层的输入分布使得训练更稳定允许使用更大的学习率。它在一定程度上减少了模型对参数初始尺度的依赖从而间接起到了正则化的作用。在实际网络中我们常常会组合使用这些技术例如Conv - BN - ReLU - Dropout。它们从不同角度约束模型共同提升泛化能力。经验上BatchNorm和Dropout的组合效果往往比单纯依赖L2权重衰减更强。但这并不意味着可以抛弃L2它仍然是一个简单有效的基础组件。最后关于选择L1还是L2并没有绝对的答案。我的经验是先从L2开始把它作为防止过拟合的基线。如果模型特征非常多且你怀疑很多特征没用或者你对模型大小和推理速度有苛刻要求那么就认真尝试L1并仔细进行特征缩放和超参数调优。当特征间有明确的相关性分组时Elastic Net值得一试。理解其背后的原理结合具体数据和业务目标进行实验才是用好正则化的不二法门。
返回列表