Diffusion Model
生成图像的第一步是从gaussian distribution中simple一个杂讯的图片,这个vector的dimension跟你要生成的图像是一样的。
接下来 你有一个Denoise的module,从名字就知道Denoise输入是一张杂讯的图,输出会把杂讯滤掉一点,然后你可能就能看见一个猫的形状,然后再做denoise
越做越清晰了,这个denoise的次数是事先定好的,通常会给每一个denoise的步骤一个编号。那这个从杂讯到图片的步骤叫reverse process
在概念上这件事情就像是米开朗琪罗说的“雕像本来就已经在大理石中了,他只是把不要的部分拔掉”。diffusion model做的 事情也是一样的,图像本来就已经在杂讯里了,它只是把杂讯滤掉就产生一张图片。
你可能会说上面这些denoise的model是不是同一个的denoise model反复用很多次?是这样的,但是在这里每一个状况,你输入的图片差异非常的大,step1000输入的图像杂讯非常大,而step1输入图像的杂讯已经非常的小了。所以怎么办呢
所以这个denoise除了吃一个图像作为输入,还多吃一个输入,这个输入代表现在noise严重的程度
那denoise model 内部实际做的是什么呢
首先就是一个Noise Predicter预测,也就是预测这张图片里杂讯应该张什么样子,然后要被denoise的图剪掉Noise Predicter输出的杂讯,然后就产生denoise以后的结果
你可能要问为什么要这么麻烦,那么这里为什么不直接训练一个end to end的model,输入是要被denoise的图片,输出就是denoise的结果呢。你可以这么做,但是你要知道产生noise和产生一张图片的难度是不一样的,如果你的denoise model可以产生一个带杂讯的猫,那它几乎可以说已经会画一只猫了。所以learn一个Noise Predicter可能是比较简单的,而learn一个end to end 的denoise model可能是比较困难的
那么怎么训练这个Noise Predicter
训练network需要pair 的data,你需要对应的gt,怎么制造出这样的资料呢。
那Noise Predicter的训练资料是人为创造出来的
你先从图像库中选一张图片,然后一步步的加噪声(从高斯分布sample出来的杂讯),只到完全看不出是什么,然后你把你手上所有的照片做一样的处理。这就叫forward process(也叫Diffusion Process),做完这个过程你就有Noise Predicter的训练资料
但是我们要的不只是生成图像,刚才只是从杂讯生成图像,还没把文字考虑进来。
如果你要训练一个影像生成的model,它吃文字产生图像,你其实还是需要成对的资料
现在这些比较厉害的模型训练的数据量都非常的大
有了文字和图像的成对资料后,先看一些denoise的时候是怎么做的
只需要把文字输入到denoise就结束了。所以现在的denoise不仅仅只看输入图片做denoise,它是根据输入图片加上一段文字的叙述去把noise拿掉
好,那训练的部分要怎么改呢
下面是完整的算法
就这么多东西,没有更多了