You are creating a new output layer each time you call the forward.
    lstm_out = nn.Linear(lstm_out.size(1), self.vocab_size)(lstm_out)


and as a result, nothing is learned across iterations.
It should be something like:
    lstm_out = self.output_layer(lstm_out)


where self.output_layer = nn.Linear(...) should be defined in __init__()