BeamSearchDecoder

  • class paddle.fluid.layers.BeamSearchDecoder(cell, start_token, end_token, beam_size, embedding_fn=None, output_fn=None)[源代码]

带beam search解码策略的解码器。该接口包装一个cell来计算概率,然后执行一个beam search步骤计算得分,并为每个解码步骤选择候选输出。更多详细信息请参阅 Beam search

注意 在使用beam search解码时,cell的输入和状态将被扩展到

BeamSearchDecoder - 图1 ,得到 BeamSearchDecoder - 图2 一样的形状,这个操作在BeamSearchDecoder中自动完成,因此,其他任何在 cell.call 中使用的tensor,如果形状为 BeamSearchDecoder - 图3 ,都必须先手动使用 BeamSearchDecoder.tile_beam_merge_with_batch 接口扩展。最常见的情况是带注意机制的编码器输出。

  • 参数:
    • cell (RNNCell) - RNNCell的实例或者具有相同接口定义的对象。
    • start_token (int) - 起始标记id。
    • end_token (int) - 结束标记id。
    • beam_size (int) - 在beam search中使用的beam宽度。
    • embedding_fn (可选) - 处理选中的候选id的接口。通常,它是一个将词id转换为词嵌入的嵌入层,函数的返回值作为 cell.call 接口的 input 参数。如果 embedding_fn 未提供,则必须在 cell.call 中实现词嵌入转换。默认值None。
    • output_fn (可选) - 处理cell输出的接口,在计算得分和选择候选标记id之前使用。默认值None。

示例代码

  1. import paddle.fluid as fluid
  2. from paddle.fluid.layers import GRUCell, BeamSearchDecoder
  3. trg_embeder = lambda x: fluid.embedding(
  4. x, size=[10000, 128], param_attr=fluid.ParamAttr(name="trg_embedding"))
  5. output_layer = lambda x: layers.fc(x,
  6. size=10000,
  7. num_flatten_dims=len(x.shape) - 1,
  8. param_attr=fluid.ParamAttr(name=
  9. "output_w"),
  10. bias_attr=False)
  11. decoder_cell = GRUCell(hidden_size=128)
  12. decoder = BeamSearchDecoder(decoder_cell,
  13. start_token=0,
  14. end_token=1,
  15. beam_size=4,
  16. embedding_fn=trg_embeder,
  17. output_fn=output_layer)
  • tile_beam_merge_with_batch(x, beam_size)

扩展tensor的batch维度。此函数的输入是形状为

BeamSearchDecoder - 图4 的tensor t,由minibatch中的样本 BeamSearchDecoder - 图5 组成。将其扩展为形状是 BeamSearchDecoder - 图6 的tensor,由 BeamSearchDecoder - 图7 组成, 每个minibatch中的样本重复 BeamSearchDecoder - 图8 次。

  • 参数:
    • x (Variable) - 形状为 BeamSearchDecoder - 图9 的tenosr。数据类型应为float32,float64,int32,int64或bool。
    • beam_size (int) - 在beam search中使用的beam宽度。

返回:形状为

BeamSearchDecoder - 图10 的tensor,其数据类型与 x 相同。

返回类型:Variable

  • _split_batch_beams(x)

将形状为

BeamSearchDecoder - 图11 的tensor变换为形状为 BeamSearchDecoder - 图12 的新tensor。

  • 参数:
    • x (Variable) - 形状为 BeamSearchDecoder - 图13 的tenosr。数据类型应为float32,float64,int32,int64或bool。

返回:形状为

BeamSearchDecoder - 图14 的tensor,其数据类型与 x 相同。

返回类型:Variable

  • _merge_batch_beams(x)

将形状为

BeamSearchDecoder - 图15 的tensor变换为形状为 BeamSearchDecoder - 图16 的新tensor。

  • 参数:
    • x (Variable) - 形状为 BeamSearchDecoder - 图17 的tenosr。数据类型应为float32,float64,int32,int64或bool。

返回:形状为

BeamSearchDecoder - 图18 的tensor,其数据类型与 x 相同。

返回类型:Variable

  • _expand_to_beam_size(x)

此函数输入形状为

BeamSearchDecoder - 图19 的tensor t,由minibatch中的样本 BeamSearchDecoder - 图20 组成。将其扩展为形状 BeamSearchDecoder - 图21 的tensor,由 BeamSearchDecoder - 图22 组成,其中每个minibatch中的样本重复 BeamSearchDecoder - 图23 次。

  • 参数:
    • probs (Variable) - 形状为 BeamSearchDecoder - 图24 的tensor,表示对数概率。其数据类型应为float32。
    • finish (Variable) - 形状为 BeamSearchDecoder - 图25 的tensor,表示所有beam的完成状态。其数据类型应为bool。

返回:具有与 x 相同的形状和数据类型的tensor,其中未完成的beam保持不变,而已完成的beam被替换成特殊的tensor(tensor中所有概率质量被分配给EOS标记)。

返回类型:Variable

  • _mask_probs(probs, finished)

屏蔽对数概率。该函数使已完成的beam将所有概率质量分配给EOS标记,而未完成的beam保持不变。

  • 参数:
    • probs (Variable) - 形状为 BeamSearchDecoder - 图26 的tensor,表示对数概率。其数据类型应为float32。
    • finish (Variable) - 形状为 BeamSearchDecoder - 图27 的tensor,表示所有beam的完成状态。其数据类型应为bool。

