我正在使用NMT中的序列到序列编码器解码器模型构建聊天机器人。从给出的数据中,我可以理解,训练时它们将解码器输出与编码器单元状态一起馈入解码器输入。我无法弄清楚,当我实际实时部署聊天机器人时,应该如何输入解码器,因为那时候我必须预测输出。有人可以帮我这个忙吗?

最佳答案

确切的答案取决于您从Neural Machine Translation model(NMT)中选择了哪些构建基块,以及您将用自己的构建基块替换哪些构建基块。我假设图形结构与NMT中的完全一样。

如果是这样,则在推理时,您可以仅将零的向量馈送到解码器。



内部详细信息:NMT使用称为Helper的实体来确定解码器中的下一个输入(请参见tf.contrib.seq2seq.Helper文档)。

特别地,tf.contrib.seq2seq.BasicDecoder在执行步骤时仅依赖于helper:馈入后继单元格的next_inputs恰好是Helper.next_inputs()的返回值。

Helper接口的实现方式不同,例如,


tf.contrib.seq2seq.TrainingHelper返回下一个解码器输入(通常是基本事实)。如the tutorial中所述,该帮助程序用于训练中。
tf.contrib.seq2seq.GreedyEmbeddingHelper丢弃输入,并从前一个输出返回argmax采样令牌。当sampling_temperature超参数为0时,NMT会使用此帮助程序进行推断。
tf.contrib.seq2seq.SampleEmbeddingHelper的功能相同,但是根据categorical(也称为广义Bernoulli)分布对令牌进行采样。当sampling_temperature > 0时,NMT会使用此帮助程序进行推断。
...


代码在BaseModel._build_decoder方法中。
注意,GreedyEmbeddingHelperSampleEmbeddingHelper都不关心解码器的输入是什么。因此,实际上您可以提供任何东西,但是零张量是标准选择。

09-27 08:58