我经历了这个Effective Approaches to Attention-based Neural Machine Translation。在 3.1 部分中,他们提到了两个注意事项之间的差异,如下所示,
-
Luong关注在编码器和解码器中都使用了顶层隐藏层状态。 但 Bahdanau注意采取前向和后向源隐藏状态(顶部隐藏层)的连接。
-
在 Luong关注中,他们在 t 时获得解码器隐藏状态。然后计算注意力得分并从中得到上下文向量,它将与解码器的隐藏状态连接起来然后进行预测。
但在 的 Bahdanau 中,我们会考虑 t-1 解码器的隐藏状态。然后我们如上所述计算对齐,上下文向量。但是,我们将此上下文与 t-1 处的隐藏解码器状态连接起来。所以在softmax之前,这个连接的向量进入GRU。
-
Luong有不同类型的路线。 Bahdanau 只有concat得分对齐模型。
醇>
我只是想为@ shamane-siriwardhana添加一张图片以更好地理解
主要区别在于解码器网络的输出
在a pytorch seq2seq tutorial
中对它们进行了很好的解释
主要区别在于如何评估当前解码器输入和编码器输出之间的相似性。
Luong-style attention:分数= tf.matmul(查询,键,transpose_b = True)
Bahdanau-style attention:得分= tf.reduce_sum(tf.tanh(查询+值),轴= -1)
除了得分和本地/全球关注之外,实际上还有许多差异。差异的简要概述:
[li] Bahdanau等人使用额外的功能从hs_t导出hs_tminus1。我看不出他们为什么要这样做的充分理由,但是Pascanu等人的论文提出了一个线索。也许他们正在寻求使RNN更深入。 Luong当然会直接使用hs_t
- 他们建议使用单向编码器和双向解码器。 Luong既有双向关系。 Luong还建议仅采用顶层输出,通常,它们的模型更简单
- 更著名的一个-在bahdanau的编码器状态下,没有hs_tminus1的点积。相反,它们对两者使用单独的权重,并执行加法运算而不是乘法运算。由于乘法更加直观,这使我困惑了很长时间,直到我读到某个地方加法的资源消耗较少...所以要权衡
在巴赫达瑙,我们可以选择使用多个单位来确定w和u-分别应用于t-1的解码器隐藏状态和编码器隐藏状态的权重。完成此操作后,我们需要向后拉伸张量形状,因此需要与另一个权重v相乘。确定v是简单的线性变换,只需1个单位
- Luong除了给予全球关注外,还给予了我们本地关注。本地注意力是软性注意力和硬性注意力的结合
- Luong为我们提供了许多其他方法来计算注意力权重。..多数涉及点积。.因此,名称为multiplcative。我认为有4个这样的方程式。我们可以选择想要的那个
- 有一些小的变化,例如Luong连接上下文和解码器隐藏状态,并使用一个权重而不是2个单独的权重
- 最后也是最重要的一点是,Luong认为过去的注意力权重历史很重要并有助于预测更好的值,因此Luong将注意力向量提供给下一个时间步
好消息是,大多数都是表面变化。作为一个概念,注意力是如此强大,以至于任何基本的实现都足够。不过,似乎有两件事很重要-将注意力向量传递到下一个时间步和本地注意力的概念(尤其是在资源受限的情况下)。其余的不会对输出产生很大的影响。
有关更多详细信息,请参阅https://towardsdatascience.com/create-your-own-custom-attention-layer-understand-all-flavours-2201b5e8be9e