torch.empty just creates a tensor with uninitialized values.
Try to print it after the init and you will see, that the values are quite random.
You could also create it with torch.zeros or skip the initialization completely:
w1=torch.tensor([0.1], requires_grad=True)
w2=torch.tensor([0.1], requires_grad=True)
w3=torch.tensor([0.1], requires_grad=True)
W=torch.cat((w1 * w2, w2 * w3, w3 * w1))