使用 Bahdanau 注意力的上下文向量形状

Context vector shape using Bahdanau Attention

我正在 here 关注 Bahdanau 关注 class。我注意到上下文向量的最终形状是 (batch_size, hidden_size)。我想知道鉴于 attention_weights 的形状为 (batch_size, 64, 1) 且特征的形状为 (batch_size, 64, embedding_dim),他们是如何得到这种形状的。他们将两者相乘(我相信它是矩阵乘积)然后在第一个轴上求和。上下文向量中的隐藏大小来自哪里?

Bahdanau注意力产生的上下文向量是编码器所有隐藏状态的加权平均值。来自 Ref 的下图显示了这是如何计算的。本质上,我们执行以下操作。

  1. 计算注意力权重,这是一个(batch size, encoder time steps, 1)大小的张量
  2. 将每个隐藏状态 (batch size, hidden size) 元素乘以 e 值。导致 (batch_size, encoder timesteps, hidden size)
  3. 时间维度上的平均值,结果是 (batch size, hidden size)

给出的答案不正确。在我分享实际答案之前,让我先解释一下原因。

查看提供的超链接中的相关代码。代码中的 'hidden size' 指的是解码器隐藏状态的维度,而不是上面答案所假设的编码器隐藏状态的维度。正如 question-framer mg_nt 正确指出的那样,上面的代码乘法将产生 (batch_size, embedding_dim) 。上下文是编码器输出的加权和,应该具有与编码器尺寸相同 o/ps。数学上也不应该得到(批量大小,隐藏大小)。

当然,在这种情况下,他们在 CNN 上使用 Attention。所以没有这样的编码器,但图像被分解成特征。这些特征是从最后一层收集的,每个特征都是整个图像的一个特定组成部分。来自解码器的隐藏状态……即查询,“关注”所有这些特征并决定哪些是重要的并且需要给予更高的权重以确定标题中的下一个单词。上述代码中的特征形状为(batch_size, embedding_dim),因此经过注意力权重放大或缩小后的上下文形状也为(batch_size, embedding_dim )!

这只是相关代码注释中的一个错误(代码功能本身似乎是正确的)。评论中提到的形状不正确。如果您搜索 'hidden_size' 的代码,则没有这样的变量。它仅在评论中提及。如果您进一步查看编码器和解码器的声明,它们将使用相同的嵌入大小。所以代码有效,但代码中的注释具有误导性和不正确性。仅此而已。