趋近智
L1正则化通过将某些权重精确地推向零来促使稀疏性,从而有效地进行特征选择。L2正则化,通常被称为权重衰减,它总体上偏好较小的权重,并倾向于将相关特征组一起收缩,而无需将它们设为零。
如果你想兼得这些效果怎么办?也许你怀疑许多特征是无关紧要的(这提示使用L1),但你也认为可能存在重要的相关特征组,并且你不希望L1随意地从组中只挑选一个(这是L2表现出色的情况)。这正是弹性网络正则化发挥作用的地方。
弹性网络线性结合了L1和L2惩罚项。不仅仅是在原始损失函数 Lorig(w) 中添加一种惩罚项,而是添加两种:
Lelastic(w)=Lorig(w)+λ1∣∣w∣∣1+λ2∣∣w∣∣22在此,∣∣w∣∣1 是L1范数(权重绝对值之和),∣∣w∣∣22 是L2范数的平方(权重平方和)。超参数 λ1≥0 和 λ2≥0 分别控制L1和L2惩罚项的强度。
通常,你会在库中看到这种公式有不同的参数化方式,这样可以更容易地调整整体强度与混合比例:
Lelastic(w)=Lorig(w)+α(ρ∣∣w∣∣1+21−ρ∣∣w∣∣22)在这种常见的参数化方式中:
l1_ratio)是一个介于0和1之间的超参数,用于控制L1和L2之间的混合。
弹性网络旨在同时获得两者的优点:
我们可以将正则化看作是对可能权重值的限制。L1正则化对应一个菱形约束区域(在二维空间中),而L2对应一个圆形区域。弹性网络创建的约束区域结合了这两种形状,具有圆角,但与纯L2相比,仍然偏向于沿坐标轴的解。
L1、L2和弹性网络正则化在二维空间中约束区域的比较。弹性网络将L1的锐角(促使稀疏性)与L2的圆润度结合起来。
使用弹性网络会引入两个需要调整的超参数:整体强度 α 和混合比例 ρ(l1_ratio)。找到最佳组合通常需要使用网格搜索或随机搜索等方法,在两个参数的可能值范围内进行,并使用验证集来评估性能。一种常见的方法是尝试 ρ 的几个离散值(例如0.1、0.5、0.9、1.0),并为每个 ρ 寻找最佳的 α。
尽管L2正则化(权重衰减)通常直接内置于Adam或SGD等优化器中,但在深度学习中实现L1或弹性网络惩罚项可能需要根据框架的不同而稍加注意。
kernel_regularizer、bias_regularizer 等。你通常可以在这里传递L1、L2或弹性网络正则化器。以下是手动添加惩罚项的PyTorch示例:
import torch
import torch.nn as nn
# 假设 'model' 是你的神经网络
# 假设 'loss' 是从你的准则(例如,交叉熵损失)计算出的损失
alpha = 0.001 # 正则化强度
l1_ratio = 0.5 # 混合参数 (rho)
l1_lambda = alpha * l1_ratio
l2_lambda = alpha * (1 - l1_ratio)
l1_penalty = 0.0
l2_penalty = 0.0
# 遍历模型参数(权重)
for param in model.parameters():
if param.requires_grad and param.dim() > 1: # 通常只应用于权重矩阵
l1_penalty += torch.linalg.norm(param, ord=1)
l2_penalty += torch.linalg.norm(param, ord=2)**2 # L2 范数平方
# 将原始损失与惩罚项结合
total_loss = loss + l1_lambda * l1_penalty + (l2_lambda / 2) * l2_penalty
# (L2惩罚项中的1/2因子在第二种公式中很常见)
# 现在进行反向传播
# total_loss.backward()
# optimizer.step()
注意:这只是一个示例。高效的实现通常会与框架的梯度计算或优化器步骤挂钩。请查阅你的框架文档,了解应用L1/L2组合惩罚项的推荐方法。
当你认为稀疏性和处理相关预测器都是可取的时,弹性网络提供了一种灵活的正则化选项。它需要调整一个额外的超参数,但在某些情况下,它可以使模型比仅使用L1或L2正则化训练的模型具有更好的泛化能力。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造