我正在尝试了解RNN的序列到序列学习。到目前为止,我了解的是编码器的输出用于调节解码器。
但是,我有两个消息来源,我认为这有不同的处理方式,我想知道哪种方法是有效的(可能是两种方式)还是我错过了什么。
来源:Yoav Goldberg的自然语言处理的神经网络方法
据作者了解,解码器在每个步骤中都使用状态向量进行操作,并且解码器输出并在序列的下一部分进行操作。 因此,解码器的状态向量与编码器的结果分离。来源:Francois Chollet在Keras中对序列学习的十分钟介绍
据我了解作者和消息来源,解码器具有作为初始状态的编码器状态。 因此,解码器的状态向量是解码器的输出。解码器的步骤仅取决于通过状态向量输出的编码器。
答案 0 :(得分:1)
有很多方法可以将编码器的输出馈送到解码器中。要么连续将其馈送到解码器中,要么允许它实例化解码器的隐藏状态(直接或在浅层转换之后),或者甚至在将解码器的输出与编码器的输出传递给最终输出预测之前将其连接起来(参见Cho et al.14)。通常,您输入到解码器中的每个额外向量都会以不利的方式扩展其计算复杂度。例如,如果您决定将编码器输出E作为每一步的输入,则将输入空间从“ X”增加到“ X + E”,这意味着参数空间增加E * H(在简单的RNN情况下) ,即不考虑选通),其中H是您的隐藏大小。这的确增加了网络的容量,但也增加了过拟合的趋势,但是有时这是必要的(例如,当您尝试解码为长输出序列时,其中网络需要不断“提醒”其工作的内容) 。
无论如何,形式主义保持不变;解码器始终以编码器输出为条件,因此您将始终最大化p(y t | y t-1 ... y 0 ,X)-区别在于您决定如何在模型中考虑输入上下文。