Self-Attention Generative Adversarial Networks
TensorFlow代码:https://github.com/taki0112/Self-Attention-GAN-Tensorflow
Pytorch代码(作者源码):https://github.com/heykeetae/Self-Attention-GAN
看论文之前看了两篇比较好的文章:https://blog.csdn.net/z704630835/article/details/86648924
https://blog.csdn.net/HaoTheAnswer/article/details/82733234
本文为主要是自己对论文的理解与总结,实验结果没有附上,可在论文里获取。
论文原文链接:https://arxiv.org/abs/1805.08318
Work:
- introduce self-attention to the GAN framework (both G and D)
- Techniques to Stabilize the Training of GANs
Spectral normalization for both generator and discriminator
Imbalanced learning rate for generator and discriminator updates
(two-time scale update rule (TTUR) TTUR)
这篇论文主要做的工作:
- 为GAN的G网和D网引入了自注意力机制,用来捕获全局依赖性。之前的GANs模型更易捕获纹理特征,而不是几何、结构这种全局特征。
- 加入了两个稳定GAN 的技巧。Spectral normalization(谱归一化)和two-time scale update rule(TTUR),G网和D网用采用两种学习速率(更新规则)。
一、前言
convolutional GANs have more difficulty in modeling multi-class dataset.
卷积网络的GAN对建模多类别数据集比较困难。
传统的卷积方法只根据低分辨率特征图中的空间局部点生成高分辨率细节。因为卷积算子有一个局域接受域,距离较远的依赖关系只能在经过几个卷积层之后才能处理。这阻止了学习长期依赖关系,可能由于各种原因:一个小模型可能无法表示他们。
优化算法可以协调多层来捕获这些依赖项,可能难以发现参数值。这些参数化可能在统计上是脆弱的,当应用到前所未有的非常大的输入,容易失败。增大卷积核的大小可以提高网络的表示能力,但是这样做也会损失使用局部卷积结构获得的计算和统计效率。
另外,the state-of-the-art(最先进的) ImageNet GAN model注重纹理,不注重几何形状,很难捕捉只出现在几类里的几何、结构模式(比如,狗,猫现实纹理区别很大,但是没有清楚的分离的脚。)
在SAGAN中,为GAN引入Self-Attention自注意力机制,用于捕获全局依赖性。可以使用来自所有特征位置的提示生成细节,更注意全局性。
本文工作:introduce a self-attention mechanism into convolutional GANs. The self-attention module is complementary to convolutions and helps with modeling long range, multi-level dependencies across image regions.
自注意力模块被引入,作为卷积的一个补偿,用来帮助建模整个图像区域的长期、多层次的依赖关系。
二、自注意力机制模块
Convolution processes the information in a local neighborhood, thus using convolutional layers alone is computationally inefficient for modeling long-range dependencies in images.
(分析同上)
In this section, we adapt the non-local model of (Wang et al., 2018) to introduce self-attention to the GAN framework, enabling both the generator and the discriminator to efficiently model rela-
tionships between widely separated spatial regions.
为GAN的G和D都引入自注意力机制使得有效地建模(捕获)相隔很远的空间区域之间的关系。
注意力机制解读链接:
https://blog.csdn.net/malefactor/article/details/78767781 深度学习中的注意力机制
https://blog.csdn.net/hpulfc/article/details/80448570
βj,i表示模型在合成j区域时关注第i个区域的程度。C是通道数,N是前一个隐藏层的特征位置的数量。
图中1x1卷积的理解:
(自己的理解,可能不太对。。。。。。)
来自上一层隐藏层的图像特征x∈RC*N被转换到两个特征空间f,g。然后接着去计算注意力。
fx=Wfx,gx=Wgx,
Wf,Wg实施了1x1卷积,根据代码理解:
f = conv(x, ch // 8, kernel=1, stride=1, sn=sn, scope='f_conv') # [bs, h, w, c']
g = conv(x, ch // 8, kernel=1, stride=1, sn=sn, scope='g_conv') # [bs, h, w, c']
其中,filter的位置是ch//8,1x1卷积的作用就是减少通道,实现通道融合。卷积核是1x1x(C/8),卷积前的通道大小为C,1x1卷积后通道大小是C/8。(具体可搜索1x1卷积)
也可以看出为什么是自注意力机制,f,g两个特征空间都来源于x的映射,即在注意力机制中,input和target都是输入的x。
注意力层的输出是: o=(o1,o2,…,oN)∈RC*N
最后我们为Attention层的输出乘以一个尺度系数,再加上输入的特征map,作为最终得输出。
这样做的好处是,gamma初始化为0.这使网络首先依赖局部特征(本地的,当前位置特征)的信息,然后再逐渐为非局部区域分配权重。这是一个由简单到复杂的过程。
SAGAN是根据对抗网络的loss的hinge版本进行训练的,损失函数如图:
hinge loss.目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重.
三、稳定GANs训练的技巧
3.1 Spectral normalization for both generator and discriminator
让每层网络的网络参数除以该层参数矩阵的谱范数满足Lipschitz=1的约束,求得每层参数矩阵的谱范数,求得谱范数后,每个参数矩阵上的参数皆除以它,以达到归一化目的。
与其他归一化技巧相比,它不需要其他超参数,不需要调参。另外一点就是它的计算代价相对比较少。
G的谱归一化可以防止参数幅度的增大,避免异常梯度。
谱归一化Both on G and D,使每次生成器更新时,D更新次数减少,因此极大降低了计算代价。也呈现了较稳定的训练
3.2 Imbalanced learning rate for generator and discriminator updates
GAN的训练都存在这个问题,容易模式崩塌。D能够很好地判别真假,训练的很快。而G的生成效果训练远远落后于D.(D训练的快能够过早的判别真伪,之后G生成的图片与真的差距越来越大。)所以传统的判别器正则化也是为了使D训练的慢一点。
为什么采用这个策略,因为之前的给判别器加正则项,整体减速了训练GAN的过程。
传统的为判别器加正则项, D要更新许多次,G才能更新一次。提出的TTUR对判别器和生成器采用不同的学习速率,作为判别器正则化学习慢的补偿。使得让D用更少的更新次数,G更新一次,成为相对更稳定的训练过程,努力使D的学习和G的学习同步。
We propose using TTUR specifically to compensate for the problem of slow learning in a regularized discriminator, making it possible to use fewer discriminator steps per generator step.
四、Experiments
提出了两个指标来衡量性能,结论就是本文的SAGAN性能很好。
分别给出了在G,D上分别/一起采用 SN,TTUR的性能对比。采用不同层次的feature map的性能对比。
最后也和别的几个GAN进行了对比,都是本文的,最佳。