生成扩散模型漫谈(十七):构建ODE的一般步骤(下)
原文链接 | 2023-02-23 | 苏剑林
欢迎访问“科学空间”,这里将与您共同探讨自然科学,回味人生百态;也期待大家的分享~ 历史总是惊人地相似。当初笔者在写《生成扩散模型漫谈(十四):构建ODE的一般步骤(上)》(当时还没有“上”这个后缀)时,以为自己已经搞清楚了构建ODE式扩散的一般步骤,结果读者 @gaohuazuo 就给出了一个新的直观有效的方案,这直接导致了后续《生成扩散模型漫谈(十四):构建ODE的一般步骤(中)》(当时后缀是“下”)。而当笔者以为事情已经终结时,却发现ICLR2023的论文《Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow》又给出了一个构建ODE式扩散模型的新方案,其简洁、直观的程度简直前所未有,令人拍案叫绝。所以笔者只好默默将前一篇的后缀改为“中”,然后写了这个“下”篇来分享这一新的结果。 我们知道,扩散模型是一个\(\boldsymbol{x}_T\to \boldsymbol{x}_0\)的演化过程,而ODE式扩散模型则指定演化过程按照如下ODE进行: \[\begin{equation}\frac{d\boldsymbol{x}_t}{dt}=\boldsymbol{f}_t(\boldsymbol{x}_t)\label{eq:ode}\end{equation}\] 而所谓构建ODE式扩散模型,就是要设计一个函数\(\boldsymbol{f}_t(\boldsymbol{x}_t)\),使其对应的演化轨迹构成给定分布\(p_T(\boldsymbol{x}_T)\)、\(p_0(\boldsymbol{x}_0)\)之间的一个变换。说白了,我们希望从\(p_T(\boldsymbol{x}_T)\)中随机采样一个\(\boldsymbol{x}_T\),然后按照上述ODE向后演化得到的\(\boldsymbol{x}_0\)是\(\sim p_0(\boldsymbol{x}_0)\)的。 原论文的思路非常简单,随机选定\(\boldsymbol{x}_0\sim p_0(\boldsymbol{x}_0),\boldsymbol{x}_T\sim p_T(\boldsymbol{x}_T)\),假设它们按照轨迹 \[\begin{equation}\boldsymbol{x}_t = \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)\label{eq:track}\end{equation}\] 进行变换。这个轨迹是一个已知的函数,是我们自行设计的部分,理论上只要满足 \[\begin{equation}\boldsymbol{x}_0 = \boldsymbol{\varphi}_0(\boldsymbol{x}_0, \boldsymbol{x}_T),\quad \boldsymbol{x}_T = \boldsymbol{\varphi}_T(\boldsymbol{x}_0, \boldsymbol{x}_T)\end{equation}\] 的连续函数都可以。接着我们就可以写出它满足的微分方程: \[\begin{equation}\frac{d\boldsymbol{x}_t}{dt} = \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t}\label{eq:fake-ode}\end{equation}\] 但这个微分方程是不实用的,因为我们想要的是给定\(\boldsymbol{x}_T\)来生成\(\boldsymbol{x}_0\),但它右端却是\(\boldsymbol{x}_0\)的函数(如果已知\(\boldsymbol{x}_0\)就完事了),只有像式\(\eqref{eq:ode}\)那样右端只含有\(\boldsymbol{x}_t\)的ODE(单从因果关系来看,理论上也可以包含\(\boldsymbol{x}_T\),但我们一般不考虑这种情况)才能进行实用的演化。那么,一个直观又“异想天开”的想法是:学一个函数\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\)尽量逼近上式右端!为此,我们优化如下目标: \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_0\sim p_0(\boldsymbol{x}_0),\boldsymbol{x}_T\sim p_T(\boldsymbol{x}_T)}\left[\left\Vert \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t}\right\Vert^2\right] \label{eq:objective} \end{equation}\] 由于\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\)尽量逼近了\(\frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t}\),所以我们认为将方程\(\eqref{eq:fake-ode}\)的右端替换为\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\)也是成立的,这就得到实用的扩散ODE: \[\begin{equation}\frac{d\boldsymbol{x}_t}{dt} = \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\label{eq:s-ode}\end{equation}\] 作为简单的例子,我们设\(T=1\),并设变化轨迹是直线 \[\begin{equation}\boldsymbol{x}_t = \boldsymbol{\varphi}_t(\boldsymbol{x}_0,\boldsymbol{x}_1) = (\boldsymbol{x}_1 - \boldsymbol{x}_0)t + \boldsymbol{x}_0\end{equation}\] 那么 \[\begin{equation}\frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t} = \boldsymbol{x}_1 - \boldsymbol{x}_0\end{equation}\] 所以训练目标\(\eqref{eq:objective}\)就是: \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_0\sim p_0(\boldsymbol{x}_0),\boldsymbol{x}_1\sim p_1(\boldsymbol{x}_1)}\left[\left\Vert \boldsymbol{v}_{\boldsymbol{\theta}}\big((\boldsymbol{x}_1 - \boldsymbol{x}_0)t + \boldsymbol{x}_0, t\big) - (\boldsymbol{x}_1 - \boldsymbol{x}_0)\right\Vert^2\right]\end{equation}\] 或者等价地写成 \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_0,\boldsymbol{x}_t\sim p_0(\boldsymbol{x}_0)p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}\left[\left\Vert \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \frac{\boldsymbol{x}_t - \boldsymbol{x}_0}{t}\right\Vert^2\right]\end{equation}\] 这就完事了!结果跟《生成扩散模型漫谈(十四):构建ODE的一般步骤(中)》的“直线轨迹”例子是完全一致的,也是原论文主要研究的模型,被称为“Rectified Flow”。 从这个直线例子的过程也可以看出,通过该思路来构建扩散ODE的步骤只有寥寥几行,相比之前的过程是大大简化了,简单到甚至让人有种“颠覆了对扩散模型的印象”的不可思议之感。 然而,迄今为止前面“直观结果”一节的结论只能算是一个直观的猜测,因为我们还没有从理论上证明优化目标\(\eqref{eq:objective}\)所得到的方程\(\eqref{eq:s-ode}\)的确实现了分布\(p_T(\boldsymbol{x}_T)\)、\(p_0(\boldsymbol{x}_0)\)之间的变换。 为了证明这一结论,笔者一开始是想证明目标\(\eqref{eq:objective}\)的最优解满足连续性方程: \[\begin{equation}\frac{\partial p_t(\boldsymbol{x}_t)}{\partial t} = -\nabla_{\boldsymbol{x}_t}\cdot\big(p_t(\boldsymbol{x}_t)\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\big)\end{equation}\] 如果满足,那么根据连续性方程与ODE的对应关系(参考《生成扩散模型漫谈(十二):“硬刚”扩散ODE》、《测试函数法推导连续性方程和Fokker-Planck方程》),方程\(\eqref{eq:s-ode}\)确实是分布\(p_T(\boldsymbol{x}_T)\)、\(p_0(\boldsymbol{x}_0)\)之间的一个变换。 但仔细想一下,这个思路似乎有点迂回了,因为根据文章《测试函数法推导连续性方程和Fokker-Planck方程》,连续性方程本身就是由ODE通过 \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right] = \mathbb{E}_{\boldsymbol{x}_t}\left[\phi(\boldsymbol{x}_t + \boldsymbol{f}_t(\boldsymbol{x}_t)\Delta t)\right]\label{eq:base}\end{equation}\] 推出的,所以按理说\(\eqref{eq:base}\)更基本,我们只需要证明\(\eqref{eq:objective}\)的最优解满足它就行。也就是说,我们想要找到一个纯粹是\(\boldsymbol{x}_t\)的函数\(\boldsymbol{f}_t(\boldsymbol{x}_t)\)满足\(\eqref{eq:base}\),然后发现它正好是\(\eqref{eq:objective}\)的最优解。 于是,我们写出(简单起见,\(\boldsymbol{\varphi}_t(\boldsymbol{x}_0,\boldsymbol{x}_T)\)简写为\(\boldsymbol{\varphi}_t\)) \[\begin{equation}\begin{aligned} \mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right] =&\, \mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\phi(\boldsymbol{\varphi}_{t+\Delta t})\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\phi(\boldsymbol{\varphi}_t) + \Delta t\,\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\cdot\nabla_{\boldsymbol{\varphi}_t}\phi(\boldsymbol{\varphi}_t)\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\phi(\boldsymbol{x}_t)\right] + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\cdot\nabla_{\boldsymbol{x}_t}\phi(\boldsymbol{x}_t)\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_t}\left[\phi(\boldsymbol{x}_t)\right] + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\cdot\nabla_{\boldsymbol{x}_t}\phi(\boldsymbol{x}_t)\right] \\ \end{aligned}\end{equation}\] 其中第一个等号是因为式\(\eqref{eq:track}\),第二个等号是泰勒展开到一阶,第三个等号同样是式\(\eqref{eq:track}\),第四个等号就是因为\(\boldsymbol{x}_t\)是\(\boldsymbol{x}_0,\boldsymbol{x}_T\)的确定性函数,所以关于\(\boldsymbol{x}_0,\boldsymbol{x}_T\)的期望就是关于\(\boldsymbol{x}_t\)的期望。 我们看到,\(\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\)是\(\boldsymbol{x}_0,\boldsymbol{x}_T\)的函数,接下来我们再做一个假设:式\(\eqref{eq:track}\)关于\(\boldsymbol{x}_T\)是可逆的。这个假设意味着我们可以从式\(\eqref{eq:track}\)中解出\(\boldsymbol{x}_T=\boldsymbol{\psi}_t(\boldsymbol{x}_0,\boldsymbol{x}_t)\),这个结果可以代入\(\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\),使它变为\(\boldsymbol{x}_0,\boldsymbol{x}_t\)的函数。所以我们有 \[\begin{equation}\begin{aligned} \mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right] =&\, \mathbb{E}_{\boldsymbol{x}_t}\left[\phi(\boldsymbol{x}_t)\right] + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_T}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\cdot\nabla_{\boldsymbol{x}_t}\phi(\boldsymbol{x}_t)\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_t}\left[\phi(\boldsymbol{x}_t)\right] + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0, \boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\cdot\nabla_{\boldsymbol{x}_t}\phi(\boldsymbol{x}_t)\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_t}\left[\phi(\boldsymbol{x}_t)\right] + \Delta t\,\mathbb{E}_{\boldsymbol{x}_t}\left[\underbrace{\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]}_{\boldsymbol{x}_t\text{的函数}}\cdot\nabla_{\boldsymbol{x}_t}\phi(\boldsymbol{x}_t)\right] \\ =&\, \mathbb{E}_{\boldsymbol{x}_t}\left[\phi\left(\boldsymbol{x}_t + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\right)\right] \end{aligned}\end{equation}\] 其中第二个等号是因为\(\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\)已经改为\(\boldsymbol{x}_0,\boldsymbol{x}_t\)的函数,所以第二项期望的随机变量改为\(\boldsymbol{x}_0,\boldsymbol{x}_t\);第三个等号则是相当于做了分解\(p(\boldsymbol{x}_0,\boldsymbol{x}_t)=p(\boldsymbol{x}_0|\boldsymbol{x}_t)p(\boldsymbol{x}_t)\),此时\(\boldsymbol{x}_0,\boldsymbol{x}_t\)不是独立的,所以要注明\(\boldsymbol{x}_0|\boldsymbol{x}_t\),即\(\boldsymbol{x}_0\)是依赖于\(\boldsymbol{x}_t\)的。注意\(\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\)原本是\(\boldsymbol{x}_0,\boldsymbol{x}_t\)的函数,现在对\(\boldsymbol{x}_0\)求期望后,剩下的唯一自变量就是\(\boldsymbol{x}_t\),后面我们会看到它就是我们要找的纯粹是\(\boldsymbol{x}_t\)的函数!第四个等号,就是利用泰勒展开公式将两项重新合并起来。 现在,我们得到了 \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right] = \mathbb{E}_{\boldsymbol{x}_t}\left[\phi\left(\boldsymbol{x}_t + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\right)\right]\end{equation}\] 对于任意测试函数\(\phi\)成立,所以这意味着 \[\begin{equation}\boldsymbol{x}_{t+\Delta t} = \boldsymbol{x}_t + \Delta t\,\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\quad\Rightarrow\quad\frac{d\boldsymbol{x}_t}{dt} = \mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\label{eq:real-ode}\end{equation}\] 就是我们要寻找的ODE。根据 \[\begin{equation}\mathbb{E}_{\boldsymbol{x}}[\boldsymbol{x}] = \mathop{\text{argmin}}_{\boldsymbol{\mu}}\mathbb{E}_{\boldsymbol{x}}\left[\Vert \boldsymbol{x} - \boldsymbol{\mu}\Vert^2\right]\label{eq:mean-opt}\end{equation}\] 式\(\eqref{eq:real-ode}\)的右端正好是训练目标\(\eqref{eq:objective}\)的最优解,这就证明了优化训练目标\(\eqref{eq:objective}\)得出的方程\(\eqref{eq:s-ode}\)的确实现了分布\(p_T(\boldsymbol{x}_T)\)、\(p_0(\boldsymbol{x}_0)\)之间的变换。 关于“直观结果”中的构建扩散ODE的思路,原论文的作者还写了篇知乎专栏文章《[ICLR2023] 扩散生成模型新方法:极度简化,一步生成》,大家也可以去读读。读者也是在这篇专栏中首次了解到该方法的,并深深为之震惊和叹服。 如果读者读过《生成扩散模型漫谈(十四):构建ODE的一般步骤(中)》,那么就会更加体会到该思路的简单直接,也更能理解笔者为何如此不吝赞美之词。不怕大家笑话,笔者在写“中篇”(当时的“下篇”)的时候,是考虑过式\(\eqref{eq:track}\)所描述的轨迹的,但是在当时的框架下,根本没法推演下去,最后以失败告终,当时完全想不到它能以一种如此简捷的方式进行下去。所以,写这个扩散ODE系列真的让人有种“人比人,气死人”的感觉,“中篇”、“下篇”就是自己智商被一次次“降维打击”的最好见证。 读者可能想问,还会不会有更简单的第四篇,让笔者再一次经历降维打击?可能有,但概率真的很小了,真的很难想象会有比这更简单的构建步骤了。“直观结果”一节看上去很长,但实际步骤就只有两步:1、随便选择一个渐变轨迹;2、用\(\boldsymbol{x}_t\)的函数去逼近渐变轨迹对\(t\)的导数。就这样的寥寥两步,还能怎么再简化呢?甚至说,“证明过程”一节的推导也是相当简单的了,虽然写得长,但本质就是求个导,然后变换一下求期望的分布,比前两篇的过程简单了可不止一丁半点。总而言之,亲自完成过ODE扩散的前两篇推导的读者就能深刻感觉到,这一篇的思路是真的简单,简单到让我们觉得已经无法再简单了。 此外,除了提供构建扩散ODE的简单思路外,原论文还讨论了Rectified Flow跟最优传输之间的联系,以及如何用这种联系来加速采样过程,等等。但这部分内容并不是本文主要关心的,所以等以后有机会我们再讨论它们。 本文介绍了Rectified Flow一文中提出的构建ODE式扩散模型的一种极其简单直观的思路,并给出了自己的证明过程。 转载到请包括本文地址:https://kexue.fm/archives/9497 更详细的转载事宜请参考:《科学空间FAQ》 如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。 如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢! 微信打赏 支付宝打赏 因为网站后台对打赏并无记录,因此欢迎在打赏时候备注留言。你还可以点击这里或在下方评论区留言来告知你的建议或需求。 如果您需要引用本文,请参考: 苏剑林. (Feb. 23, 2023). 《生成扩散模型漫谈(十七):构建ODE的一般步骤(下) 》[Blog post]. Retrieved from https://kexue.fm/archives/9497
@online{kexuefm-9497,
title={生成扩散模型漫谈(十七):构建ODE的一般步骤(下)},
author={苏剑林},
year={2023},
month={Feb},
url={\url{https://kexue.fm/archives/9497}},
}
December 7th, 2023 […]本文我们聚焦于ODE。在本系列的(六)、(十二)、(十四)、(十五)、(十七)等博客中,我们已经推导过ODE与扩散模型的联系,本文则对扩散ODE的采样加速做简单介绍,并重点介绍一种巧妙地利用“中值定理”思想的新颖采样加速方案“AMED”。[…] April 26th, 2024 想请教一下苏神,这里预测\(x_0\)和预测\(v_t\)有什么本质上的区别吗?我个人理解是无区别,因为\(v_t=\frac{x_t-x_0}{t}\),而模型的输入本身包含\(x_t,t\),两者应该只差一个转换的过程。我自己的实验结果表明,预测\(x_0\)的效果会更好,这点倒是和@o_glay|comment-21780的实验结果保持一致。 数学上应该没区别,实际中时好时坏。 EDM里面的input output scaling也相当于一种混合的training target 好的,感谢! 预测x0岂不是直接从z映射到数据分布了吗,我们使用diffusion flow等模型的初衷不就是因为分布映射很难学习? 如果Loss都是直接用\(\Vert\cdot\Vert^2\)(不加任何\(\lambda\))的话,两者差一个跟\(t\)有关的比例常数,由于跟\(t\)有关,所以这个常数的差异不能直接忽略。至于哪个更好,我倾向于要具体问题具体分析,我暂时没有通用的答案。 好的,感谢苏神解惑。 你好,可以学习一下您的工作吗,想知道是否有论文或开源代码可以学习一下。 May 11th, 2024 发现有个跟rectified flow同期的工作,虽然思路的出发点不同,最后得到了一样的优化目标,感觉也蛮有意思的 解释更加的直观 不需要任何ODE知识 当然他没有做reflow,理论上没有rectified flow完备 https://ggx-research.github.io/publication/2023/05/10/publication-iadb.html 看上去结果差不多,推导比较依赖想象力,理论方面确实差点意思,感谢分享~ July 8th, 2024 您好,这里的证明过程我感觉逻辑上有点别扭: 我试图总结你的证明为: 存在ODE过程: \(\frac{dx_t}{dt} = \frac{\partial \varphi_t(x_0, x_t)}{\partial t}\), Rectified Flow用\(v_{\theta}\)逼近\(\frac{\partial \varphi_t(x_0, x_t)}{\partial t}\). 本文希望证明近似的欧拉过程\(\frac{dx_t}{dt} = v_{\theta}(x_t)\)能够实现\(p_0(x_0)\)到\(p_T(x_T)\)的分布变换. 为了证明这个结论, 本文将\(x_t = \varphi_t(x_0, x_T)\)代入到了测试函数法, 得到了该ODE过程的离散形式: \(x_{t+\Delta t} = x_t + \Delta t \mathbb E[\frac{\partial \varphi_t}{\partial t}]\),从而证明\(v_\theta\)的最优化目标和通过测试函数法得到的是一致的. 我这里觉得奇怪的点在于: 给定\(x_t = \varphi_t(x_0, x_T)\),我们简单的两边微分即可得 \(\frac{dx_t}{dt} = \frac{\partial \varphi_t(x_0, x_t)}{\partial t}\). 这已经是一个ODE过程的表达形式,该ODE将\(x_0\)的分布转移到\(x_T\)的分布. 为什么我们还要通过测试函数法如此麻烦的得到\(x_t = \varphi_t(x_0, x_T)\)的离散形式,才能判定\(\frac{\partial \varphi_t}{\partial t}\)是我们的优化目标? 希望得到您的解答,十分感谢! 现在我们是有一个方程 \[\frac{d\boldsymbol{x}_t}{dt} = \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\] 我们需要证明它满足 \[\begin{equation}\mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right] = \mathbb{E}_{\boldsymbol{x}_t}\left[\phi\left(\boldsymbol{x}_t + \Delta t\,\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\right]\end{equation}\] 你说的ODE \[\frac{d\boldsymbol{x}_t}{dt} = \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t}\] 一来这不是一个实际推理可用的ODE,二来实际上我们没有这个ODE,这个ODE只是我们理解过程中的一步,不借用这个ODE同样可以导出后面的结果。我反倒是不大明白你说这个ODE成立然后就不用这么麻烦证明的逻辑是什么? 多谢您的回复,我的观点是这样的: (1) 我们是希望证明\(\frac{d x_t}{dt} = v_\theta(x_t, t)\)满足Eq.18. 但是在Eq.11\(\to\)Eq.15的证明过程其实没有用到\(v_{\theta}(x_t, t)\)的任何信息,最终是通过验证包含\(x_t\)的测试函数满足Eq.15得到\(x_{t+\Delta t} = x_t + \Delta t \mathbb E_{x_0|x_t}[\frac{\partial\varphi_t}{\partial t}] \to \frac{d x_t}{dt} = \mathbb E_{x_0|x_t}[\frac{\partial \varphi_t}{\partial t}]\) (2) 证明过程中, 实际用到了\(\varphi_t = x(t)\) 和 \(\varphi_(t+\Delta t) = x(t+\Delta t)\)两个条件 (如Eq.13第一个等式用到了\(\varphi_(t+\Delta t) = x(t+\Delta t)\)). 由这两个条件得到:\(\frac{d(x(t))}{dt} = \frac{x(t+\Delta t) - x(t)}{\Delta t} = \frac{\varphi(t+\Delta t) - \varphi(t)}{\Delta t} = \frac{\partial \varphi_t}{\partial t}\) 这就是我上面所说的 “这个ODE成立然后不用这么麻烦”. 也就是在证明过程中我认为用到了\(\varphi_t = x(t)\) 和 \(\varphi_(t+\Delta t) = x(t+\Delta t)\)两个条件, 其实也就隐含了\(\frac{d(x(t))}{dt} = \frac{\partial \varphi_t}{\partial t}\)这个ODE方程成立. 既然\(\frac{d(x(t))}{dt} = \frac{\partial \varphi_t}{\partial t}\)这个ODE成立,那复用之前的结论: 该ODE将\(x_0\)的分布转移到\(x_T\)的分布. 不知道我的表述是否清楚,可能中间存在某些想当然的误区,还请您指正,感谢! 本文的过程,是直接从\(\mathbb{E}_{\boldsymbol{x}_{t+\Delta t}}\left[\phi(\boldsymbol{x}_{t+\Delta t})\right]\)出发,泰勒展开然后得到最后的方程是 \[\frac{d\boldsymbol{x}_t}{dt} = \mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\] 然后发现\[\frac{d\boldsymbol{x}_t}{dt} = \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\] 中的\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\)正好是\(\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\),从而完成证明,当然这里更像是一个充分性证明,而如果将\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)=\mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\)代入进行验证,则更像是必要性证明。证明的篇幅看上去有点长,但实际上就两个公式,只不过步骤写得细了点。 对于你的理解,我的问题在于,成立 \[\frac{d\boldsymbol{x}_t}{dt} = \frac{\partial \boldsymbol{\varphi}_t}{\partial t}\] 之后,是怎么过渡到 \[\frac{d\boldsymbol{x}_t}{dt} = \mathbb{E}_{\boldsymbol{x}_0|\boldsymbol{x}_t}\left[\frac{\partial \boldsymbol{\varphi}_t}{\partial t}\right]\] 的?或者怎么过渡到\(\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\)的?看上去你没有提到这一步骤。 我完全认同您关于上述的充分性证明 & 必要性证明的观点,也觉得本文的证明是没有问题的,之前唯一的疑惑是怀疑证明过程中用到了更高阶的已知条件(\(\frac{d x_t}{dt} = \frac{\partial \varphi_t}{\partial t}\)). 你说的怎么从\(\frac{d x_t}{dt} = \frac{\partial \varphi_t}{\partial t}\)过渡到\(\frac{d x_t}{dt} = \mathbb E[\frac{\partial \varphi_t}{\partial t}]\)确实是我没有考虑到的问题,这应该是导致不能直接从\(\frac{d x_t}{dt} = \frac{\partial \varphi_t}{\partial t}\)推到结论的一步. 不过我现在有一个新的问题.. 为什么我们可以同时得到两个ODE: \(\frac{d x_t}{dt} = \frac{\partial \varphi_t}{\partial t}\) # 1 \(\frac{d x_t}{dt} = \mathbb E[\frac{\partial \varphi_t}{\partial t}]\) # 2 #1 是从\(x_t = \varphi(t)\) 和\(x_{t+\Delta t} = \varphi(t+\Delta t)\)得出的 #2 是从测试函数导出的. 这两个ODE都对应于同一个随机过程\(x_0 \to x_t\)吗? 如果是的话,为什么同一个随机过程能对应两个不同形式的ODE, 如果不是的话,那是哪一个ODE的推导出现了问题呢? 这两个ODE仅仅是起点相同、终点相同,过程完全不相同。存在多个不同的ODE,满足起终点相同的条件不是很正常的吗?另外就是ODE描述的是确定性的运动,它描述的不是随机过程。 October 31st, 2024 博主您好,非常感谢这篇文章。但是有一个小问题,如果路径\(\boldsymbol{\varphi_t}(x_0, x_T)\)不是直线,即不能表达为\(x_t=(1-t)x_0+t\cdot x_T\),那\(v_{\theta}(\boldsymbol{x}_t, t)\)还可以使用(5)式中的优化方法,即直接从\(p_0(x_0)和p_T(x_T)\)中采样\(x_0, x_T\)然后代入\(|| v_{\theta}(x_t, t)-\frac{\partial \boldsymbol{\varphi_t}(x_0, x_T)}{\partial t} ||^2\)来优化吗? 对应原文中的”Nolinear Extension”章节,优化目标是不是应当退化为\(\mathbb{E}_{p(x_0)p(x_t|x_0)}(|| \boldsymbol{v}_{\theta}(\boldsymbol{x_t}, t)-\frac{\partial \boldsymbol{\varphi_t}(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t} ||^2)\), 而不是\(\mathbb{E}_{p(\boldsymbol{x}_0), p(\boldsymbol{x}_T)}(|| \boldsymbol{v}_{\theta}(\boldsymbol{x_t}, t)-\frac{\partial \boldsymbol{\varphi_t}(\boldsymbol{x}_0, \boldsymbol{x}_T)}{\partial t} ||^2)\),在直线路径下这两个是等价的,但是非直线路径下这两个期望的计算方法还等价吗? \(\boldsymbol{x}_t\)就是由\(\boldsymbol{x}_0\)和\(\boldsymbol{x}_T\)构建而来的啊(即给定\(\boldsymbol{x}_0\)和\(\boldsymbol{x}_T\)以及\(t\),\(\boldsymbol{x}_t\)也就定了),所以对\(\boldsymbol{x}_t\)的期望,不就是对\(\boldsymbol{x}_0,\boldsymbol{x}_T\)的期望?因此两者是等价的。 April 19th, 2025 苏神您好,我想请教一个问题。 我想利用Rectified Flow来估计一个复杂分布的概率密度,学习博文后我的想法是在训练好模型后,将原始空间中的点通过反向ODE映射到简单分布(比如多元高斯分布)上,再在简单分布上直接利用解析表达式计算概率密度。 但我的实验结果与预想并不相同:使用ODE采样生成确实能生成出符合原始分布的数据,但这些数据里有些点通过上述方式计算得到的概率密度非常低。同时,我尝试对原始空间(二维)网格化后将所有网格点转换到高斯分布空间计算概率密度,结果一些没有数据的区域也显示出很高的概率密度。 上面的结果有些反直觉,不知您是否知道是因为什么问题呢?是无法以这种方式计算概率密度?还是我的计算过程有问题,即不能通过简单的反向ODE(我用的反向的一阶欧拉)来计算? 谢谢! 参考这里 https://kexue.fm/archives/9280 。概率密度之间的变换,还需要计算一个雅可比行列式,放到ODE这里要算一个 \(\nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t)\)的积分。 还可以参考 https://arxiv.org/abs/1806.07366 等工作。 非常感谢! 我这几天学习了一下Normalizing Flow相关的知识,确实发现概率密度的变换需要考虑这个雅可比行列式。看来我还得加强掌握一下基础的理论知识。 June 3rd, 2025 苏神您好,看本文的证明确实非常简洁易懂,受益良多。我又回过头看了原论文的证明,他的说法是边缘分布 \(p(x_t)\) 和 \(p(z_t)\) 始终保持一致(原论文定理3.3)?但是并没有看懂原论文为什么能够证明这一点,我的理解是 \(x_t\) 和 \(z_t\) 服从的连续性方程是不一样的,\(x_t\) 满足 \[ \frac{\mathrm{d} x_t}{\mathrm{d} t} = x_1 - x_0 \] 而 \(z_t\) 满足 \[ \frac{\mathrm{d} z_t}{\mathrm{d} t} = v^x(z_t, t) \] 感觉 \(v^x(x_t, t)\equiv x_1-x_0\) 并不能成立,根据连续性方程,边缘分布并不一定保证一致?阅读本文,发现您也只是说 \(z_t\) 能够实现 \(x_0\) 到 \(x_1\) 的变换,并没有强调 \(z_t\) 和 \(x_t\) 边缘分布的一致性,希望苏神能够指点一下这两者的边缘分布是否是一致的。 你似乎没有理解reflow。首先你觉得“\(z_t\) 能够实现 \(x_0\) 到 \(x_1\) 的变换”这句话定量上应该怎么描述呢?最基本的一个性质,难道不是\(z_1\)的边缘分布跟\(x_1\)一致、\(z_0\)的边缘分布跟\(x_0\)一致吗?它们本身没有一一映射关系,所以所谓能实现变换,只能是(边缘)分布之间的变换。 另一方面,其实终点为1,还是终点为0,抑或是终点是0.9,其实过程和结果的形式都是一样的,所以它不单单实现了“\(z_1\)的边缘分布跟\(x_1\)一致、\(z_0\)的边缘分布跟\(x_0\)一致”,还实现了任意\(t\)的“\(z_t\)的边缘分布跟\(x_t\)一致”。 不知道这样说你能接受不?如果需要证明,你可以仔细看“证明过程”一节,它实际上证明的是:从\(\boldsymbol{x}_t=(1-t)\boldsymbol{x}_0+t\boldsymbol{x}_1\)构造的点出发(等价于从这个边缘分布采样),经过\(\boldsymbol{x}_t + \boldsymbol{f}_t(\boldsymbol{x}_t)\Delta t\)后,它的边缘分布跟\(\boldsymbol{x}_{t+\Delta t}=(1-t-\Delta t)\boldsymbol{x}_0+(t+\Delta t)\boldsymbol{x}_1\)的边缘分布一致。 感谢您的回复!这么一看,我才注意到能从 \(p(x_0)\) 变换到 \(p(x_1)\) 实际上是每个 \(\Delta t\) 微元都保持边缘分布一致的结果,而我原来迷惑在 \(\varphi(x_0, x_1)\) 由 \(x_1\) 组成的这一形式中,以为有可能存在过程中边缘分布不一致的可能性了。
你的大名
电子邮箱
个人网站(选填)
- 可以使用LaTeX代码,点击“预览效果”可查看效果;2. 可以通过点击评论楼层编号来引用该楼层;3. 网站可能会有点卡,如非确认评论失败,请不要重复点击提交。
本站采用创作共用版权协议,要求署名、非商业用途和保持一致。转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议。
© 2009-2026 Scientific Spaces. All rights reserved. Theme by laogui. Powered by Typecho. 备案号: 粤ICP备09093259号-1/2。