20170627-GAN笔记

生成对抗网络(Generative Adversarial Nets) 作为生成模型的一种,从2013年提出以来就在CV界大放异彩,各种玩法层出不穷。本文旨在了解GAN的进展的同时针对文章中具体实现的方法进行琢磨,希望能在阅读文章的过程中找到训练GAN的有效的方法或者Trick,具体Code基于Pytorch,并不定时更新。

基本概念

原始目标函数:
$\min_G \max_D V(D,G)=\mathbb{E}_{x\thicksim p_{data}(x)}[logD(x)]+\mathbb{E}_{z\thicksim p_z(z)}[log(1-D(G(z)))]$
基于一个博弈的思想,希望判别器D能区别从真实分布采样的样本$x$和从随机分布采样($z\thicksim p_z(z)$)后通过生成器G生成的样本$G(z)$,因此是最大化$V(D,G)$。而生成器G希望能生成出不被判别器D判别出来的样本,因此希望最小化$V(D,G)$。
然而,问题在于,由于一开始生成器生成的东西太烂了,判别器很容易就区别出来,那么G优化的目标
$\mathbb{E}_{z\thicksim p_z(z)}[log(1-D(G(z)))]$
的梯度就十分小,导致G不能很好地update自己的参数,因此整个游戏就运转不起来了。在GAN原文中对G的优化目标做了一些改动:
$\max_G V(G)=\mathbb{E}_{z\thicksim p_z(z)}[logD(G(z))]$
但是实际上两个优化目标据说是不等价的。

Conditional GAN

希望可以引入一些条件使得生成的内容是condition on额外的信息如类标。那么目标函数为:
$\min_G \max_D V(D,G)=\mathbb{E}_{x\thicksim p_{data}(x)}[logD(x|y)]+\mathbb{E}_{z\thicksim p_z(z)}[log(1-D(G(z|y)))]$
比如我们可以指定生成的mnist数字是哪个数字,而不是随机产生数字。

实现细节

1.For G: 从uniform distribution中获得100维的噪声。但在另外一篇github blog中建议在高斯分布下面采样。用的都是relu做激活函数。
2.For D: 作者使用了maxout作为激活函数,并说明maxout在这个task里面很好并且附上了一个诡异的微笑!!!!:)
3.用SGD lr=0.1 然后指数下降到0.000001, with decay factor of 1.00004? momentum从0.5上升到0.7,dropout=0.5 for both G and D。

Improved Techniques for Training GANs

主要提出几个方法来稳定GAN的迭代过程

1.Feature matching

GAN的本质目的是为了使得随机分布$p_z(z)$经过变换$G()$之后能接近真实分布$p_{data}(x)$。在这个过程中,判别器的作用是用来给G提供梯度的,那么实际上可以在特征的时候就进行判别,这种方法也一定程度上获得较好的结果。
为此,G的loss function定义为
$||\mathbb{E}_{x\thicksim p_{data}(x)}\mathbf{f}(\mathbf{x})-\mathbb{E}_{z\thicksim p_z(z)}\mathbf{f}(G(z))||$
实际上这个目标函数一定程度上与WGAN的目标函数相似,只是缺少了1-Lipschitz的约束,和D的目标函数仍用原来的。

2.Minibatch discrimination

mode collapse是指生成器重复生成同一种模式或类别的图片,这是由于在loss function中判别器只需要判别真假图片,而不考虑图片的多样性,使得生成器偏向于生成使得loss变小的图片,这样的话又会影响判别器往某些样本方向去下降。综合后使得生成器生成相同种类的图片。
文章中引入了Minibatch discrimination,首先度量batch内所有样本的特征的距离的平均,然后与特征拼接,相当于判别器在判别特征的同时考虑每个样本的diversity,以期望减少mode collapse的影响。但是实际上在后面的文章中较少看到这种处理方式。

3.Historical averaging

这个方法主要是对参数进行操作,希望参数能平稳地更新?相当于是限制了梯度的数值,与GP-WGAN有点类似。

4.One-sided label smoothing

在这里,作者用0.9替换原来的目标1.,而0保持不变..(Tricky)
在验证方法上,作者提出使用Inception model对生成的图片进行分类来看得分用于评估生成质量。对于生成质量好的有意义的图片,条件类别分布$p(y|x)$具有较低的信息熵,另外又希望生成更加diverse的图片因此$\int p(y|x=G(z))dz$具有较高的信息熵。因此,可以通过衡量$exp(\mathbb{E}_\mathbf{x}KL(P(y|\mathbf{x})||p(y)))$得到。

Info GAN

这篇文章的主要思想是希望在生成模型中引入一个向量c,控制类似角度、类别等信息,相当于一个控制器。那么在优化GAN模型的时候就要把c单独分出来去对待。引入信息论的思想之后推导出可以通过增加一个互信息正则项来控制c表达的信息内容。如假设我们希望控制生成人脸的角度,就可通过不同的c的值来控制。
然而,实际上做法是把c分别拆成一组categorical latent code和continuous latent code来完成,在D中用softmax产生categorical latent code,同时通过假设continuous latent code可以通过factored Gaussian来表达之后利用reparameterize的方法拆成mean和variance来近似一个高斯分布来获得。
那么相当于在生成的时候[z,c]中z与vanilla GAN的一样,但是c可以控制生成的catergori和通过continuous latent code来控制一些诸如角度之类的一些连续数值变量。

欢迎转载和提出意见和建议,转载请注明出处。http://yongyitang92.github.io