[论文笔记]Self-Attention Generative Adversarial Networks
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=\gamma o+x
上面简单的从过程上对self-attention机制做了说明,下面对其中一些步骤的具体操作进行说明:
首先同样是通过卷积网络的隐藏层得到卷积的特征图(convolution feature maps)x,然后通过1 \times 1的卷积核得到两个特征空间(feature space)f=W_{f}x和g=W_{g}x然后使用f 和 g 来计算注意力,得到的是[HxW,HxW]的输出,因此表示的是像素点与像素点之间 的相关性。其中经过了softmax函数之后(注意这里是对每一行单独进行softmax),每一行就代表了一种attention机制,其实质是原始feature map中一个像素位置(C个像素点)与其它所有像素位置的关系,HxW行也就对应了原始的HxW个像素位置。公式如下所示
\beta_{j, i}=\frac{\exp \left(s_{i j}\right)}{\sum_{i=1}^{N} \exp \left(s_{i j}\right)}, \text { where } s_{i j}=f\left(x_{i}\right)^{T} g\left(x_{j}\right)
其中\beta_{j,i} 表示在生成第j个位置时对于第i个局部的注意力,然后将结果经过softmax归一化得到注意力图(attention map)。Attention map中的每一行都代表了一种attention机制而h(x)有HxW行和C列。因此两个矩阵相乘就是计算了h(x)每个通道上的所有像素分别经过HxW种attention机制后的结果,经过这个操作,每个像素点都和整张feature map上所有的点建立了联系,实现了self-attention的目的,如下所示
o_{j}=v\left(\sum_{i=1}^{N} \beta_{j, i} h\left(x_{i}\right)\right), h\left(x_{i}\right)=W_{h} x_{i},v\left(x_{i}\right)=W_{v} x_{i}
上述的三个权重矩阵W_{f}、W_{g}、W_{h} 需通过训练学习。最后将注意力层的输出和x进行结合,得到最终的输出{\boldsymbol y_{\boldsymbol i}}=\gamma \boldsymbol{o}_{\boldsymbol{i}}+\boldsymbol{x}_{\boldsymbol{i}}
其中\gamma是一个可学习的参数,并且初始化为0。因为在网络开始训练的时候,还是希望网络先把局部信息学好,初始化为0就表示不采用self-attention模块,而随着训练的进行,网络会开始慢慢尝试使用self-attention模块学习更多长距离的特征。
最终需要优化的损失函数为
\begin{array}{l}{L_{D}=-\mathbb{E}_{(x, y) \sim p_{d a t a}}[\min (0,-1+D(x, y))]-\mathbb{E}_{z \sim p_{z}, y \sim p_{d a t a}}[\min (0,-1-D(G(z), y))]} \\ {L_{G}=-\mathbb{E}_{z \sim p_{z}, y \sim p_{d a t a}} D(G(z), y)}\end{array}
4、实验结果
作者选用的实验评价指标:
Inception Score 用于评价生成图像的清晰度和多样性(值越高越好)
FID 用于评价生成图像的质量(值越低越好)
进行实验前,为了稳定模型的训练,使用了如下的两个技巧:
- Spectral normalization:这个方法可以限制参数的分布(Lipschitz 条件),从而减少梯度爆炸等影响,稳定网络的训练。最初该方法只在判别器中使用,SAGAN中在生成器和判别器中均加入了Spectral normalization。
- two-timescale update rule(TTUR):通常在GAN中G和D采用交替训练的方法,G训练一次后需要训练多次D(常见的是一次G,五次D),SAGAN使用了TTUR的方法,具体来说就是G和D使用不同的学习率(G为0.0001,D为0.0004),使得每一次生成器的训练之后判别器需要更少的训练次数。
下图是上面两个技巧的消融实验结果:

除了和残差网络对比了生成效果外,作者还探索了在不同层使用self-attention模块和残差模块的影响:

可以看到在中高层特征引入Attention机制能取得更好的效果。
最后从下图生成的结果中可以看出,在保证生成图像逼真度的前提下,对于图像中的细节部分也刻画的相对比较好。

5、小结
SAGAN通过引入self-attention模块,使得每个像素点与其它像素点产生了关联,解决了普通卷积结构存在的long-range dependencies(长距离依赖)问题,在提高感受野和减小参数量之间得到了一个更好的平衡。此外为了稳定模型的训练,引入了Spectral normalization和two-timescale update rule(TTUR)。
