DCGAN
- DCGAN
- 原理
- 改进
- 网络架构
- ImprovedDCGAN
- 训练增强手法
- 特征匹配
- 批次判别
- 常见问题
- 原理
- 实现
- 历史平均
- 单侧标签平滑(one-sided label smoothing)
- 虚拟批次正态化(virtual batch normalization)
DCGAN
原理
把上述的 G和D 换成了两个卷积神经网络(CNN)。但不是直接换就可以了,DCGAN 对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度
改进
- 取消所有pooling 层。G网络中使用微步幅度卷积(fractionally strided convolution)代替pooling层,D网络中使用步幅卷积(strided convolution)代替 pooling层。
- 在D和G中均使用 batch normalization
- 去掉FC层,使网络变为全卷积网络
- G网络中使用ReLU 作为激活函数,最后一层使用tanh
- D网络中使用LeakyReLU 作为激活函数
网络架构
生成器的输入是一个 100 维的噪声,中间会通过 4 层卷积层,每通过一个卷积层通道数减半,长宽扩大一倍 ,最终产生一个 64643 大小的图片输出。值得说明的是,在很多引用 DCGAN 的 paper 中,误以为这 4 个卷积层是 deconv(反卷积)层,但其实在DCGAN 的介绍中这 4 个卷积层是 fractionally strided convolution(微步幅度卷积),二者的差别如下图所示:
上图左边是反卷积,用 33 的卷积核把 22 的矩阵反卷积成 44 的矩阵;而右边是微步幅度卷积,用 33 的卷积核把 33 的矩阵卷积成 55 的矩阵,二者的差别在于,反卷积是在整个输入矩阵周围添 0,而微步幅度卷积会把输入矩阵拆开,在每一个像素点的周围添 0。 接下来我们再看一下 DCGAN 中 D 网络的结构,由于原论文中没有给出相关图,我找了一篇近似论文中的图说明:
D 可以看成是 G 结构反过来的样子,那具体结构也没什么好说的了,简言之不断地做卷积,最终得到一个 0,1 之间的结果。
ImprovedDCGAN
训练增强手法
GANs 的主要问题之一是收敛性不稳定,尽管 DCGAN 做了结构细化,训练过程仍可能难以收敛。我们先来分析一下为什么会出现收敛性不稳定。 GANs 的优化就是寻找两玩家非合作博弈的纳什均衡点。这里的两玩家指的就是生成器和判别器。
特征匹配
为了不让生成器尽可能地去蒙骗鉴别器,ImprovedDCGAN 希望以特征作为匹配标准,而不是图片作为匹配标准,于是提出了一种新的生成器的目标函数,即:
其中 f(x)是指的生成器把判别器的中间层输出 f(x)作为目标(一般中间层都是 D 最后几层,f(x)实际上是 feature map),这样可以让生成的中间层输出和真实数据的中间层输出尽可能相同。这种做法虽然不能保证到达均衡点,但是收敛的稳定性应该是有所提高。
批次判别
常见问题
收敛到同一个点,并没有什么机制可以让生成器生成不一样的内容。
原理
用 minibatch 判别器。也就是说每次不是判别单张图片,而是判别一批图片。
实现
将一个中间层 f(x)乘以一个 tensor,得到一个新的矩阵 M,计算 M 每一行之间的 L1 距离 o,以此为 f(x)下一层的输入
假设 x 是从生成器生成的,并且收敛到同一点,那么对应的 f(x)必然很相似,由 f(x)生成的 M也必然非常相似。而这些 M 每一行的 L1 距离c(xi,xj)也就会非常接近 0,这也导致 o(X)几乎是 0 向量。相对的,如果 x 是真实数据,那么 o(X)一般不会太接近 0 向量,这样判别器就可以更简单的区分生成数据或真实数据(在生成器收敛到一点的情况下)。
历史平均
在更新参数值时,把它们过去的值也纳入考虑:
单侧标签平滑(one-sided label smoothing)
- 判别式的目标函数中正负样本的系数不再是 0-1,而是α和β,这样判别式的目标就变成了下面这个式子。这相当于,原本判别器的目标数出值是[0=假图像,1=真图像],现在可能变成了[0=假图像,0.9=真图像]
虚拟批次正态化(virtual batch normalization)
batch normalize 在神经网络领域有广泛应用,但是也有一些问题,比如特定样例 x 在神经网络上的输出会受到 minibatch 上其他的样本影响。文中提出了一种 virtual batch normalization(VBN),会在训练前提取一个 batch,以后就根据这个 batch 做 normalize,不过由于这样的计算成本很高,所以它仅仅被用在生成器当中。