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