machine-learning - 如何限制 LSTM 模型中的序列预测以匹配特定模式?

标签 machine-learning lstm reinforcement-learning generative-adversarial-network fst

我使用 LSTM 模型创建了一个词级文本生成器。但就我而言,并非每个词都适合选择。我希望它们匹配其他条件:

  • 每个单词都有一个映射:如果一个字符是元音,则写 1,否则写 0(例如,溢出是 10100010)。然后,生成的句子需要满足给定的结构,例如,01001100 (嗨 01 和 friend 001100)。
  • 最后一个单词的最后一个元音必须是提供的那个。让我们说是e。 (星期五 e nd 将完成这项工作)。

  • 因此,为了处理这种情况,我创建了一个具有以下结构的 Pandas 数据框:
    word    last_vowel  word_map
    -----   ---------   ----------
    hello   o           01001
    stack   a           00100
    jhon    o           0010
    

    这是我目前的工作流程:
  • 给定句子结构,我从数据框中选择一个与模式匹配的随机单词。例如,如果句子结构是 0100100100100 ,我们可以选择hello这个词,因为它的元音结构是01001 .
  • 我从剩余的结构中减去选定的单词:0100100100100会变成00100100因为我们已经删除了最初的 01001 (你好)。
  • 我从与剩余结构的一部分匹配的数据帧中检索所有单词,在这种情况下,堆栈 00100和约翰 0010 .
  • 我将当前单词句子内容(现在只是 hello)传递给 LSTM 模型,它检索每个单词的权重。
  • 但我不只是想选择最佳选项,我想选择第 3 点选择中包含的最佳选项。所以我选择了该列表中估计值最高的单词,在这种情况下,堆栈。
  • 从第 2 点开始重复,直到剩余的句子结构为空。

  • 这就像一个魅力,但还有一个条件需要处理:句子的最后一个元音。

    我处理这个问题的方法如下:
  • 生成 1000 个句子,强制最后一个元音是指定的元音。
  • 获取 LSTM 模型返回的权重的均方根值。输出越好,权重就越高。
  • 选择检索较高排名的句子。

  • 你认为有更好的方法吗?也许是 GAN 或强化学习?

    编辑:我认为另一种方法是添加 WFST。我听说过 pynini library ,但我不知道如何将其应用于我的特定上下文。

    最佳答案

    如果您对自己的方法感到满意,那么最简单的方法可能是您能够在反向序列上训练 LSTM,以训练它给出前一个词的权重,而不是下一个词的权重。在这种情况下,您可以使用您已经使用的方法,只是单词的第一个子集将满足最后一个元音约束。我不相信这能保证产生最好的结果。

    现在,如果这种逆转是不可能的,或者如果在进一步阅读我的答案后,您发现这没有找到最佳解决方案,那么我建议使用类似于强化学习的寻路算法,但不是统计的,因为权重由经过训练的 LSTM 是确定性的。您目前使用的基本上是一个 depth first greedy search这取决于 LSTM 输出,甚至可能是最佳的。假设 LSTM 是否为您提供了保证总和的单调增加,这在可接受的结果词之间变化不大(因为 N-1 和 N 序列之间的差异远大于第 N 个词的不同选项之间的差异) .在一般情况下,当没有明确的启发式方法可以帮助您时,您将不得不执行详尽的搜索。如果你能想出一个可接受的启发式方法,你可以使用 A*而不是 Dijkstra's下面第一个选项中的算法,它执行得越快,启发式越好。

    我想这很清楚,但以防万一,您的图形连接性由您的约束序列定义。初始节点(没有单词的 0 长度序列)与数据帧中与约束序列开头匹配的任何单词连接。因此,您没有将图形作为数据结构,只是作为此约束的压缩描述。

    编辑
    根据评论中的要求,这里有其他详细信息。不过,这里有几个选项:

  • 多次应用 Dijkstra 算法。 Dijkstra 的搜索找到 2 个已知节点之间的最短路径,而在您的情况下,我们只有初始节点(没有单词的 0 长度序列)并且最终单词未知。
  • 找到所有可接受的最后一个词(那些同时满足模式和元音约束的词)。
  • 对其中的每一个应用 Dijkstra 搜索,为它们找到最大的词序列权重和。
  • Dijkstra 的算法专为搜索最短路径而设计,因此要直接应用它,您必须否定每一步的权重,并选择尚未访问过的最小的权重。
  • 在找到所有解决方案(以您最初确定的最后一个单词之一结尾的句子)后,选择最小的解决方案(这将是所有解决方案中最大的权重总和)。
  • 修改您现有的深度优先搜索以进行详尽搜索。
  • 执行你在OP中描述的搜索操作,如果最后一步给出一个解决方案(如果最后一个带有正确元音的单词完全可用),记录重量
  • 回滚一步到前一个词,并在前一个词中选择第二好的选项。如果根本没有解决方案,您可能可以丢弃上一步中所有相同长度的单词。如果有解决方案,则取决于您的 LSTM 是否根据前一个单词提供不同的权重。可能确实如此,在这种情况下,您必须对上一步中的所有单词执行该操作。
  • 当您用完上一步的单词时,向上移动一步并从那里重新开始。
  • 您始终保留当前的获胜者以及每一步未访问的节点列表,并执行详尽的搜索。最终,您将找到最佳解决方案。
  • 关于machine-learning - 如何限制 LSTM 模型中的序列预测以匹配特定模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61055924/

    相关文章:

    python - 具有多个元素的数组的真值不明确?

    image-processing - 图像上的机器学习:如何预处理数据

    python - Pytorch 梯度存在但权重不更新

    neural-network - 当可能有多个 Action 时,策略梯度是多少?

    tensorflow - TensorFlow 中的资格跟踪

    machine-learning - 交叉熵和遗传算法有什么区别?

    python - 计算训练集的混淆矩阵

    python - 如何在 Keras ImageDataGenerator 中应用 OpenCV 颜色图转换?

    python - Keras:如何实现LSTM的目标复制?

    python - pandas 根据条件将数据转换为多步时间序列