生成扩散模型漫谈(九):条件控制生成结果
By 苏剑林 | 2022-08-30 | 140350位读者 |前面的几篇文章都是比较偏理论的结果,这篇文章我们来讨论一个比较有实用价值的主题——条件控制生成。
作为生成模型,扩散模型跟VAE、GAN、flow等模型的发展史很相似,都是先出来了无条件生成,然后有条件生成就紧接而来。无条件生成往往是为了探索效果上限,而有条件生成则更多是应用层面的内容,因为它可以实现根据我们的意愿来控制输出结果。从DDPM至今,已经出来了很多条件扩散模型的工作,甚至可以说真正带火了扩散模型的就是条件扩散模型,比如脍炙人口的文生图模型DALL·E 2、Imagen。
在这篇文章中,我们对条件扩散模型的理论基础做个简单的学习和总结。
技术分析 #
从方法上来看,条件控制生成的方式分两种:事后修改(Classifier-Guidance)和事前训练(Classifier-Free)。
对于大多数人来说,一个SOTA级别的扩散模型训练成本太大了,而分类器(Classifier)的训练还能接受,所以就想着直接复用别人训练好的无条件扩散模型,用一个分类器来调整生成过程以实现控制生成,这就是事后修改的Classifier-Guidance方案;而对于“财大气粗”的Google、OpenAI等公司来说,它们不缺数据和算力,所以更倾向于往扩散模型的训练过程中就加入条件信号,达到更好的生成效果,这就是事前训练的Classifier-Free方案。
Classifier-Guidance方案最早出自《Diffusion Models Beat GANs on Image Synthesis》,最初就是用来实现按类生成的;后来《More Control for Free! Image Synthesis with Semantic Diffusion Guidance》推广了“Classifier”的概念,使得它也可以按图、按文来生成。Classifier-Guidance方案的训练成本比较低(熟悉NLP的读者可能还会想起与之很相似的PPLM模型),但是推断成本会高些,而且控制细节上通常没那么到位。
至于Classifier-Free方案,最早出自《Classifier-Free Diffusion Guidance》,后来的DALL·E 2、Imagen等吸引人眼球的模型基本上都是以它为基础做的,值得一提的是,该论文上个月才放到Arxiv上,但事实上去年已经中了NeurIPS 2021。应该说,Classifier-Free方案本身没什么理论上的技巧,它是条件扩散模型最朴素的方案,出现得晚只是因为重新训练扩散模型的成本较大吧,在数据和算力都比较充裕的前提下,Classifier-Free方案表现出了令人惊叹的细节控制能力。
条件输入 #
说白了,Classifier-Free方案就是训练成本大,本身“没什么技术含量”,所以接下来的主要篇幅都是Classifier-Guidance方案,而Classifier-Free方案则是在最后简单介绍一下。
经过前面一系列文章的分析,想必读者已经知道,生成扩散模型最关键的步骤就是生成过程$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$的构建,而对于以$\boldsymbol{y}$为输入条件的生成来说,无非就是将$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$换成$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$而已,也就是说生成过程中增加输入$\boldsymbol{y}$。为了重用已经训练好的无条件生成模型$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,我们利用贝叶斯定理得
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{y}) = \frac{p(\boldsymbol{x}_{t-1})p(\boldsymbol{y}|\boldsymbol{x}_{t-1})}{p(\boldsymbol{y})}\end{equation}
在每一项上面补上条件$\boldsymbol{x}_t$,就得到
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y}) = \frac{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)p(\boldsymbol{y}|\boldsymbol{x}_{t-1}, \boldsymbol{x}_t)}{p(\boldsymbol{y}|\boldsymbol{x}_t)}\label{eq:bayes-1}\end{equation}
注意,在前向过程中,$\boldsymbol{x}_t$是由$\boldsymbol{x}_{t-1}$加噪声得到的,噪声不会对分类有帮助,所以$\boldsymbol{x}_t$的加入对分类不会有任何收益,因此有$p(\boldsymbol{y}|\boldsymbol{x}_{t-1}, \boldsymbol{x}_t)=p(\boldsymbol{y}|\boldsymbol{x}_{t-1})$,从而
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y}) = \frac{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)p(\boldsymbol{y}|\boldsymbol{x}_{t-1})}{p(\boldsymbol{y}|\boldsymbol{x}_t)} = p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) e^{\log p(\boldsymbol{y}|\boldsymbol{x}_{t-1}) - \log p(\boldsymbol{y}|\boldsymbol{x}_t)}\label{eq:bayes-2}\end{equation}
近似分布 #
对于已经看过《生成扩散模型漫谈(五):一般框架之SDE篇》的读者,大概会觉得接下来的过程似曾相识。不过即便没读过也不要紧,下面我们依旧完整推导一下。
当$T$足够大时,$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$的方差足够小,也就是说只有$\boldsymbol{x}_t$与$\boldsymbol{x}_{t-1}$很接近时概率才会明显大于0。反过来也是成立的,即也只有$\boldsymbol{x}_t$与$\boldsymbol{x}_{t-1}$很接近时$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$或$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1}, \boldsymbol{y})$才明显大于0,我们只需要重点考虑这个范围内的概率变化。为此,我们用泰勒展开:
\begin{equation}\log p(\boldsymbol{y}|\boldsymbol{x}_{t-1}) - \log p(\boldsymbol{y}|\boldsymbol{x}_t)\approx (\boldsymbol{x}_{t-1} - \boldsymbol{x}_t)\cdot\nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)\end{equation}
严格来讲还有一项关于$t$的变化项,但是那一项跟$\boldsymbol{x}_{t-1}$无关,属于不影响$\boldsymbol{x}_{t-1}$概率的常数项,因此我们没有写出。假设原来有$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)=\mathcal{N}(\boldsymbol{x}_{t-1};\boldsymbol{\mu}(\boldsymbol{x}_t),\sigma_t^2\boldsymbol{I})\propto e^{-\Vert \boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t)\Vert^2/2\sigma_t^2}$,那么此时近似地有
\begin{equation}\begin{aligned}
p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y}) \propto&\, e^{-\Vert \boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t)\Vert^2/2\sigma_t^2 + (\boldsymbol{x}_{t-1} - \boldsymbol{x}_t)\cdot\nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)} \\
\propto&\, e^{-\Vert \boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t) - \sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t))\Vert^2/2\sigma_t^2}
\end{aligned}\end{equation}
从这个结果可以看出,$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$近似于$\mathcal{N}(\boldsymbol{x}_{t-1};\boldsymbol{\mu}(\boldsymbol{x}_t) + \sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t),\sigma_t^2\boldsymbol{I})$,所以只需要把生成过程的采样改为
\begin{equation}\boldsymbol{x}_{t-1} = \boldsymbol{\mu}(\boldsymbol{x}_t) \color{skyblue}{+} {\color{skyblue}{\underbrace{\sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)}_{\text{新增项}}}} + \sigma_t\boldsymbol{\varepsilon},\quad \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})\end{equation}
这就是Classifier-Guidance方案的核心结果。值得注意的是,本文的推导结果跟原论文略有不同,原论文新增项是
\begin{equation}\sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)|_{\boldsymbol{x}_t=\boldsymbol{\mu}(\boldsymbol{x}_t)}\end{equation}
也就是梯度项在$\boldsymbol{\mu}(\boldsymbol{x}_t)$处的结果而非$\boldsymbol{x}_t$处,而一般情况下$\boldsymbol{\mu}(\boldsymbol{x}_t)$的零阶近似正是$\boldsymbol{x}_t$,所以两者结果是差不多的。
梯度缩放 #
原论文(《Diffusion Models Beat GANs on Image Synthesis》)发现,往分类器的梯度中引入一个缩放参数$\gamma$,可以更好地调节生成效果:
\begin{equation}\boldsymbol{x}_{t-1} = \boldsymbol{\mu}(\boldsymbol{x}_t) \color{skyblue}{+} \color{skyblue}{\sigma_t^2 \color{red}{\gamma}\nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)} + \sigma_t\boldsymbol{\varepsilon},\quad \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})\label{eq:gamma-sample}\end{equation}
当$\gamma > 1$时,生成过程将使用更多的分类器信号,结果将会提高生成结果与输入信号$\boldsymbol{y}$的相关性,但是会相应地降低生成结果的多样性;反之,则会降低生成结果与输入信号之间的相关性,但增加了多样性。
怎么从理论上理解这个参数呢?原论文提出将它理解为通过幂操作来提高分布的聚焦程度,即定义
\begin{equation}\tilde{p}(\boldsymbol{y}|\boldsymbol{x}_t) = \frac{p^{\gamma}(\boldsymbol{y}|\boldsymbol{x}_t)}{Z(\boldsymbol{x}_t)},\quad Z(\boldsymbol{x}_t)=\sum_{\boldsymbol{y}} p^{\gamma}(\boldsymbol{y}|\boldsymbol{x}_t)\end{equation}
随着$\gamma$的增加,$\tilde{p}(\boldsymbol{y}|\boldsymbol{x}_t)$的预测会越来越接近one hot分布,用它来代替$p(\boldsymbol{y}|\boldsymbol{x}_t)$作为分类器做Classifier-Guidance,生成过程会倾向于挑出分类置信度很高的样本。
然而,这个角度虽然能提供一定的参考价值,但其实不完全对,因为
\begin{equation}\nabla_{\boldsymbol{x}_t}\log \tilde{p}(\boldsymbol{y}|\boldsymbol{x}_t) = \gamma\nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t) - \nabla_{\boldsymbol{x}_t} \log Z(\boldsymbol{x}_t) \neq \gamma\nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)\end{equation}
原论文错误地认为$Z(\boldsymbol{x}_t)$是一个常数,所以$\nabla_{\boldsymbol{x}_t} \log Z(\boldsymbol{x}_t)=0$,但事实上$\gamma\neq 1$时,$Z(\boldsymbol{x}_t)$会显式地依赖于$\boldsymbol{x}_t$。笔者也继续思考了一下有没有什么补救方法,但很遗憾没什么结果,仿佛只能很勉强地认为$\gamma=1$时(此时$Z(\boldsymbol{x}_t)=1$)的梯度性质能近似地泛化到$\gamma\neq 1$的情形。
相似控制 #
事实上,理解$\gamma\neq 1$的最佳方案,就是放弃从贝叶斯定理的式$\eqref{eq:bayes-1}$和式$\eqref{eq:bayes-2}$来理解$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$,而是直接定义
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y}) = \frac{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) e^{\gamma\cdot\text{sim}(\boldsymbol{x}_{t-1}, \boldsymbol{y})}}{Z(\boldsymbol{x}_t, \boldsymbol{y})},\quad Z(\boldsymbol{x}_t,\boldsymbol{y})=\sum_{\boldsymbol{x}_{t-1}} p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) e^{\gamma\cdot\text{sim}(\boldsymbol{x}_{t-1}, \boldsymbol{y})}\end{equation}
其中$\text{sim}(\boldsymbol{x}_{t-1}, \boldsymbol{y})$是生成结果$\boldsymbol{x}_{t-1}$与条件$\boldsymbol{y}$的某个相似或相关度量。在这个角度下,$\gamma$直接融于$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$的定义中,直接控制结果与条件的相关性,当$\gamma$越大,模型会倾向于生成跟$\boldsymbol{y}$越相关的$\boldsymbol{x}_{t-1}$。
为了进一步得到可采样的近似结果,我们可以在$\boldsymbol{x}_{t-1}=\boldsymbol{x}_t$处(也可以在$\boldsymbol{x}_{t-1}=\boldsymbol{\mu}(\boldsymbol{x}_t)$,跟前面类似)展开
\begin{equation}e^{\gamma\cdot\text{sim}(\boldsymbol{x}_{t-1}, \boldsymbol{y})}\approx e^{\gamma\cdot\text{sim}(\boldsymbol{x}_t, \boldsymbol{y}) + \gamma\cdot(\boldsymbol{x}_{t-1}-\boldsymbol{x}_t)\cdot\nabla_{\boldsymbol{x}_t}\text{sim}(\boldsymbol{x}_t, \boldsymbol{y})}
\end{equation}
假设此近似程度已经足够,那么除去与$\boldsymbol{x}_{t-1}$无关的项,我们得到
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})\propto p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)e^{\gamma\cdot(\boldsymbol{x}_{t-1}-\boldsymbol{x}_t)\cdot\nabla_{\boldsymbol{x}_t}\text{sim}(\boldsymbol{x}_t, \boldsymbol{y})}
\end{equation}
跟前面一样,代入$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)=\mathcal{N}(\boldsymbol{x}_{t-1};\boldsymbol{\mu}(\boldsymbol{x}_t),\sigma_t^2\boldsymbol{I})$,配方后得到
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})\approx \mathcal{N}(\boldsymbol{x}_{t-1}; \boldsymbol{\mu}(\boldsymbol{x}_t) + \sigma_t^2\gamma \nabla_{\boldsymbol{x}_t} \text{sim}(\boldsymbol{x}_t, \boldsymbol{y}),\sigma_t^2\boldsymbol{I})
\end{equation}
这样一来,我们就不需要纠结$p(\boldsymbol{y}|\boldsymbol{x}_t)$的概率意义,而是只需要直接定义度量函数$\text{sim}(\boldsymbol{x}_t, \boldsymbol{y})$,这里的$\boldsymbol{y}$也不再是仅限于“类别”,也可以是文本、图像等任意输入信号,通常的处理方式是用各自的编码器将其编码为特征向量,然后用cos相似度:
\begin{equation}\text{sim}(\boldsymbol{x}_t, \boldsymbol{y}) = \frac{E_1(\boldsymbol{x}_t)\cdot E_2(\boldsymbol{y})}{\Vert E_1(\boldsymbol{x}_t)\Vert \Vert E_2(\boldsymbol{y})\Vert}\end{equation}
要指出的是,中间过程的$\boldsymbol{x}_t$是带高斯噪声的,所以编码器$E_1$一般不能直接调用干净数据训练的编码器,而是要用加噪声后的数据对它进行微调才比较好。此外,如果做风格迁移的,通常则是用Gram矩阵距离而不是cos相似度,这些都看场景发挥了。以上便是论文《More Control for Free! Image Synthesis with Semantic Diffusion Guidance》的一系列结果,更多细节可以自行参考原论文。
连续情形 #
经过前面的推导,我们得到均值的修正项为$\sigma_t^2 \gamma \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)$或$\sigma_t^2\gamma \nabla_{\boldsymbol{x}_t} \text{sim}(\boldsymbol{x}_t, \boldsymbol{y})$,它们都有一个共同特点,就是$\sigma_t=0$时,修正项也等于0,修正就失效了。
那么生成过程的$\sigma_t$可以等于0吗?肯定可以,比如《生成扩散模型漫谈(四):DDIM = 高观点DDPM》介绍的DDIM,就是方差为0的生成过程,这种情况下应该怎样做控制生成呢?此时我们需要用到《生成扩散模型漫谈(六):一般框架之ODE篇》介绍的基于SDE的一般结果了,在里边我们介绍到,对于前向SDE:
\begin{equation}d\boldsymbol{x} = \boldsymbol{f}_t(\boldsymbol{x}) dt + g_t d\boldsymbol{w}\end{equation}
对应的最一般的反向SDE为
\begin{equation}d\boldsymbol{x} = \left(\boldsymbol{f}_t(\boldsymbol{x}) - \frac{1}{2}(g_t^2 + \sigma_t^2)\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x})\right) dt + \sigma_t d\boldsymbol{w}\end{equation}
这里允许我们自由选择反向方差$\sigma_t^2$,DDPM、DDIM都可以认为是它的特例,其中$\sigma_t=0$时就是一般化的DDIM。可以看到,反向SDE跟输入有关的就是$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x})$,如果要做条件生成,自然是要将它换成$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}|\boldsymbol{y})$,然后利用贝叶斯定理,有
\begin{equation}\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}|\boldsymbol{y}) = \nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}) + \nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x})\end{equation}
在一般的参数化下有$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}) = -\frac{\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)}{\bar{\beta}_t}$,因此
\begin{equation}\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}|\boldsymbol{y}) = -\frac{\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)}{\bar{\beta}_t} + \nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x}) = -\frac{\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \bar{\beta}_t\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x})}{\bar{\beta}_t}\end{equation}
这就意味着,不管生成方差是多少,我们只需要用$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \bar{\beta}_t\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x})$代替$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)$就可以实现条件控制生成了。因此,在SDE的统一视角下,我们可以非常简单而直接地得到Classifier-Guidance方案的最一般结果。
无分类器 #
最后,我们来简单介绍一下Classifier-Free方案。其实很简单,它就是直接定义
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y}) = \mathcal{N}(\boldsymbol{x}_{t-1}; \boldsymbol{\mu}(\boldsymbol{x}_t, \boldsymbol{y}),\sigma_t^2\boldsymbol{I})
\end{equation}
沿用前面DDPM的几篇文章的结果,$\boldsymbol{\mu}(\boldsymbol{x}_t, \boldsymbol{y})$一般参数化为
\begin{equation}\boldsymbol{\mu}(\boldsymbol{x}_t, \boldsymbol{y}) = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \frac{\beta_t^2}{\bar{\beta}_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{y}, t)\right)\end{equation}
训练的损失函数就是
\begin{equation}\mathbb{E}_{\boldsymbol{x}_0,\boldsymbol{y}\sim\tilde{p}(\boldsymbol{x}_0,\boldsymbol{y}), \boldsymbol{\varepsilon}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}\left[\left\Vert\boldsymbol{\varepsilon} - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}, \boldsymbol{y}, t)\right\Vert^2\right]\end{equation}
它的优点是在训练过程中就引入了额外的输入$\boldsymbol{y}$,理论上输入信息越多越容易训练;它的缺点也是在训练过程中就引入了额外的输入$\boldsymbol{y}$,意味着每做一组信号控制,就要重新训练整个扩散模型。
特别地,Classifier-Free方案也模仿Classifier-Guidance方案加入了$\gamma$参数的缩放机制来平衡相关性与多样性。具体来说,式$\eqref{eq:gamma-sample}$的均值可以改写成:
\begin{equation}\boldsymbol{\mu}(\boldsymbol{x}_t) + \sigma_t^2 \gamma \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t) = \gamma\left[\boldsymbol{\mu}(\boldsymbol{x}_t) + \sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)\right] - (\gamma - 1) \boldsymbol{\mu}(\boldsymbol{x}_t)\end{equation}
Classifier-Free方案相当于直接用直接用模型拟合了$\boldsymbol{\mu}(\boldsymbol{x}_t) + \sigma_t^2 \nabla_{\boldsymbol{x}_t} \log p(\boldsymbol{y}|\boldsymbol{x}_t)$,那么类比上式,我们也可以在Classifier-Free方案中引入$w=\gamma - 1$参数,用
\begin{equation}\tilde{\boldsymbol{\epsilon}}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{y}, t) = (1 + w)\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{y}, t) - w \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\end{equation}
代替$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{y}, t)$来做生成。那无条件的$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)$怎么来呢?我们可以新引入一个特定的输入$\boldsymbol{\phi}$,它对应的目标图像为全体图像,加到了模型的训练中,这样我们就可以认为$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)=\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{\phi}, t)$了。
文章小结 #
本文简单介绍了建立条件扩散模型的相关理论结果,主要包含事后修改(Classifier-Guidance)和事前训练(Classifier-Free)两种方案。其中,前者不需要重新训练扩散模型,可以低成本实现简单的控制;后者需要重新训练扩散模型,成本较大,但可以实现比较精细的控制。
转载到请包括本文地址:https://spaces.ac.cn/archives/9257
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Aug. 30, 2022). 《生成扩散模型漫谈(九):条件控制生成结果 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/9257
@online{kexuefm-9257,
title={生成扩散模型漫谈(九):条件控制生成结果},
author={苏剑林},
year={2022},
month={Aug},
url={\url{https://spaces.ac.cn/archives/9257}},
}
May 6th, 2024
这个4式,嗯~条件概率P(a|b)中不应该a才是变量吗,为什么4式是xt在xt-1处的泰勒展开?
$p(a|b)$的含义是给定$b$时$a$出现的概率(密度),它是关于$a,b$的函数,既然是$a,b$的函数,那么对$a,b$展开自然都是可以的。
June 18th, 2024
请教一个问题,一些加速模型(如 SDXL-turbo等)的 CFG 都非常小,反向关键词都不起作用,这是怎么回事?是因为推理步数少,条件引导不够?
CFG非常小是什么意思?CFG是Classifier-free Guidance?那它不是直接一个条件生成模型吗?还能小?
抱歉我没有表述清楚,我是诧异为什么一些蒸馏的 sd 模型的 guidance_scale 都很小,负向关键词也不起作用,望您指点一二
那加速前的模型表现好吗?涉及到具体的应用细节,我确实不大了解,猜测是采样步数减少后输入的condition的调控作用变得不明显了?
August 1st, 2024
苏老师,我想问一下,公式(11)是怎么来的呢,也就是为什么可以直接那么定义?有什么可以参考的论文或者资料吗?
就是我们希望改造$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,来加上$\boldsymbol{y}$跟$\boldsymbol{x}_{t-1}$的关联,就得到了$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) e^{\gamma\cdot\text{sim}(\boldsymbol{x}_{t-1}, \boldsymbol{y})}$,然后归一化。这只是一种经验形式,也不是唯一的形式。
August 16th, 2024
Classifier-Free方案变现出了令人惊叹的细节控制能力。
应该是错别字:是表现,不是变现
谢谢,已更正。
August 20th, 2024
苏老师您好,想请教您一个问题,在有条件的image-to-image任务中,我看到很多文献中的做法是直接将xt与条件图像cat在一起后,直接送入unet网络进行噪声预测,在我尝试的任务中,目标图与条件图需要一一对应,对多样性没有要求,24式中的w=0,但我的实验中,生成图与目标图的余弦相似度较高,但ssim较差,我尝试过一些方法,但都没有增强网络的细节捕捉能力,请问您有什么建议么
符合正确的答案绝对只有一个的特性吗?如果符合,那应该可以不用扩散吧?
另外也可以考虑直接将整个采样过程构建为一个RNN模型,然后对最终的输出加一下L1 Loss或者SSIM Loss?
October 7th, 2024
苏老师您好,我在生成扩散模型方面算是一名初学者。
在拜读您博客的时候,由于我数学基础不足,导致对于博客中的公式推导不能完全理解,想请教一下,这种情况下,应该着重补充一下哪些方面的数学知识呢?
最后还是看到哪里不懂补哪里吧,咬文嚼字地坚持一两篇,后面就轻车熟路了。数学这东西很难说学够了然后再去看别的,都是边读边学的。
October 28th, 2024
苏老师您好,我想请问一下除了从SDE角度对条件控制生成进行研究之外,还有其他对条件控制生成理论的研究吗?比方说从Wasserstein空间的角度,或者从数据流形的角度进行研究?
近来没关注这方面进展了,抱歉。
December 5th, 2024
苏老师您好,原文中的$Z$难道不是指代$$1/\hat{q}(y|x_{t+1})$$吗?确实是和$x_t$无关的吧。
我说的是原论文4.3节Scaling Classifier Gradients里边的$Z$,这一节哪里有$q$?
December 18th, 2024
在讨论Classifier Guidance时,顺序使用了两种思路:①基于贝叶斯公式,对$p(\boldsymbol x_{t-1}|\boldsymbol x_{t})$进行校准来得到$p(\boldsymbol x_{t-1}|\boldsymbol x_t, y)$,最终的guidance修改项正比于$\sigma_t$;②直接利用反向方程得到$p(\boldsymbol x_{t-1}|\boldsymbol x_t, y)$,最后得到的结果与$\sigma_t$无关。
请问苏神,为什么使用两种推导方式得到的结果会不同?
其实是相同的。SDE
$$d\boldsymbol{x} = \left(\boldsymbol{f}_t(\boldsymbol{x}) - \frac{1}{2}(g_t^2 + \sigma_t^2)\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x})\right) dt + \sigma_t d\boldsymbol{w}$$
对应的采样过程是
$$\boldsymbol{x}_{t-\Delta t} - \boldsymbol{x}_t = - \left[\boldsymbol{f}_t(\boldsymbol{x}_t) - g_t^2\nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{x}_t) \right]\Delta t - g_t \sqrt{\Delta t}\boldsymbol{\varepsilon}$$
$\nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{x}_t)$替换为$\nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{x}_t)+\nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{y}|\boldsymbol{x}_t)$后,多出来的一项是
$$g_t^2\Delta t \nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{y}|\boldsymbol{x}_t) $$
这其实就是$\sigma_t^2 \nabla_{\boldsymbol{x}_t}\log p(\boldsymbol{y}|\boldsymbol{x}_t)$,因为这里的采样方差正好是$g_t^2\Delta t$。