The loss calculation is independent from the optimization step (parameter update) in general.
You could create two optimizers with the specified learning rates and apply them sequentially, if that would fit your use case:
optimizer1.zero_grad()
loss1.backward(retain_graph=True) # calculate gradients using loss1
optimizer1.step() # update parameters with lr, lr

optimizer2.zero_grad()
loss2.backward() # calculate gradients using loss2
optimizer2.step() # update parameters with lr, -lr

Would this work for you?