This is defy_odd's blog

人在有闲的时候,才最像一个人 —— 梁实秋

初识Diffusion model(后面有缘分再更新吧,没看很明白说实话)

东西有点多,有点看不过来

一、引言

它的过程其实很清晰,就是把一张全是噪声的图片生成一个新的,有意义的图片。

具体来说,是通过一个神经网络预测出一个噪声图,在原图上减去这个预测出来的图片,经过多轮的迭代之后得到一个新的,好看的,有意思的图片。

鼠鼠只看了吴恩达的diffusion model和李宏毅的diffusion model,把链接都放在下面。

感觉吴恩达的视频没讲什么东西,只告诉我们怎么样进行训练,讲了一点最基础的理论,没有任何数学推导。感觉用处不算大。而且视频剪的emmm不太好评价

爆火!这绝对是目前B站最新的diffusion教程,不愧是AI大佬,1小时弄清楚diffusion的工作原理,简直比刷剧还要爽!人工智能|机器学习|openAI_哔哩哔哩_bilibili

扩散模型 - Diffusion Model【李宏毅2023】_哔哩哔哩_bilibili

PowerPoint 簡報.pdf) (李宏毅版本的pdf,只有后面的推导证明部分)

接下来主要根据李宏毅的视频进行记录(因为另一个根本不知道能记什么……)

二、训练过程

1、noise predictor

通过人为添加一些噪声到图片当中,得到有点噪声的图片。通过这些带有人为噪声的图片做为数据集,进行noise predictor的训练。

训练时,就让该模块对有噪声的图片进行预测得到噪声,跟我们人为添加的噪声进行比对,计算loss,逐渐收敛得到一个性能较好的模块。

这个模块是人为创造数据集为其进行训练的,和鼠鼠之前了解过的dl不太一样

2、其余部分

除了这个重要的noise predictor模块以外,还需要两个重要的参数

1、time step。它是来评估噪声程度的一个重要参数,调节模块对于现有图形的认识并且动态调整从噪声图中减去噪声的程度

2、文本参数。我们希望它朝我们期望的方向前进,就需要我们给它一些文本的描述,这也是需要给定的数据

三、diffusion模型介绍

目前主流都是采用三个步骤来实现:

  1. text encoder。先对文本进行好的编码
  2. generate model (经常是diffusion model或者autoregressive)。根据编码好的文字进行压缩图片的生成
  3. decoder。通过上一步得到的压缩图片进行解码,得到最终经过整个流程之后的图片

三个部分通常是分开训练

text encoder

FID评判指标:用于评判生成的图片和真实的图片之间的差距,检验生成的图片是否真实

通过一个已经训练好的cnn网络分别进行两张图像的表征,将两张图片的结果进行对比(前提是认为它们都符合高斯分布)

具体对比方式:计算两组分布之间的Frechet距离,所以两者越小越好

它需要sample出很多的图片才能进行测量,视频中提到的是10k张图片。

CLIP:简单说就是同时将text和image作为一个pair输入进去训练,看最后两者的距离是远还是近,主要作为text encoder

decoder

优势:不需要成对的数据

  1. 中间产物为缩小的图片

    这种情况就很简单了,只需要训练一个网络能够放大图像就行(这个过程也有点唐,一个resize不就行了吗)

  2. 中间产物为latent representation

​ 需要训练一个auto encoder,把图像变成latent representation,然后再通过这个representation训练decoder。(感觉这个过程有点唐)

generation model

数据准备:

给定一张图片,先进行encoder,这个encoder得到的是latent representation

(这里感觉没讲明白,我不知道这里的encoder是什么东西,但是感觉不是text encoder)

得到latent representation之后,将噪声加在这个表征上面。

训练predictor:

把各个加上噪声的表征、step、text作为输入数据,放进predictor进行训练。

训练时要求得到一张加上噪声的表征,和放入训练的进行比对

使用模型

跟训练相反,把latent representation和text放进denoise模块中,重复多次直到得到满意的图片为止


