如何仅将正则化应用于pytorch中的一层?
How to apply regularization only to one layer in pytorch?
让我们想象一个有 2 层(X1,X2)的网络。我想在 X1 上使用 L1 范数,然后在 X1 上执行 (loss + L1).backward() 。 X2 仍在接受训练,但没有进行正则化。我的目标是使 X1 变得稀疏。
我已经尝试过 ,不幸的是正则化应用于所有层,即使它只使用一层的参数。
我也尝试冻结 X1,执行 loss.backward(),然后冻结 X2 以应用执行 loss.backward(),包括正则化。像这样:
for parameter in model.X1.parameters():
parameter.requires_grad = False
loss.backward(retain_graph=True)
for parameter in model.X1.parameters():
parameter.requires_grad = True
for parameter in model.X2.parameters():
parameter.requires_grad = False
loss += l1_regularization
loss.backward()
optimizer.step()
虽然结果不如预期。 X2 根本不再更新,X1 中的值似乎太低(所有权重变得非常接近于零)。
我做错了什么,有什么方法可以达到我的目标吗?
感谢您的帮助
你的第二个实现应该可以工作。但是,它没有显示您之后为 X2 设置 requires_grad = True
的部分(或在您冻结 X1 的开始处)。如果您的代码中确实缺少该部分,那么从第二个循环开始,X2 将不会接受训练。
让我们想象一个有 2 层(X1,X2)的网络。我想在 X1 上使用 L1 范数,然后在 X1 上执行 (loss + L1).backward() 。 X2 仍在接受训练,但没有进行正则化。我的目标是使 X1 变得稀疏。
我已经尝试过
我也尝试冻结 X1,执行 loss.backward(),然后冻结 X2 以应用执行 loss.backward(),包括正则化。像这样:
for parameter in model.X1.parameters():
parameter.requires_grad = False
loss.backward(retain_graph=True)
for parameter in model.X1.parameters():
parameter.requires_grad = True
for parameter in model.X2.parameters():
parameter.requires_grad = False
loss += l1_regularization
loss.backward()
optimizer.step()
虽然结果不如预期。 X2 根本不再更新,X1 中的值似乎太低(所有权重变得非常接近于零)。
我做错了什么,有什么方法可以达到我的目标吗? 感谢您的帮助
你的第二个实现应该可以工作。但是,它没有显示您之后为 X2 设置 requires_grad = True
的部分(或在您冻结 X1 的开始处)。如果您的代码中确实缺少该部分,那么从第二个循环开始,X2 将不会接受训练。