【问题标题】:Context vector shape using Bahdanau Attention使用 Bahdanau Attention 的上下文向量形状
【发布时间】:2020-05-18 18:20:42
【问题描述】:

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

【问题讨论】:

    标签: python tensorflow machine-learning keras attention-model


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      Bahdanau attention 产生的上下文向量是编码器所有隐藏状态的加权平均值。来自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)

      【讨论】:

      • 是否必须为每个解码器单元重新计算上下文向量?如果是这样,这是在解码器本身内部完成的,还是必须是在解码器外部作为全局模型的一部分执行的逻辑?
      • @user7331538,是的,每个解码器单元的上下文向量都是不同的,因为不同的解码器单元关注不同的事物。您可以将注意力作为解码器的一部分,或者将其作为一个单独的东西。你只需要传递编码器输出和解码器输出来计算上下文向量,就是这样
      猜你喜欢
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多