Backprop in one paragraph
Backpropagation is the chain rule applied to a computation graph. For a network L = f₃(f₂(f₁(w₀; x))), the gradient of the loss with respect to a parameter deep in the network is the product of local Jacobians along the path from that parameter to the loss. Autograd records the graph during the forward pass; backward walks it in reverse, multiplying local Jacobians, and accumulates the gradient at each parameter.
You almost never write backprop by hand. PyTorch and JAX both implement it as a generic algorithm over a directed acyclic graph of operations, where each operation registers its own forward and backward. The reason to learn backprop deeply anyway is that it tells you why some architectures train and others do not.
The chain rule, picture form
If z = g(y) and y = f(x), then dz/dx = (dz/dy) · (dy/dx). For a deep stack z = g(f(h(...x...))), the gradient at x is the product of every local derivative along the chain. Each local derivative is small or moderate; their product can vanish or explode, which is why deep networks need normalization, residual connections, and good initialization.
What autograd gives you for free
Define a forward pass. Set requires_grad=True on the leaves you want gradients for. Call .backward() on a scalar loss. Read .grad on every leaf. That is the whole user interface. Inside, PyTorch built a graph, walked it backward, applied the chain rule, and accumulated the result.