Pytorch LSTM文本生成器重复相同的单词

时间:2019-04-26 05:39:50

标签: deep-learning lstm pytorch

更新:生成新字符的逻辑是错误的。请参阅下面的答案。

原始问题:我用Pytorch构建了一个LSTM来生成字符级文本。该模型训练得很好(损失合理减少等),但是经过训练的模型最终输出了输入的最后几个单词,一遍又一遍地重复(例如,输入:“她告诉她以后再来,但是她从没来过”);输出:“,但是她从没做过,但是她从未做过,但是她从未做过”等等。

我已经使用了一些超参数,但问题仍然存在。我当前正在使用:

  • 丢失功能:BCE

  • 优化器:亚当

  • 学习率:0.001

  • 序列长度:64

  • 批量大小:32

  • 嵌入暗号:128

  • 隐藏的暗淡:512

  • LSTM层:2

我也尝试不总是选择最佳选择,但这只会引入错误的单词,并且不会中断循环。我一直在看无数的教程,但我不太清楚自己在做什么与众不同/错误。

以下是训练模型的代码。 training_data是一个长字符串,我正在遍历它,以预测长度为SEQ_LEN的每个子字符串的下一个字符。我不确定我的错误是在这里还是在其他地方,但是任何评论或指导都将受到高度赞赏!

loss_dict = dict()
for e in range(EPOCHS):
    print("------ EPOCH {} OF {} ------".format(e+1, EPOCHS))

    lstm.reset_cell()

    for i in range(0, DATA_LEN, BATCH_SIZE):

        if i % 50000 == 0:
            print(i/float(DATA_LEN))

        optimizer.zero_grad()

        input_vector = torch.tensor([[
            vocab.get(char, len(vocab)) 
            for char in training_data[i+b:i+b+SEQ_LEN]
        ] for b in range(BATCH_SIZE)])

        if USE_CUDA and torch.cuda.is_available():
            input_vector = input_vector.cuda()

        output_vector = lstm(input_vector)        

        target_vector = torch.zeros(output_vector.shape)

        if USE_CUDA and torch.cuda.is_available():
            target_vector = target_vector.cuda()

        for b in range(BATCH_SIZE):
            target_vector[b][vocab.get(training_data[i+b+SEQ_LEN])] = 1

        error = loss(output_vector, target_vector)

        error.backward()
        optimizer.step()

        loss_dict[(e, int(i/BATCH_SIZE))] = error.detach().item()

1 个答案:

答案 0 :(得分:0)

答案:我在使用经过训练的模型制作角色时犯了一个愚蠢的错误:我对批量大小感到困惑,并假设网络在每一步都将预测整批新角色,而实际上它只能预测一个新角色。单个…这就是为什么它只是重复输入的末尾。 kes!

无论如何,如果遇到此问题,请仔细检查一下,您是否具有使用经过训练的模型生成新输出的正确逻辑(尤其是在使用批处理时)。如果不是那样,并且问题仍然存在,则可以尝试对以下内容进行微调:

  • 序列长度

  • 贪婪(例如,概率选择与下一个字符的首选)

  • 批量大小

  • 时代