这两个注意力用于seq2seq模块。在这个TensorFlow 文档中,这两种不同的注意力被介绍为乘法和加法注意力。有什么区别?
5 回答
我经历了这种基于注意力的神经机器翻译的有效方法。在3.1节中,他们提到了两个注意力之间的区别,如下所示,
Luong attention在编码器和解码器中都使用了顶层隐藏层状态。但Bahdanau 注意力采用前向和后向源隐藏状态(Top Hidden Layer)的串联。
在Luong attention中,他们在时间t获得解码器隐藏状态。然后计算注意力分数,并从中得到上下文向量,该向量将与解码器的隐藏状态连接,然后进行预测。
但是在时间t的Bahdanau中,我们考虑解码器的大约t-1 个隐藏状态。然后我们如上所述计算对齐,上下文向量。但随后我们将这个上下文与解码器在t-1的隐藏状态连接起来。所以在 softmax 之前,这个连接的向量进入了 GRU。
Luong有不同类型的对齐方式。Bahdanau只有 concat 分数对齐模型。
它们在PyTorch seq2seq 教程中得到了很好的解释。
主要区别在于如何对当前解码器输入和编码器输出之间的相似性进行评分。
除了评分和本地/全球关注度之外,实际上还有很多差异。差异的简要总结:
- Bahdanau 等人使用一个额外的函数从 hs_t 导出 hs_tminus1。我在任何地方都没有看到他们为什么这样做的充分理由,但 Pascanu 等人的一篇论文提出了一个线索……也许他们正在寻求让 RNN 更深入。Luong 当然直接使用 hs_t
- 他们推荐单向编码器和双向解码器。Luong 具有双向性。Luong 还建议只采用顶层输出,一般来说,他们的模型更简单
- 更著名的一个 - 在 Bahdanau 的编码器状态中没有 hs_tminus1 的点积。相反,他们对两者都使用单独的权重,并进行加法而不是乘法。这让我困惑了很长一段时间,因为乘法更直观,直到我在某处读到加法占用的资源较少……所以需要权衡
- 在 Bahdanau 中,我们可以选择使用多个单元来确定 w 和 u——分别应用于 t-1 的解码器隐藏状态和编码器隐藏状态的权重。完成后,我们需要将张量形状向后按摩,因此,需要与另一个权重 v 相乘。确定 v 是一个简单的线性变换,只需要 1 个单位
- 除了全球关注之外,Luong 还为我们提供了本地关注。局部注意力是软注意力和硬注意力的结合
- Luong 为我们提供了许多其他计算注意力权重的方法..大多数涉及点积..因此得名乘法。我认为有 4 个这样的方程。我们可以挑选我们想要的
- 有一些小的变化,例如 Luong 连接上下文和解码器隐藏状态,并使用一个权重而不是 2 个单独的权重
- 最后也是最重要的一点是,Luong 将注意力向量提供给下一个时间步,因为他们认为过去的注意力权重历史很重要,有助于预测更好的值
好消息是,大多数都是表面上的变化。注意力作为一个概念是如此强大,以至于任何基本的实现都足够了。不过,有两件事似乎很重要——注意力向量传递到下一个时间步和局部注意力的概念(尤其是在资源有限的情况下)。其余的不会对输出产生很大影响。
Luong 式注意:scores = tf.matmul(query, key, transpose_b=True)
Bahdanau 式注意力:scores = tf.reduce_sum(tf.tanh(query + value), axis=-1)