我正在构建一个带有序列的chat-bot来编码编码器解码器模型,如NMT . 根据给出的数据,我可以理解,在训练时,它们将解码器输出与编码器单元状态一起馈送到解码器输入 . 我无法弄清楚当我实际部署实时聊天机器人时,我应该如何输入解码器,因为那时我必须预测输出 . 请有人帮我解决这个问题吗?
确切的答案取决于您从Neural Machine Translation model(NMT)获取哪些构建块以及您将用自己的构建块替换哪些构建块 . 我假设图形结构与NMT完全相同 .
如果是这样,在推理时,您可以只向解码器提供一个零向量 .
Internal details :NMT使用名为 Helper 的实体来确定解码器中的下一个输入(请参阅tf.contrib.seq2seq.Helper文档) .
Helper
特别是,tf.contrib.seq2seq.BasicDecoder在执行一个步骤时仅依赖于辅助程序: next_inputs 被输入到后续单元格正好是 Helper.next_inputs() 的返回值 .
next_inputs
Helper.next_inputs()
有 Helper 接口的不同实现,例如,
tf.contrib.seq2seq.TrainingHelper正在返回下一个解码器输入(通常是地面实况) . 该助手用于训练,如the tutorial所示 .
tf.contrib.seq2seq.GreedyEmbeddingHelper丢弃输入,并从前一个输出返回 argmax 采样标记 . 当 sampling_temperature hyper-parameter为0时,NMT在推理中使用此帮助程序 .
argmax
sampling_temperature
tf.contrib.seq2seq.SampleEmbeddingHelper也这样做,但根据categorical(a.k.a . 广义伯努利)分布对令牌进行采样 . sampling_temperature > 0 时,NMT在推理中使用此帮助程序 .
sampling_temperature > 0
......
代码在BaseModel._build_decoder方法中 . 请注意, GreedyEmbeddingHelper 和 SampleEmbeddingHelper 都不关心解码器输入是什么 . 所以实际上你可以提供任何东西,但零张量是标准选择 .
GreedyEmbeddingHelper
SampleEmbeddingHelper
1 回答
确切的答案取决于您从Neural Machine Translation model(NMT)获取哪些构建块以及您将用自己的构建块替换哪些构建块 . 我假设图形结构与NMT完全相同 .
如果是这样,在推理时,您可以只向解码器提供一个零向量 .
Internal details :NMT使用名为
Helper
的实体来确定解码器中的下一个输入(请参阅tf.contrib.seq2seq.Helper文档) .特别是,tf.contrib.seq2seq.BasicDecoder在执行一个步骤时仅依赖于辅助程序:
next_inputs
被输入到后续单元格正好是Helper.next_inputs()
的返回值 .有
Helper
接口的不同实现,例如,tf.contrib.seq2seq.TrainingHelper正在返回下一个解码器输入(通常是地面实况) . 该助手用于训练,如the tutorial所示 .
tf.contrib.seq2seq.GreedyEmbeddingHelper丢弃输入,并从前一个输出返回
argmax
采样标记 . 当sampling_temperature
hyper-parameter为0时,NMT在推理中使用此帮助程序 .tf.contrib.seq2seq.SampleEmbeddingHelper也这样做,但根据categorical(a.k.a . 广义伯努利)分布对令牌进行采样 .
sampling_temperature > 0
时,NMT在推理中使用此帮助程序 .......
代码在BaseModel._build_decoder方法中 . 请注意,
GreedyEmbeddingHelper
和SampleEmbeddingHelper
都不关心解码器输入是什么 . 所以实际上你可以提供任何东西,但零张量是标准选择 .