我正在构建一个带有序列的chat-bot来编码编码器解码器模型,如NMT中所示。根据给出的数据,我可以理解,在训练时,它们将解码器输出与编码器单元状态一起馈送到解码器输入。我无法弄清楚当我实际部署实时聊天机器人时,我应该如何输入解码器,因为那时我必须预测输出。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
确切的答案取决于您从Neural Machine Translation model(NMT)获取的构建块以及您将用自己的构建块替换的构建块。我假设图形结构与NMT完全相同。
如果是这样,在推理时,你只能向解码器提供一个零向量。
内部细节: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
超参数为0时,NMT在推理中使用此帮助程序。tf.contrib.seq2seq.SampleEmbeddingHelper
也会这样做,但会根据categorical(a.k.a. generalized Bernoulli)分布对令牌进行抽样。在sampling_temperature > 0
。代码采用BaseModel._build_decoder
方法。
请注意,GreedyEmbeddingHelper
和SampleEmbeddingHelper
都不关心解码器的输入。所以实际上你可以提供任何东西,但零张量是标准选择。