Your error is this line:
self.word_lstm_init_h = Parameter(torch.randn(2, 20, word_lstm_dim), requires_grad=True).type(FloatTensor)

What you did is x = foo.type(), The problem here is that foo is the leaf Variable (which will have .grad attribute correctly filled), not foo.type().
Try this:
self.word_lstm_init_h = Parameter(torch.randn(2, 20, word_lstm_dim).type(FloatTensor), requires_grad=True)