The optimizers don’t get valid parameters and should thus raise an error, since you would have to call the parameters method:
first_opt = torch.optim.SGD(first_model.parameters())
second_opt = torch.optim.SGD(second_model.parameters())
third_opt = torch.optim.SGD(third_model.parameters())

The loss calculation should also raise an error, since you are not creating the criterion, but try to pass the tensors to the constructor.
Replace it with:
criterion = torch.nn.MSELoss()
loss1 = criterion(first_result, second_result)

I’m also not sure why your code didn’t raise any errors.