来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM)
论文链接:https://arxiv.org/abs/2006.11239
Hung-yi Lee 课件整理
简单地介绍diffusion model 的基本概念,diffusion model有很多不同的变形,现在比较成功的使用diffusion model实现的图像生成的系统,比如阿里、Google的系统基本上都是用差不多的方法来作为他们的diffusion model。
一、整体运作
我们先来看看它是怎么生成图片的,在生成图片的第一步,需要sample一个都是杂训的图片,从高斯分布里面sample出一个向量,这个向量的数值和维度和我们要生成的图片大小是一模一样的,假设你要生成一张256256的图片,从标准分布里面sample出来的向量,它的维度必须是256256,然后把sample出来的256*256的向量排成图片的样子。
然后接下来就有一个Denoise的module,也就是Denoise的一个network,后面会说它长什么样子,从它的名字就可以知道,输入一张都是杂训的图,输出就会把杂训去掉一些,那就可以看到一个猫的形状。
然后再做Denoise的操作,猫的形状就会逐渐出来。
Denoise越多越多,期望最终会看到一张清晰的图片。
Denoise的次数是事先定好的,我们通常会给每一个Denoise的操作设置一个编号,产生最终那个图片的编号是最小的,一开始输入都是杂训的编号是最大的,所以从1000、999、排到2、1,这个从杂训到图片的步骤成为reverse process。
接下来我们讲Denoise的module,从这个图上来看,你会不会认为是同一个Denoise的module用很多次呢?我们这里是把同一个Denoise的module反复使用,但是我们看到每一个Denoise的module的输入和输出的状况都不一样,差异很大。
实际上我们会在每个Denoise除了需要输入图片还需要一个额外的输入,这个输入代表了噪声的严重程度,1000代表刚开始Denoise的时候严重程度很大,1代表Denoise的步骤快要结束了,我们期望Denoise的module可以根据我们现在输入第几个step的信息作出不同的回应,所以我们确实只使用了一个Denoise的Module。
二、Denoise module
那么Denoise的module里面实际内部在做什么呢,在Denoise里面实际上有一个noise predictor,它用来预测输入图片里面的杂训长什么样子,它的输入是需要Denoise的图片和当前噪声的严重程度,输出一张杂训的图。
然后把输出的杂训减去这个要被Denoise的图片,生成Denoise之后的结果。
产生一张图片和产生一张噪声的难度是不一样的,生成一张带杂训的猫和生成一张猫的图片的难度是不一样的,所以直接训练一个噪声预测器是比较简单的,用end-to-end的模型直接产生一个猫的图片是比较困难的。
三、Noise Predictor
接下来的问题是怎么训练这个Noise Predictor,要预测一个噪声需要Ground truth,训练network需要有pair data才行,需要告诉Noise Predictor这个杂训长什么样子,它才可以学习怎么输出杂训来。
实际上这个训练预料是人工创造的。
从Databese里面拿一张图片出来,自己加噪音进去,产生有点噪声的图片,再sample,得到噪声更多的图片,以此类推,最后整张图片都看不出原来是什么东西了,把手上有的所有的图片都做这样的操作,这个加噪音的过程叫Forward Process,也叫Diffusion Process。
做完这个Forward Process之后我们就有了Noise Predictor的训练数据了。
四、Text-to-Image
上面提到的只是怎么生成图片,并没有把文字考虑进来。
图像生成模型是输入文字,输出图片,实际上我们还是需要文字和图片成对的训练语料,现在图像生成模型使用的语料库基本上是LAION,它有5.85B的成对的图像语料。
Denoise是根据输入的图片和文字描述来把噪声过滤掉,所以在每一个module都会有一个额外的输入,这个额外的输入就是需要它根据什么样的文字描述生成什么样的图片。
那么在Denoise module里面的Noise Predictor需要把这段文字输入给它,要让它多一个额外的输入。
训练的时候Noise Predictor会根据这三个输入产生相应的噪声,也就是需要过滤掉的噪声。
这是来自原始论文里面的算法描述,就这些,没有更多东西了。这两个算法里面还暗藏玄机,下一篇博客详细讲解。