图像生成模型的发展

图像生成工作

GAN,VAE,diffusion model

GAN

  • 思想:左右手互搏,训练2个网络,generator和discriminator
    • 生成器:给定随机噪声,生成比较真实的图片
    • 判别器:将生成的图片和真实的图片输入给判别器,让判别器判断哪个是真实图片,0/1二分类问题
    • 通过生成器和判别器之间的互相较量,不断提高自己,最后能生成比较真实的图片;
      ​​​​​在这里插入图片描述
  • 优点:GAN的目标函数就是以假乱真,所以GAN生成的图片的保真度很高;
  • 缺点:
    • 训练不够稳定,需要同时训练2个网络,所以就有平衡的问题,训练不好的话模型就训练坍塌了;
    • 另外由于GAN的主要优化目标是让图片尽可能真实,但是生成图片的多样性不太好,多样性主要来自于生成器输入的随机噪声,多样性还不太好;
    • 不是一个概率模型,生成都是隐式的,是通过一个网络去完成的,所以并不知道它遵循了什么分布,所以GAN在数学上不如VAE、扩散模型等优美。

AE、DAE、VAE、VQVAE

Auto-encoder:
  • pipeline:给定一个输入图片x,过一个编码器,得到一个特征,然后再过一个解码器,得到图像;
  • 训练时的目标函数是:希望最终得到的图像尽可能的重建输入的x;自己重建自己,所以叫自编码器。
    在这里插入图片描述
Denoising auto-encoder
  • pipeline:先把原图x进行一定程度的打乱,变成xc (corrupted x),然后把扰乱后的xc传给编码器,后序和AE一样;
  • 经过改进后训练出来的模型非常稳健,不容易过拟合;原因是因为图像中像素的冗余性太高,即使对原图做一些污染,模型还是能抓住它的本质重建出来。
    ​​在这里插入图片描述
如何做生成?

AE,DAE的主要目的都是为了学中间bottleneck特征,然后把这个特征拿去做分类、检测、分割等任务,并不是用来做生成的,原因是bottleneck特征学到的不是一个概率分布,我们没法对它进行采样,这里的z并不像GAN中那样是一个随机噪声,它是一个专门用来重建的一个特征,但是这种encoder-decoder的形式确实是一个很好的结构,那么如何使用这种结构去做图像生成呢?所以就有了VAE。

VAE

在这里插入图片描述
相比于AE,不再是学习一个固定的bottleneck特征,而是去学习了一个分布;
作者假设这个分布是一个高斯分布,可以用均值和方差进行描述;

  • pipeline:当我们得到从编码器出来的特征,在后面加一些fc层,去预测这个均值和方差,然后得到均值和方差后就去采样一个z出来,这样的话VAE就可以用来做生成了,因为在你训练好这个模型之后,就可以把编码器直接扔掉,z就是一个可以从高斯随机噪声中抽样出来的样本,然后把z给解码器,就可以生成一张照片了。

  • 最大似然:VAE这里预测的是一个分布,从贝叶斯概率的角度来看,前面给定x得到z的过程其实就是一个后验概率q(z|x),然后学出来的这个distribution其实就是一个先验分布,后面给定z去预测一张图片x的时候,其实就是likelihood p(x | z),所以这里做的其实就是maximize likelihood,从数学上看就优美很多;

  • 多样性更好:而且VAE有很多不错的性质,例如因为它学的是一个概率分布,是从这个分布里去抽样,所以它生成的图像多样性就比GAN要好很多,所以后续也做了很多VAE的工作,包括VQ-VAE和VQ-VAE-2,以及DALLE第一版模型;

VQVAE

在这里插入图片描述

  • VQ的含义是vector quantised,就是把VAE做量化;这么做的原因是,如果做之前的VAE的方式,就不好把模型做大,图像的尺寸做大,而且中间的分布也不是很好学,所以说取而代之的是,不去做分布的推测,而是用一个codebook去代替了;

  • codebook可以理解成聚类的中心,codebook的大小一般是K * D,K一般是8192,D一般是512 或者 768,意思是有8192个长度为D的向量在这个codebook里,也就是说我们有8192个聚类中心,如果有一个图片经过编码器得到一个hw长宽大小的特征图,然后把特征图里的向量去跟codebook了的向量做对比,看看它跟哪个聚类中心最接近,然后就把最接近的聚类中心的编码存到z这个矩阵里,这里面就是一些编号,比如1或者100之类的,一旦做完聚类的分配,就不用之前的特征f了,而是把index对应的特征拿出来,生成新的特征图fq,就是quantised feature;

  • 这个量化后的特征非常可控,因为它永远都是从codebook里来的,它不是一个随机的东西,所以优化起来就相对容易,有了特征图fq之后就通过解码器重构一张图片;

  • VQVAE后来不仅用到了DALLE中,还用到了视觉自监督学习中,例如BEIT,就是把DALLE训练好的codebook拿过去,把图片全都quantise成特征图fq,拿这个去做gt自监督训练一个视觉网络;

  • VQVAE学习的是一个固定的codebook,没法像VAE一样去做随机采样,然后去生成对应的图片了,准确的说它不像VAE,更像是AE,它学的codebook和特征fq是拿去做high-level的任务的(分类,检测等),那么如果想要它做生成怎么办?对于VQVAE来说,还需要单独再训练一个prior网络,论文中作者又训练了一个pixel CNN当做prior网络,从而能够利用已经训练好的codebook去做图像的生成;

