在序列到序列中,为什么将解码器的输出用作其输入?
在 seq2seq 中,他们通过将任何字符/单词序列分解为时间前向条件来模拟任何字符/单词序列的联合分布:
这可以通过按升序对每个条件进行采样来进行采样。所以,这正是他们试图模仿的。您希望第二个输出取决于采样的第一个输出,而不是其分布。
这就是为什么隐藏状态不适合对此设置建模的原因,因为它是分布的潜在表示,而不是分布的样本。
注意:在训练中,他们默认使用 ground-truth 作为输入,因为它在假设模型应该已经预测正确的单词的情况下工作,如果没有,单词/字符级别损失的梯度将反映(这被称为教师强迫,有很多陷阱)。
来自先前时间戳的 RNN 的隐藏状态难道还不够吗?
理论上生成一个序列就足够了。但是,允许输入提供了一些方便的附加功能:
输出序列的训练数据被使用两次——一次作为输入(作为先前的序列数据),一次作为目标(建立损失度量)。这可能有助于训练过程,因为解码器既可以作为新序列类型的解码器进行训练,也可以作为输出序列上的预测模型半独立地进行训练——即从输入到 RNN 层的权重分别受到误差梯度的影响,与先前隐藏状态之间的权重不同和下一个状态,虽然这两组权重一起影响输出和下一个状态,所以在一个序列上并不完全独立。
通过允许输入到目前为止生成的序列,解码器可以作为生成器工作,其中序列中的下一项不需要是最大概率项,但可以被采样或应用规则。这允许使用诸如BEAM 搜索(通常用于机器翻译)之类的方法,该方法可以维护几个潜在的输出,并在最后选择最好的一个。
我没有做过实验,但我怀疑第一项会导致更快更好的泛化。第二种对于自然语言生成和类似问题非常方便。
在最初的 seq2seq 论文中,他们使用了两个 RNN,一个用于编码,一个用于解码。在编码器中,他们需要展开输入以捕获时间依赖性。现在,如果我们想将隐藏状态从编码器传递到解码器,这意味着解码器的隐藏状态形状需要与编码器匹配(也就是相同的架构)。由于架构是相同的,我们不能直接在解码器中生成一个包含 n 个样本的序列而不展开它,也不能在没有输入的情况下展开它。