我正在尝试理解 RNN 的序列到序列学习。到目前为止我所理解的是编码器的输出用于调节解码器。
但是,我有两个来源,在我看来,它们的调节方式不同,我想知道哪种方式有效(可能两者都有效),或者我是否错过了某些内容。
来源:自然语言处理的神经网络方法,作者:Yoav Goldberg
据我了解作者,解码器在每一步中都使用状态向量和解码器输出以及序列的下一部分进行操作。 因此,解码器的状态向量与编码器的结果是分开的。
来源:Francois Chollet 对 Keras 中序列到序列学习的十分钟介绍
据我了解作者和来源,解码器提供编码器状态作为初始状态。 因此,解码器的状态向量是解码器的输出。解码器步骤仅取决于编码器通过状态向量的输出。
最佳答案
有很多方法可以将编码器输出馈送到解码器;要么连续地将其输入解码器,要么允许它实例化解码器隐藏状态(直接或在浅层变换之后),或者甚至通过将解码器输出与编码器输出连接起来,然后将两者传递给最终输出预测(参见 Cho 等人'14)。一般来说,输入解码器的每个额外向量都会以相当不利的方式扩展其计算复杂性;例如,如果您决定将编码器输出 E 作为每一步的输入,则可以将输入空间从“X”增加到“X+E”,这意味着参数空间增加了 E*H(在简单的 RNN 情况下) ,即不考虑门控),其中 H 是隐藏大小。这确实增加了网络的容量,但也增加了其过度拟合的倾向,但这有时是必要的(例如,当您尝试解码为长输出序列时,网络需要不断“提醒”其正在做什么) 。
无论如何,形式主义保持不变;解码器始终以编码器输出为条件,因此您将始终最大化 p(yt | yt-1...y0, X) - 差异在于您决定如何将输入上下文考虑到模型中。
关于nlp - seq2seq 学习中解码器是如何调节的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629049/