Luong 注意力和 Bahdanau 注意力有什么区别?

What is the difference between Luong attention and Bahdanau attention?

这两个attention用在seq2seq模块中。在 this TensorFlow 文档中将这两种不同的注意作为乘法和加法注意进行了介绍。有什么区别?

它们在 a PyTorch seq2seq tutorial 中有很好的解释。

主要区别在于如何对当前解码器输入和编码器输出之间的相似性进行评分。

我经历了这个Effective Approaches to Attention-based Neural Machine Translation。在3.1一节中,他们提到了两个attention的区别如下,

  1. Luong attention 在编码器和解码器中都使用了顶层隐藏层状态。 但是Bahdanau 注意力 将前向和后向源隐藏状态(顶层隐藏层)串联起来

  2. Luong attention他们在时间t[=43得到解码器隐藏状态=].然后计算注意力分数,并从中得到上下文向量,它将与解码器的隐藏状态连接起来,然后进行预测。

    但是在 Bahdanau 时间 t 我们考虑 t-1 解码器的隐藏状态。然后我们如上所述计算对齐,上下文向量。但随后我们将此上下文与 t-1 处解码器的隐藏状态连接起来。所以在 softmax 之前,这个连接的向量进入 GRU 内部。

  3. Luong 有不同类型的排列。 Bahdanau 只有 concat 分数比对模型。

我只是想添加一张图片以便更好地理解@shamane-siriwardhana

主要区别在于解码器网络的输出

Luong-style attention: scores = tf.matmul(query, key, transpose_b=True)

Bahdanau-style attention: scores = tf.reduce_sum(tf.tanh(query + value), axis=-1)

除了打分和local/global注意力之外,其实还有很多不同。差异的简要总结:

  1. Bahdanau 等人使用一个额外的函数从 hs_t 中导出 hs_{t-1}。我在任何地方都看不到他们为什么这样做的充分理由,但 Pascanu 等人的一篇论文提出了一个线索……也许他们正在寻求使 RNN 更深入。 Luong当然直接使用hs_t
  2. Bahdanau 推荐单向编码器和双向解码器。 Luong 两者都是单向的。 Luong 还建议只采用顶层输出;一般来说,他们的模型更简单
  3. 比较有名的一个——在 Bahdanau 中没有 hs_{t-1}(解码器输出)与编码器状态的点积。相反,他们对两者使用单独的权重并进行加法而不是乘法。这让我困惑了很长一段时间,因为乘法更直观,直到我在某处读到加法占用资源较少……所以需要权衡
  4. 在 Bahdanau 中,我们可以选择使用多个单元来确定 w 和 u - 分别应用于 t-1 处的解码器隐藏状态和编码器隐藏状态的权重。完成后,我们需要向后按摩张量形状,因此需要与另一个权重 v 相乘。确定 v 是一个简单的线性变换,只需要 1 个单位
  5. Luong 除了全球关注外,还给我们本地关注。局部注意力是软注意力和硬注意力的结合
  6. Luong 为我们提供了许多其他方法来计算注意力权重..大多数涉及点积..因此得名 multiplcative。我认为有 4 个这样的方程式。我们可以挑选我们想要的
  7. 有一些小的变化,比如 Luong 将上下文和解码器隐藏状态连接起来,并使用一个权重而不是 2 个单独的权重
  8. 最后也是最重要的一点是,Luong 将注意力向量提供给下一个时间步长,因为他们认为过去的注意力权重历史很重要,有助于预测更好的值

好消息是大多数都是表面的变化。注意力作为一个概念是如此强大以至于任何基本的实现都足够了。不过有两件事似乎很重要——将注意力向量传递到下一个时间步和局部注意力的概念(尤其是在资源受限的情况下)。其余的对输出影响不大。

更具体的细节请参考https://towardsdatascience.com/create-your-own-custom-attention-layer-understand-all-flavours-2201b5e8be9e