Diffusion Model
How it works#
扩散模型生成图片的第一步是sample一张都是杂讯的图片, 也可以说是从Gaussion Distribution中sample出的一个vector, 并且该vector的dimention跟我们要生成的图片大小相同. 假如我们今天想要生成一张256x256大小的图片, 那我们sample出的vector的dimension就必须是256x256.
接下来我们需要一个denoise的network, 它的作用是从我们输入的一张充满杂讯的图滤去部分杂讯, 接着不断重复. 随着我们的denoise的次数越多, 我们就能得到一张清晰的图片. 需要注意的是, denoise的次数是提前确定的. 通常我们还会给每一个denoise步骤1个编号, 编号从大到小, 也就是说从一开始都是杂讯的输入开始做的denoise的编号最大, 然后逐渐递减.
这个从杂讯到图片的步骤, 被称为Reverse Process
#
那denoise内部究竟做的是什么呢?
其实理论上是可行的, 但是效果不会很好. 因为直接产生一张denoise之后的图片的难度远大于产生一张noise的图片, 如果能训练一个直接产生denoise之后的图片的Predictor, 那么它已经接近于能够得到真实的图片了, 所以难度比较大.
How to train#
首先我们从database中取出一张图片, 我们自己加入噪音, 所谓的噪音就是随机的从Gaussion Distribution中sample出的一组杂讯, 然后将噪音加入到图片中, 产生有点noise的image; 接着再sample一次得到更noisy的image, 以此类推, 最后得到的整张图片就已经看不出原来的内容. 这个加入噪音的过程叫做Forward Process, 也叫做Diffusion Process
做完之后, 我们就有Noise Predictor的训练资料了, 对于它来说, 训练资料就是加完杂讯的图片还有step id, 而先前加入的杂讯就是network应该要predict的输出. 接下来就像一般的network一样, 不断train即可.
#
前面讲的只是从杂讯中生出图片, 但是还没有考虑文字. 那如何把文字考虑进来呢?
首先我们要知道, 如果我们想要训练一个影像生成的模型, 输入文字输出图片, 我们还是需要图片跟文字成对的资料. 我们今日所看到非常厉害的模型, 例如midjourney, stable diffusion或者是DALLE, 它们的资料往往来自于LAION, 这是一个拥有5.85 billion图片数量的数据集, 是我们所熟知的 ImageNet 图片数据集大小(1M)的6000倍左右. 而且它还拥有描述图片的多语言的文字资料, 这就是我们所要准备的训练资料.
在Denoise过程中, 我们的做法也很简单, 把文字加入denoise的module中即可. 这个额外的输入就是我们要它根据文字生成怎样的图片. 所以现在Denoise Module不仅仅依靠输入的图片做denoise, 还会根据一段文字的叙述, 再把noise去掉.
那Denoise Module中的Noise Predictor要如何修改呢? 就是直接把文字输入到Noise Predictor就可以了
训练部分如何修改呢? 当我们对图片做完Diffusion Process之后, 训练的时候不仅仅要给Noise Predictor输入加入杂讯后的图片, 以及step id, 同时还要多输入文字. 然后Noise Predictor会根据这三个输入产生需要滤去的noise, 也就是ground truth
#
作者:Esofar
出处:https://www.cnblogs.com/ygtrece/p/17869452.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人