I think this is the issue - linear.parameters() returns a tuple of tensors, none of which require gradients. If I had defined the linear neural net by hand, rather than using the module, then I could declare that the weight tensor and bias vector both required gradients and this should work.
Since I want to use a deep neural network with all sorts of complicated layers, I would like to avoid needing to define it by hand in this way.