Generative Models(生成模型)简介

版权声明:本文为博主原创文章,如若转载,请注明出处! https://blog.csdn.net/u013010889/article/details/80147779

著名物理学家费曼说过: What I cannot create, I do not understand. 所以我们要真正做到了解图像影音等,就必须要能创造它们。

Pixel RNN

收集一大堆图片,然后利用这些图片开始训练这个图片生成模型,根据前面的像素预测接下来的像素,训练结束后随便给一个(或者若干)初始像素就能生成一幅图片。PixelRNN不仅work,而且在各种生成方法中PixelRNN产生的图是最清晰的。 用在图像上有一些tips: 如果RGB三个值相差不大,则得到的颜色灰灰的、不够明亮,可以把众多颜色聚成若干类然后做1-of-N encoding,把”连续”的像素变成离散的。
这里写图片描述

VAE

利用output和input要一样这个约束进行无监督学习,训练完成后,把auto-encoder中的decoder拿出来,随便产生一个vector作为code输入到decoder,得到一张image,但是效果通常不好,这个时候出现了VAE。
这里写图片描述
为什么要用VAE?从数学上解释,VAE是GMM的Distributed representation版本。 一个intuitive的解释是,auto-encoder的encoder与decoder都是非线性的,很难预测问号处是一张介于满月与弦月之间的图像(如果是线性的,你code某个维度增大一点,图像就跟着对应变化,如果是非线性的就会不可控)。
VAE是在encoder output上加noise(而De-noising auto-encoder是在encoder input上加noise增加鲁棒性的),使得code在noise范围内都要能恢复出来,这样在右边红色箭头出,同时处于满月和弦月的noise范围内,由于mse的约束就会导致此处的code既要像满月又要像弦月,介于中间。
这里写图片描述
如果只最小化重构误差,那么train出来的结果不会是预期的样子,因为variance是学出来的,会学成0。 exp是为了确保variance是正的,右下方的minimize是为了让variance不能太小,其中第一项为蓝色曲线、第二项为红色曲线、二者相减得绿色曲线,这样variance最小为1,第三项是L2正则化,希望参数稀疏避免过拟合。
这个约束就是使得均值m为0.sigma->0 那么e的sigma次方即方差为1。其实整个式子就是假设隐空间服从正态分布,然后我们通过encoder找到这个分布的均值和方差,然后生成时就可以随便在这个分布上采样得到隐向量,进而decoder出不同“形态”的物体。这个loss是由隐向量的分布和正态分布的KL散度,推导过来的目的就是使得隐向量的分布是正态分布
VAE(3)——公式与实现

这里写图片描述

GAN

VAE中一个最大的问题就是不能真正的无中生有,因为它的loss是MSE,约束生成的图片必须和已有图片像素级相似,不能凭空产生一个“概念”上的相似。
而GAN很好的解决了这个问题,它的生成器G从来没见过真实图片,只能从判别器D提供的梯度来学习,这样就不是简单的记忆已有的图片了。
它的原始loss形式如下: D是判别器它要把真实图片识别为真,生成图片识别为假
这里写图片描述
原文第3节的时候提了个trick,即把min log(1-D(G(z))) 改为max log(D(G(z))),因为原版的loss设计中,判别器越好,生成器梯度消失越严重,很难训练。不过改进后的也会出现模式坍塌的问题,这在以后的WGAN中会有详细的证明。
注意我们的loss是BCELoss,即交叉熵loss,以后会有LSGAN使用MSE loss,即平方差loss

# D: 对应公式max: log(d(x))+log(1-D(G(z)))
adversarial_loss = torch.nn.BCELoss()
real_loss = adversarial_loss(discriminator(real_imgs), valid) # max log(d(x))
fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake) # max log(1-D(G(z)))
d_loss = (real_loss + fake_loss) / 2
# G: 对应公式max: log(D(G(z))) 现在都是用这种改进后的loss了
g_loss = adversarial_loss(discriminator(gen_imgs), valid) # max log(D(G(z)))
# G: 对应公式min: log(1-D(G(z)))-> max: -log(1-D(G(z))) 无人用这种了
g_loss = -adversarial_loss(discriminator(gen_imgs), fake) # max -log(1-D(G(z)))
# 以上的优化都是使min loss,对应的都是max log(xxxx)

证明

以上证明完全截图于生成对抗网络-GAN-公式推导和证明

这里写图片描述
这里写图片描述
这里写图片描述

loss对比

  1. minmax: 零和游戏,最直接的想法就是G的loss直接对D取反,即最原版的loss,min max(V(G,D)) D是max,G是min,这存在最大的问题就是D很厉害时轻易就把G生成的图片给识别出来时,完全没有梯度给G进行学习了,即蓝色线的左边
    这里写图片描述
  2. non-saturating game, 就是上文说的trick,G不是直接min max了,而是把min log(1-D(G(z))) 改为max log(D(G(z))),这样更改后在D很容易识别G生成的图片时有梯度给G进行学习,但是该loss也有问题就是梯度不稳定和模式坍塌,在以后的WGAN中会介绍
    这里写图片描述
  3. Maximum likelihood game,极大似然的方式,减小数据与模型的KL散度,其中σ是logistic sigmoid function。这个loss也有minmax的问题,大部分梯度都来自于曲线右侧
    这里写图片描述

这里写图片描述


引用:

猜你喜欢

转载自blog.csdn.net/u013010889/article/details/80147779