1、文献综述
文章链接:链接
文章题目:《Self-Attention Generative Adversarial Networks》
项目地址:1.TensorFlow版 2.pytorch版
2、文献导读
本文提出了Self-Attention Generative Adversarial Networks,该网络可以为图像生成任务提供注意力机制的远距离依赖(long-range dependency)关系建模。(1)传统的卷积GAN上高分辨率详细信息仅由低分辨率特征图中空间上局部点的提供生成。而在在SAGAN中,则可以使用来自所有要素位置的提示来生成详细信息。(2)因为判别器可以检查图像的远端部分中的高度详细的特征是否彼此一致。而最近的研究表明,生成器条件会影响GAN性能。故利用这种见解,将谱归一化(spectral normalization)应用于GAN生成器中,并发现这可以改善训练动态对生成器进行有效的调节继而影响GAN网络的性能。
3、文献详细介绍
文章作者观察到卷积GAN在多种类别的数据集上进行训练时,在建模某些图像类时比其他模型困难得多,也即GAN在合成具有很少结构约束的图像类会比较容易(例如例如,海洋,天空和景观类方面表现出色,它们在纹理上比几何上更能区分。)
对于上述,可能原因有
- 对此的一种可能解释是先前的模型严重依赖卷积来对不同图像区域之间的依赖关系进行建模。 由于卷积算子具有局部感受野,因此只有在经过几个卷积层后才能处理长距离依赖性(long-range dependency)关系。 这可能会由于多种原因而阻止学习长期依赖关系:
- 小型模型可能无法找到他们之间的依赖关系;
- 优化算法可能无法发现仔细协调多个层以捕获这些依赖性的参数值;
- 增加卷积核的大小可以增加网络的表示能力,但是又会丧失卷积网络的参数和计算效率。
针对以上可能的原因,作者受到self-attention启发,找到解决办法:
- Self-attention 在模拟远程依赖性的能力、计算效率和统计效率之间展现出更好的平衡。自我关注模块将所有位置处的特征的加权和作为该位置的响应,其中权重 - 或注意向量 - 仅以较小的计算成本来计算。故提出了自我注意生成对抗网络(SAGAN),它将self-attention机制引入卷积GAN。
- 可以很好的处理长范围、多层次的依赖(可以很好的发现图像中的依赖关系);
- 生成图像时每一个位置的细节和远端的细节协调好;
- 判别器还可以更准确地对全局图像结构实施复杂的几何约束。
提出的SAGAN通过利用图像的远处而不是固定形状的局部区域中的互补特征来生成图像,以生成一致的对象/场景。 在下图的每一行中,第一张图片显示了五个具有颜色编码点的代表性查询位置。 其他五幅图像是这些查询位置的注意力图,带有相应的颜色编码的箭头总结了关注最多的区域。从中我们可以看出,在GAN中引入注意力机制后,当生成图像中的每一个点时,我们可以考虑全局中与它可能相关的点,而不只是局限于附近固定形状的点。
那SAGAN具体是如何将Self-Attention和GAN结合起来的呢?下面我们通过文中提供的示意图来看一下,如下所示:
如上对于某一个卷积层之后输出的feature maps(x),整个模块有以下步骤:
- 分别经过三个1x1卷积结构的分支f(x)、g(x)和h(x),特征图的尺寸均不变,f(x)和g(x)改变了通道数(C/k),h(x)的输出保持通道数也不变;(文章中选择的k为8)
- 对于H和W两个维度进行合并,将f(x)的输出转置后和g(x)的输出矩阵相乘,经过softmax归一化得到一个 [HxW,HxW] 的attention map;
- 将attention map与h(x)的输出进行矩阵相乘,得到一个 [HxW,C] 的特征图,经过一个1x1的卷积结构,并把输出重新reshape为[H,W,C],得到此时的feature maps(o);
- 最终输出的特征图为: y = γ o + x y=\gamma o+x y=γo+x
上面简单的从过程上对self-attention机制做了说明,下面对其中一些步骤的具体操作进行说明:
首先同样是通过卷积网络的隐藏层得到卷积的特征图(convolution feature maps) x x x,然后通过 1 × 1 1 \times 1 1×1的卷积核得到两个特征空间(feature space) f = W f x f=W_{f}x f=Wfx和 g = W g x g=W_{g}x g=Wgx然后使用 f f f 和 g g g 来计算注意力,得到的是[HxW,HxW]的输出,因此表示的是像素点与像素点之间的相关性。其中经过了softmax函数之后(注意这里是对每一行单独进行softmax),每一行就代表了一种attention机制,其实质是原始feature map中一个像素位置(C个像素点)与其它所有像素位置的关系,HxW行也就对应了原始的HxW个像素位置。公式如下所示
β j , i = exp ( s i j ) ∑ i = 1 N exp ( s i j ) , where s i j = f ( x i ) T g ( x j ) \beta_{j, i}=\frac{\exp \left(s_{i j}\right)}{\sum_{i=1}^{N} \exp \left(s_{i j}\r