我正在Keras实施Seq2Seq模型。但是,它们没有在解码器中提供波束搜索选项。因此,我考虑了pynlpl的BeamSearch,但他们关于搜索的文档here没有关于如何实现它的任何信息。能否举一个如何实现波束搜索的例子?
这里有一个类似的答案:How to implement a custom beam search in TensorFlow? 但是,它不清楚。
答案 0 :(得分:0)
一般来说,你可以这样做:
通过beam_size时间在第一维中平铺原始批次,包括输出(编码的注意输出和编码器的最终状态作为初始解码器状态)。每个波束大小的重复样本都记为beam_i。
进行一步解码并从每个beam_i的词汇量大小的输出中相应地获得顶部beam_size * 2索引和概率。
保留每个生成字符的先前概率,并计算具有这些概率的平均概率和从步骤2得到的最后概率,并获得顶部beam_size字符。
将那些遇到stop_decode符号的样本放入列表中,如果列表的长度达到每个beam_i的波束大小,则波束结束。
但它有点过于抽象,因此您可以参考this (official) example寻求帮助。它由Denny Britz来自Google和this very simple one实施。