Inputs and parameters are leaf nodes, results of calculations are not.
For example, supposing
x = Variable(torch.rand(5))
weight = Variable(torch.rand(5), requires_grad=True)
y = x*weight
# do other calculations
loss.sum().backward()

then


x.grad is None because x is a leaf node with requires_grad=False.

weight.grad is not None because weight is a leaf node with requires_grad=True.

y.grad is None because y is not a leaf node, it is the result of a calculation.