返回:具有与 x 相同的形状和数据类型的tensor,其中未完成的beam保持不变,而已完成的beam被替换成特殊的tensor(tensor中所有概率质量被分配给EOS标记)。

返回类型:Variable

  • _gather(x, indices, batch_size)

对tensor x 根据索引 indices 收集。

  • 参数:
    • x (Variable) - 形状为 BeamSearchDecoder - 图28 的tensor。
    • index (Variable) - 一个形状为 BeamSearchDecoder - 图29 的int64 tensor,表示我们用来收集的索引。
    • batch_size (Variable) - 形状为 BeamSearchDecoder - 图30 的tensor。其数据类型应为int32或int64。

返回:具有与 :code:`x 相同的形状和数据类型的tensor,表示收集后的tensor。

返回类型:Variable

  • initialize(initial_cell_states)

初始化BeamSearchDecoder。

  • 参数:
    • initial_cell_states (Variable) - 单个tensor变量或tensor变量组成的嵌套结构。调用者提供的参数。

返回:一个元组 (initial_inputs, initial_states, finished)initial_inputs 是一个tensor,当 embedding_fn 为None时,由 start_token 填充,形状为

BeamSearchDecoder - 图31 ;否则使用 embedding_fn(t) 返回的值。initial_states 是tensor变量的嵌套结构(命名元组,字段包括 cell_states,log_probs,finished,lengths),其中 log_probs,finished,lengths 都含有一个tensor,形状为 BeamSearchDecoder - 图32 ,数据类型为float32,bool,int64。cell_states 具有与输入参数 initial_cell_states 相同结构的值,但形状扩展为 BeamSearchDecoder - 图33finished 是一个布尔型tensor,由False填充,形状为 BeamSearchDecoder - 图34

返回类型:tuple

  • _beam_search_step(time, logits, next_cell_states, beam_state)

计算得分并选择候选id。

  • 参数:
    • time (Variable) - 调用者提供的形状为[1]的tensor,表示当前解码的时间步长。其数据类型为int64。
    • logits (Variable) - 形状为 BeamSearchDecoder - 图35 的tensor,表示当前时间步的logits。其数据类型为float32。
    • next_cell_states (Variable) - 单个tensor变量或tensor变量组成的嵌套结构。它的结构,形状和数据类型与 initialize() 的返回值 initial_states 中的 cell_states 相同。它代表该cell的下一个状态。
    • beam_state (Variable) - tensor变量的结构。在第一个解码步骤与 initialize() 返回的 initial_states 同,其他步骤与 initialize() 返回的 beam_search_state 相同。

返回:一个元组 (beam_search_output, beam_search_state)beam_search_output 是tensor变量的命名元组,字段为 scores,predicted_ids parent_ids。其中 scores,predicted_ids,parent_ids 都含有一个tensor,形状为

BeamSearchDecoder - 图36 ,数据类型为float32 ,int64,int64。beam_search_state 具有与输入参数 beam_state 相同的结构,形状和数据类型。

返回类型:tuple

  • step(time, inputs, states, **kwargs)

执行beam search解码步骤,该步骤使用 cell 来计算概率,然后执行beam search步骤以计算得分并选择候选标记ID。

  • 参数:
    • time (Variable) - 调用者提供的形状为[1]的int64tensor,表示当前解码的时间步长。
    • inputs (Variable) - tensor变量。在第一个解码时间步时与由 initialize() 返回的 initial_inputs 相同,其他时间步与由 step() 返回的 next_inputs 相同。
    • States (Variable) - tensor变量的结构。在第一个解码时间步时与 initialize() 返回的 initial_states 相同,其他时间步与由 step() 返回的 beam_search_state 相同。
    • kwargs - 附加的关键字参数,由调用者提供。

返回:一个元组 (beam_search_output,beam_search_state,next_inputs,finish)beam_search_state 和参数 states 具有相同的结构,形状和数据类型。 next_inputs 与输入参数 inputs 具有相同的结构,形状和数据类型。 beam_search_output 是tensor变量的命名元组(字段包括 scores,predicted_ids,parent_ids ),其中 scores,predicted_ids,parent_ids 都含有一个tensor,形状为

BeamSearchDecoder - 图37 ,数据类型为float32 ,int64,int64。finished 是一个bool类型的tensor,形状为 BeamSearchDecoder - 图38

返回类型:tuple

  • finalize(outputs, final_states, sequence_lengths)

使用 gather_tree 沿beam search树回溯并构建完整的预测序列。

  • 参数:
    • outputs (Variable) - tensor变量组成的结构(命名元组),该结构和数据类型与 output_dtype 相同。tensor将所有时间步的输出堆叠,因此具有形状 BeamSearchDecoder - 图39
    • final_states (Variable) - tensor变量组成的结构(命名元组)。它是 decoder.step 在最后一个解码步骤返回的 next_states,因此具有与任何时间步的 state 相同的结构、形状和数据类型。
    • sequence_lengths (Variable) - tensor,形状为 BeamSearchDecoder - 图40 ,数据类型为int64。它包含解码期间确定的每个beam的序列长度。

返回:一个元组 (predicted_ids, final_states)predicted_ids 是一个tensor,形状为

BeamSearchDecoder - 图41 ,数据类型为int64。final_states 与输入参数 final_states 相同。

返回类型:tuple

  • output_dtype()

用于beam search输出的数据类型的嵌套结构。它是一个命名元组,字段包括 scores, predicted_ids, parent_ids

参数:无。

返回:用于beam search输出的数据类型的命名元组。