我正在 Keras 中实现 Seq2Seq 模型。但是,他们没有在解码器中提供波束搜索选项。因此,我考虑了 pynlpl 的 BeamSearch,但他们在此处找到的关于搜索的文档没有任何关于如何实现它的信息。您能否举例说明如何实施波束搜索?
这里有一个类似的答案:How to implement a custom beam search in TensorFlow? 但是,还不清楚。
我正在 Keras 中实现 Seq2Seq 模型。但是,他们没有在解码器中提供波束搜索选项。因此,我考虑了 pynlpl 的 BeamSearch,但他们在此处找到的关于搜索的文档没有任何关于如何实现它的信息。您能否举例说明如何实施波束搜索?
这里有一个类似的答案: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 的波束大小,则波束结束。
但它有点过于抽象,因此您可以参考这个(官方)示例寻求帮助。它是由Google的Denny Britz实现的,这个非常简单。
TensorFlow addons
provides beam-search
facility. Quoting from the official documentation:
Following is the class-signature:
tfa.seq2seq.BeamSearchDecoder(
cell: tf.keras.layers.Layer,
beam_width: int,
embedding_fn: Optional[Callable] = None,
output_layer: Optional[tf.keras.layers.Layer] = None,
length_penalty_weight: tfa.types.FloatTensorLike = 0.0,
coverage_penalty_weight: tfa.types.FloatTensorLike = 0.0,
reorder_tensor_arrays: bool = True,
**kwargs
)
And here is an example:
tiled_encoder_outputs = tfa.seq2seq.tile_batch(
encoder_outputs, multiplier=beam_width)
tiled_encoder_final_state = tfa.seq2seq.tile_batch(
encoder_final_state, multiplier=beam_width)
tiled_sequence_length = tfa.seq2seq.tile_batch(
sequence_length, multiplier=beam_width)
attention_mechanism = MyFavoriteAttentionMechanism(
num_units=attention_depth,
memory=tiled_inputs,
memory_sequence_length=tiled_sequence_length)
attention_cell = AttentionWrapper(cell, attention_mechanism, ...)
decoder_initial_state = attention_cell.get_initial_state(
batch_size=true_batch_size * beam_width, dtype=dtype)
decoder_initial_state = decoder_initial_state.clone(
cell_state=tiled_encoder_final_state)