在TensorFlow中,我们可以在顺序模型中添加L1或L2正则化。我在PyTorch中找不到类似的方法。如何在网络定义中为PyTorch中的权重添加正则化:
class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隐藏层 """ 如何在某个隐藏层之后添加L1正则化?? """ """ 或者如何在某个隐藏层之后添加L2正则化?? """ self.predict = torch.nn.Linear(n_hidden, n_output) # 输出层 def forward(self, x): x = F.relu(self.hidden(x)) # 隐藏层的激活函数 x = self.predict(x) # 线性输出 return xnet = Net(n_feature=1, n_hidden=10, n_output=1) # 定义网络# print(net) # 网络架构optimizer = torch.optim.SGD(net.parameters(), lr=0.2)loss_func = torch.nn.MSELoss() # 这是用于回归的均方误差损失
回答:
一般来说,PyTorch通过优化器的weight_decay
参数来处理L2正则化(您也可以为不同层分配不同的参数)。然而,这种机制不允许在不扩展现有优化器或编写自定义优化器的情况下进行L1正则化。
根据TensorFlow文档,他们对L1正则化使用reduce_sum(abs(x))
惩罚,对L2正则化使用reduce_sum(square(x))
惩罚。实现这一目标的最简单方法可能是直接将这些惩罚项添加到用于训练期间梯度计算的损失函数中。
# 将l1_weight和l2_weight设置为非零值以启用惩罚# 在训练循环中(给定输入x和目标y)...pred = net(x)loss = loss_func(pred, y)# 仅为net.hidden参数计算惩罚l1_penalty = l1_weight * sum([p.abs().sum() for p in net.hidden.parameters()])l2_penalty = l2_weight * sum([(p**2).sum() for p in net.hidden.parameters()])loss_with_penalty = loss + l1_penalty + l2_penaltyoptimizer.zero_grad()loss_with_penalty.backward()optimizer.step()# 我们最终关心的是惩罚前的损失print('loss:', loss.item())