I think you are mistaking parameters and state variables.
On the second line, where you initialize the optimizer, you give it initialization parameters that define that instance (for example, learning rate or momentum).
When you are loading the state dict, however, those are (in the case of the optimizer) the gradients computed on the last forward pass. They are required to continue training from a checkpoint correctly.
Note that you could save any variable in the checkpoint when calling torch.save, like the current learning rate, so that you could initialize the optimizer correctly in the first place.
Also note that the optimizer needs the model parameters to make learning happen. Not to be confused with the initialization parameters of the optimizer itself, but you will have a params argument in the constructor of the optimizer for this.