这两个注意力机制在 seq2seq 模块中使用。 this TensorFlow 文档中将两种不同的注意力作为乘法注意力和加性注意力引入。有什么区别?
我经历了这个基于注意力的神经机器翻译的有效方法。在3.1节中他们提到了两个注意力之间的区别,如下,
Luong 注意在编码器和解码器中都使用了顶部隐藏层状态。 但是 Bahdanau 注意力 采用前向和后向源隐藏状态(顶部隐藏层)的串联。
在Luong注意力中,他们在时间t获得解码器隐藏状态。然后计算注意力分数,并从中得到上下文向量,该向量将与解码器的隐藏状态连接起来,然后进行预测。
但是在Bahdanau时间t我们考虑解码器的t-1隐藏状态。然后我们如上所述计算对齐方式、上下文向量。但随后我们将此上下文与解码器的隐藏状态连接在 t-1 处。因此,在 softmax 之前,这个串联向量会进入 GRU 内部。
Luong 有不同类型的对齐方式。 Bahdanau 只有 concat 分数对齐模型。
它们在 PyTorch seq2seq 教程中得到了很好的解释。
主要区别在于如何对当前解码器输入和编码器输出之间的相似性进行评分。
除了评分和本地/全局关注度之外,实际上还有很多差异。差异的简要总结:
好消息是,大多数都是表面的变化。注意力作为一个概念是如此强大,任何基本的实现都足够了。有两件事似乎很重要 - 将注意力向量传递到下一个时间步骤和局部注意力的概念(特别是在资源受限的情况下)。其余的对输出影响不大。
Luong式注意力:scores = tf.matmul(query, key, transpose_b=True)
Bahdanau 式注意力:scores = tf.reduce_sum(tf.tanh(query + value), axis=-1)
参考这篇文章。我最近写了它,并认为这个概念可以使用一些图解解释。