继续创作,加快成长!这是我参加「日新计划 10 月更文挑战」的第23天,点击检查活动详情


分散模型的悲惨开端

搞AI的都知道,一个模型好不好空口无凭,咱们必须要用数据说话。可是分散模型刚出来的时分存在一个问题,便是图片咱们用人眼看起来好像作用仍是挺好的,可是在数值上便是打不过GAN生成的图画,所谓的数值上便是在点评方针上,比如FID score和IS score。就算咱们直接把图片放到论文中,人家也可能会质疑说,你这些图片肯定是把作用好的放出来了,作用不好的根本就没让咱们看吧。所以如果数值提不上去,论文很难有说服力,审稿人那一关就过不了。所以很重要的一个努力方向便是提高模型的方针。别的还有一个问题便是模型的采样是按照时刻步来的嘛,这样比较慢。所以大家就在想办法改善这些地方。就引出了咱们今天要讲的东西,凭借一些技巧或者guidance来协助引导模型练习和采样。

其实在之前的这篇文章【翻译】最近鼓起的分散模型提过一嘴引导分散这个事,今天就把它打开讲讲。

从uncondition到condition

咱们分散模型的反向进程是给定xTx_T时刻的输入,从xTx_T生成xT−1x_{T-1},这样逐渐一直到康复图画x0x_0。康复进程每一步用的都是一个U-Net,不停地采样、生成、采样、生成,算算算。

Guidance,让扩散模型的指标更能打

咱们将每一步的进程formulate一下便是f(xt,t)f_\theta(x_t,t),便是时刻步t的生成需要两个输入信息:

  1. 当时时刻步的输入xtx_t

  2. 当时时刻步tt

引进guidance之后给模型提供辅导,这个辅导咱们用y\mathbf y表示,那咱们就能够得到修改之后的网络f(xt,t,y)f_\theta(x_t,t,\mathbf y)。接下来咱们就来看一下y\mathbf y究竟能够变成什么。


classifier guided diffusion

Guidance,让扩散模型的指标更能打

classifier gudied diffusion 便是在咱们练习模型的同时 再 额外练习一个图画分类器,在许多论文中的完成办法便是直接用ImageNet的数据集去练习一个图画分类器,因为分散模型的特性是从每一步的噪声图画中康复,所以练习分类器的进程中是不断对ImageNet的图画加噪之后再练习分类器。

这个分类器的作用是:当咱们拿到图片xtx_t之后,咱们能够知道它分类的对不对,经过运用交叉熵方针函数,会得到一些梯度,然后咱们用这些梯度去协助模型进行接下来的采样和生成。

分类器的梯度暗含当时图片的一些信息,比如是否含有某个物体,比如图片是否实在等 。这个梯度引导便是给U-Net传递信息,我现在生成的图片要像什么东西。

经过classifier gudied diffusion的引导之后,生成的图片保真性就提高了许多,在FID score和IS score等方针上大幅度提高,分散模型也第一次在点评方针的数值上逾越了big GAN。详细的能够看《diffusion model beat GAN》这篇论文。这个做法是牺牲了一部分的多样性来换取图片的实在性,可是这个取舍是值得的,它的多样性依旧是比GAN要好许多的。点评方针数值提上来了,多样性还能吊打你,这样就开端奠定了新一位大魔王的位置了。

GAN、VAE、Diffusion model等生成模型如果大家不了解能够浅浅看一下这个文章:图画生成模型简介 – ()

简略classifier之后的思路

除了用分类器咱们还能凭借什么发生辅导信号呢?比如换成CLIP模型,这样文本和图画还能联系起来,这样咱们就不止能够运用梯度来引导图画生成了,还能够运用文本信息来引导图画生成。

还有用言语模型进行文本方向引导的,利用图片的一些小任务引导的等等。


经过上述两大类改善办法,咱们能够归结起来引导分散模型生成和采样的一大方向便是:

p(xt−1∣xt)=∥−f(xt,t,y)∥p(x_{t-1}|x_t) = \| \epsilon – f_\theta(x_t,t,\mathbf y) \|

其中的y\mathbf y便是咱们选定的操控办法。

可是这个办法有一个缺陷,便是咱们需要凭借别的一个模型进行引导。简略的分类器都要用带噪声的ImageNet数据集进行练习,更甭说CLIP或者其他预练习的大型言语模型了。这样本钱比较高,练习进程也是不可控的。


classifier-free guidance

因为咱们上边提到的一些缺陷,所以有研究人员开端考虑不需要额外模型的办法,也便是classifier-free。不运用classifier之后咱们能不能找到一种辅导信号去让模型生成的更好呢?

在模型练习阶段让其发生两个输出,一个是在有条件的情况下发生的输出,一个是在无条件下发生的输出。

f(xt,x,y)−f(xt,x,)f_\theta(x_t,x,\mathbf y) – f_\theta(x_t,x,\phi)

比如你用文本操控图画生成,练习时分用的是图画文本对,文本作为guidance信号。此时y\mathbf y便是文本,你在练习的时分用y\mathbf y去生成图画f(xt,x,y)f_\theta(x_t,x,\mathbf y),然后在某些情况下你随机去掉这个信号,取而代之传入一个空集\phi,再去生成别的一个输出f(xt,x,)f_\theta(x_t,x,\phi),这样你就能够在生成图画的散布空间中知道有条件和无条件图画的距离,咱们就能够知道在这个散布空间上怎么从无条件输出得到有条件的输出,经过练习咱们就能够知道有条件、无条件的差距是多少,最后去做图画生成的时分,即便咱们没有条件去做生成,也能够获得一个比较合理的输出结果。这样就摆脱了分类器。

可是这样存在一个问题便是练习代价比较贵重,分散模型的练习本来就很烧钱,现在竟然要一次做两个输出,一个有条件一个无条件,这样又增加许多本钱。

可是这个真的是很好用的办法,GLIDE、DALLE 2、Imagen等模型都用到了这个技巧。