I tried out the following script, to see if i can get the gradients of parts of a tensor:
x = torch.tensor([1,2,3]).float()
x.requires_grad_(True)
a = x[0]
b = x[1]
c = x[2]
loss = x.dot(torch.tensor([1.,2.,3.]).float())
for t in [a,b,c]:
  print(t.grad)
  pass
loss.backward()
for t in [a,b,c]:
  print(t.grad)
  pass
for t in x:
  print(t.grad)
  pass
print(x.grad)


I am getting the following output

None
None
None
None
None
None
None
None
None
tensor([1., 2., 3.])

Basically i am not able to refer to parts of the tensor to see their grads. I tried a different experiment, to first refer to parts of x as individual tensors and then have these tensors make their requires_grad=True, there i end up with an error:
x = torch.tensor([1,2,3]).float()
a = x[0]
b = x[1]
c = x[2]

for t in [a,b,c]:
  t.requires_grad_(True)
  pass
loss = x.sum()
for t in [a,b,c]:
  print(t.grad)
  pass
loss.backward()
for t in [a,b,c]:
  print(t.grad)
  pass


I get the output:

None
None
None



RuntimeError                              Traceback (most recent call last)
 in ()
6   print(t.grad)
7   pass
----> 8 loss.backward()
9 for t in [a,b,c]:
10   print(t.grad)


/usr/local/lib/python3.6/dist-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph)
91                 products. Defaults to False.
92         “”"
—> 93         torch.autograd.backward(self, gradient, retain_graph, create_graph)
94
95     def register_hook(self, hook):


/usr/local/lib/python3.6/dist-packages/torch/autograd/init.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
88     Variable._execution_engine.run_backward(
89         tensors, grad_tensors, retain_graph, create_graph,
—> 90         allow_unreachable=True)  # allow_unreachable flag
91
92


RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn