Python深度学习pyTorch权重衰减与L2范数正则化解析

  • Post category:Python

Python深度学习pyTorch权重衰减与L2范数正则化解析

在深度学习中,过拟合是一个常见的问题。为了解决这个问题,我们可以使用正则化技术,如权重衰减和L2范数正则化。在本攻略中,我们将详细介绍pyTorch中的权重衰减和L2范数正则化,并提供两个示例说明。

权重衰减

权重衰减是一种常用的正则化技术,它通过在损失函数中添加一个正则化项来惩罚模型的复杂度。在pyTorch中,我们可以使用weight_decay参数来实现权重衰减。weight_decay参数是一个正则化系数,它控制正则化项的强度。

以下是使用权重衰减的示例代码:

import torch
import torch.nn as nn
import torch.optim optim

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 定义数据和优化器
inputs = torch.randn(1, 10)
labels = torch.randn(1, 1)
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=0.001)

# 训练模型
for i in range(100):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = nn.MSELoss()(outputs, labels)
    loss.backward()
    optimizer.step()

在这个示例中,我们首先定义了一个Net类,它包含两个全连接层。然后,我们定义了输入和标签,并创建了一个模型和一个优化器。在训练模型时,我们将weight_decay参数设置为0.001,以实现权重衰减。

L2范数正则化

L2范数正则化是一种常用的正则化技术,它通过在损失函数中添加一个L2范数的平方来惩罚模型的复杂度。在pyTorch中,我们可以使用weight_decay参数和nn.Module的parameters方法来实现L2范数正则化。

以下是使用L2范数正则化的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 定义数据和优化器
inputs = torch.randn(1, 10)
labels = torch.randn(1, 1)
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for i in range(100):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = nn.MSELoss()(outputs, labels)
    l2_reg = torch.tensor(0.)
    for param in model.parameters():
        l2_reg += torch.norm(param)
    loss += 0.001 * l2_reg
    loss.backward()
    optimizer.step()

在这个示例中,我们首先定义了一个Net类,它包含两个全连接层。然后,我们定义了输入和标签,并创建了一个模型和一个优化器。在训练模型时,我们首先计算L2范数的平方,并将其添加到损失函数中。然后,我们使用backward方法计算梯度,并使用step方法更新模型参数。

示例说明

以下是两个使用pyTorch实现权重衰减和L2范数正则化的示例说明:

1. 使用权重衰减的线性回归

以下是使用权重衰减的线性回归的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(1, 1)

    def forward(self, x):
        x = self.fc(x)
        return x

# 定义数据和优化器
inputs = torch.randn(100, 1)
labels = 3 * inputs + 1 + 0.2 * torch.randn(100, 1)
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=0.001)

# 训练模型
for i in range(1000):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = nn.MSELoss()(outputs, labels)
    loss.backward()
    optimizer.step()

# 打印模型参数
for name, param in model.named_parameters():
    if param.requires_grad:
        print(name, param.data)

在这个示例中,我们首先定义了一个Net类,它包含一个全连接层。然后,我们定义了输入和标签,并创建了一个模型和一个优化器。在训练模型时,我们将weight_decay参数设置为0001,以实现权重衰减。最后,我们打印模型参数。

2. 使用L2范数正则化的多项式回归

以下是使用L2范数正则化的多项式回归的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 10)
        self.fc2 = nn.Linear(10, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 定义数据和优化器
inputs = torch.randn(100, 1)
labels = torch.sin(inputs) + 0.1 * torch.randn(100, 1)
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for i in range(1000):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = nn.MSELoss()(outputs, labels)
    l2_reg = torch.tensor(0.)
    for param in model.parameters():
        l2_reg += torch.norm(param)
    loss += 0.001 * l2_reg
    loss.backward()
    optimizer.step()

# 打印模型参数
for name, param in model.named_parameters():
    if param.requires_grad:
        print(name, param.data)

在这个示例中,我们首先定义了一个Net类,它包含两个全连接层。然后,我们定义了输入和标签,并创建了一个模型和一个优化器。在训练模型时,我们首先计算L2范数的平方,并将其添加到损失函数中。最后,我们打印模型参数。

结论

本攻略中,我们详细介绍了pyTorch中的权重衰减和L2范数正则化,并提供了两个示例说明。我们使用示例代码演示了如何使用权重衰减和L2范数正则化决线性回归和多项式回归问题。这些示例代码可以帮助学者更好地理解pyTorch中的正则化技术的实现和应用场景。