0%

Bilinear Attention Networks

Bilinear Attention Networks

Pub in NeuraIPS’18, by Jin-Hwa Kim, 首尔国立大学。

VQA的任务,主要关注attention部分。下图来自原论文Figure 1。

image-20191117174946648

1.输入矩阵X和Y,分别表示文本和图像两个部分的feature map。

其中文本特征矩阵X的长度是(对应原文的),图像特征图Y的长度是(对应原文的,这里的是图像检测的object数量)。

2.计算Raw Attention Weight。

目标是得到一个矩阵,而后可以从dim1或者dim2进行softmax:

  • dot attention:,需要两个feature的维度相同,而且缺少feature维度的线性变换。
  • bilinear attention:,可以认为线性变换之后的X feature map与Y进行dot attention,但是W参数量可能很大。
  • low-rank bilinear attention: , 把W分解为,其中
  • Optimized:上面的计算等价于,也就是Figure 1中的计算。
  • low-rank bilinear pooling:如果我们把上面一步的矩阵运算分开来,也就是一个向量一个向量的计算,并引入pooling矩阵,那么得到:,这里得到的,也就是得到了G个raw attention weight。

3.计算attention weight并使用。

目标是得到softmax之后的attention weight,并得到最终的特征输出。

  • 计算attention weight:从2中的输出,如果G>1就是multi-head attention,对dim1或者dim2进行softmax之后得到,这里假设希望得到X的表示,那么就表示在Y上的G种注意力权重。
  • unitary attention networks:计算结果是first:【X aware Y representation】或者second:【Y aware X representation】,和上一步一样假如目标是后一个的话,那么计算方式为,也就是G个注意力权重加权求和的向量拼接在一起。
  • bilinear attention map:论文中引入的与2中很相似的计算方式,但又有些不同,首先single-head的attention map计算方式:,和2中最后一步相同,而后把这个公式推广到multi-glimpse形式:,不同的glimpse阶段使用不同的A。注意这里的glimpse和multi-head有所区别。
  • bilinear attention networks:上上一步我们得到的那个,它只是缩减了其中一个输出Y的channel,但是如果是进行分类问题,希望一次性得到一个的表示向量怎么办呢?公式5:,其中。最后再pooling一次得到输出:。整个过程表示为
  • Residual learning:,首先增加了输出输出之间的连接,其次输出的向量被复制为份并加到输入。最终还是以X的表示为基础,不断使用X和Y的表示来增强原有的表示,整个过程持续G次(称为G-glimpse),最终分类器使用最后一个阶段的输出的sum:

最后的瞎想:

关于两个个feature map:X和Y进行interaction,不加残差的情况下其实有点奇怪,因为想得到【Y aware X representation】,那么希望计算的是fusion了Y的X的信息,最终每个位置却变成了Y的表示的加权求和,X的信息被丢掉了(只用来计算了attention weight)。就像Graph Attention Networks,每个节点的信息等于其邻居信息的加权求和却没有自己的原始信息。所以在进行feature fusion的时候应该加入残差连接,保留主要信息,而interaction得到的表示作为其补充。