趋近智
为了提高模型的泛化能力,惩罚大权重 (weight)是正则化 (regularization)中的一个常见做法。这里比较两种最常见的权重正则化方法:L1和L2正则化。两者都通过添加一个惩罚项来修改损失函数 (loss function),但这种惩罚的特点会导致非常不同的结果。
回想一下训练神经网络 (neural network)的标准损失函数,通常表示为 , 代表模型的参数 (parameter)(权重和偏置 (bias))。
L2正则化(权重衰减): 添加一个与权重大小的平方成比例的惩罚项。 这里, 表示网络中的每个权重(偏置通常不包括在内), 是正则化强度超参数 (hyperparameter)。添加 因子是为了在求导时方便计算。项 是权重向量 (vector)的平方 范数。
L1正则化: 添加一个与权重大小的绝对值成比例的惩罚项。 同样, 控制正则化的强度。项 是权重向量的 范数。
主要差异在于这些惩罚在梯度下降 (gradient descent)过程中如何影响权重。
L2正则化 (regularization): L2惩罚项对权重 的梯度是 。这意味着更新规则实际上包含一个使权重线性收缩到零的项:。这种持续的收缩效应是L2常被称为“权重衰减”的原因。它鼓励权重变小并更均匀地分布,很少会使它们精确为零,除非数据梯度完美地抵消了衰减项。它偏向于小权重的扩散分布。
L1正则化: L1惩罚项对 的梯度是 ,其中 在 时为 +1,在 时为 -1,在 时(技术上)未定义。在实际应用中,实现通常在 时使用次梯度(例如0)。重点是惩罚项从权重的更新中减去一个常数量()(如果权重为负则加上),而不管权重当前的大小(只要它不为零)。这种向零的常数“推动”在使权重精确为零方面比L2的比例推动更有效。这会形成稀疏权重向量 (vector),其中许多权重变为零。
想象一个只有两个权重 (weight) 和 的简单情况。正则化 (regularization)项限制了这些权重的可能值。
优化过程试图在该区域内找到权重,同时最小化原始数据损失 。最优解通常出现在数据损失的等高线首次接触约束区域的地方。
L1(菱形)和L2(圆形)约束区域在二维权重空间中的几何解释。L1菱形的“角”位于坐标轴上,这使得当损失等高线与边界相交时,某个权重为零的解更有可能出现。
如图所示,L1菱形的“角”位于坐标轴上( 或 )。除非损失等高线恰好与约束边界完全对齐 (alignment),否则交点更有可能出现在这些“角”之一,从而得到稀疏解。L2圆形是平滑的,没有这些“角”,交点往往发生在两个权重都不为零的地方。
最实际的差异是稀疏性。L1正则化 (regularization)通过将不重要特征的权重 (weight)推向精确的零来实现隐式特征选择。如果连接输入特征到网络的权重变为零,那么该特征在该连接路径上实际上对输出没有影响。这在高维空间 (high-dimensional space)中很有用,因为许多特征可能不相关或冗余。
L2正则化使权重变小,但通常不会精确为零。它普遍减小了所有特征的影响,但不会消除它们。
L2正则化 (regularization)通常在计算上更简单。它的惩罚项具有平滑的导数,使其可以直接集成到标准梯度下降 (gradient descent)算法中。许多优化器(如Adam、SGD)都包含一个内置的 weight_decay 参数 (parameter),它直接实现了L2正则化。
L1正则化的惩罚项在零点不可导。尽管这并非无法克服的问题(存在使用次梯度或迭代软阈值等方法),但这表示L1并不总是像L2的 weight_decay 那样是优化器中的内置参数。通常,您需要在反向传播 (backpropagation)之前将L1惩罚项明确添加到您的损失计算中,如下面的代码示例所示。
import torch
import torch.nn as nn
import torch.optim as optim
# 示例层
linear_layer = nn.Linear(50, 20)
inputs = torch.randn(64, 50) # 批量数据
targets = torch.randn(64, 20)
# --- 应用L2正则化(权重衰减)---
# 只需在优化器中使用 weight_decay 参数
optimizer_l2 = optim.Adam(linear_layer.parameters(), lr=0.001, weight_decay=1e-4)
# --- 应用L1正则化 ---
# L1通常显式添加到损失函数中
optimizer_l1 = optim.Adam(linear_layer.parameters(), lr=0.001) # 无权重衰减
l1_lambda = 1e-5
criterion = nn.MSELoss() # 示例基础损失函数
# 在您的训练循环中:
optimizer_l1.zero_grad()
outputs = linear_layer(inputs)
loss = criterion(outputs, targets)
# 计算需要梯度的参数的L1惩罚
l1_penalty = 0
for param in linear_layer.parameters():
if param.requires_grad:
l1_penalty += torch.sum(torch.abs(param))
# 将L1惩罚添加到基础损失
total_loss_l1 = loss + l1_lambda * l1_penalty
total_loss_l1.backward()
optimizer_l1.step()
print(f"基础损失: {loss.item():.4f}")
print(f"L1惩罚: {l1_penalty.item():.4f}")
print(f"包含L1的总损失: {total_loss_l1.item():.4f}")
示例代码,说明了L2正则化通常如何通过优化器的
weight_decay参数来处理,而L1正则化通常涉及手动计算权重 (weight)的L1范数并将其添加到主要损失函数 (loss function)中。
L2正则化 (regularization):
L1正则化:
Elastic Net: 正如下一节所讨论的,Elastic Net 结合了 L1 和 L2。当您希望获得L1的部分特征选择性质,同时也希望有L2的通用权重收缩时,它会很有用,尤其是在处理相关特征时。
L1和L2都引入了一个超参数 (parameter) (hyperparameter),它控制正则化的强度。这个值需要调整,通常使用在验证集上的网格搜索或随机搜索等方法,因为其最佳值取决于具体问题。选择过大的可能导致欠拟合 (underfitting)(模型过于简化),而过小的可能无法提供足够的正则化。
总之,L1和L2正则化都旨在通过惩罚大权重来简化模型,但它们的方式不同,从而产生不同的模型特点。L2鼓励小而分散的权重(权重衰减),而L1鼓励稀疏权重(特征选择)。您选择使用哪一个取决于您的数据特点以及特征选择是否是您希望的结果。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造