单位 | 粤港澳大湾区数字经济研究院

研究方向 | 条件受控文本生成

这篇文章主要比较一下扩散模型的引导生成的三种做法的区别。它们分别是用显式分类器引导生成的做法,用隐式无分类器引导的做法和用 CLIP 计算跨模态间的损失来引导生成的做法。

分类器引导生成

1.1 直观理解

我们知道扩散模型的前向扩散过程和后向的去噪过程都可以用一个随机微分方程来描述,并且其中后向去噪时我们事实上通过一个神经网络来拟合当前输入关于原数据分布的梯度,来将一个先验分布(如高斯噪声)里采样出的点逐渐推进到数据分布里(具体联系可以参考笔者的上一篇笔记:扩散模型与能量模型,Score-Matching 和 SDE,ODE 的关系 [5])。

既然我们知道后向生成可以看成是一个 MCMC 采样过程,而其中实际每一步的转移方程都是沿着往数据分布的梯度方向迈进,且该方向由我们神经网络的输出来拟合,那么推出分类器引导的形式就十分自然了。首先 DDPM 里我们网络训练预测的目标一般写成如下形式:

▲ DDPM里扩散网络预测的噪声实际上是往数据分布的转移梯度

有了这个网络之后,我们想要生成符合原数据分布的点(例如图像或文本)时我们可以通过逐步往该网络的预测梯度方向行走来获得最终数据点。但这样有一个问题是这样的无条件生成我们无法做到条件生成,如指定图像类别是猫或狗来生成具体类别的结果。但根据以上的直观理解,我们可以用贝叶斯定理来将条件生成对输入的对数梯度拆解一下 [1]:

▲ 贝叶斯定理

上式里我们很明显看到 定类别或条件生成的梯度可以看作是我们本来就已经在拟合的无条件梯度再加上一个分类器的梯度来得到 (其中条件关于输入的求导为零)!换句话说对于一个先验分布,我们想要再次获得数据分布里在条件约束下的数据点时,我们实际只要在原来往数据方向的梯度方向上再额外添加一个分类器的梯度方向即可。

具体来说,宋飏博士在论文 [2] 里给出的后向去噪的随机微分方程本来是如下形式:

▲ 后向去噪过程的SDE形式

其中 代表的就是我们之前提及的无条件生成的数据分布方向的梯度,现在这个方向我们需要加上分类器的方向,所以后向过程变成了如下形式:

▲ 注意每步迭代的方向现在加上了分类器的梯度方向来引导

而在几乎同一时间发表的论文 Diffusion Models Beat GANs on Image Synthesis [3] 里,作者用了更加数学化的方式来得到同样的推导结论。这个推导就不那么直观了。

1.2 异曲同工

有关这篇论文如何得到相同的公式推导,读者可以参考原论文 [3] 附录里的推导。笔者在此按下不表。但同样的推论下,这篇论文作者给出了宋飏博士的推论在 DDPM 和 DDIM 的采样算法下的具体实现形式:

▲ 分类器引导在 DDPM,DDIM 采样算法下的具体实现形式

其中留意在 DDPM 下,每一步的均值估计加上了分类器引导的梯度,而在 DDIM 的框架下,原来的噪声估计也加上了分类器引导的梯度。

无分类器引导生成

但用一个显式的分类器引导生成有几个比较大的问题:一个是你需要额外训练一个在噪声图像上做分类判别的分类器,费时费力。其次该分类器的质量决定了你按类别生成的效果。实际上往分类器的判别梯度上更新图像的做法是图像界对分类模型进行对抗攻击的经典做法。骗过了一个并不健壮的分类器并不代表我们确实逼近了条件分布。

▲ 实际上在用分类器引导文本扩散生成时笔者也遇到了这个现象

而由此引申的最重要的一个缺陷是,这样的一个分类器在多样性和生成效果此消彼长的权衡博弈,并没有直接反映到我们的评判测度上(例如 IS 这个测度的输出本身就依赖于分类器)。

下图是 classifier-free [4] 这篇论文里给出的形象例子。对于一个来自于三个高斯分布混合而成的分布,我们通过分类器引导的采样过程导致了采样结果严重受限于该分布的局部领域,且分类器引导强度越强,远离其他类别的质心的表现越明显,使得结果越加集中在局部空间。

▲ 随着分类器引导的程度加深,我们的多样性显著下降

为了避免一个显式的分类器引导,笔者认为 classifier-free 这篇论文的核心思想是提出了一个隐式的分类器引导。以下是相关的推导: 首先我们知道噪声的估计和对数据分布的梯度是成负系数比例的(直观来说,噪声使得原输入偏离了原数据分布,而去噪过程沿着往数据分布的最近梯度则刚好和噪声是反方向,具体推导可以参考笔者文章: 从大一统视角理解扩散模型(Diffusion Models) )。而这个关系在这篇论文里以这个公式形式给出:

