转自(6 条消息) 扩散模型本体变体对比 -- diffusion model, stable diffusion model v1 & v2 - 知乎
扩散模型最近非常热, 也出现了许多变体。其中包括stable diffusion,并且stable diffusion也出现了v1和v2两个版本。这篇博客主要是想对比一下扩散模型本身,stable diffusion v1和v2三个模型之间的差异。本篇博客参考:Stable Diffusion 1 vs 2 - What you need to know 和 Stable Diffusion 2.0 Release
diffusion model扩散模型相信大家有所耳闻,输入简单的文字就可以生成非常惊艳的图片。比如输入"photograph of an astronaut riding a horse"就可以生成下面的图片:
扩散模型效果图扩散模型大致的流程图长这样: 简单来说,扩散模型的训练就是对一张图片进行不断的加噪再去噪的过程,而主要训练的是模型对噪声的预测能力。也就是说正向过程中,是我们人为的加噪声并且我们会记录下来到底加了什么噪声,在逆向过程中,就轮到模型去猜我们在每一步加了什么噪声,所以loss就是正向过程中我们记录下来的噪声和逆向过程中模型猜的噪声之间的距离。然后当训练好了之后,我们就只关注与它逆向的去噪过程。给它一张纯噪声图片,让它多次去噪并加以“想象”,最终就生成了各种各样的图片。
stable diffusion modelstable diffusion model是扩散模型比较有名的一个变体了,简单来说,与扩散模型对比,可以理解成stable diffusion model就是在latent space上的diffusion model,它只是在扩散模型前后加了一个编码器和解码器,先用编码器把图片压缩成比较小尺寸的latent data,然后把这个latent data当作扩散模型的输入,经过扩散模型之后的输出再进入一个解码器,最终还原成图像。这样做的好处就是计算量减小,计算速度加快。除此之外,stable diffusion加入了条件控制,因为我们有时想根据我们的文字输入去控制图片的生成,所以多了一块text encoding。下面是stable diffusion实际implement的流程图。输入的text先经过一个固定的预训练好的text encoder,输出一个text vector。之后随机生成一个纯噪声图片,就是下图中的RNG,与输出的编码过的text vector连接起来,输入到扩散模型当中,默认去噪50次,之后输入到解码器最后生成图片。 stable diffusion model v1&v2 对比v1和v2的模型结构都一样,只是一些细节和性能变了,最主要的变化就是text encoder。v1使用的text encoder是openAI的CLIP模型,但是CLIP模型训练数据集没有公开;v2用的是openCLIP,基于公开数据集LAION-5B进行训练的。至于为什么要讨论text encoder变了,是因为它是v1和v2差异的根源。v2的训练完全基于公开的资源,这符合了stable diffusion最初的开发意图,即建立一个完全open的项目。但实际上v2的性能并没有说一定打败了v1,相反在某些特定种类上比v1更差。比如名人和艺术作品。因为LAION-5B的数据集里面包含的名人和艺术作品数据集更少,所以性能也更差。下图是v1和v2的对比,比起v2,v1更加真实且细节更多。 当然v2肯定有自己的优势。比如说添加了超分辨率功能: 还有深度估计功能,depth-to-image,在保持原图各个物体深度不变的条件下进行变化:
v2.1 & v2.0但是最新发布的2.1版本做了改进,2.1版本的训练使用了修改过的NSFW filter。NSFW filter主要用于过滤数据集,去除掉一些不适宜的图片。修改过的filter没有那么严格,所以数据集也扩增了,因此2.1版本刻画人的性能也提升了。总结总结来说,stable diffusion model基于diffusion model做了改变,将扩散模型应用于latent space上,加速了计算;而v2和v1有差距的根本来源于text encoder训练的数据集不同。v1和v2的性能没有说一定谁更好,要看具体是要生成什么种类;除此之外,v2支持更多功能比如超分辨率和depth-to-image;2.1版本刻画人的性能比2.0更强。
|