该文章摘自李宏毅老师https://www.youtube.com/watch?v=sU5CG8Z0zgw&index=7&list=PLJV_el3uVTsMq6JEFPW35BCiOQTsoqwNw 的教学视频,建议大家观看原视频
如果使用auto-encoder来做生成,普遍存在的问题是会得到非常模糊的结果;如果使用原始GAN,训练就会不太稳定。基于auto-encoder的GAN希望通过GAN来强化auto-encoder,能够使得生成清晰的结果,同时也能生成出不一样的output。这中间的代表就是VAE-GAN和BiGAN
VAE-GAN
VAE-GAN的原理是用GAN来强化VAE,VAE本身就是一个auto-encoder的变形。auto-encider大家都很熟悉了。
在原来VAE的基础上加一个discriminator,看看output的image越真实越好。如果只是做VAE,那么图片会很模糊。加上discriminator后迫使output越真实越好。从GAN的角度来看,在train GAN的时候,generator从来没见过真正的image长什么样,如果通过auto-encoder的架构,generator不仅仅要骗过discriminator,它见过真实的图片长什么样,所以VAE GAN学起来会更稳一点。
在VAE-GAN中,各个部件的优化目标如下:
encoder:minimize reconstruction error,同时希望encode的向量z越接近真实越好。
Generator(同时也是decoder): Minimize reconstruction error, 同时 cheat discriminator
Discriminator: 区分真实图片和generator生成的图片。
算法流程
我们再来看看具体的算法流程:
- 初始化encoder, generator(decoder), discriminator
- 在每次迭代中:
- 从数据集中sample出M个样本
- 从encoder中生成M个向量
,
- 从Generator中生成M个output
,
- 从一个分布
中sample出M个向量
- 从Generator中生成M个output
- 优化Encoder:更新参数来减小
和,就是说希望可以把decoder(也就是generator)产生的输出和原始输入越接近越好,同时希望中间的与normal distribution越接近越好。
- 优化Generator: 更新参数来减小
,同时让越大越好。也就是要骗过discriminator。
- 优化Discriminator: 更新参数增加
,减小
那么VAE-GAN是修改了auto-encoder,另一种BiGAN也是修改了auto encoder, 看看它的原理:
BiGAN
在BiGAN中,Encoder和Decoder分开了,对于Encoder,输入一张图片,得到一个vector, =对于decoder(也就是Generator),从一个normal distribution中随机sample一个vector, 输入Decoder得到图片。然后对于Discriminator, 我们同时投喂图片和其配对的z,让discriminator去判断这是来自于encoder还是decoder。Bi-GAN为什么有效呢,它其实就是在拟合生成原始数据集的分布P和Generator所拟合的分布Q的divergences。虽然Encoder和Decoder没有直接接在一起,但透过Discriminator可以让他们形成理想的auto-encoder
Bi-GAN的算法流程如下:
- 初始化encoder, generator(decoder), discriminator
- 在每次迭代中:
- 从数据集中sample出M个样本
- 从encoder中生成M个向量
,
- 从一个prior
中sample出M个向量
- 从Generator中生成M个output
,
- 优化Discriminator: 更新参数增加
,减小
- 优化Encoder和Decoder: 更新Encoder和Decoder来减小
,增大,也就是Encoder和Decoder联手来骗过Discriminator。