The guide
You have written the gradients by hand. Now hand that job to a framework and see what it was doing for you.
Autograd records the operations you perform on tensors into a graph, and
.backward() walks that graph applying the chain rule, which is exactly
the algorithm from the calculus topic with better bookkeeping. Knowing
this is why zero_grad() exists, why gradients accumulate by default,
and why detach() cuts a branch out of the graph, all stop being
arbitrary rules to memorise.
The training loop is five lines and always the same five: forward, loss, zero the gradients, backward, step. Almost every real training bug is one of those five in the wrong order.