扩散模型简介-智商<=75能看懂版(入门必看)

109 阅读8分钟

下图是一张噪声图像,也许你可以理解成由计算机的随机数生成,实际它也可以由一张图像慢慢加噪得到。

x_0092.png

对一张图像加噪的过程,架起了图像生成的桥梁。计算机学习加噪的逆过程,就能慢慢掌握从噪声到图像的规律。类比物理学中的热扩散方程,热扩散和图像噪声化有异曲同工之妙,两者都是一个从有序到无序的熵增过程。你可以这样理解:将图像每个像素点的明暗程度看作热运动的粒子,那么一张图像中那些有序的高热量区域就会向低热量区域扩散,最终达到热平衡的噪声状态。扩散方程是离散化的:

xt=(1βt)xt1+βtϵtx_t=\sqrt{(1-\beta_t)}x_{t-1}+\sqrt{\beta_t}\epsilon_t

从原图到噪声图,使用扩散方程给图像加工的过程,可以分为t个时间步。模型可以逐步的学习去噪。扩散模型的训练,主要可以分为两个阶段。

1.首先是向前扩散

x0>xtx_0 -> x_t

xt=(1βt)xt1+βtϵtx_t=\sqrt{(1-\beta_t)}x_{t-1}+\sqrt{\beta_t}\epsilon_t

βt\beta_t:控制每一步加入多少噪声的参数,通常 0<βt<10<\beta_t<1βt\beta_t越大当前添加的噪声越多,一般在添加过程中,设置随着t增大,βt\beta_t逐步增大,直到得到完全噪声图像。

0<β0<.....<βt1<βt<.....10<\beta_0<.....<\beta_{t-1}<\beta_t<.....1

对于 ϵt\epsilon_t 则表示从正态分布中采样出来的随机噪声。正态分布或高斯分布,是描述自然界大量随机事件的普遍规律。所以你可以把 ϵt\epsilon_t 理解成计算机生成的一组随机数。得益于框架,在实际应用中这个变量可以调用很简单的代码生成,如下:

c_t=torch.randn_like(x_t)#标准高斯分布采用

我们得到了一组形状和原始图像相同的随机数 ϵt\epsilon_t 再代入这个扩散方程中,就能根据前一步的图像,计算出后一步的图像。在实际要求中,我们想要求任意时间步的 xtx_t 也不用这样一步步的求,可以直接令 αt\alpha_t 等于 1 减去 βt\beta_t 的累积乘积,直接从 x0x_0 求出 xtx_t

αtˉ=i=1t(1βi)\bar{\alpha_t}=\prod_{i=1}^{t}(1-\beta_i) -----> xt=αtˉx0+(1αtˉ)ϵtx_t=\sqrt{\bar{\alpha_t}} x_0+\sqrt{(1-\bar{\alpha_t})}\epsilon_t

到了这里我们的第一阶段就结束了,我们来到第二阶段。

2.逆向扩散过程

逆向扩散过程的目的是想办法将一张纯噪声图 xtx_t 逐步去除噪声,最终恢复出一张清晰的有意义的图像x0x_0

x_0062.png x_t->去...噪->x_0 img.jpeg

如何才能做到呢?之前我们根据扩散方程可以从xt1x_{t-1} 计算xtx_t ,现在要去除噪声就是要反过来从xtx_txt1x_{t_1} 把公式变一下就是像下面这样:

xt1=1(1βt)xtβt(1βt)ϵtx_{t-1}=\frac{1}{\sqrt{(1-\beta_t)}}x_t-\sqrt{\frac{\beta_t}{(1-\beta_t)}}\epsilon_t

现在式子里βt\beta_t 因为是提前设定好的,我们是知道的。所以求 xt1x_{t-1} 的关键就在于这个 ϵt\epsilon_t 但问题是它是个随机数,每次生成的都不一样,我们是没办法通过什么数学公式来求出它的。

不过这恰好是我们万能的神经网络的拿手好戏,既然数学上很难求出它,那我们就训练一个神经网络,把它预测出来不就行了。现在我们需要找一个神经网络,比如U-Net。给它输入带噪的图像 xtx_t 和当前的时间步 tt ,让它输出 ϵθ(t)\epsilon_\theta(t) 然后计算它和实际添加噪声 ϵt\epsilon_t 之间的均方误差作为损失函数,最后通过大量的样本训练网络,最小化这个损失,就可以得到一个能够预测每一步噪声的AI模型了,这样给模型一张纯噪声图 xtx_t 就能根据它所预测的噪声 ϵt\epsilon_t 一步一步还原出清晰的图像 xtx_t 了。

loss=ϵtϵθ(t)2loss=||\epsilon_t-\epsilon_\theta(t)||^2

从本质上来说,模型学习的是如何从噪声中还原出原始数据的概率分布,它通过预测出每一步的噪声,间接学会了如何从 xtx_t 中剥离掉一部分噪声得到 xt1x_{t-1}

