📜  正则化 pytorch - Python (1)

📅  最后修改于: 2023-12-03 14:55:53.730000             🧑  作者: Mango

正则化 PyTorch - Python

在机器学习中,过拟合是一个很常见的问题,主要原因是模型在训练集上的表现越来越好,但在测试集上的表现并没有那么好。这意味着模型过分依赖于训练集的特性,而这些特性并不具备普遍性和推广性。

为了解决这个问题,我们可以对模型的权重进行正则化,从而减少模型过拟合的风险。在 PyTorch 中,我们可以使用一些方法来实现正则化。

L1 正则化

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 正则化

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 正则化

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 中的代码实现。希望本文能对你的学习有所帮助。