▲ 噪声估计和梯度方向成负相关

我们也知道有分类器引导时我们是在原梯度估计上额外加上分类器的梯度,于是我们得到了下面式子的左侧表示,其中 是分类器引导的强度。将噪声估计转换为梯度后我们得到了等式右侧的表示。

在此基础上继续将 以贝叶斯等式分解可以得到 其中 与 求导为零被约去,我们得到了右侧下方的表达式。也就是说 对无条件生成的网络以 的强度进行有分类器引导的扩散生成等价于对有条件生成的网络以 的强度进行有分类器引导。

▲ 推出这个等式是为了引出隐式分类器的表示

有了右侧下方这个表达式后我们来看 这个分类器的分布表示。同样我们可以用贝叶斯等式将其拆成 ,也同样再次忽略掉 关于 的求导, 我们实际可以构建一个隐式的分类器梯度,只关于 而无需一个显式的分类器 于是显式的分类器梯度拆成以下形式

▲ 其中两个epsilon分别代表P(z|c)和P(z)

那么我们再将这个显示分类器的梯度拆解式代入回上面的用 omega 强度对有条件生成的网络进行引导的表达式,我们可以得到 也就是下式:

613ce4481d25a671e16fcd42be673174.png ▲ 无分类器引导的最终形式

也就是说, 使用隐式分类器引导的最终解析式要求我们只需要训练两个梯度预估模型,其中一个是无条件生成的梯度预估模型(例如常规的 DDPM),另一个是基于条件的梯度预估模型。而我们甚至可以使用同一个模型同时表示两者,区别只在于无条件生成时将条件向量置为零即可!

一方面这大大减轻了条件生成的训练代价(无需训练额外的分类器,只需要在训练时进行随机 drop out condition 来同时训练两个目标),另一方面这样的条件生成并不是以一个类似于对抗攻击的方式进行的。

而同时,仔细观察我们上面的采样式子,实际上它是两个梯度的差值所形成的。如果有玩过 stable-diffusion-webui 的读者可能会注意到其中一个 feature 是 negative prompt. 也就是使用者可以指定不想要出现的提示,让生成不会包括该内容。其实现方式实际上就用了上面这个无分类器引导的公式。将无条件生成转为带着你不想要的提示的条件生成。

无分类器引导可以说是 Stable-Diffusion 的做法的直接奠基工作之一。在此之前要做到多模态或者说文生图的引导生成,通常大家用的是 clip 模型,来对生成的图像和文本的距离做一个损失差值,用这个差值来引导多模态生成。但有了 classifier-free 这篇论文之后,文生图可以有更加自然和更加有效的方式达成。

关于 SD 具体是如何工作的,可以参考笔者这篇笔记:CLIP, VQGAN, VQGAN-CLIP, Stable-Diffusion? [6]。

CLIP损失引导生成

上面谈了谈扩散模型的无分类器引导生成,并提到了这项技术使得训练一个多模态文生图的 Stable-Diffusion 成为可能。下面我将简要地谈一谈如果不用隐式分类器引导生成的话,多模态引导生成可以如何做。

笔者在之前的笔记:CLIP, VQGAN, VQGAN-CLIP, Stable-Diffusion [6] 里提及过 VQGAN-CLIP,一种在生成时不断借助 CLIP 判断所生成的图像和目标文本的距离来不停迭代生成的方法。但这个方法不涉及到任何的扩散模型。

在 Diffusion-CLIP 这篇文章里,作者同样通过使扩散生成时的图像和目标文本的多模态 CLIP 损失尽可能小来达成目的。具体来说,CLIP 的损失由下图定义:

▲ CLIP损失

其中 delta_I 是图像编码器对生成图和原图的编码向量差,delta_T 是文本编码器对目标文本和原文本的编码向量的差。这是一个余弦距离的损失函数。而我们可以在扩散时引导我们的噪声或者模型使得其生成结果满足以下两个损失,一个是 CLIP 损失,一个是保证生成图和原图尽可能不要相差太远的重构损失。根据作者的实验发现,对模型微调的效果会比对噪声直接微调的效果更好一些。

▲ 多模态引导时的优化目标

很明显这个方法最大的问题在于,每一个新的性质,都需要对模型进行微调一次,哪怕作者论证了不同的性质可以在某种程度上互相叠加来生成,这依然是个非常耗费资源且难以落地的技术方向。而且这个方法依然是对 DDPM 等在像素空间上做操控的模型做多模态引导,其巨大的资源耗费也导致了难以训练一个在通用数据集上拟合的模型。更加不要说用海量的自然语言去做文本指导生成了(在这个技术路线下,要微调并储存海量的模型)。

