二、 扩散模型(Diffusion Model)的训练过程

以下内容参考了Lil'Log 和李宏毅老师的课程

对于任何一个模型,都会分为两个过程:这篇文章主要聚焦于扩散模型的训练过程,而后面的文章将会聚焦于扩散模型的测试过程。

1. 前向过程与反向过程

训练过程中,我们需要向不含任何噪音的图片x0中加噪,是从image-20241017111523798image-20241017111648068,再到image-20241017112718800的过程。这个过程称为前向过程,也叫做扩散过程

测试过程中,我们需要从一个全是噪音的图片xT开始,逐渐降噪,最终生成想要的图片,是从image-20241017111648068,再到image-20241017111523798的过程。这个过程称为反向过程,也叫做逆扩散过程

为什么向图片中加噪叫做扩散过程?

想象一滴墨水倒在了水中,这滴墨水会在水中逐渐扩散,最终化在水中。

这个过程也可以理解为墨水从有序变得无序的过程。

同样的,如果我们有一张图片,那么我们可以向图片中添加噪音,使得图片从有序变得无序

image-20241021135743420

就像墨水在水中扩散一样,因此叫做扩散过程。

2. 扩散模型的训练过程

训练过程的目的是:训练出一个可以预测噪音的模型Noise Predicter。训练结束后,使用Noise Predicter,可以生成我们想要的图片。

在论文中,扩散模型的训练过程如下

image-20241016212012863

训练过程第2步

image-20241016215227395

  • 目的:

    生成一张不带任何噪音的图片x0

    例如,下图中,红色框的图片就是不带任何噪音的图片。

    image-20241016212925261

  • 公式讲解:

    q(x0)表示x0的满足的分布为q(x0),因此x0q(x0)表示从分布q(x0)中抽取一张图片x0

t时刻的图片为xt,那么x0是不带任何噪音的图片;xT是完全是噪音的图片,从x0xT,图片中的噪音逐渐增加

训练过程第3,4步

image-20241016215240454

  • 目的:

    [1,T]中随机抽取一个时刻t;并且从标准正态分布中,采样出噪音ϵ

  • 公式讲解:

    tUniform({1,,T})表示从1到T的均匀分布中采样出一个tϵN(0,I)从标准正态分布中,采样出噪音ϵ。因为噪音ϵ是一个矩阵,所以在公式ϵN(0,I)中,0表示零矩阵,I表示单位矩阵。

训练过程第5步

image-20241016215302052

  • 目的:

    计算损失函数关于参数θ的梯度,从而更新参数参数θ

  • 公式讲解:

    • α¯tx0+1α¯tϵ表示t时刻的图片xt,其中αt¯是一个常量。

      可以看到,这和我们上一篇文章中说的不太一样,对于xt的生成,不需要一步一步的从x0是生成x1 ,从x1生成x2 ...从xt1生成xt,而是可以直接从x0生成xt

      image-20241017114147060

    • ϵθ就是上一篇文章说的Noise Predicter,即预测噪声的模型。

      它有两个输入:t时刻的图片xtxt=α¯tx0+1α¯tϵ),以及时刻t

      它的输出是:对噪音ϵ的预测值,记作ϵ^

      Noise Predicter的输出也和上一篇文章不太一样。由于可以从x0直接生成xt,因此Noise Predicter的输出变成了从 0 时刻到 t 时刻,加入的噪音总和 ϵ^ ;而不再是从 t1 时刻到 t 时刻加入的噪音。

    • ϵϵθ(α¯tx0+1α¯tϵ,t)2,也就是||ϵϵ^||2,表示模型的损失函数是均方误差损失,可以记作Lt

    • θϵϵθ(α¯tx0+1α¯tϵ,t)2,也就是Ltθ,表示损失函数Lt对参数θ的梯度。

训练过程伪代码

image-20241016212012863

训练过程的伪代码如下:

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时刻的图片x0直接生成t时刻的图片xt?

xt1xt

t时刻的图片为xtt1时刻的图片为xt1t1时刻向t时刻加入的噪音为ϵt,并且假设ϵtN(0,1),扩散模型规定,将噪音ϵt加入到图像xt1中的公式为:

(1)xt=1βt×xt1+βt×ϵt1

其中βt是一个常数,并且从t=0t=Tβt的值逐渐增大。这代表着,从t=0t=T,向图片中增加的噪音越来越多。

若一开始的清晰的图片为x0,根据公式(1),我们就可以逐步加噪,最终生成充满噪音的图片xT

x0xt

考虑这样一个问题,如果逐步迭代:根据x0计算x1,根据x1计算x2,...,这样的速度也太慢了。

所以,我们可以考虑简化一下公式,最好是能够推导出直接从x0生成xT的公式。

我们将常数βt换一种表达方式,令αt=1βt,那么根据公式(1),我们可以得到

(2)xt=αt×xt1+1αt×ϵt(3)xt1=αt1×xt2+1αt1×ϵt1

将公式(3)带入到公式(2)中,可以得到

xt=αt×(αt1×xt2+1αt1×ϵt1)+1αt×ϵt=αtαt1×xt2+αt(1αt1)ϵt1+1αt×ϵt

因为ϵtN(0,1)ϵt1N(0,1),因此,[αt(1αt1)ϵt1+1at×ϵt]N(0,1αtαt1)

如果我们另设一个噪音ϵN(0,1),那么1αtαt1ϵN(0,1αtαt1)

因此,我们可以令[αt(1αt1)ϵt1+1at×ϵt]=1αtαt1ϵ

上面这种改写方式被称为“重参数化技巧”。

于是可以得到从xt2得到xt的公式

xt=αtαt1×xt2+1αtαt1ϵ

不断重复上面的过程,最终我们可以得到从x0xt的公式

(4)xt=α¯t×x0+1α¯t×ϵ

其中,α¯t=αtαt1αt2αt3α2α1=i=1tαiϵN(0,1)

至此,我们得到前向过程的公式,即公式(4)

我们前面说过,β1<β2<<βT,因此α¯1>>α¯T。当t=T时,α¯T0xTϵ,即xT可以近似认为服从标准正态分布。

概率密度函数 q(xtxt1) 以及 q(xtx0)

根据公式(1),我们可以得到,在前向过程中,在已知xt1的条件下,xt的概率密度函数q(xtxt1)=N(xt;1βtxt1,βtI)

根据公式(4),我们可以得到,在前向过程中,在已知x0的条件下,xt的概率密度函数q(xtx0)=N(xt;α¯tx0,(1α¯t)I)

N(xt;α¯tx0,(1α¯t)I)表示随机变量为xt,均值为α¯tx0,方差为(1α¯t)I的正态分布。

posted @   Brain404  阅读(1162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示