我正在构建一个聊天机器人,它具有序列到序列编码器解码器模型,如NMT中。从给定的数据中,我可以理解,在训练时,它们将解码器输出与编码器单元状态一起馈送到解码器输入中。我无法弄清楚当我实际实时部署聊天机器人时,我应该如何输入解码器,因为那时我必须预测输出。有人可以帮我解决这个问题吗?
问问题
568 次
1 回答
1
确切的答案取决于您从神经机器翻译模型(NMT) 中获取哪些构建块,以及您将用自己的构建块替换哪些构建块。我假设图形结构与 NMT 中的完全一样。
如果是这样,在推理时,您可以只向解码器提供一个零向量。
内部细节:NMT 使用调用的实体Helper
来确定解码器中的下一个输入(参见tf.contrib.seq2seq.Helper
文档)。
特别是,tf.contrib.seq2seq.BasicDecoder
当它执行一个步骤时仅依赖于 helper:next_inputs
被输入到后续单元格的 正是 的返回值Helper.next_inputs()
。
接口有不同的实现Helper
,例如,
tf.contrib.seq2seq.TrainingHelper
正在返回下一个解码器输入(通常是基本事实)。如教程中所述,此帮助器用于培训。tf.contrib.seq2seq.GreedyEmbeddingHelper
丢弃输入,并argmax
从前一个输出返回采样的令牌。sampling_temperature
当超参数为 0时,NMT 在推理中使用这个助手。tf.contrib.seq2seq.SampleEmbeddingHelper
做同样的事情,但根据分类(又名广义伯努利)分布对令牌进行采样。NMT 在sampling_temperature > 0
.- ...
代码在BaseModel._build_decoder
方法中。请注意,两者GreedyEmbeddingHelper
都不SampleEmbeddingHelper
关心解码器输入是什么。所以事实上你可以喂任何东西,但零张量是标准选择。
于 2018-02-02T19:43:33.243 回答