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中的正则化技术的实现和应用场景。