我正在使用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
方法中。
注意,GreedyEmbeddingHelper
和SampleEmbeddingHelper
都不关心解码器的输入是什么。因此,实际上您可以提供任何东西,但是零张量是标准选择。