I have two loss terms and I want to do an adaptive gradient clipping to prevent one of the two losses to prevail on the other.
By adaptive gradient clipping I mean the gradient among the two that is bigger is normalized by the other one.
after computing the normalized gradient I need to assign it, but then the code breaks
loss1 = ...
loss2 = ...
loss_tot = loss1 + loss2
model.optimizer.zero_grad()
loss_tot.backward(retain_graph=True)
gg1 = grad(loss1, model.encoder.parameters())
gg2 = grad(loss2, model.encoder.parameters())
# gradient clipping
for i, (g1, g2) in enumerate(zip(gg1, gg2)):
# compute L2 norms
g1_ = g1.norm(2)
g2_ = g2.norm(2)
g_ = torch.min(g1_, g2_)
# normalize gradients
gg2[i] = torch.mul(g_, torch.div(g2, g2_)) # --- NOT WORKING ---
model.optimizer.step()
I get:
TypeError: 'tuple' object does not support item assignment
I am new to Pytorch, so this solution may not be the best one.
Thanks in advance