Machine learning 使用LSTM&x27生成助记符;我如何确保我的模型使用损失函数生成有意义的句子?

Machine learning 使用LSTM&x27生成助记符;我如何确保我的模型使用损失函数生成有意义的句子?,machine-learning,keras,nlp,deep-learning,Machine Learning,Keras,Nlp,Deep Learning,我正在做一个能产生记忆法的项目。我的模型有问题 我的问题是,如何确保我的模型使用损失函数生成有意义的句子? 项目目标 为单词列表生成助记符。给定用户想要记住的单词列表,该模型将输出一个有意义、简单且易于记住的句子,该句子将用户想要记住的单词的前两个字母封装在要生成的助记符单词中。我的模型只会收到用户想要记住的单词的前两个字母,因为它携带了生成助记符的所有信息。 数据集 我正在使用Kaggle的55000多首歌词数据,这些歌词中的句子包含5到10个单词,我想生成的助记符也包含相同数量的单词 输入

我正在做一个能产生记忆法的项目。我的模型有问题

我的问题是,如何确保我的模型使用损失函数生成有意义的句子? 项目目标 为单词列表生成助记符。给定用户想要记住的单词列表,该模型将输出一个有意义、简单且易于记住的句子,该句子将用户想要记住的单词的前两个字母封装在要生成的助记符单词中。我的模型只会收到用户想要记住的单词的前两个字母,因为它携带了生成助记符的所有信息。

数据集 我正在使用Kaggle的55000多首歌词数据,这些歌词中的句子包含5到10个单词,我想生成的助记符也包含相同数量的单词

输入/输出预处理。 在删除标点符号和数字,从一个句子中的每个单词中提取前2个字母,并从预定义的字典中为这些字母对指定一个唯一的数字,该字典包含一对键、一个键和一个唯一的数字作为值。 当作为输入时指定的这些唯一编号的列表,这些单词的手套向量将作为输出。在每个时间步,LSTM模型都会将这些唯一的数字分配给这些单词,并输出相应单词的手套向量

模型架构 我使用的是10个时间步长的LSTM。 在每个时间步,与这对字母相关联的唯一数字将被输入,输出将是相应单词的手套向量

结果: 我的模型是输出与输入中每个单词的前两个字母相匹配的助记符。但产生的记忆法几乎没有意义。 我意识到这个问题是由于我的训练方式造成的。从单词中提取的字母顺序已经为句子的形成做好了准备。但这与while测试的情况不同。我输入单词的字母摘录的顺序可能不太可能形成句子。 因此,我为我的数据建立了一个二元图,并将句子形成概率最高的排列输入到我的记忆生成器模型中。虽然有一些改进,但整个句子没有任何意义。 我被困在这一点上了

输入

输出

我的问题是,,
如何确保我的模型生成有意义的句子?首先,使用损失函数,我有几个无关的建议。我认为您不应该输出每个单词的手套向量。为什么?Word2Vec方法旨在封装单词的含义,可能不包含有关拼写的信息。然而,为了产生一个有意义的句子,意义也是有帮助的。因此,我会让LSTM在阅读每个单词的前两个字母后生成它自己的隐藏状态(就像您当前所做的那样)。然后,我会将该序列展开(正如您当前所做的那样)为维度1的序列(索引到索引到单词映射)。然后,我将获取该输出,通过一个嵌入层对其进行处理,该嵌入层将单词索引映射到它们的手套嵌入,然后我将通过另一个输出LSTM运行该输出,以生成更多索引。你可以根据自己的需要来叠加,但是2到3级就足够了

即使有了这些变化,你也不太可能在生成易于记忆的句子方面看到任何成功。对于这一主要问题,我认为通常有两种方法。第一种是在某种意义上增加你的损失,即所产生的句子是一个“有效的英语句子”。通过对输出句子进行词性标注,并增加与是否遵循标准句子结构(主谓副词、直接宾语等)相关的损失,您可以在一定程度上通过编程实现这一点。虽然这个结果可能比下面的替代方案更容易,但它可能不会产生真正自然的结果

我建议,除了按照当前的方式训练你的模型外,还可以使用一个GAN来判断输出的句子是否是自然句子。有很多的资源,所以我不认为你需要在这个答案的具体代码。但是,以下概述了您的模型应该如何进行逻辑训练:

  • 通过两个附加阶段来增加您当前的培训。
    • 首先训练鉴别器判断输出句子是否自然。你可以通过让一个LSTM模型读句子并给出一个sigmoid输出(0/1)来判断它们是否是“自然的”。然后,您可以在包含1个标签的真实句子和0个标签的句子的数据集上以大约50/50的比例对该模型进行训练
    • 然后,除了用于实际生成助记符的当前损失函数外,添加损失,即生成的带有1(真)标签的句子的二进制交叉熵分数。执行此操作时,请确保明显冻结鉴别器模型

  • 继续迭代这两个步骤(每次训练1个历元),直到开始看到更合理的结果。您可能需要考虑生成器(您的模型)中每个损失项的权重,以便在正确的助记符和易于记忆的句子之间进行正确的权衡。

    @VikasNS-我确实回答了您的问题,但这并不一定能正确处理堆栈溢出问题。我不能单方面重新提出这个问题
    optimizer=rmsprop(lr=0.0008)
    model=Sequential()
    model.add(Embedding(input_dim=733,output_dim=40,input_length=12))
    model.add(Bidirectional(LSTM(250,return_sequences=True,activation='relu'),merge_mode='concat'))
    Dropout(0.4)
    
    model.add(Bidirectional(LSTM(350,return_sequences=True,activation='relu'),merge_mode='concat'))
    Dropout(0.4)
    model.add(TimeDistributed(Dense(332, activation='tanh')))
    model.compile(loss='cosine_proximity',optimizer=optimizer,metrics=['acc'])