生成扩散模型漫谈(九):条件控制生成结果
By 苏剑林 | 2022-08-30 | 121207位读者 |前面的几篇文章都是比较偏理论的结果,这篇文章我们来讨论一个比较有实用价值的主题——条件控制生成。
作为生成模型,扩散模型跟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://www.kexue.fm/archives/9257
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Aug. 30, 2022). 《生成扩散模型漫谈(九):条件控制生成结果 》[Blog post]. Retrieved from https://www.kexue.fm/archives/9257
@online{kexuefm-9257,
title={生成扩散模型漫谈(九):条件控制生成结果},
author={苏剑林},
year={2022},
month={Aug},
url={\url{https://www.kexue.fm/archives/9257}},
}
October 27th, 2022
苏老师您好,想请教一下为什么在 Classifier-Guidance 论文里面 DDIM 的采样方法中他在得到 $\hat{\epsilon}$ 之后直接用了这个公式去采样,$x_{t-1} \leftarrow \sqrt{\bar{\alpha}_{t-1}}\left(\frac{x_t-\sqrt{1-\bar{\alpha}_t} \hat{\epsilon}}{\sqrt{\bar{\alpha}_t}}\right)+\sqrt{1-\bar{\alpha}_{t-1}} \hat{\epsilon}$, 但是我觉得这两个 $\hat{\epsilon}$ 应该不是一样的,我觉得后面的 $\hat{\epsilon}$ 应该重新随机采样才对吧。求解惑。
DDIM本就是确定性采样,中间步骤没有噪声的呀。
这个式子里两项的噪声都是预测的,原论文有说,第一项是预测的X0,第二项是指向Xt的方向。如果你想再加随机采样噪声可以再加一项 $\sigma_t\varepsilon_t$,方差 $\sigma_t^2$ 可以采用 $\eta\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t$ 的形式,使用不同的 $\eta\in[0,1]$ 在DDIM和DDPM间采样
November 13th, 2022
请问苏神,为什么(11)式可以这么定义呀?我推不出来左右两式是相等的。
(评论好像被吞了一次,不知道会不会重复)
你咬文嚼字一点,就会发现这个问题本身就有问题,为什么不可以这样“定义”?这个“定义”犯法了吗?
都已经说得很清楚,是直接通过$(11)$来定义$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{y})$,是直接“定义”,“定义”的意思是你爱定义成什么形式,就是什么形式,跟前面的东西没关系,所以何来“推不出来左右两式是相等的”的说法?它就是新的出发点,只能用它来推别的,没有别的东西可以推它。
我又回来理解了一遍,其实可能你没理解到我的问题,或者是因为我没有表述清楚。
但是实际我想知道的是,(11)式其实是利用能量模型的定义,因为能量函数可以是任意的,所以把$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$提到指数部分,就是能量函数,所以左右两式确实是相等的。
文章已经说得很清楚,式$(11)$是“定义”,所以你原来的说法“我推不出来左右两式是相等的”自然就是荒谬的。至于式$(11)$为什么这样定义,你可以说是能量函数,也可以说纯粹就是用打分函数定义概率分布的一种习惯,这个无所谓,反正“定义”本身具有很大的随意性。
January 27th, 2023
接@宇|comment-20755、@苏剑林|comment-20778:
谢谢苏神!俺意思是此处的noise能否用N(0,1)分布的数据来替换,极端情况下就是每次加的噪声是同一个noise(高斯归一化后的特征),这样子可行吗?
高斯归一化指的是什么?DDPM的noise本身就是采样自标准正态分布的,所以我不理解“能否用N(0,1)分布的数据来替换”具体是表达什么含义。
February 13th, 2023
苏神,我可以拿预训练好的扩散模型,进行微调或者训练一个Classifier用来处理其他场景的任务吗?还是说必须得重新训练?
另外,Classifier是怎么训练的呢?
谢谢苏神~
直接分类数据监督训练,或者用预训练好的ImageNet模型微调。
理论上可以吧,我没有试过,不好回答。
好的,谢谢苏神~
March 24th, 2023
请教苏神,当T足够大时,$p(x_t|x_{t−1})$的方差足够小怎么理解呀。我的理解是:
根据DDPM,当$T \rightarrow +\infty$ 时,$p(x_t|x_{t−1}) = \mathcal{N}(0, (1-\alpha_t)\text{I})$,它的方差$\rightarrow 1$而不是$0$
这个问题困扰了我好几天,望解答,感谢
你似乎连$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$是什么含义都没搞清楚。
May 8th, 2023
请问苏神,Classifier-Free为什么不直接拿有条件的输出作为预测值,而是要有条件减去无条件呢?
本文有讨论,根据公式如此。
我可以理解为是因为引入缩放机制所以要用有条件减去无条件吗?如果不需要调节的话就可以直接拿有条件的输出作为预测值呢?
那是啊,你直接将$w$设为0,不就等于没有减去无条件了么
那可以再问一下模型训练的时候,如果是有条件减去无条件,那是不是要对标签信息进行一个dropout。但如果直接拿有条件的输出作为预测值,就不需要dropout这个过程了。也就是两者训练情况是不同的。
就是要随机确定输入标签或者输入空标签,那是不是训练时间也需要加倍呢?
相当于只是增加了一个类别,理论上时间应该不至于翻倍
最近在学习条件扩散模型,请问苏神,假如我的任务中条件和输出图像是确定性的,也就是说给定每一个条件,希望能够生成相对应的单一的最准确的图像,请问这种情况下如何设置?希望能得到您的解答。
理论上这种任务不存在?总不可能生成的图像一个像素都没法变吧?
不过即便存在,好像也不需要做什么改变?如果真的是有非常明确的对应关系,那么即便采样时加入噪声,最终输出的也会偏向于确定的,类似超分辨率任务。
May 10th, 2023
请问苏神,对于公式(24),现在有些生成式模型,比如stable diffusion会使用negative prompt的方式将生成结果中不想要的东西去掉,具体操作就是将公式(24)的无条件变成想要去掉的东西的prompt对应的条件,并且效果不错。请问这样做的原理是什么呢?
就当做直觉来理解吧,score function的线性可加性?具体的数学论证可能不是很容易,就好比Classifier-Guidance方案加入$\gamma$参数,更多也是经验可行的做法,也没有从数学上严格化。
score function这个是在哪部分出现的,我前面没有全看完。还有我理解的gamma参数可能是对应P(y|xt)经过贝叶斯公式转化后的P(y)这个常数项吧
score function你就当它是$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, \boldsymbol{y}, t)$吧。
我想表达的是神经网络的特征,很多都呈现出一定的线性可分性,但又不完全。这就好比词向量的“国王-男人+女人=女王”之类的线性运算,有些时候能呈现一定的效果,但又不总是这样。
June 29th, 2023
苏神你好。关于classifier-free的公式,似乎这里没有要求$\mu(x_t,y)$一定要学到$y$的信息。它好像完全可以忽略$y$,并退化成无条件的生成。请问这是我理解错了吗?还是真的就存在这种可能呢?
可能啊。如果说“可能”的话,模型可能会忽略掉你给的一切输入,比如做QA可能干脆忽略了你的Q。
但是,如果你给定的条件信息是有利于loss降低的话,理论上模型能够学会利用条件信息。
谢谢!「条件利于loss降低就可能会利用这些条件」,这看起来似乎是一个比较弱的约束。请问现在有没有什么方法能给出比较直接、或者比较强的约束,使得模型更「努力」地学习这些条件呢?
抬杠地说,没有绝对的办法。
简单的方案就是利用输出重新预测一下输入条件。
拿我在Image Restoration(超分之类的任务)中观察的现象来举例,输入是$x_t, t,y$。$y$一般就是退化的原图。通过直接预测$x_0$而不是$\epsilon$能有有效利用$y$并且能够极大缩短采样步长。我的理解是对于这类1对多的任务,$y$不能给$\epsilon$提供信息,因为$\epsilon$只作用在$x_t$上。但$y$可以为预测$x_0$提供很多帮助,毕竟一个常规的回归方法就是直接用Unet,输入$y$来预测$x_0$ (GT)。从上帝视角来看,这种办法只是相对一般的方法中在输入中加入了一个额外的通道$x_t$,并在推理中利用迭代输出就能产生比一般方法好很多的效果。真的很神奇。
可是预测$\boldsymbol{x}_0$跟预测$\boldsymbol{\varepsilon}$理论上难度不是等价的嘛?
这个问题可不可以这么理解:Classifier-Free方案的Loss 相当于
$$ min \quad KL(p(y, x_0:x_T)||q(y)q_\theta(x_0:x_T|y)) $$
然后利用
$$ KL(p(x,y)||q(x,y)) = KL(p(x)||q(x)) + \mathbb{E}_{x\sim p(x)}[KL(p(y|x)||q(y|x))] $$
得到等价的优化目标
$$ min \quad KL(p(x_0:x_T)||q_\theta(x_0:x_T)) + \mathbb{E}_{x_0:x_T \sim p(x_0:x_T)} [KL(p(y|x_0:x_T)||q_\theta(y|x_0:x_T))]$$
这个第一项就是无条件生成的loss。
在不考虑信号y的情况下,可以将第一项的loss降到最小,但第二项可能比较大。
这个推导没毛病,但问题就在于,对于非凸优化来说,有很多个局部最优点,也许“第一项的loss降到最小,但第二项可能比较大”也是其中一个局部最优点,我们没有绝对的手段来保证不会出现这种局部最优点。这是我一开始回复的,“可能”肯定是有可能的。
February 29th, 2024
请问一下,根据式(23),当有多个条件时,应该如何实现Classifier-Free?
多个条件和单个条件的区别,无外乎就是$y$是向量还是标量而已,classifier-free的话都是直接输入到U-Net中,没什么特别的啊。
我纠结的问题在于:应该使用$\epsilon (x,\emptyset,\emptyset,t)+\lambda (\epsilon (x,y1,y2,t)-\epsilon (x,\emptyset,\emptyset,t))$还是使用$\epsilon (x,\emptyset,\emptyset,t)+\lambda _1(\epsilon (x,y1,\emptyset,t)-\epsilon (x,\emptyset ,\emptyset,t))+\lambda _2(\epsilon (x,\emptyset,y2,t)-\epsilon (x,\emptyset,\emptyset,t))$
正常来说肯定都是两个条件一起输入到模型中吧,所以肯定是前者更加合理?
April 1st, 2024
@yisiming|comment-23857
原论文就是前者,把t和X作为条件预测y