二、 扩散模型(Diffusion Model)的训练过程
以下内容参考了Lil'Log 和李宏毅老师的课程
对于任何一个模型,都会分为两个过程:这篇文章主要聚焦于扩散模型的训练过程,而后面的文章将会聚焦于扩散模型的测试过程。
1. 前向过程与反向过程
训练过程中,我们需要向不含任何噪音的图片中加噪,是从到
,再到
的过程。这个过程称为前向过程,也叫做扩散过程。
测试过程中,我们需要从一个全是噪音的图片开始,逐渐降噪,最终生成想要的图片,是从到
,再到
的过程。这个过程称为反向过程,也叫做逆扩散过程。
为什么向图片中加噪叫做扩散过程?
想象一滴墨水倒在了水中,这滴墨水会在水中逐渐扩散,最终化在水中。
这个过程也可以理解为墨水从有序变得无序的过程。
同样的,如果我们有一张图片,那么我们可以向图片中添加噪音,使得图片从有序变得无序
就像墨水在水中扩散一样,因此叫做扩散过程。
2. 扩散模型的训练过程
训练过程的目的是:训练出一个可以预测噪音的模型
Noise Predicter
。训练结束后,使用Noise Predicter
,可以生成我们想要的图片。
在论文中,扩散模型的训练过程如下
训练过程第2步
-
目的:
生成一张不带任何噪音的图片。
例如,下图中,红色框的图片就是不带任何噪音的图片。
-
公式讲解:
表示的满足的分布为,因此表示从分布中抽取一张图片。
若时刻的图片为,那么是不带任何噪音的图片;是完全是噪音的图片,从到,图片中的噪音逐渐增加
训练过程第3,4步
-
目的:
从中随机抽取一个时刻;并且从标准正态分布中,采样出噪音
-
公式讲解:
表示从1到的均匀分布中采样出一个;从标准正态分布中,采样出噪音。因为噪音是一个矩阵,所以在公式中,表示零矩阵,表示单位矩阵。
训练过程第5步
-
目的:
计算损失函数关于参数的梯度,从而更新参数参数
-
公式讲解:
-
表示时刻的图片,其中是一个常量。
可以看到,这和我们上一篇文章中说的不太一样,对于的生成,不需要一步一步的从是生成 ,从生成 ...从生成,而是可以直接从生成。
-
就是上一篇文章说的
Noise Predicter
,即预测噪声的模型。它有两个输入:时刻的图片(),以及时刻。
它的输出是:对噪音的预测值,记作。
Noise Predicter
的输出也和上一篇文章不太一样。由于可以从直接生成,因此Noise Predicter
的输出变成了从 0 时刻到 时刻,加入的噪音总和 ;而不再是从 时刻到 时刻加入的噪音。 -
,也就是,表示模型的损失函数是均方误差损失,可以记作。
-
,也就是,表示损失函数对参数的梯度。
-
训练过程伪代码
训练过程的伪代码如下:
while True:
# 第2步
挑出一张没有噪音的图片x_0
# 第3步
在[1,T]中,随机选出一个时刻t
# 第4步
生成一个噪音ε
# 第5步
生成t时刻的图片x_t
y_pred = ε_θ(x_t,t) # 预测噪音的模型是ε_θ,y_pred为ε_θ输出的预测值
y = ε # 真实值是噪音ε
loss = (y-y_pred)**2
计算loss关于参数θ的损失
更新参数θ
# 第6步
if 模型ε_θ 已经收敛:
break
3. 为什么可以从0时刻的图片直接生成t时刻的图片?
从 到
设时刻的图片为,时刻的图片为,时刻向时刻加入的噪音为,并且假设,扩散模型规定,将噪音加入到图像中的公式为:
其中是一个常数,并且从到,的值逐渐增大。这代表着,从到,向图片中增加的噪音越来越多。
若一开始的清晰的图片为,根据公式(1),我们就可以逐步加噪,最终生成充满噪音的图片。
从 到
考虑这样一个问题,如果逐步迭代:根据计算,根据计算,...,这样的速度也太慢了。
所以,我们可以考虑简化一下公式,最好是能够推导出直接从生成的公式。
我们将常数换一种表达方式,令,那么根据公式(1),我们可以得到
将公式(3)带入到公式(2)中,可以得到
因为,,因此,
如果我们另设一个噪音,那么
因此,我们可以令
上面这种改写方式被称为“重参数化技巧”。
于是可以得到从得到的公式
不断重复上面的过程,最终我们可以得到从到的公式
其中,,。
至此,我们得到前向过程的公式,即公式(4)
我们前面说过,,因此。当时,,,即可以近似认为服从标准正态分布。
概率密度函数 以及
根据公式(1),我们可以得到,在前向过程中,在已知的条件下,的概率密度函数
根据公式(4),我们可以得到,在前向过程中,在已知的条件下,的概率密度函数
表示随机变量为,均值为,方差为的正态分布。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?