【问题标题】:Beam Search in PythonPython 中的束搜索
【发布时间】:2017-12-19 21:45:30
【问题描述】:

我正在 Keras 中实现 Seq2Seq 模型。但是,他们没有在解码器中提供波束搜索选项。因此,我考虑了 pynlpl 的 BeamSearch,但他们的搜索文档发现 here 没有任何关于如何实现它的信息。您能否举例说明如何实施波束搜索?

这里也有类似的答案:How to implement a custom beam search in TensorFlow? 但是,不清楚。

【问题讨论】:

    标签: python tensorflow deep-learning keras beam-search


    【解决方案1】:

    一般来说你可以这样做:

    1. 将第一维中的原始批次平铺成 beam_size 倍,包括输出(将注意力的输出和编码器的最终状态编码为初始解码器状态)。每个波束大小的重复样本都被标记为 beam_i。

    2. 进行一步解码,并从每个 beam_i 的词汇大小输出中获得相应的 top beam_size * 2 索引和概率。

    3. 保留每个生成字符的先前概率,并使用这些概率和从步骤 2 中获得的最后一个概率计算平均概率,并获得顶部 beam_size 字符。

    4. 将遇到 stop_decode 符号的样本放入列表中,如果列表的长度达到每个 beam_i 的波束大小,则波束结束。

    但它有点过于抽象,因此您可以参考this (official) example 寻求帮助。它由来自 Google 的 Denny Britzthis very simple one 实现。

    【讨论】:

      【解决方案2】:

      TensorFlow addons 提供beam-search 设施。引用自official documentation

      以下是类签名:

      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
      )
      

      这是一个例子:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-11
        • 2020-08-22
        • 2011-04-19
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        相关资源
        最近更新 更多