在比较了三种引导的大方向之后,我们可以更清晰地明白 Stable-Diffusion 其背后的技术路线成功的原因之一。就是使用了无分类器引导的隐式分类引导生成的技术,使得跨模态的条件生成变得简单可行。当然,其背后整合了最新的 VQGAN 模型并在潜在空间做扩散的思路使得所需训练和推理资源急剧降低,也是一个重要的方面。

[1] Understanding Diffusion Models: A Unified Perspective. https://arxiv.org/abs/2208.11970

[2] Score-Based Generative Modeling through Stochastic Differential Equations. https://arxiv.org/abs/2011.13456

[3] Diffusion Models Beat GANs on Image Synthesis. https://arxiv.org/abs/2105.05233

[4] Classifier-Free Diffusion Guidance. https://arxiv.org/abs/2207.12598

[5] https://zhuanlan.zhihu.com/p/576779879

[6] https://zhuanlan.zhihu.com/p/572156692

让你的文字被更多人看到

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是 最新论文解读 ,也可以是 学术热点剖析 科研心得 竞赛经验讲解 等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人 原创作品 ,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供 业内具有竞争力稿酬 ,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信( pwbot02 )快速投稿,备注:姓名-投稿

△长按添加PaperWeekly小编

现在,在 「知乎」 也能找到我们了

进入知乎首页搜索 「PaperWeekly」

点击 「关注」 订阅我们的专栏吧

©作者 |中森单位 |粤港澳大湾区数字经济研究院研究方向 |条件受控文本生成这篇文章主要比较一下扩散模型的引导生成的三种做法的区别。它们分别是用显式分类器引导生成的做法,用隐式无分类器引导的做法和用 CLIP 计算跨模态间的损失来引导生成的做法。分类器引导生成1.1 直观理解我们知道扩散模型的前向扩散过程和后向的去噪过程都可以用一个随机微分方程来描述,并且其中后向去噪时我们事实上通过一个神经...
目前,我国是世界上经济发展快的国家,市场上新设备的控制需求、传统设备技术升级、换代对运动控制器的市场需求越来越大。另外由于市场日益竞争的压力,系统集成商和设备制造商要求运动控制系统向开放式方向发展。同时,经济型数控市场占有率正在逐渐减小。在这样的形势下,我国可以抓住这一机遇,研制出具有自主知识产权,具有高水平、高质量、高可靠性的开放式运动控制器产品。   运动控制器已经从以单片机或微处理器作为的运动控制器和以专用芯片(ASIC)作为处理器的运动控制器,发展到了基于PC总线的以DSP和FPGA作为处理器的开放式运动控制器。运动控制技术也由面向传统的数控加工行业专用运动控制技术而发展为具有开放结构
[1912.05170v1] Image Classification with Deep Learning in the Presence of Noisy Labels: A Survey (arxiv.org)https://arxiv.org/abs/1912.05170v1 Abstract 用于进行图像分类的神经网络需要大量的标记数据来进行适当的训练。但是,由于分类的困难和标记过程的高代价,使得标签噪声是数据集中普遍存在的问题。 众所周知,深度网络对标签噪声具有一定的鲁棒性..
PyTorch是一种流行的框架,用于构建深度学习模型。在PyTorch中,softmax 分类器 是一种常见的 分类器 模型。softmax 分类器 通过将输入样本映射到多个类别,并将其转换为概率分布来预测每个类别的概率。 在PyTorch中,我们可以使用torch.nn.Softmax()来构建softmax 分类器 模型。首先,我们需要定义输入和输出的大小。然后,我们需要定义模型的神经网络层和激活函数。最后,我们需要定义损失函数和优化器来训练模型。 对于一个具体的例子,我们可以构建一个模型来对手写数字进行分类。我们可以使用MNIST数据集来训练模型。该数据集包含60,000张28x28像素的手写数字图像以及相应的标签。我们可以将这些图像作为模型的输入,并将它们映射到10个输出类别中的一个。 在定义模型时,我们可以使用线性层和激活函数来处理输入数据。为了训练我们的模型,我们可以使用交叉熵损失函数和随机梯度下降优化器来最小化误差。我们可以使用PyTorch中的torch.nn.CrossEntropyLoss()和torch.optim.SGD()来实现这些功能。 要使用我们的模型进行预测,我们可以将手写数字图像加载到模型中,并使用torch.nn.Softmax()函数将其转换为概率分布。然后,我们可以使用argmax()函数来找到具有最高概率的类别。 最终,softmax 分类器 模型是一种简单但有效的 分类器 模型,可用于许多机器学习任务。在PyTorch中,构建和训练该模型非常容易,并且可以使用其强大的GPU加速功能来提高性能。