那怎么计算两组 Representation 之间的距离呢?FID 这边用的是一个其实很粗糙但是有用的方法。那这背后所代表的含义是什么呢?我们现在如果把文字用 y y y来描述,图像用 x x x来描述,那正确答案的分布我们可以写成 P ( x ∣ y ) P(x|y) P(x∣y),它显然会非常的复杂,如果我们可以知道说 P ( x ∣ y ) P(x|y) P(x∣y)长什么样子,我们从这个分布里面去做 sample 我们就可以把图画出来
但是问题是 P ( x ∣ y ) P(x|y) P(x∣y)它非常的复杂,其实在过去早些时候比如说在 GAN 都还没有的 2014 年以前人们还不知道用什么 deep learning 生图的时候,多数就假设说 P ( x ∣ y ) P(x|y) P(x∣y)可能是一个 Mixture Gaussian 由多个 Gaussian 所组成的,然后我们看这个模型能不能够 learn 出来,那其实它生成的图都非常模糊跟今天就是完全不在同一个量级上面,所以这个 P ( x ∣ y ) P(x|y) P(x∣y)它显然非常的复杂,复杂到它不是一个你用人脑可以想出来的模型,它不是一个简单的 Gaussian Distribution,所以怎么办呢?
这边的策略是我们把 Normal Distribution 里面 sample 出来的 vector 都对应到 P ( x ∣ y ) P(x|y) P(x∣y)里面的每一个 x x x,我们知道说如果要画一只奔跑的够,有很多不同可能的样子,那我们把 Normal Distribution 里面 sample 出来的 vector 一个一个对应到可能画的狗,这个图像生成的模型等于就是在产生这种对应关系,图像生成的模型它做的工作就是想办法把 Normal Distribution 里面 sample 出来的东西对应到正确的狗在奔跑的图片
OK,那所以接下来难的点就是怎么把这个 distribution 变成 P ( x ∣ y ) P(x|y) P(x∣y)的样子呢?那这个其实就是所以的图像生成的模型都在解的问题,那所以这些图像生成的模型和背后想攻克的问题其实是一样的,只是解法是不一样的
那 VAE 它做的事情是什么呢?我们今天想要从 Normal Distribution 对应到图像怎么做呢?我们期待有一个 Decoder,这个 Decoder 就吃 Normal Distribution sample 出来的 vector 作为输入,它的输入就应该是一张正确的图片,那上面是把文字的输入省略了。它就把这些中间产生出来的 Latent Representation 丢给 Decoder 然后再产生出来的结果给你看
Stable Diffusion 包括 Text Encoder、GAN 等等,然后介绍了 Diffusion Model 的工作流程,先 random sample 一张噪声的图片然后不断通过 Denoise Model 去噪最终变成一张完整的图片,最后我们学习了 Stable Diffusion,它由 Text Encoder、所以我们才说你在做完 DIffusion Process 以后你手上就有训练数据了,接下来就跟训练一般的 Network 一样 train 下去就结束了。Flow-based Model 以及 Diffusion Model 其实它们有非常多的共通性
今天最强的那些图像生成的模型比如说 DALL-E、而 Denoise Model 并不都是同一个,它内部实际上有一个 Noise Predicter 噪声预测器,这个 Noise Predicter 有两个输入,一个是带有噪声的图片,一个是描述图片噪声严重程度的 Step ID,通过这两个输入 Noise Predicter 得到一个噪声的输出,然后与输入的噪声图片相减得到 Denosie 后的图片,这就是 Diffusion Model 图像生成的流程。那因为它算的两组 Distribution 之间的距离所以这个分数是越小越好,距离越小代表你的模型生成的结果越好。Stable Diffusion 或者是 DALL-E 它们的数据往往来自于 Laion,网址是:https://laion.ai/projects/
Laion 其实有一个搜索的 Demo 平台,链接是 https://rom1504.github.io/clip-retrieval/,大家可以去里面看看有什么样的图片,比如说上图中的猫的图片,它不只是只有猫的图片跟英文文字的对应它还有跟中文的对应还有跟日文的对应,所以这也就解释了为什么你今天看到的那些图像生成模型不是只看得懂英文,中文它也能看懂,这是因为它的训练数据里面也有中文跟其它的语言,所以这个是你需要准备的训练数据。那怎么生成图片呢?生成图片的方法就是你 learn 一个 Denoise 的 Model,那实际上怎么做我们下一节会讲到,learn 一个 Denoise 的 Model 后把 Normal Distribution sample 出来的 vector 当作输入然后不断去噪去噪,你要的图就慢慢产生出来了,就是这么的神奇
那可能大家心里充满了困惑和怀疑,那也是很正常的,那我们下一节会再详细的讲这个模型
1.4 GAN
OK,那最后一个要讲的就是大家都耳熟能详的 GAN,如下图所示:
那 GAN 它是只 learn Decoder 它就没有 learn Encoder 了,那 GAN 怎么 learn Decoder 呢?那一开始你就给它一大堆从 Normal Distribution sample 出来的向量,那一开始呢这个 Decoder 没有经过训练所以它根本不知道怎么画一张图,所以就输出一些乱七八糟的东西,通常一开始的输出的东西都是一些噪声,你根本不知道在画些什么
那接下来你会训练一个 Discriminator,这个 Discriminator 的工作就是去分辨输入的图片也就是 Decoder 产生出来的是虚假的图片还是真正的图片,如果我们今天把真正的图片的分布想成 P ( x ) P(x) P(x),当然如果你有文字的输入那分布就是 P ( x ∣ y ) P(x|y) P(x∣y),不过这边先把文字的 condition 省略掉,那这个真实图片的分布是 P ( x ) P(x) P(x)
Decoder 产生出来的图片分布是 P ′ ( x ) P'(x) P′(x),这个 Discriminator 实际上在做的事情是什么呢?其实这个 Discriminator 训练的时候的 loss 其实就代表了 P ( x ) P(x) P(x)和 P ′ ( x ) P'(x) P′(x)它们的相似程度,那这个在直觉上其实也是蛮容易理解的,因为当 Discriminator 没有办法分辨来自这两个 Distribution 的 image 的时候,代表这两个 distribution 的 image 非常的接近。我们上面有说其实 Denoise Model 里面是一个 Noise Predicter,它的输入就是一张 Noise 的图片和 Step ID 然后产生一个预测出来的噪声,但是你要产生出一个预测出来的噪声你得有 Ground Truth 啊
我们在训练 Network 的时候就是要有 pair data 才能够训练呀,你需要告诉 Noise Predicter 这张图片里面的噪声长什么样子它才能够学习怎么把噪声输出出来啊,那这件事情怎么做呢?怎么制造出这样的数据呢?
那这个 Noise Predicter 它的训练数据是我们人去创造出来的,怎么创造呢?如下图所示:
它的创造方法是这样的,你从你的 Dataset 里面拿一张图片出来你自己加噪声进去,你就 Random sample 从 Gaussian Distribution 里面 sample 一组噪声出来加上去产生有点 Noise 的 image,那你可能再 sample 一次再得到更 Noise 的 image,依此类推最后整张图就看不出原来是什么东西。
因为你是从这个 Normal Distribution 里面 sample 出来,所以 sample 出来就是一个像是噪声的东西,丢到图像生成模型里面你才能够产生最终的结果。
OK,那接下来的问题就是怎么训练这个 Noise Predicter 呢?
我们已经知道我们 Denoise Model 输入是一张 Noise 的图片和现在在 Denoise 的 Step ID 然后产生 Denoise 的结果。 现在的文生图模型如 Midjourney、总之你就训练这个 Encoder 跟 Decoder,训练完就把这个 Decoder 拿出来用,这个 Decoder 就可以输入一个 Latent Representation 还原一张图片。在生成图片的第一步你要去 sample 出一个都是噪声的图片,也就是我们要从 Gaussian Distribution 里面 sample 出一个 vector,这个 vector 的维度和你要生成的图片大小一样。Generation Model 以及 Decoder 三个部分组成,其中 Generation Model 的中间产物可以是小图或者 Latent Representation
下一节我们会更详细的跟大家讲 Diffusion Model 是怎么做的,这里我们就简单讲一下 Diffusion Model 的概念,那 Diffusion Model 是什么呢?我们就是把一张图片一直加噪声一直加噪声,加到原来的图看不出来是什么,那看起来就像是从 Normal Distribution sample 出来的一个噪声一样。Imagen 都是用 Diffusion Model 做的,但是这些模型之所以会这么强也不完全是 Diffusion Model 的功劳,那我们后面会概览一下 Stable Diffusion,那你会知道说 Stable Diffusion 里面其实是加了很多其它的东西才会让它这么厉害
那上图中没有 GAN,为什么没有 GAN 呢?因为 GAN 它其实就是另外一个角度的思考,所以它跟 VAE、Decoder 都是 Neural Network,都是类神经网络,都很复杂;那在 Flow-based Model 里面我们其实只 learn 了 Encoder,但是我们做了一些手脚来保证 Encoder 是 Invertible的,所以我们的 Decoder 其实就是 Encoder 的 Inverse,所以在 Flow-based Model 里面只需要 learn Encoder
那从上面的图上看来你可能会想说 Denoise Model 是不是同一个呢?是不是同一个 Denoise Model 反复用很多次呢?但是因为这边每一个 Denoise Model 输入的图片差异非常大,比如最开始的 Denoise Model 的输入就是一个纯噪声,而在靠后的 Denoise Model 输入的图片噪声非常小,它已经非常接近完整的图。Flow-based Model 跟 Diffusion Model 的差异,那它们的共通性就是它们都有一个 Encoder 的机制一个 Decoder 的机制,在 VAE 里面 Encoder、
你现在每一张图片都有一段文字,所以你先把这张图片做完 Diffusion Process 得到 pair data 的训练数据以后,你在训练的时候不只要给你的 Noise Predicter 加入噪声后的图片和 Step ID 还要多给一个文字的输入,然后 Noise Predicter 会根据这三样东西产生适合的 Noise,产生要消掉的 Noise,也就是我们所说的 ground truth
OK,那通常这个中间产物长什么样子呢?如果讲得更具体一点通常的做法是上图这个样子,假设你输入的图片是 HxWx3,那通常你的这个 Latent Representation 可以写成 hxwx3,所以你要把它当作是一张小图也可以,只是这张小图是人类看不懂的小图,这个 h 跟 w 是 H 跟 W 做 downsampling 的结果,然后这个 c 就代表的是 channel,就代表说在这小图上每一个位置是用多少个数字来表示,如果 c 等于 10 就代表每一个位置是用 10 个数字来表示
3.3 Generation Model
OK,那最后就来进入 Generation Model 的部分
那 Generation Model 的作用就是输入文字的 Representation 产生一个中间产物图片压缩的结果,那怎么做呢?那我们已经讲过 Diffusion Model 的概念了,我们现在唯一不一样的地方是刚才在做 Diffusion Process 的时候你的 Noise 是直接加在图片上,但是现在我们要 Diffusion Model 产生出来的东西已经不是图片了,那怎么办呢?
OK,然后今天在生图的时候你的做法就是你有一个纯粹从 Normal Distribution 里面 sample 出来的 Latent Representation,它的大小像是一个小图的样子,但是它是从 Normal Distribution 里面 sample 出来的,然后你把这个东西加上这段文字丢给一个 Denoise 的 Model,然后 Denoise 的 Model 就去掉一些 Noise,然后这个步骤就反复继续下去,直到你通过一定次数的 Denoise 之后产生出来的结果够好了丢给 Decoder 就可以生图了
那所以你会发现你在用 Midjourney 的时候它有一个生图的过程,从模糊慢慢到清楚,那如果是 Diffusion Model 的话你应该看到的是一开始完全 Random 的噪声,然后噪声慢慢越来越少越来越少,最后你的清晰的图才生成出来
那我们之前有讲过说对于图像生成而言这种方法太耗费时间了,所以在图像生成任务中今天你看到多数的模型采取的都是一步到位的方法,也就是说给一段文字,如果你要生成一张图像,那在概念上你会做的事情就是我把每一个位置要放什么颜色的 distribution 都先产生出来,然后再根据这些 distribution 去做 sample,但是这么做会有什么问题呢?
你会发现今天图像生成的模型都有一个共同的套路,这个共同的套路是什么呢?它们都不是直接给一段文字就生成图,它们都会有一个额外的输入,这个额外的输入是由一个高维的 Normal Distribution 做 sample 得到的一个高维的向量,然后把这个向量丢到图像生成的模型里面跟这个文字合力去产生你最后的结果
所以你会发现说不管你今天是用什么图像生成的模型,VAE、GAN 或者是热门的 Diffusion Model 其实方法都是一样的,你都不只是只有拿文字去生图像,你都需要一个额外的输入,你都需要从一个简单的概率分布里面去 sample 出一个东西,sample 出来的这个东西有点像是噪声。通常三个模组是分开训练然后再把它们组合起来的,今天你看到的比较好的文生图的模型都是差不多的套路
那 DALL-E 系列其实一开始也是用的相同的套路,你需要有一个文字的 Encoder 先对文字进行理解,接下来你要有一个生成的模型,那其实在 DALL-E 里面它是有两个生成的模型,你可以用 Auto Regressive Model,因为今天已经先做了一些处理以后现在你要产生的并不是一张完整的图片,如果你要生成完整的图片的话 Auto Regressive Model 的运算量太大了,但是如果生成的只是一个图片的压缩的版本也许用 Auto Regressive 的方法还可以,所以可以用 Auto Regressive 也可以用 Diffusion Model 生成图片的压缩版本,最后用个 Decoder 还原回原来的图片,这是 DALL-E 系列的做法
Decoder 要做的事情就是想办法调整它的参数让 Discriminator 做得越差越好,那这个就是 GAN 的概念,当 Discriminator 做得差了就代表 P ′ ( x ) P'(x) P′(x)也就是这个 Decoder 生成的图片的分布跟真正的图片的分布有很大的差距,那这个就是 GAN
如果你想要知道更多关于 GAN 的内容你可以参考下:GAN Lecture 1 (2018): Introduction