四、数学原理(概论率启动)

这里不知道为什么旁边的目录里多了一个无序列表的标识

这里先贴上diffusion model的training algorithm

img

来解释一下每一行是什么意思,非常标准的伪代码

第二行的,指的是干净的数据。是指从数据集中选出一张图片。我的理解是选出一个target

第三行的, 指的是从中sample出一个数,例如从1-1000中选出一个968

第四行的, 指的是从均值为1 ,所有维度上的方差都为1的normal distribution中sample出一个noise,大小和一样

第五行的公式

首先看 其中,是已经固定好的值,并且随着i的增大而减小。这个是通过计算得到的。

主要是为了平衡原图和噪声对于最后生成的图像的结果。

当t越大时,越小,越大,生成的叠加图中原图占比就小,噪声占比就大。

再看外面的 这个是我们需要训练的noise predictor(划重点)。 给一个生成的叠加图和时间t,放入该模块中,得到一个模块预测出来的noise

接下来就是让噪声真值减去预测出来的noise,得到一个loss,之后再通过梯度下降去优化算式直到收敛

极大似然估计

先别急到sample,先来学一学极大似然估计孩子们,链接放在下面的参考里了。

为什么要学?因为大家都这么干,来看看大家是怎么解决sample这个问题的。

用简单的话来说就是已知一个带参数的确定分布(一个带参数的函数),但是参数未知,需要得到那个参数。

因为该分布存在,所以,当参数取得最大值时,就更能确定分布,更加验证了该分布的合理性。(这一行有点绕,建议看一下视频)

要得到参数的最大值,将该函数先取对数(为的是降低幂次),求导,令其等于0,解出方程。

极大似然估计用人话讲就是这样。

来吧,来看看极大似然估计的用处

这里的是真实世界的数据,是从真实世界中抽取出来的一些真实图片。

上面的可以认为是我们通常讲的似然函数。因为是我们预测出来的分布,它已经被模型预测出来了,所以它真实存在,可以作为似然函数。也可以理解为概率密度函数。

后面这个约等于用的妙,把和我们想要求的联系在一起。

在等于这里,按道理应该是要等于,主要原因是它用了min,不再是之前的max,多了一个负号

关于KL散度,熵等名词,在我另一个文章里面有写,链接在这里香农熵,交叉熵和KL散度 | This is defy_odd’s blog

所以,在这当中,最大似然估计的值可以看成是最小KL散度

又接着讲VAE了,靠,又要补了

接下来是sampling的阶段

img


PS:关于推理(Inference)和预测(Prediction)

这里主要关注的点是推理模型和预测模型

推理:更加关注于确定的数据,更重要的是模型的可解释性,这是能够进行推理的重要指标。能够让外行理解模型产生预测的过程

预测:更加关注于通过概率得到的结果,更加依赖以参数估计相关的置信度(感觉是概率论里面的东西)

通常说的推理和预测,一般是训练结束输入新的数据进行处理,二者通常可以等价


参考

Inference vs Prediction - Data Science Blog: Understand. Implement. Succed. (这全英的看的我难受死了)

深度学习的宏观框架——训练(training)和推理(inference)及其应用场景_深度学习中inference部分是-CSDN博客

torch.cumsum — PyTorch 2.6 文档 - PyTorch 深度学习库

扩散模型中的Noise Scheduler - 知乎 (这个知乎写的挺好的,但是感觉概论率的东西有点多看不太明白)

似然估计不会做?这个视频让你从头通透到脚趾!_哔哩哔哩_bilibili (最大似然估计都忘记了)

概率论基础 —— 8.数学期望、方差、协方差_期望和方差-CSDN博客 (看了一眼期望的连续是咋样的)

AI+分子模拟:从 Score Matching 到 Diffusion Model,从瑞士卷到丁烷 | Bohrium-玻尔科研空间站 (应某人要求,把这个最开始的链接放上来,但是我真的没参考里面的东西,看不懂啊(捂脸))