那么我相信很多人和我有一样的疑惑,拿一张图片加了噪声再去除噪声有什么意义呢?这不是脱了裤子放屁吗?这就涉及到了扩散模型的下一个核心问题就是条件生成。模型从一张噪声图中去除一部分噪声绝对不是随意的,而是受到了额外信息的指导。也就是说在训练阶段,我们不仅要给模型提供带噪图像 xtx_t 和时间步 tt 还需要提供与原始图像 x0x_0 相关联的条件信息 cc 。这个条件信息 cc 就是模型学习的目标或者指引,我们下面用文生图模型来举例说明。

img.jpeg "一只可爱的猫咪"

在文生图模型中,条件信息 cc 就是描述图像 x0x_0 的文本标签或者提示词。例如训练图片是一只猫,对应的 cc 可能就是 "一只可爱的猫咪" 的提示词。而在图生图模型中,cc 就是另一张图片或者草图中的信息。不过在训练的过程中,我们必须实现条件信息与生成图像的精准对齐,只有这样才能保证生成的图像完全符合提示词的要求。

接下来我们来介绍如何整合条件信息,在文生图中常用的神经网络模型如U-Net是如何工作的呢?

假设现在有一张带噪图像 xtx_t 将它输入U-Net后会先经过一个下采样的过程,这个过程就像把高清大图缩小成低分辨率小图一样,同时提取图像中的关键信息(关于U-Net可以自己问大模型,也可以关注我后续的博文),例如轮廓和结构特征。在技术方面,下采样可以通过步长卷积来实现,经过下采样的图像形状发生了改变,虽然分辨率降低了,但是通道数达到了最高。

xtx_t(128x128x3)....>(64x64x64)....>(32x32x128)....>(16x16x256)

而接下来也会进行另一个核心过程:交叉注意力层 。

该层将会实现提示词和图像特征的对齐,交叉注意力层有3个较为重要的参数,分别是 q,k,vq ,k ,v 。其中qq 是经过下采样的图像特征,kkvv 则是我们的提示词输入文本编码器 CLIP 后被编码成的两个向量。你可以将 kk 理解成提示词信息的标识符,将 vv 理解成提示词文本的具体内容,他们就像一本书的目录和正文,这时候我们可以拿图像特征 qq 和目录 kk 进行对照看看能否对得上,如果对上了我们就把具体信息 vv 加入到这个对上的区域,这个对照的过程可以用 qqkk 的点积套上一个激活函数softmaxsoftmax来表示:

softmax(Q.KtDk)Vsoftmax(\frac{Q.K^t}{\sqrt{D_k}})V

其中 Dk\sqrt{D_k} 是一个防止梯度爆炸的参数,如果 qqkk 非常匹配,那么 softmax(Q.KtDk)softmax(\frac{Q.K^t}{\sqrt{D_k}}) 的结果将会趋近于1,和 vv 相乘后将会把 vv 的文本信息给代入到特征图中。而如果 qqkk 不匹配值将会趋近于0,和v相乘后将不会被代入到这个特征区域中。

屏幕截图 2025-11-18 153119.png

这时候,我们已经经过了下采样,经过了交叉注意力层,接下来将特征图进行上采样:

上采样和下采样相反,是将缩小后的图片恢复到原来的尺寸,最后输出预测噪声 ϵθ\epsilon_\theta

再举一个例子:

假如我们想生成一张猫咪的图片,现在已经有了一张带猫咪轮廓的噪声图 xtx_t ,这个图像经过下采样后,得到一张特征图 qq ,我们的提示词经过 CLIP 编码后输出了 kkvv 的两个向量序列。其中 kk 包含“猫””灰色“等语义向量特征,vv 则包含猫的具体毛发细节等语义信息,那么我们希望将 vv 中的细节只加入到猫所在的区域,我们拿猫轮廓特征图 qq 逐个像素点的分别和向量 kk 进行点积运算。计算得分高的区域,就说明和提示词关联性强,再与 vv 相乘就将 vv 的语义信息标记到了这个特征区域,就能精准的将提示词信息给注入到图像的不同区域,这时候再将整合后的特征图用反卷积进行上采样,最后预测出一个和 xtx_t 形状相同的噪声 ϵθ\epsilon_\theta 然后再根据扩散模型公式将这个噪声 ϵθ\epsilon_\theta 剥离,就得到了更像猫的图片,经过多次迭代,就能生成一个完整,清晰的猫咪图像。

当然扩散模型也可能不能一次就生成正确结果,仍然需要大量的训练。

下面就说说扩散模型的一些局限性:

例如,在训练的过程中对细节的学习不够充分,模型本质上学习的是像素的概率分布,所以对于一些自然规律它可能无法把握。

屏幕截图 2025-11-18 155147.png

不过这些问题未来一定能解决,目前的文生图模型总体上来说已经好多了,不过未来可能也会出现全新的框架来取代扩散模型。