目录
导语
聚焦GANs
训练GANs:双人游戏
GANs的卷积神经网络架构
一些有趣的例子
生成模型的分类
总结
导语
除却变分自编码器VAE(Variational Auto-Encoder), 生成对抗网络GAN(Generative Adversarial Networks)同样也是一种生成模型(Generative Model)。
VAE中比较恶心的是隐变量z的求解,我们通常使用以下公式生成隐变量z的概率分布,通常假设p(z)服从标准正态分布(参数和可调整)。
VAE的问题就在于我们无法对其进行直接优化, 而是根据可能性推导和优化下限(相关博文后面会更新,详细推导VAE的整个过程)。
在VAE中,我们是通过假设隐变量z的概率密度,这是一种显式的概率密度建模方法,那我们为什么不直接强化采样能力呢?
于是乎,天降正义,GAN出现了!它不需要任何显式的概率密度函数!相反,它采用了一种类似博弈论的手段,即通过双人游戏来生成数据。
聚焦GANs
我们暂时先不解释这个双人游戏的定义,我们先来看GAN它解决了什么问题。
问题:在实战或者工程领域,机器学习工程师们往往需要从非常复杂,维度非常高的训练分布中做数据采样,但是这是一个非常困难的事情。
解决方案:我们可以首先从一个简单的分布(比如高斯噪声)中进行采样(类似于Importance Sampling中引入的Proposal Distribution)。然后我们通过训练,训练出一个可以将简单分布转换为复杂分布的转换器(生成器网络)。
训练GANs:双人游戏
这个双人游戏有两位玩家构成:
- 生成器网络(Generative Network):生成逼真的假图片去试图欺骗判别器
- 判别器网络(Discriminator Network):试图判别真图片和假图片,把真图片判为真,假图片判为假。
具体流程可见下图:
如上图所示,生成器网络在接受随机噪声z后生成了相应的仿真假图片(Fake Image),假图片与训练集中的真图片一道作为判别器网络的输入,最后判别器会输出图片的真伪信息。
那么,使用数学公式来表达上述过程即为:
上图公式即,
需要找到判别器参数,使得中括号中的公式取得极大值;
同时,需要找到生成器参数,使得中括号中的公式取得极小值。
判别器(Discriminator)对真实图片的判别的输出介于(0,1)之间
因此,对于判别器Discriminator(),我们希望使得接近1(将真实的图片判为真),同时希望接近0(将假图片判为假)。
对于生成器Generator(),我们希望接近1(将假图片判为真)。
那么,我们可以将上图公式替换成两个子任务,即:
1. 判别器目标函数(梯度上升)(如下图)
2. 生成器目标函数(梯度下降)(如下图)
但在具体实践过程中,我们发现这种梯度下降生成器目标函数优化效果并不是很好。原因在于,当生成器能力并不是很强也就是生成的样本还非常假的时候,我们非常想要去优化它,但此时这一区域的梯度太过平整,也就意味着优化速度非常非常慢,但是当生成器已经具备很好的生成以假乱真的图片时,梯度倒好起来了。
为解决这个问题,我们将生成器目标函数等价地修改为
等价于最大化判别器将假图片判为真的概率。
比较修改前后的生成器目标函数,很明显,红线的更好。
那么我们可以将以上过程再转换为伪代码的形式:
后续博客中会给大家带来Wasserstein GAN的介绍。
GANs的卷积神经网络架构
- 生成器是具有分数步(可以是非整数步)的卷积的上采样网络
- 鉴别器是一个卷积网络
- 对于判别器而言,将所有池化层替换为strided卷积;对于生成器而言,将所有池化层替换为fractional-strided(分数步)卷积
- 在生成器和判别器中都使用batchnorm
- 移除所有深层结构中的隐层全连接层
- 除去输出层使用Tanh以外,生成器的其他层全都使用ReLU作为激活函数
- 判别器的所有函数都是用LeakyReLU作为激活函数
GANs生成器的卷积神经网络架构如下图所示
一些有趣的例子
生成模型的分类
总结
最后,再总结一下三种常见的生成模型
- PixelRNN 和 PixelCNN: 显式概率密度模型,有较好的优化性能和采样能力,但是顺序生成效率低下。
- 变分自编码器(VAE):显式概率密度模型,优化likelihood的变分下限。 有用的latent representation以及inference queries。 但是采样的质量并不是最好的。
- 生成对抗网络(GANs):博弈论方法,最好的样本!但是训练起来可能很棘手且不稳定,没有inference queries。