Есть ли способ, я могу добавить простую регуляцию L1/L2 в PyTorch? Мы можем, вероятно, вычислить регуляризованную потерю, просто добавив data_loss
с помощью reg_loss
, но есть ли какой-либо явный способ, любая поддержка библиотеки PyTorch, чтобы сделать это легче, не делая это вручную?
Добавление регуляции L1/L2 в PyTorch?
Ответ 1
Это представлено в документации для PyTorch. Посмотрите на http://pytorch.org/docs/optim.html#torch.optim.Adagrad. Вы можете добавить потерю L2 с помощью параметра снижения веса в функцию оптимизации.
Ответ 2
Следующее должно помочь для L2-регуляризации:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)
Ответ 3
Для регуляризации L2,
lambda = torch.tensor(1.)
l2_reg = torch.tensor(0.)
for param in model.parameters():
l2_reg += torch.norm(param)
loss += lambda * l2_reg
Рекомендации:
Ответ 4
Интересно, что torch.norm
медленнее на CPU и быстрее на GPU, чем прямой подход.
import torch
x = torch.randn(1024,100)
y = torch.randn(1024,100)
%timeit torch.sqrt((x - y).pow(2).sum(1))
%timeit torch.norm(x - y, 2, 1)
Out:
1000 loops, best of 3: 910 µs per loop
1000 loops, best of 3: 1.76 ms per loop
С другой стороны:
import torch
x = torch.randn(1024,100).cuda()
y = torch.randn(1024,100).cuda()
%timeit torch.sqrt((x - y).pow(2).sum(1))
%timeit torch.norm(x - y, 2, 1)
Out:
10000 loops, best of 3: 50 µs per loop
10000 loops, best of 3: 26 µs per loop