Deep learning Pytorch LSTM文本生成器重复相同的单词
更新:生成新字符的逻辑是错误的。见下面的答案 原始问题:我用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
- 损失函数: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()
回答:我在使用经过训练的模型生成字符时犯了一个愚蠢的错误:我对批量大小感到困惑,并假设在每一步网络都会预测一整批新字符,而实际上它只预测一个字符……这就是为什么它只是重复输入的结尾。哎呀
无论如何,如果您遇到这个问题,请仔细检查您是否具有使用经过训练的模型生成新输出的正确逻辑(尤其是在使用批处理的情况下)。如果不是这样,并且问题仍然存在,则可以尝试微调以下各项:
- 序列长度
- 贪婪(例如,概率选择与下一个角色的首选)
- 批量
- 时代