VQVAE2
  • 首先把模型编程层级式的,不仅做局部的建模,而且做全局的建模,还加上了attention,对模型的表达能力变强了,同时还根据codebook去学习了一个prior,所以生成的效果也非常好
DALLE
  • 训练的时候,text通过BPE编码得到文本特征ft,Image通过VQVAE得到图像特征fq,然后将文本特征和图像特征拼接起来,输入到GPT里做自回归预测;
    在这里插入图片描述

Diffusion

  • 发展脉络:20年开始一系列工作提升了扩散模型的保真度:
    DDPM -> improved DDPM -> diffusion models beat GAN -> GLIDE -> DALLE2 -> imagen
  • Diffusion思想:输入是噪声(类似于GAN里的z) ,训练一个网络,能够慢慢的把这个噪声一点一点去掉,恢复到最初的图片,就可以做图像生成
  • 前向扩散过程:原始图片x0,每一步加噪,T步之后就变成了一个真正的噪声xT,变成了正态分布;
  • 反向过程:随机抽样一个噪声xt,训练一个模型把它从xt变到xt-1,然后一步一步倒退回去就得到x0;

在这里插入图片描述
其中这个模型的输入输出的尺寸是不变的,采用的是U-net:
在这里插入图片描述

DDPM

DDPM做了一些改进让优化过程更简单了,最重要的2个贡献:

  1. 预测噪声:
    • 之前是用xt去预测xt-1,是做图像到图像的转化,但是DDPM觉得这样可能不好优化,所以不去预测图像的转化,能不能去预测从xt-1到xt这个噪声是怎么加的,只去预测噪声是否可行,类似于resnet的思想,从x预测y,但是直接预测y太难了,所以把y理解成x + residual,只去预测residual就可以了,所以这里去预测xt-1到xt加的噪声,把问题简化了,所以这里unet的输出不再是xt-1,而是添加的噪声;
    • 另外unet的输入还有当前时刻的time embedding,用来告诉unet现在到了反向扩散的第几步,我们希望在反向扩散的前期unet可以先生成一些这个物体的大致轮廓,然后在后期学习到一些高频的信息特征,例如物体的边边角角等细小的特征,让生成的图片更加逼真,由于每一步的unet都是共享参数的,所以需要time embedding提醒unet现在走到哪一步了。损失函数就是真实添加的噪声和预测的噪声之间的差值。
      在这里插入图片描述
  2. 预测均值: 如果要去预测一个正态分布,只要学它的均值和方差,作者发现其实只要预测均值就可以,方差只要变成一个常数,最后的效果就可以很好了,所以又再次降低了模型优化的难度。
improved DDPM

improved DDPM做了几个改动:

  1. DDPM说方差可以不用学,作者认为学了效果可能会更好

  2. 把怎么添加噪声的schedule改了,从线性schedule变成余弦schedule

  3. 用更大的模型会有更好的图像生成结果

Diffusion beats GAN:
  1. 首先上来把模型加大加宽,增加自注意头的数量等,把模型变得又大又复杂

  2. 提出了新的归一化的方式,adaptive group normalization,根据步数做自适应的归一化

  3. 使用classifier guidance的方法去引导模型做采样和生成,不仅让生成的图像更逼真,也加速了反向采样的速度(25次采样就可以生成图像)
    在这里插入图片描述
    把xt扔给分类器,可以算交叉熵目标函数,对应得到一些梯度,用梯度帮助模型接下来进行采样和图像的生成,梯度就暗含了图片里到底有没有一个物体,或者说当前这个物体真不真实,通过梯度的引导来告诉unet,现在生成的图片要看起来更像某一类的物体,所以经过classifier guidance,生成的图像逼真了很多,在FID等score上比bigGAN高了,牺牲了一些多样性来换取图片的写实性。

  • 除了用梯度做引导信号,后续很多工作也尝试了其他的引导方式:

    • 例如把简单的图像分类器换成clip模型,换成clip模型之后文本和图像就可以联系起来了,而且不仅可以用梯度去引导图像的生成,还可以用文本去控制图像的采样和生成;
    • 另外分别在图像和文本上进行引导也有很多工作,例如图像上的引导不仅可以用图像重建做引导也可以用特征层面进行引导,或者图像风格的引导(用gram matrix),文本方面可以用已经训练的很好很大的语言模型做引导。
      在这里插入图片描述
  • classifier guidance的问题是,要么拿一个pretrain好的模型,要么得去训练一个模型,不仅成本比较高,而且训练的过程也不可控;

  • 所以就有了classifier free guidance,不想要classifier,能不能找到一种指导信号去让这个模型的生成变得更好;在训练模型的时候生成了2个输出,一个是有条件的时候的输出,一个是没有条件的时候的输出,然后训练时得到无条件输出到有条件输出之间的变换;不过这种方式比较贵,要infer两次。

DALLE2

在这里插入图片描述

  • 采取2阶段的训练方式,包括prior和decoder的训练;

文本y–> 文本特征 -prior-> 图像特征zi -decoder-> 图像x

  • prior模型:用文本特征预测图像特征,gt是用clip image encoder提取的图文对中的图像特征;尝试了用autoregressive和diffusion的两种方式,都用了classifer-free guidance

  • decoder模型:扩散模型将图像特征生成图像,是GLIDE模型的变体;用的是CLIP guidance,用了classifier-free guidance,用了级联式生成,先从6464->256256->1024*1024

总的来说,dalle2是将CLIP和GLIDE两个模型结合在一起

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值