Here is the problem:
# Backpropagate the loss
train_loss_tensor = Variable(torch.tensor(train_loss), requires_grad=True)

When you are making a Variable, you are removing all gradient information from the tensor, hence you see no training improvement, since it doesn’t know its origins.
Try this code:
a = torch.randn(2, 3, requires_grad=True)
a = a*2
print(a.grad_fn)
# <MulBackward0 object at 0x7f1819cf3518>
a = Variable(a, requires_grad=True)
print(a.grad_fn)
# None