Diffusion Model

前段时间学习了李宏毅老师的diffusion课程, 想着作点笔记总结一下

以下说明主要来自最知名的Denoising Diffusion Probabilistic Model(DDPM)

How it works#

扩散模型生成图片的第一步是sample一张都是杂讯的图片, 也可以说是从Gaussion Distribution中sample出的一个vector, 并且该vector的dimention跟我们要生成的图片大小相同. 假如我们今天想要生成一张256x256大小的图片, 那我们sample出的vector的dimension就必须是256x256.

接下来我们需要一个denoise的network, 它的作用是从我们输入的一张充满杂讯的图滤去部分杂讯, 接着不断重复. 随着我们的denoise的次数越多, 我们就能得到一张清晰的图片. 需要注意的是, denoise的次数是提前确定的. 通常我们还会给每一个denoise步骤1个编号, 编号从大到小, 也就是说从一开始都是杂讯的输入开始做的denoise的编号最大, 然后逐渐递减.

这个从杂讯到图片的步骤, 被称为Reverse Process. 在概念上, 我们可以将其理解为Michelangelo说的, "雕像本来就在石头里, 我只是把不要的部分去掉. " Diffusion Model所做的事情是一样的, 本来图片已经存在于杂讯之中, 它只是把杂讯的部分滤去, 然后产生了一张图片.

 

那么如此多step中的Denoise Model是不是同一个呢?

答案是肯定的, 这里我们就是将同一个Denoise Model 反复进行使用. 但是由于每个步骤中我们输入的图片差异非常大, 即图片所包含的杂讯差异很大, 例如step1000中输入的是纯杂讯的图, 而最后一个step中输入的图已经接近于最终的图片结果. 所以我们要做的, 就是不仅仅将图片输入, 还有输入目前noise的严重程度, 我们使用的方法是输入step, 告诉模型目前是在哪一个step中.

Inside the Denoise Module#

那denoise内部究竟做的是什么呢?

实际上它有一个Noise Predictor, 它的作用是预测这张图片中杂讯长什么样子. 我们将要被denoise的图片和noise目前的严重程度(目前的step代号)输入Noise Predictor, 然后Noise Predictor会输出一张杂讯的图, 这张图就是对输入图片中杂讯的预测, 然后将输入的图片减去输出的杂讯图, 就得到了denoise后的结果.

可是为什么不直接训练一个Predictor能输出denoise后的结果, 而是要输出杂讯再用输入的图片减去杂讯呢?

其实理论上是可行的, 但是效果不会很好. 因为直接产生一张denoise之后的图片的难度远大于产生一张noise的图片, 如果能训练一个直接产生denoise之后的图片的Predictor, 那么它已经接近于能够得到真实的图片了, 所以难度比较大.

How to train#

接下来的问题就是如何训练这个Noise Predictor呢?

Noise Predictor的训练资料其实是我们去创造出来的. 如何创造呢?

首先我们从database中取出一张图片, 我们自己加入噪音, 所谓的噪音就是随机的从Gaussion Distribution中sample出的一组杂讯, 然后将噪音加入到图片中, 产生有点noise的image; 接着再sample一次得到更noisy的image, 以此类推, 最后得到的整张图片就已经看不出原来的内容. 这个加入噪音的过程叫做Forward Process, 也叫做Diffusion Process.

做完之后, 我们就有Noise Predictor的训练资料了, 对于它来说, 训练资料就是加完杂讯的图片还有step id, 而先前加入的杂讯就是network应该要predict的输出. 接下来就像一般的network一样, 不断train即可.

Text-to-Image#

前面讲的只是从杂讯中生出图片, 但是还没有考虑文字. 那如何把文字考虑进来呢?

首先我们要知道, 如果我们想要训练一个影像生成的模型, 输入文字输出图片, 我们还是需要图片跟文字成对的资料. 我们今日所看到非常厉害的模型, 例如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

Algorithm#

在DDPM论文中训练和图像生成的算法如下, 这是经过复杂的推导和简化之后的结果, 所以看起来极其简洁.

 

参考:

[1] Jonathan Ho and Ajay Jain and Pieter Abbeel. Denoising Diffusion Probabilistic Models.

[2] https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php

 

 

作者:Esofar

出处:https://www.cnblogs.com/ygtrece/p/17869452.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   YG_TRECE  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示