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