Thanks for those.  As far as your comments, I do use the hidden layer from the last hidden state, like so:
        x_data, y_data = get_sequence_data([sample], train=False)

        model.zero_grad()
        hidden = model.init_hidden(x_data.size()[0])
        
        prev_word = autograd.Variable(torch.LongTensor([word2idx['<GO>']]), volatile=True).cuda()
        
        seq = [GO_TOKEN]

        while True:
            output, hidden = model(prev_word.unsqueeze(1), hidden)
            _, idx = output.topk(1)
            
            cur_word = idx.data[0][0][0]
            
            seq.append(cur_word)

            if cur_word == END_TOKEN:
                break

            elif len(seq) > 50:
                break

            prev_word = idx.view(-1)