📅  最后修改于: 2023-12-03 14:55:53.730000             🧑  作者: Mango
在机器学习中,过拟合是一个很常见的问题,主要原因是模型在训练集上的表现越来越好,但在测试集上的表现并没有那么好。这意味着模型过分依赖于训练集的特性,而这些特性并不具备普遍性和推广性。
为了解决这个问题,我们可以对模型的权重进行正则化,从而减少模型过拟合的风险。在 PyTorch 中,我们可以使用一些方法来实现正则化。
L1 正则化是为了惩罚模型权重中的绝对值之和。这个方法可以有效地鼓励模型权重中的稀疏性,从而减少不必要的冗余特征。
import torch.nn as nn
# 使用 L1 正则化
model = nn.Sequential(
nn.Linear(1, 10),
nn.ReLU(),
nn.Linear(10, 1)
)
lambda_l1 = 0.01 # 正则化系数
l1_regularization = torch.tensor(0., requires_grad=True)
for name, param in model.named_parameters():
if 'weight' in name:
l1_regularization += torch.norm(param, 1)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
# 训练模型
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss += lambda_l1 * l1_regularization
loss.backward()
optimizer.step()
L2 正则化是为了惩罚模型权重平方和的平方根。这个方法可以使模型权重更加平滑,从而在某种程度上减少过拟合的风险。
import torch.nn as nn
# 使用 L2 正则化
model = nn.Sequential(
nn.Linear(1, 10),
nn.ReLU(),
nn.Linear(10, 1)
)
lambda_l2 = 0.01 # 正则化系数
l2_regularization = torch.tensor(0., requires_grad=True)
for name, param in model.named_parameters():
if 'weight' in name:
l2_regularization += torch.norm(param, 2)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
# 训练模型
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss += lambda_l2 * l2_regularization
loss.backward()
optimizer.step()
ElasticNet 正则化是 L1 正则化和 L2 正则化的结合,可以同时发挥它们的优点。
import torch.nn as nn
# 使用 ElasticNet 正则化
model = nn.Sequential(
nn.Linear(1, 10),
nn.ReLU(),
nn.Linear(10, 1)
)
lambda_l1 = 0.01 # L1 正则化系数
lambda_l2 = 0.01 # L2 正则化系数
l1_l2_regularization = torch.tensor(0., requires_grad=True)
for name, param in model.named_parameters():
if 'weight' in name:
l1_l2_regularization += lambda_l1 * torch.norm(param, 1) + lambda_l2 * torch.norm(param, 2)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
# 训练模型
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss += l1_l2_regularization
loss.backward()
optimizer.step()
以上就是不同正则化方法在 PyTorch 中的代码实现。希望本文能对你的学习有所帮助。