我正在构建一个带有序列到序列编码器解码器模型的聊天机器人,如 NMT 所示。 。从给出的数据中我可以了解到,在训练时,它们将解码器输出与编码器单元状态一起馈送到解码器输入中。我无法弄清楚当我实际实时部署聊天机器人时,我应该如何将什么输入到解码器中,因为那时我必须预测输出。有人可以帮我解决这个问题吗?
最佳答案
确切的答案取决于您从 Neural Machine Translation model 中获取的构建 block (NMT)以及您将用自己的替换哪些。我假设图结构与 NMT 中的完全一样。
如果是这样,在推理时,您可以只向解码器提供一个零向量。
<小时/>内部详细信息:NMT 使用名为 Helper
的实体来确定解码器中的下一个输入(请参阅 tf.contrib.seq2seq.Helper
文档)。
特别是,tf.contrib.seq2seq.BasicDecoder
在执行步骤时仅依赖于 helper:输入到后续单元格的 next_inputs
正是 Helper.next_inputs()
的返回值。
Helper
接口(interface)有不同的实现,例如,
-
tf.contrib.seq2seq.TrainingHelper
返回下一个解码器输入(通常是基本事实)。该助手用于训练,如 the tutorial 中所示。 . -
tf.contrib.seq2seq.GreedyEmbeddingHelper
丢弃输入,并返回先前输出中的 argmax 采样标记。当sampling_Temperature
超参数为 0 时,NMT 使用此辅助函数进行推理。 -
tf.contrib.seq2seq.SampleEmbeddingHelper
执行相同的操作,但根据 categorical 对 token 进行采样(又名广义伯努利)分布。当sampling_Temperature > 0
时,NMT 使用此辅助函数进行推理。 - ...
代码位于 BaseModel._build_decoder
方法。
请注意,GreedyEmbeddingHelper 和 SampleEmbeddingHelper 都不关心解码器输入是什么。所以事实上你可以喂任何东西,但零张量是标准选择。
关于tensorflow - 聊天机器人的 Seq2Seq 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48017090/