.grad_fn is very different from .grad. You have a .grad_fn because this new Tensor was obtained in a differentiable way (using the slicing operation on the original one).
You indeed want to work with the full Tensor, not the individual elements !
For the overfitting, you can try to increase the training set size, l2 regularization, momentum, etc (the usual suspects :D)