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