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

Deep learning Pytorch LSTM文本生成器重复相同的单词,deep-learning,lstm,pytorch,Deep Learning,Lstm,Pytorch,更新:生成新字符的逻辑是错误的。见下面的答案 原始问题:我用Pytorch构建了一个用于字符级文本生成的LSTM。该模型训练良好(损失合理减少等),但训练后的模型最终输出输入的最后几句话,反复重复(例如输入:“她告诉她稍后再来,但她从未回来过”;输出:“但她从未回来过,但她从未做过,但她从未做过”等等) 我对超参数做了一些修改,但问题仍然存在。我目前正在使用: 损失函数:BCE 优化器:亚当 学习率:0.001 序列长度:64 批量:32 嵌入尺寸:128 隐藏暗显:512 LSTM层:2

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

原始问题:我用Pytorch构建了一个用于字符级文本生成的LSTM。该模型训练良好(损失合理减少等),但训练后的模型最终输出输入的最后几句话,反复重复(例如输入:“她告诉她稍后再来,但她从未回来过”;输出:“但她从未回来过,但她从未做过,但她从未做过”等等)

我对超参数做了一些修改,但问题仍然存在。我目前正在使用:

  • 损失函数:BCE

  • 优化器:亚当

  • 学习率:0.001

  • 序列长度:64

  • 批量:32

  • 嵌入尺寸:128

  • 隐藏暗显:512

  • LSTM层:2

我也试着不总是选择最上面的选项,但这只会引入错误的单词,不会打破循环。我一直在看无数的教程,我不太明白我做的有什么不同/错误

以下是培训模型的代码
training_data
是一个长字符串,我在它上面循环,预测每个长度为
SEQ_LEN
的子字符串的下一个字符。我不确定我的错误是在这里还是在其他地方,但任何评论或指示都是非常感谢的

loss\u dict=dict()
对于范围内的e(历元):
打印(“----EPOCH{}OF{}----”。格式(e+1,EPOCHS))
lstm.reset_cell()
对于范围内的i(0,数据长度,批次大小):
如果i%50000==0:
打印(i/float(数据长度))
optimizer.zero_grad()
输入向量=torch.tensor([[
vocab.get(char,len(vocab))
用于训练数据中的字符[i+b:i+b+顺序]
]适用于范围内的b(批次尺寸)]
如果使用_CUDA和torch.CUDA.is_可用():
输入向量=输入向量.cuda()
输出向量=lstm(输入向量)
目标向量=火炬零点(输出向量形状)
如果使用_CUDA和torch.CUDA.is_可用():
target_vector=target_vector.cuda()
对于范围内的b(批次尺寸):
目标向量[b][vocab.get(训练数据[i+b+SEQ\u LEN])]=1
错误=损失(输出向量、目标向量)
error.backward()
optimizer.step()
loss_dict[(e,int(i/BATCH_SIZE))]=error.detach().item()

回答:我在使用经过训练的模型生成字符时犯了一个愚蠢的错误:我对批量大小感到困惑,并假设在每一步网络都会预测一整批新字符,而实际上它只预测一个字符……这就是为什么它只是重复输入的结尾。哎呀

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

  • 序列长度

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

  • 批量

  • 时代


为什么使用BCE作为损失函数?我认为你的问题表述是错误的。因为您正在生成文本,所以在每个时间步,您必须使用softmax计算每个单词或字符的概率。这意味着您应该将交叉熵与logits或负对数似然损失函数一起使用。