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

Python 使用Bahdanau注意的上下文向量形状,python,tensorflow,machine-learning,keras,attention-model,Python,Tensorflow,Machine Learning,Keras,Attention Model,我正在看Bahdanau的注意力课程。我注意到上下文向量的最终形状是(批大小、隐藏大小)。我想知道他们是如何得到这个形状的,因为注意力权重有形状(batch\u size,64,1),功能有形状(batch\u size,64,embedded\u dim)。他们将两者相乘(我相信这是一个矩阵积),然后在第一个轴上求和。上下文向量中的隐藏大小来自哪里?由Bahdanau注意产生的上下文向量是编码器所有隐藏状态的加权平均值。下图显示了如何计算该值。基本上我们做了以下工作 计算注意力权重,这是一个(

我正在看Bahdanau的注意力课程。我注意到上下文向量的最终形状是
(批大小、隐藏大小)
。我想知道他们是如何得到这个形状的,因为注意力权重有形状
(batch\u size,64,1)
,功能有形状
(batch\u size,64,embedded\u dim)
。他们将两者相乘(我相信这是一个矩阵积),然后在第一个轴上求和。上下文向量中的隐藏大小来自哪里?

Bahdanau
注意产生的上下文向量是编码器所有隐藏状态的加权平均值。下图显示了如何计算该值。基本上我们做了以下工作

  • 计算注意力权重,这是一个
    (批量大小,编码器时间步长,1)
    大小的张量
  • 将每个隐藏状态
    (批量大小,隐藏大小)
    元素与
    e
    值相乘。导致
    (批量大小、编码器时间步长、隐藏大小)
  • 时间维度上的平均值,导致
    (批量大小、隐藏大小)

  • 给出的答案不正确。让我先解释一下原因,然后再分享实际答案

    请查看提供的超链接中的相关代码。代码中的“隐藏大小”是指解码器隐藏状态的尺寸,而不是上述答案假设的编码器隐藏状态。上述代码中的乘法将产生(批大小、嵌入大小)问题架构师MGNT正确地指出。。上下文是编码器输出的加权和,应具有与编码器o/p相同的维度。从数学上讲,也不应获得(批量大小、隐藏大小)

    当然,在这种情况下,他们是通过CNN使用注意力。因此没有编码器,但是图像被分解成不同的特征。这些特征是从最后一层(但只有一层)收集的,每个特征都是整个图像的特定组成部分。译码器的隐藏状态..即查询'关注所有这些功能,并决定哪些功能是重要的,需要给予更高的权重以确定标题中的下一个单词。上述代码中的特征形状是(批量大小,嵌入大小),因此,被注意权重放大或缩小后的上下文形状也是(批量大小,嵌入大小)


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

    是否必须为每个解码器单元重新计算上下文向量?如果这是在解码器内部完成的,还是必须在解码器外部作为全局模型的一部分执行的逻辑?@user7331538,是的,每个解码器单元的上下文向量将不同,因为不同的解码器单元关注不同的事情。您可以将注意力作为解码器的一部分,也可以将其作为单独的东西。您只需要传递编码器输出和解码器输出来计算上下文向量,仅此而已