一些技术类教程转载
~x~
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4
https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization
https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts
这个系列的文章也挺不错的
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4
你是否曾好奇,为什么像 Flow Matching 这样的生成模型在采样时需要跑几十甚至上百步?明明训练时用的是“直线插值”,为何实际生成路径却弯弯曲曲?这不仅拖慢了速度,还增加了计算开销。
在这篇可视化入门文章中,Alec Helbling 用二维玩具实验揭示了问题的核心:独立耦合(independent coupling)导致轨迹交叉,而神经网络无法在同一时空点预测多个方向的速度,只能取平均——于是路径就“弯”了。
而解决方案出人意料地优雅:Rectified Flows(校正流)。它通过迭代地用模型自身生成的新样本对重新训练,逐步“拉直”轨迹。结果?采样只需几步 Euler 积分,就能获得高质量样本,大幅降低延迟与算力成本。
文中配有大量交互式动图与对比图(支持点击生成),即使没有深度学习背景也能直观理解。
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4
https://arxiv.org/abs/2602.04770
https://lambertae.github.io/projects/drifting/
https://www.qbitai.com/2026/02/376752.html
这篇论文 《Generative Modeling via Drifting》(通过漂移进行生成建模)由 邓明扬 等人(包括 何恺明 )发表。
在当前的生成模型领域,主要有两种主流范式:
- 扩散模型/流匹配(Diffusion/Flow-based Models): 它们效果非常好,但生成图像时通常需要迭代推理(例如 Euler 求解器),即需要多次网络评估(NFE, Neural Function Evaluation)才能得到一张高质量图像,这使得生成速度较慢。
- GANs(生成对抗网络)或 VAEs(变分自编码器): 它们可以实现单步生成(1-NFE),速度极快,但在生成超高质量、高复杂度的图像(如 ImageNet 256×256)时,往往难以达到扩散模型那样的稳定性和图像多样性。
问题: 如何在保持单步生成(1-NFE)高速度的同时,达到甚至超越扩散模型的高质量?
漂移模型 (Drifting Models):生成建模本身就可以看作是一个“演化”的过程。

论文定义了一个“漂移场” 。
- 想象生成样本 (来自当前的生成分布 )就像是在一个空间里移动的粒子。
- 数据样本 (来自真实数据分布 )是吸引子(attractors)。
- 生成样本 (来自当前生成分布 )是排斥子(repulsors)。
- 漂移场的物理意义: 告诉生成样本如何从当前位置“漂移”到更接近真实数据的位置。
与扩散模型将迭代过程放在推理阶段(生成时)不同,漂移模型将迭代演化过程放在了训练阶段。
- 训练即演化: 随着训练的进行(通过 SGD 优化),模型参数更新,生成分布 也在不断变化。
- 目标: 我们希望找到一个模型,使得当训练结束时,漂移场 趋近于零。这意味着生成分布 已经与真实数据分布 达到“平衡状态”(Equilibrium),即不再需要进一步漂移。
- 单步生成: 因为训练过程已经把“漂移”的方向和规则嵌入到了神经网络中,所以在推理(生成)时,只需要模型一次前向传播,就能直接映射出高质量的样本。
漂移场(Drifting Field)
在 Drifting Models 中,作者设计了一套物理规则,让生成出来的样本自己知道该往哪里挪。
想象一个场景:
有一群真蝴蝶(真实数据分布 )和一群假蝴蝶(生成分布 )。
- 每一只“假蝴蝶”都感受到两股力:
- 吸引力:附近的“真蝴蝶”把它往真分布的方向拉。
- 排斥力:附近的“假蝴蝶”把它往外推(防止大家都挤在一起,保证多样性)。
- 当这两种力达到平衡时,假蝴蝶的分布就和真蝴蝶一模一样了。
这是论文的核心公式。定义在位置 处的漂移场 :
拆解:
- :当前生成的样本(一个向量)。
- 和 :分别是真实数据分布和生成数据分布。
- :核函数(Kernel)。它的作用是“权重分配”。
- 如果 和 很远,权重就很小;如果很近,权重就很大。
- 这保证了:一个生成的“猫”只会被附近的“真猫”吸引,而不会被远处的“真卡车”吸引。
- :位移矢量。告诉样本 应该往 的方向挪多少(x->y)。
为什么这个公式有效?
它具有反对称性:。
当 (生成的和真的一样)时,。这就意味着系统达到了平衡态。
# compute_drift
dist = torch.cdist(gen, targets) # 计算所有点对之间的距离
# Mask self: 自己不能排斥自己,将对角线距离设为无穷大
dist[:, :G].fill_diagonal_(1e6)
# 计算核权重:距离越近,权重越大 (exp(-d/T))
kernel = (-dist / temp).exp()
# 代码逻辑简化版
# targets 包含了 [生成的样本 (neg), 真实的样本 (pos)]
# 归一化核函数 (类似 Softmax 的分母)
normalized_kernel = kernel / normalizer
# 计算正向力(吸引):来自 targets[G:] (即真实数据 pos)
pos_coeff = ...
pos_V = pos_coeff @ targets[G:]
# 计算负向力(排斥):来自 targets[:G] (即生成数据 gen)
neg_coeff = ...
neg_V = neg_coeff @ targets[:G]
# 最终漂移向量 = 吸引 - 排斥
return pos_V - neg_V

训练:梯度下降
在扩散模型中,我们训练神经网络去预测速度场;在 Drifting Models 中,我们训练神经网络 去直接生成图像,而优化的目标就是让漂移场消失。
训练步骤(每一轮迭代):
- 采样:从数据集中取一批真图 ,用生成器造一批假图 。
- 计算力场:对每一张假图 ,根据上面的公式计算它受到的总力 。
- 更新生成器:
- 我们的目标是让假图 顺着 的方向移动。
- 在代码实现中,损失函数(Loss)通常可以简化为让生成的 靠近 (其中 是步长)。
- 关键点:随着训练进行, 不断变化, 也在不断更新。这就像是一个动态的脚手架,随着楼越盖越高,脚手架也在往上搭。
def drifting_loss(gen: torch.Tensor, pos: torch.Tensor, compute_drift):
"""
gen: 生成的假样本 (batch_size, dim)
pos: 真实的真样本 (batch_size, dim)
"""
with torch.no_grad():
# 1. 计算漂移场 V,告诉 gen 应该往哪挪
V = compute_drift(gen, pos)
# 2. 设定目标 target = 当前位置 + 漂移量
# 注意:这里使用了 .detach() (stopgrad)
target = (gen + V).detach()
# 3. 损失函数:让生成器下次直接输出到 target 的位置
return F.mse_loss(gen, target)
Feature Space
如果直接在像素(Pixels) 级别算这个力场,效果会很差。为什么?
- 像素空间维度太高(256x256x3 = 19 万维)。
- 两张猫的图片即使语义相似,如果像素平移一个单位,它们在像素空间的距离也会变得非常远。
解决方案:
不直接对比像素,而是利用 MAE(Masked Autoencoder) 或类似的预训练模型,将图片转化为语义特征(Features)。
- 在特征空间计算漂移场 。
- 特征空间更能捕捉“这有一只猫”这样的高层信息,让吸引力和排斥力变得更有意义。
- 这就解决了 GAN 容易出现的“模式崩溃(Mode Collapse)”问题,因为特征空间提供了全局的分布约束。
我虽然行过死荫的幽谷,也不怕遭害,因为你与我同在。
诗篇 23:4