har*_*on4 5 machine-learning reinforcement-learning fst lstm generative-adversarial-network
我使用 LSTM 模型创建了一个词级文本生成器。但就我而言,并非每个词都适合选择。我希望它们匹配其他条件:
10100010)。然后,生成的句子需要满足给定的结构,例如,01001100(hi 01和朋友 001100)。因此,为了处理这种情况,我创建了一个具有以下结构的 Pandas 数据框:
word last_vowel word_map
----- --------- ----------
hello o 01001
stack a 00100
jhon o 0010
Run Code Online (Sandbox Code Playgroud)
这是我目前的工作流程:
0100100100100,我们可以选择单词hello,因为它的元音结构是01001。0100100100100will be become00100100因为我们已经删除了首字母01001( hello )。00100和jhon 0010。这就像一个魅力,但还有一个条件需要处理:句子的最后一个元音。
我处理这个问题的方法如下:
你认为有更好的方法吗?也许是 GAN 或强化学习?
编辑:我认为另一种方法是添加 WFST。我听说过pynini library,但我不知道如何将它应用于我的特定上下文。
如果您对自己的方法感到满意,最简单的方法可能是能够在反向序列上训练 LSTM,训练它给出前一个单词的权重,而不是下一个单词的权重。在这种情况下,您可以使用已经使用的方法,只不过单词的第一个子集将满足最后一个元音约束。我不相信这能保证产生最好的结果。
现在,如果这种逆转是不可能的,或者在进一步阅读我的答案后,您发现这没有找到最佳解决方案,那么我建议使用寻路算法,类似于强化学习,但不是统计的,因为权重计算为训练后的 LSTM 是确定性的。您当前使用的本质上是深度优先 贪婪搜索,根据 LSTM 输出,它甚至可能是最优的。假设 LSTM 是否为您提供了总和的保证单调增加,该总和在可接受的后续单词之间变化不大(因为 N-1 和 N 序列之间的差异远大于第 N 个单词的不同选项之间的差异) 。在一般情况下,当没有明确的启发式方法可以帮助您时,您将不得不执行详尽的搜索。如果你能想出一个可接受的启发式算法,你可以在下面的第一个选项中使用A*代替Dijkstra算法,它会做得越快,你的启发式算法就越好。
我想这很清楚,但以防万一,您的图连接性是由您的约束序列定义的。初始节点(没有单词的 0 长度序列)与数据框中与约束序列开头匹配的任何单词连接。因此,您没有将图作为数据结构,只是将其压缩描述作为此约束。
编辑 根据评论中的要求,这里有更多详细信息。不过,这里有几个选择:
多次应用 Dijkstra 算法。Dijkstra 的搜索找到 2 个已知节点之间的最短路径,而在您的情况下,我们只有初始节点(0 长度序列,没有单词),最终单词未知。
修改现有的深度优先搜索以进行详尽的搜索。