尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

c-Rectified Flow解析:条件生成模型少步采样的计算与统计保证

c-Rectified Flow解析:条件生成模型少步采样的计算与统计保证 最近两年凡是用扩散模型做过图像生成的人大概率都被同一个问题折磨过想要好效果就得几十步采样想把步数压到个位数画面质量就肉眼可见地崩坏。这个问题的根源不只是工程调优不到位而是一个数学事实——概率流路径是弯的离散化误差会随着路径弯曲度被放大。步数越少误差越大图像越糊。Rectified Flow 给出的解法非常直接既然弯是误差的来源那就把轨迹拉直。当噪声分布和数据分布之间的传输路径接近一条直线时从随机噪声走到真实样本只需要一步、两步或几步。而 c-Rectified Flow 把这个思路从无条件生成推广到了条件生成——也就是给一个类别标签、一段文字或一张参考图要求模型生成对应内容。论文标题里最关键的两个词是 Computational Guarantees 和 Statistical Guarantees前者回答“最少几步能生成、误差上界是多少”后者回答“需要多少训练数据、学到的条件速度场能泛化到什么程度”。这篇文章不打算逐条复述定理证明因为这类理论论文的假设和常数对工程读者意义有限。更有价值的是把理论承诺翻译成工程语言c-Rectified Flow 为什么能少步采样条件变量 c 在理论分析里扮演什么角色计算保证和统计保证分别约束了哪一层的误差以及我们在自己的项目里可以怎么快速验证这套思路。1. 这篇文章真正要解决的问题很多人第一次看到“Computational and Statistical Guarantees”这个标题时第一反应是这又是一篇纯理论论文跟我的工程实践没关系。这个判断是错的。理论保证和工程体验之间其实隔着很短的传导链计算保证直接对应采样成本。它告诉你在什么条件下模型可以少步生成、Euler 离散化带来的误差上界是多少以及“拉直”为什么能换来每一步的精度。统计保证直接对应数据需求。它告诉你需要多少配对样本来估计条件速度场条件分布越复杂样本复杂度会怎么变化模型的泛化边界在哪里。这两类保证共同决定了一个条件生成模型能不能从论文变成可用的系统。如果你在做文本到图像、类别条件生成、可控编辑或者正在研究如何把采样步数从几十步压到一两步那么 c-Rectified Flow 正是你应该关注的方向。更具体地说这篇文章能帮你解决三个问题理解 c-Rectified Flow 的核心构造条件变量 c 如何进入概率流 ODE。理解计算保证和统计保证分别约束什么以及它们各自依赖什么假设。用最小代码示例跑通一个条件 rectified flow 的“训练-拉直-少步采样”流程并知道如何排查失败。1.1 什么样的读者最该读这篇文章正在做扩散模型加速采样、蒸馏、少步生成的算法工程师。想从“调参跑实验”转向“理解模型为什么有效”的研究型开发者。对 flow matching、consistency models、rectified flow 这一类生成模型理论有兴趣的读者。如果你只想把现有模型跑起来这篇文章中的采样代码可以直接参考如果你想知道这类模型的理论边界在哪里第四、五节和第九节应该能给你一个比论文摘要更落地的框架。2. 基础概念与核心原理从传输映射到条件概率流要理解 c-Rectified Flow首先要理解一个更基本的观点生成模型本质上是在两个分布之间建立一个传输方案。源分布通常是高斯噪声目标分布是真实数据。从噪声到数据的每一条轨迹都可以看成把一个样本点从源分布“搬运”到目标分布。2.1 概率流 ODE把生成过程变成确定性微分方程扩散模型里采样过程通常用随机微分方程SDE描述。但在 Rectified Flow 中采样过程被建模成确定性常微分方程ODEdX_t v(X_t, t) dt其中 X_0 服从噪声分布X_1 服从数据分布v 是速度场。给定速度场之后从任意一个初始噪声 X_0 出发沿着 ODE 积分到 t1就能得到一个生成样本。这里的关键问题是速度场 v 应该怎么定义Rectified Flow 给出了一种非常优雅的构造先在源分布和目标分布之间做线性插值令X_t (1 - t) * X_0 t * X_1对这个插值过程求导立即可得dX_t / dt X_1 - X_0也就是说如果 X_0 和 X_1 已经配对好了那么理想速度场 v(X_t, t) 应该等于 X_1 - X_0。但问题在于我们只知道 X_t 的值并不知道它到底是从哪个 X_0 和 X_1 插值来的。所以实际做法是用条件期望来定义速度场v(x, t) E[ X_1 - X_0 | X_t x ]这个条件期望可以通过回归直接学习。训练损失是L E[ || v(X_t, t) - (X_1 - X_0) ||^2 ]这里的做法本质上是监督学习采样一对 (X_0, X_1)算出插值点 X_t 和目标速度 X_1 - X_0让神经网络去拟合。训练完成后采样时只需要用 Euler 法迭代求解 ODEx_{tdt} x_t v(x_t, t) * dt2.2 为什么轨迹一开始是弯的reflow 怎么把它拉直理论上如果每一条插值轨迹互不相交那么速度场 v(x,t) 就是精确的采样一步就能从噪声到数据。但实际上不同 (X_0, X_1) 配对的插值轨迹会在中间时刻交叉。在交叉点处条件期望会把不同方向的速度“平均”掉导致 ODE 轨迹偏离直线产生弯曲。Reflow重新配对的做法很直观用当前模型先生成一批轨迹取每条轨迹的起点和终点组成新的配对 (X_0, X_1)再用这些新配对重新训练一个速度场。因为新的配对是模型自己生成的轨迹线的交叉程度会下降路径更接近直线。经过一两轮 reflow轨迹可以被拉得非常直这正是 rectified flow 能做到少步采样的核心原因。这里值得注意一个容易误解的点reflow 不是知识蒸馏不需要 teacher-student 结构它只是用当前模型生成新的训练配对。每次 reflow 都会把“轨迹的公共交叉程度”往下压直白地说就是把速度场向“一步到位”的方向逼近。3. c-Rectified Flow 的核心概念条件变量如何进入概率流c-Rectified Flow 要解决的是条件生成问题。环境不变只是每个数据样本 X_1 现在带有一个条件标签 c它可以是离散的类别、连续向量、文本编码或图像特征。3.1 条件速度场的定义无条件 rectified flow 学习的是全局速度场 v(x,t)。c-Rectified Flow 学习的是条件速度场 v(x,t,c)它表示在给定条件 c 的前提下噪声点 x 在当前时刻最可能的移动方向。训练目标自然扩展为L_c E[ || v(X_t, t, c) - (X_1 - X_0) ||^2 ]其中 X_t (1-t)X_0 tX_1且 (X_0, X_1, c) 来自配对数据。直观理解条件 c 就像给每一条插值轨迹贴上了标签模型在估计速度时不仅要看当前位置 x 和时间 t还要看“我要生成的是哪一类内容”。3.2 和无条件版本的差别在哪里无条件 rectified flow 是把所有数据混在一起学习一个平均速度场。如果数据分布是多模态的这个平均速度场在中间区域会非常平滑轨迹也容易弯曲。条件版本则不同给定 c 之后目标分布收敛到条件分布 X_1|c多模态性被大幅压低速度场的“分歧”集中在不同的 c 之间而不是 c 内部。从这个角度看条件变量 c 不仅仅是一种“引导信号”它实际上是在改变传输问题的结构。无条件传输是在一个混合分布上找一条全局路径条件传输是在每个条件子分布上各自找一条路径。后者显然更容易被拉直这也是为什么条件 rectified flow 在少步采样上通常比无条件版本表现更好。3.3 条件 c 在实际系统中从哪里来在文本到图像模型里c 通常是 CLIP 或 T5 的文本嵌入在类别条件生成里c 是 class embedding在图像编辑里c 可以是参考图的编码。无论哪种形式c 都会被送进速度网络的某一部分与 x、t 一起参与预测。4. 计算保证解析为什么少步采样是可行的“Computational Guarantees”在论文标题里出现说明这篇工作要回答的核心问题是用 c-Rectified Flow 做条件生成到底需要多少次函数评估误差有多大这类分析通常从三个层次展开。4.1 第一层轨迹弯曲度与离散化误差的关系Euler 法的离散化误差不是随意的它和速度场沿轨迹的变化程度直接相关。直观地说如果轨迹是一条直线速度为常量那么 Euler 法一步就能精确到达终点如果轨迹弯曲剧烈速度方向时刻在变大步长就会产生明显偏离。理论分析中会定义轨迹的曲率或二阶导数上界。曲率越小同样步数下的误差上界越小反过来说要达到同样的误差精度可以用更少的步数。Rectified Flow 系列工作的关键洞察是通过 reflow 过程轨迹可以被系统性地拉直从而同时降低曲率上界和实际离散化误差。4.2 第二层函数评估次数NFE与采样成本采样成本最直接的指标是 NFENumber of Function Evaluations也就是速度网络被调用的次数。标准 DDPM 采样动辄几百步DDIM 等加速方法通常也要 20~100 步。Rectified Flow 经过 reflow 之后轨迹接近直线4 步、2 步乃至 1 步就能生成质量可用的样本。计算保证在这里的意义是它告诉你少步采样不是靠运气而是有误差上界支持的。只要轨迹足够直Euler 法在高 NFE 和低 NFE 之间的质量差距就会明显缩小。4.3 第三层条件变量 c 对计算复杂度的影响条件版本的额外复杂度来自 c 对速度场的影响。如果不同 c 对应的速度场差异很大那么条件速度场的 Lipschitz 常数可能变大轨迹弯曲度也可能上升。计算保证的理论分析需要把 c 的影响纳入误差上界。这里有一个重要的工程推论并不是所有条件都同样容易拉直。如果某个条件子分布内部本身就是高度多模态、高度分散的那么它的条件轨迹也可能弯曲需要更多步数才能生成好。在设计系统时不应该假设“只要用了 c-Rectified Flow就一定能一步生成”。4.4 一个现实的看待方式理论上的误差上界通常是“最坏情况”的保证工程上我们更关心平均表现。两者之间有差距很正常一个模型可能在任何单点上都满足理论假设但实际样本质量远超最坏情况。反过来一个理论保证很强的模型如果实现细节不对比如条件编码没有接入正确的位置工程效果照样一塌糊涂。所以正确理解计算保证的方式是它证明了“把路径拉直”这个策略在数学上是合理的并且给出了减少采样步数时误差的收敛关系。具体能压到几步要以自己的任务和模型为准。5. 统计保证解析数据量、泛化与条件分布覆盖第二部分是 Statistical Guarantees。统计保证回答的问题和计算保证完全不同给定 n 个训练样本我们学到条件速度场它与真实条件速度场之间的误差上界是多少更直白地说需要多少数据模型才不会“瞎编”。5.1 速度场学习本质上是一个回归问题训练 c-Rectified Flow 的损失函数是一个条件回归损失v_hat argmin_v E[ || v(X_t, t, c) - (X_1 - X_0) ||^2 ]从统计学习的角度看这是在高维输入空间x, t, c上做非参数回归。统计保证通常会把估计误差分解为两部分近似误差approximation error神经网络这个函数类能不能表达真实条件速度场这和模型容量、网络结构有关。估计误差estimation error有限样本下训练学到的函数和函数类里最优函数之间的距离。这和样本量 n、输入维度、速度场的复杂度有关。一个简单但有洞察的结论是条件 c 的维度越高、条件分布越复杂需要的数据量通常就越大。文本到图像模型动辄需要数十亿图文对不只是因为图像本身复杂也是因为条件空间极其庞大不同 c 对应的条件速度场差异巨大。5.2 条件分布覆盖与低密度区域问题统计保证有一个常见的隐含假设训练数据的条件分布要能覆盖推理时可能遇到的 c。如果推理时的 c 在训练集中几乎没出现过那么条件速度场的估计在对应区域就不可靠。这也是为什么条件生成模型在罕见类别、罕见文本组合上容易失败——不是模型“不懂”而是它没见过足够多该条件下的配对样本。另一个关键问题是低密度区域。即使某个 c 在训练集中出现过如果带有该 c 的数据样本很少那么条件速度场在这些样本附近的数据点会比较稀疏回归误差也会更大。这正是统计保证要量化的现象条件分布的长尾直接决定条件生成的可靠性边界。5.3 配对数据的来源会影响什么Rectified Flow 需要 (X_0, X_1) 配对。这个配对从哪来会直接影响统计特性。独立配对X_0 和 X_1 独立采样插值轨迹在空间上更分散交叉更多轨迹更弯。但配对成本低适合第一轮训练。reflow 配对用当前模型生成轨迹取起点和终点作为新配对。轨迹交叉减少更接近直线但配对数据来自模型自身如果当前模型生成质量差误差会被带入下一轮训练。这里存在一个经典的鸡生蛋问题reflow 需要当前模型生成数据而质量差的模型生成的数据可能误导下一轮训练。统计保证的另一个作用正是分析这种迭代过程中误差是如何累积或收敛的。6. 环境准备与最小实现跑通条件速度场训练前面五节已经把概念和理论框架铺开了。从这一节开始我们用最简代码验证这套思路。为了聚焦核心逻辑演示用一个二维 toy 数据集四个高斯簇每个簇对应一个类别条件。6.1 环境说明示例代码基于 PyTorch版本以你本机实际安装为准这篇演示不依赖特定版本。需要以下包pip install torch numpy matplotlib所有代码都是实验性演示目的是展示核心逻辑不是任何论文的官方实现。6.2 条件速度网络定义速度网络的输入是当前点 x、时间 t 和条件 c。我们把时间 t 和条件 c 分别编码再与 x 拼接送入 MLP。# 文件路径model.py import torch import torch.nn as nn class ConditionedVelocityNet(nn.Module): def __init__(self, dim2, cond_dim8, hidden128, num_layers3): super().__init__() self.time_encoder nn.Sequential( nn.Linear(1, hidden), nn.SiLU(), nn.Linear(hidden, hidden), ) self.cond_encoder nn.Sequential( nn.Linear(cond_dim, hidden), nn.SiLU(), nn.Linear(hidden, hidden), ) layers [] in_dim dim hidden hidden for _ in range(num_layers): layers.append(nn.Linear(in_dim, hidden)) layers.append(nn.SiLU()) in_dim hidden layers.append(nn.Linear(hidden, dim)) self.mlp nn.Sequential(*layers) def forward(self, x, t, c): # x: (B, dim), t: (B, 1), c: (B, cond_dim) h torch.cat([x, self.time_encoder(t), self.cond_encoder(c)], dim-1) return self.mlp(h)关键点在于三个输入的融合方式x 是原始坐标t 编码当前时间c 编码条件。三者拼接后共同决定预测速度。条件编码器的作用是把类别信息映射到一个高维嵌入空间让网络有条件地调整速度方向。6.3 数据准备与训练循环训练数据由四个高斯簇组成每个簇的中心不同簇索引映射为一个 one-hot 条件向量。# 文件路径train.py import torch import torch.nn.functional as F from model import ConditionedVelocityNet def make_dataset(centers, n_per_class2000): 构造条件玩具数据每个簇一个条件 xs, cs [], [] for cls_id, center in enumerate(centers): x torch.randn(n_per_class, 2) * 0.3 torch.tensor(center, dtypetorch.float32) c torch.zeros(n_per_class, len(centers)) c[:, cls_id] 1.0 xs.append(x) cs.append(c) return torch.cat(xs), torch.cat(cs) centers [(-3, -3), (3, -3), (-3, 3), (3, 3)] x1_all, c_all make_dataset(centers) model ConditionedVelocityNet(dim2, cond_dim4) optimizer torch.optim.Adam(model.parameters(), lr1e-3) def train_step(model, optimizer, x1, c): x0 torch.randn_like(x1) t torch.rand(x1.size(0), 1, devicex1.device) xt (1 - t) * x0 t * x1 target x1 - x0 pred model(xt, t, c) loss F.mse_loss(pred, target) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() for epoch in range(200): perm torch.randperm(len(x1_all)) total_loss 0.0 for i in range(0, len(x1_all), 256): idx perm[i:i256] loss train_step(model, optimizer, x1_all[idx], c_all[idx]) total_loss loss if epoch % 20 0: print(fepoch {epoch}, loss {total_loss:.4f})这段代码做的事和论文中的训练目标一致采样噪声 x0在 x0 和真实样本 x1 之间线性插值得到 xt用 x1 - x0 作为回归目标让网络预测条件速度。6.4 Euler 采样与一步生成训练完成后可以用不同步数采样。采样过程就是从随机噪声出发按速度场逐步推进。# 文件路径sample.py import torch def sample(model, c, steps1, devicecpu): 给定条件 c从噪声采样生成样本。steps1 表示一步到位。 x torch.randn(1, 2, devicedevice) dt 1.0 / steps for i in range(steps): t torch.tensor([[i * dt]], devicedevice) v model(x, t, c) x x v * dt return x # 测试每个类别都采样 100 个样本检查位置是否落在对应簇内 with torch.no_grad(): for cls_id in range(4): c torch.zeros(1, 4) c[0, cls_id] 1.0 samples torch.cat([sample(model, c, steps8) for _ in range(100)]) print(fclass {cls_id}: mean {samples.mean(dim0).tolist()})如果训练正确每个类别采样出来的样本均值应该接近该类别的簇中心。这一步是判断模型是否学会条件生成的直接依据。6.5 Reflow拉直轨迹并减少采样步数reflow 的核心是用当前模型生成新的配对然后用新配对重新训练。# 文件路径reflow.py def generate_reflow_pairs(model, c_all, n_pairs8000, steps100): 用当前模型生成轨迹取起点和终点构造新配对 model.eval() new_x0, new_x1, new_c [], [], [] idx torch.randperm(len(c_all))[:n_pairs] with torch.no_grad(): for i in idx: c c_all[i:i1] x0 torch.randn(1, 2) x x0.clone() dt 1.0 / steps for s in range(steps): t torch.tensor([[s * dt]]) v model(x, t, c) x x v * dt new_x0.append(x0) new_x1.append(x) new_c.append(c) return torch.cat(new_x0), torch.cat(new_x1), torch.cat(new_c) # 生成新配对后用完全相同的条件速度回归损失重新训练 # 只是这一次回归目标从 (x1 - x0) 变成了 (new_x1 - new_x0)reflow 之后重新训练的新模型轨迹会明显更直。此时把采样步数从 100 步压到 1 步生成质量也不会大幅下降。这就是计算保证在工程上的直接体现。7. 运行结果与效果验证7.1 训练损失的变化正常训练下损失值会逐步下降并趋于稳定。如果损失不下降或震荡剧烈优先检查学习率和数据是否归一化。条件速度回归的目标 x1 - x0 的量级很重要如果数据分布方差极大建议对数据做标准化否则网络要同时拟合方向和尺度收敛变慢。7.2 采样结果的验证方式最直观的验证是可视化把四个类别在二维平面上的采样点画出来观察颜色是否正确聚集在对应的簇中心附近。验证时注意类别正确性给定条件 c 采样的样本是否落在对应的分布区域。分布覆盖性样本是否覆盖了该簇的完整范围而不是只集中在某个子区域。步数稳定性把采样步数从 100 次降到 1 次观察样本质量的变化幅度。reflow 之后的模型这个变化幅度应该明显缩小。7.3 判断 reflow 是否生效一个容易执行的标准是比较 reflow 前和 reflow 后1 步采样和 100 步采样结果的分布差异。如果 reflow 前 1 步采样的结果明显偏在簇中心之间的区域说明轨迹弯曲中间点被速度场的平均效应带偏了而 reflow 后 1 步采样已经贴近真实簇说明拉直生效了。如果 reflow 后 1 步采样依然很差最可能的原因是 reflow 步骤数太少轨迹还没有被充分拉直。可以增加 reflow 采样时的 Euler 步数或者多跑一轮 reflow。8. 常见问题与排查思路条件 rectified flow 的训练和采样流程虽然简单但实际运行时有一些典型坑。下面的表格整理了最常见的几类问题。问题现象可能原因排查方式解决方案训练损失不下降学习率过大或过小数据未标准化打印损失曲线检查梯度范数调整学习率对数据做标准化采样结果与条件无关条件 c 没有正确传入网络检查 forward 中 c 的拼接位置和维度打印网络中间层确认条件编码器生效1 步采样质量差轨迹尚未充分拉直分别比较 1 步和 100 步采样结果增加 reflow 轮数或提高 reflow 采样步数同一条件采样多样性不足速度场在条件内部过度平均检查该条件内部的样本分布增大模型容量增加该条件的训练样本罕见条件生成崩坏长尾条件训练样本不足统计训练数据中各条件的样本数增加数据或对条件嵌入做平滑/正则训练时显存或内存溢出batch size 过大或轨迹数据存储过多观察资源占用减小 batch size或分块保存 reflow 配对这些排查思路不仅适用 toy demo也适用于真实的条件生成任务。大部分问题追根溯源都能落到三个地方条件信息有没有真正参与速度预测、轨迹有没有被拉直、条件分布有没有足够的训练数据覆盖。9. 工程实践建议与理论应用边界9.1 什么时候选择 c-Rectified Flow如果你的项目满足以下条件c-Rectified Flow 比传统扩散模型更有优势采样效率优先线上推理成本敏感需要把采样步数压到 1~4 步。已有配对数据你有 (条件, 目标) 配对数据可以训练条件速度场。数据形式可以是文本-图像、类别-图像、参考图-目标图等。任务本身适合确定性传输不需要刻意保留随机 SDE 带来的多样性红利。如果数据量很小或者条件空间极其复杂且覆盖率低那么先不要期待理论保证直接转化为完美效果。此时优先做好数据收集而不是盲目压缩采样步数。9.2 与 flow matching、consistency models 的关系理解 c-Rectified Flow 在技术谱系中的位置有助于选择方案。Flow Matching 是更一般化的框架通过匹配条件向量场来训练Rectified Flow 可以看成一种插值策略同时强调 reflow 拉直。Consistency Model 则走的是另一条路直接把任意时刻的样本映射到最终样本训练目标不是速度而是自一致性。三者都服务于少步生成但机制不同Rectified Flow拉直 ODE 轨迹让大步长 Euler 离散化也够准。Consistency Model直接学会从任意时间点跳到终点的映射。Flow Matching关注任意向量场的学习框架不强制拉直。在实践中Rectified Flow 的 reflow 思路更容易被解释和调试因为它每一步都有清晰的物理含义我们在重新配对轨迹而不是在蒸馏抽象映射。9.3 阅读理论论文的正确姿势论文里的计算保证和统计保证除了定理本身更应该关注三件事假设条件定理成立依赖哪些假设这些假设在你的任务中是否成立误差量级误差上界里哪些项主导是离散化误差、近似误差还是估计误差条件 c 的影响条件维度进入误差上界的方式是什么越高维的条件是否需要越多的数据了解这些之后你会发现理论和工程之间确实有桥梁所有“保证”本质上都在告诉你系统在哪里会失效以及失效的程度如何随资源变化。9.4 条件生成实验中的几条工程建议整理几条我认为最有价值的实践经验条件 c 的编码器不要和速度网络的主体剪得太开。条件信息需要和 x 的每个中间层有意义地交互而不是只在最后一层拼接。reflow 不是越多越好。每一轮 reflow 都会引入当前模型的误差通常 1~2 轮就能获得主要收益多轮提升有限。采样时时间点 t 建议保持训练分布一致。训练时 t 均匀采样采样时也尽量均匀步进不要为了加速而跳变。记录每种条件对应的样本质量不要只看整体指标。条件生成的长尾问题要靠逐条件统计才能暴露。10. 总结与后续学习方向这篇文章把 c-Rectified Flow 的理论和工程拼在了一起。核心结论可以归纳为几条c-Rectified Flow 是条件生成框架条件变量 c 进入速度场 v(x,t,c)把复杂的全局传输拆解成每个条件子分布内的局部传输。计算保证解释了“少步采样为什么可行”核心在于轨迹直线度与离散化误差的关系reflow 是系统性地降低轨迹弯曲度的关键机制。统计保证解释了“多少数据才够用”条件分布的覆盖度、长尾效应和配对数据来源决定了条件速度场估计的可靠性。用最小代码实现验证这套思路并不复杂条件速度回归、Euler 采样、reflow 配对三步即可跑通。下一步建议你从两个方向继续深入。第一个方向是实践把 toy demo 升级成一个真实任务比如用类别条件在 CIFAR-10 或 ImageNet 上验证少步采样质量观察 reflow 前后不同步数下 FID 或 Inception Score 的变化。第二个方向是理论仔细阅读计算保证和统计保证部分的证明框架重点看误差分解的层次和条件 c 进入误差项的方式这能帮你判断未来新模型在什么情况下会失效。条件生成模型的少步采样不是神话而是一个可以被理论解释和工程验证的系统工程。c-Rectified Flow 最值得学的不是某个具体网络结构而是那种“先看路径弯不弯再决定步数多不多”的思考方式。建议收藏这篇文章下次遇到条件生成模型采样质量问题的时候拿出来对照排查一遍。
返回列表