比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
发布时间:2025-08-06 00:25:06

  智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月

  扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。

  扩散模型(Diffusion Models)和流匹配(Flow Matching)是用于生成高质量、连贯性强的高分辨率数据(如图像和机器人轨迹)的先进技术。在图像生成领域,扩散模型的代表性应用是Stable Diffusion,该技术已成功迁移至机器人学领域,形成了所谓的扩散策略(Diffusion Policy)。值得注意的是,扩散实际上是流匹配的特例,流匹配作为一种更具普适性的方法,已被Physical Intelligence团队应用于机器人轨迹生成,并在图像生成方面展现出同等的潜力。相较于扩散模型,流匹配通常能够以更少的训练资源更快地生成数据。本文将通过直观的解释和基础代码实现,深入剖析流匹配在图像生成中的应用,并提供一个简单的一维模型训练实例。

  流匹配和扩散方法的核心理念是将数据(如图像)视为随机变量的实现。例如,下图中的8×8像素图像中每个像素都具有(0..255)范围内的RGB值。通过向其添加服从高斯分布的随机值,我们可以将其转化为随机图像。这里,我们用函数q()表示添加噪声的过程。通过追踪中间状态的图像,我们能够学习逆函数pθ(),其中θ对应神经网络的参数。该神经网络预测需要移除的噪声量,以将噪声转换回原始图像。这基本概括了扩散方法的工作原理。

  扩散方法(上)通过预测添加到原始图像x0的高斯噪声来生成图像。流匹配(下)则将每个像素明确表示为通过速度场v()变换的高斯分布。扩散训练卷积神经网络以预测需要移除的噪声,而流匹配则学习时间依赖的速度场,将正态分布转换为表征图像的分布。

  但是这里还存在一种更整体的视角来审视此问题。由于每个像素本质上是遵循高斯分布的随机变量,随机图像(右上)实际上就是一个均值为128且方差相对较大的高斯分布(右下),而包含有意义内容的图像(左上)则是均值等于实际像素值且方差相对较小的高斯分布(左下)。

  虽然此处展示了64个独立分布,但也可将其视为一个64维的高斯分布。我们可以构想一个速度场vθ(),使随机粒子从x0分布移动到xT上的对应位置,而非通过添加噪声从左向右移动,并在从右向左移动时预测噪声。在整个分布范围内对随机粒子执行此操作,相当于将所有64个均值为0(方差为1)的正态分布x0转换为64个均值对应像素值的分布xT。这些概念在代码实现中将变得更加清晰。

  让我们仅考虑图像中的单个像素,其值为2(为简化起见,我们假设分布以0为中心,而非255除以2)。我们可以从实际图像中采样1000次,获得下图所示的以x=2为中心的绿色概率密度分布。出于演示目的,我们选择了一个不太小的标准差。具有如此大方差的图像实现将类似于上述插图中的中间图像。我们还可以生成1000个像素值围绕0分布且方差为1的完全随机图像,这将产生橙色直方图。

  N(0,1)分布的样本及其在N(2,0.5)分布上的对应位置。速度场(箭头)将每个样本从源分布移动到目标分布上的对应位置,从而将N(0,1)转换为N(2,0.5)。

  我们现在可以构想一个速度场v(x,t),该速度场将每个样本从一个分布移动到目标分布上的对应位置。这种速度依赖于x位置,在此例中表现为向右移动点。假设移动耗时为单位时间(例如一秒),速度也随时间变化。学习此速度场是流匹配的核心内容。如果对每个像素执行此操作,每个像素都有其特定的目标分布,则可以从噪声中生成图像。已知v(x,t)后,我们可以表述:

  即速度场决定了分布x随时间的变化率(dx/dt)。我们可以通过对时间积分v(x,t)来计算最终分布:

  您可能会疑惑,在不了解源分布与目标分布样本间对应关系的情况下,如何学习v(x,t)。

  实际上,只需从两个分布中随机选择配对样本x0 ~ p0和x1 ~ p1,并用直线连接它们即可。使用足够多的样本后,平均速度场将自然呈现。如下图所示,在时间t=0时,样本主要分布在-2和2之间,而在t=1时,样本围绕2集中,并表现出更高的密度(因为N(2,0.5)的方差小于原始方差)。

  N(0,1)和N(2,0.5)的随机配对。通过足够多的样本,可以清晰地展现如何平均移动样本以将一个分布转换为另一个分布。

  我们还可以观察速度场随时间的变化。下图展示了速度作为x的函数。初始阶段(t=0,亮色),左侧区域的速度较高——将样本向右移动。在流动后期(较大t值,暗色),当粒子接近目标位置时,运动减缓。同时需注意,初始阶段在x2处的速度为负值,将那里的粒子向左移动。

  为了学习速度场,我们需要两组粒子样本:一组从源分布采样,另一组从目标分布采样:

  这将生成前文展示的直方图。那么速度场应该具有怎样的形式呢?让我们看看上述积分在Python中的实现方式:

  这里,time_steps是一个从0到1以dt为增量的数组。例如,当dt=1ms时,我们将计算1000步。向量x包含从源分布(在我们的例子中为N(0,1))中抽取的n_samples个随机值。在每个时间步,我们将速度场v添加到x,目标是使生成的x分布近似于从目标分布N(2,0.5)中抽样得到的分布。速度场由一个神经网络模型表示,该模型以当前分布和时间步为输入。需要注意的是,这实际上是求解常微分方程(ODE),上述实现是其中最简单的方法之一,即欧拉方法。在此提及这一点是因为还存在许多更高效的求解方法。

  该模型由输入层(接收(x,t)对并投影到hidden_dim=128维潜在空间)、两个隐藏层以及输出x的输出层组成。我们添加了层归一化和ReLU(修正线性单元)激活函数。注意,输出层后没有ReLU激活,因为x值可以为负。网络还包含残差连接,这有助于梯度更有效地传播,并提高训练稳定性。

  现在我们可以利用训练好的模型将标准正态分布N(0,1)的任意样本转换为目标分布:

  这个案例比较简单,并且我们略施技巧,恰好在适当时机停止训练。如果继续训练,损失值会降至0.25并停滞不前。此时生成的分布会越来越窄,最终在x=2处形成单一峰值。这是由于我们简化的损失函数(计算随机配对间的均方误差)导致的。虽然当目标方差较低时(例如生成真实图像或轨迹时)这种方法有效,但我们可以通过更直接地比较两个分布来改进模型。

  使用Kullback-Leibler散度轻松比较参数化分布,但在这里我们面临的挑战是仅基于样本比较两个分布。给定两个概率分布P和Q,MMD定义为:

  其中x和x是来自分布P的样本,y和y是来自分布Q的样本,k(x,y)是核函数,例如高斯核,用于测量x和y之间的相似度:

  其中分布P包含m个样本,分布Q包含n个样本。当两个分布相同时,第三项抵消前两项,MMD值为0。

  该方法实际上适用于任意概率分布,例如高斯混合模型。只需将target_samples替换为其他分布类型:

  流匹配不需要像扩散方法中常用的复杂神经网络结构(如U-Net)就能从噪声中生成多模态/多维概率分布。与扩散类似,流匹配可以基于文本或图像嵌入进行条件约束,以生成特定类型的分布,且通常需要更少的数据和训练资源。

  本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。

  Flow Matching生成模型:从理论基础到Pytorch代码实现

  本文将系统阐述Flow Matching的完整实现过程,包括数学理论推导、模型架构设计、训练流程构建以及速度场学习等关键组件。通过本文的学习,读者将掌握Flow Matching的核心原理,获得一个完整的PyTorch实现,并对生成模型在噪声调度和分数函数之外的发展方向有更深入的理解。

  提升模型泛化能力:PyTorch的L1、L2、ElasticNet正则化技术深度解析与代码实现

  本文将深入探讨L1、L2和ElasticNet正则化技术,重点关注其在PyTorch框架中的具体实现。关于这些技术的理论基础,建议读者参考相关理论文献以获得更深入的理解。

  基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络

  本文详细讲解了如何在昇腾平台上使用PyTorch训练推荐系统中的经典模型DIN(Deep Interest Network)。主要内容包括:DIN网络的创新点与架构剖析、Activation Unit和Attention模块的实现、Amazon-book数据集的介绍与预处理、模型训练过程定义及性能评估。通过实战演示,利用Amazon-book数据集训练DIN模型,最终评估其点击率预测性能。文中还提供了代码示例,帮助读者更好地理解每个步骤的实现细节。

  PyTorch 2.0推出的pile`功能为深度学习模型带来了显著的性能优化能力。本文从实用角度出发,详细介绍了`torch.compile`的核心技巧与应用场景,涵盖模型复杂度评估、可编译组件分析、系统化调试策略及性能优化高级技巧等内容。通过解决图断裂、重编译频繁等问题,并结合分布式训练和NCCL通信优化,开发者可以有效提升日常开发效率与模型性能。文章为PyTorch用户提供了全面的指导,助力充分挖掘`torch.compile`的潜力。

  近期发布的LLaMA 4模型引入混合专家(MoE)架构,以提升效率与性能。尽管社区对其实际表现存在讨论,但MoE作为重要设计范式再次受到关注。本文通过Pytorch从零实现简化版LLaMA 4 MoE模型,涵盖数据准备、分词、模型构建(含词元嵌入、RoPE、RMSNorm、多头注意力及MoE层)到训练与文本生成全流程。关键点包括MoE层实现(路由器、专家与共享专家)、RoPE处理位置信息及RMSNorm归一化。虽规模小于实际LLaMA 4,但清晰展示MoE核心机制:动态路由与稀疏激活专家,在控制计算成本的同时提升性能。完整代码见链接,基于FareedKhan-dev的Github代码修改而成。

  9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体

  生成对抗网络(GAN)的训练效果高度依赖于损失函数的选择。本文介绍了经典GAN损失函数理论,并用PyTorch实现多种变体,包括原始GAN、LS-GAN、WGAN及WGAN-GP等。通过分析其原理与优劣,如LS-GAN提升训练稳定性、WGAN-GP改善图像质量,展示了不同场景下损失函数的设计思路。代码实现覆盖生成器与判别器的核心逻辑,为实际应用提供了重要参考。未来可探索组合优化与自适应设计以提升性能。

  从零实现基于扩散模型的文本到视频生成系统:技术详解与Pytorch代码实现

  本文介绍了一种基于扩散模型的文本到视频生成系统,详细展示了模型架构、训练流程及生成效果。通过3D U-Net结构和多头注意力机制,模型能够根据文本提示生成高质量视频。

  Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)

  本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。

  【8月更文第29天】在深度学习领域中,PyTorch 是一个非常流行的框架,被广泛应用于各种机器学习任务中。然而,随着模型复杂度的增加以及数据集规模的增长,如何有效地训练这些模型成为了一个重要的问题。本文将介绍一系列优化技巧和策略,帮助提高 PyTorch 模型训练的效率。

  Java 大视界 --Java 大数据在智慧交通公交车辆调度与乘客需求匹配中的应用创新(206)

  Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对抗训练与鲁棒性提升(205)

  使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%

  【跨国数仓迁移最佳实践2】MaxCompute SQL执行引擎对复杂类型处理全面重构,保障客户从BigQuery平滑迁移

  【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型

  WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究

  WebAssembly 与 Java 结合实操指南 基于最新工具链的跨语言开发实践教程