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

har*_*on4 5 machine-learning reinforcement-learning fst lstm generative-adversarial-network

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

  1. 每个单词都有一个映射:如果一个字符是元音,那么它会写 1,否则会写 0(例如,溢出10100010)。然后,生成的句子需要满足给定的结构,例如,01001100hi 01朋友 001100)。
  2. 最后一个单词的最后一个元音必须是提供的那个。假设是e。(周五ê将做的工作,然后)。

因此,为了处理这种情况,我创建了一个具有以下结构的 Pandas 数据框:

word    last_vowel  word_map
-----   ---------   ----------
hello   o           01001
stack   a           00100
jhon    o           0010
Run Code Online (Sandbox Code Playgroud)

这是我目前的工作流程:

  1. 给定句子结构,我从数据框中选择一个与模式匹配的随机单词。例如,如果句子结构是0100100100100,我们可以选择单词hello,因为它的元音结构是01001
  2. 我从剩余的结构中减去选定的单词:0100100100100will be become00100100因为我们已经删除了首字母01001( hello )。
  3. 我从与剩余结构的一部分匹配的数据帧中检索所有单词,在本例中为stack 00100jhon 0010
  4. 我将当前单词句子内容(现在只是hello)传递给 LSTM 模型,它检索每个单词的权重。
  5. 但我不只是想选择最佳选项,我想选择第 3 点选择中包含的最佳选项。所以我选择了该列表中估计值最高的单词,在本例中为stack
  6. 从第 2 点开始重复,直到剩余的句子结构为空。

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

我处理这个问题的方法如下:

  1. 生成 1000 个句子,强制最后一个元音是指定的元音。
  2. 获取 LSTM 模型返回的权重的均方根值。输出越好,权重就越高。
  3. 选择检索较高排名的句子。

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

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

isp*_*zax 2

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

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

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

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

  1. 多次应用 Dijkstra 算法。Dijkstra 的搜索找到 2 个已知节点之间的最短路径,而在您的情况下,我们只有初始节点(0 长度序列,没有单词),最终单词未知。

    • 找到所有可接受的最后一个单词(同时满足模式和元音约束的单词)。
    • 对其中的每一个应用 Dijkstra 搜索,找到每个词的最大单词序列权重总和。
    • Dijkstra 算法是为搜索最短路径而定制的,因此要直接应用它,您必须否定每一步的权重,并选择尚未访问过的最小路径。
    • 找到所有解决方案(以您最初确定的最后一个单词之一结尾的句子)后,选择最小的解决方案(这将是所有解决方案中最大的权重总和)。
  2. 修改现有的深度优先搜索以进行详尽的搜索。

    • 按照OP中所述执行搜索操作,如果最后一步给出一个解决方案(如果具有正确元音的最后一个单词完全可用),则记录权重
    • 回滚到前一个单词,并在前一个单词中选择第二好的选项。如果根本没有解决方案,您也许可以丢弃上一步中所有相同长度的单词。如果有解决方案,则取决于您的 LSTM 是否根据前一个单词提供不同的权重。可能是这样,在这种情况下,您必须对上一步中的所有单词执行该操作。
    • 当您用完上一步的单词时,向上移动一步并从那里重新开始。
    • 您始终保留当前的获胜者以及每一步的未访问节点列表并执行详尽的搜索。最终,你会找到最好的解决方案。