其实那么多的attention机制,说白了就是一句话,重新分配权重,比如说现在有一个n维向量[x1, x2, x3..., xn],我觉得x1的值不足以代表其真实情况,所以希望利用x2,...xn的值来对其进行“修补”, 然后就是要找到一组权重w1, w2, w3...wn, 对其求加权平均(也不一定是加权平均,看实际需求)来得到x1的最终值(当然,实际应用中会涉及到一些维度映射,Query-Key-Value等内容,但大体框架都基于此)。
而Self-Attention GAN与之前的non local neural network极为相似(换了个皮?),以下为一些理解。
对于当前得到的feature map X(shape=[C, N],C为channel, N为特征点数,例如在12*12图像中,将其展平,就得到144个特征点),我希望其能够得到更加全局的信息来弥补小卷积核信息获取不足的缺陷。
根据上图,对于feature map X,上面两路是获取attention map, 下面一列是一个线性变换,最后相乘得到最终结果。
对于第一路(f(X)那一行),首先X经过一个1x1 卷积,得到f(x) (shape=[C/8, N],C/8是文中的参数,可自由替换,个人理解是为了减少计算量设置的), 而第二路(g(x)一行),也是一个1x1卷积,得到g(x) (shape=[C/8, N]),然后对f(x)进行转置后与g(x)进行矩阵乘法,得到A2(shape=[N, N]),然后对其每一行进行softmax,即可得到所有特征点对某一个特征点的权重,即attention map A中的每一行相加为1, 第i行的N个数分别代表在第i个点上其余所有点对其的贡献,这样通过每一行就能得到其他所有点对这个点的贡献值,而每一列则可以得到某一个点对其他所有点的贡献值。然后最后一行1x1卷积得到h(x)(shape=[C, N]), 与attention map A的转置相乘(A转置后每一列权重和为1,所以相乘就得到某个点的最终值咯)便得到最终的结果。
下面这个图中的某个点的attention map,我个人理解是指的A的某一列(某一个点对其他所有点的贡献值)。
个人觉得attention map做的事情就是把之前全连接层做的事给在卷积里面再做了一次,稍有不同而已。其实与扩大感受野类似。。。