From 413f241843d1953d0f56782fddeae7301c82c4b2 Mon Sep 17 00:00:00 2001
From: Felix Fu <841808303@qq.com>
Date: Fri, 22 Aug 2025 11:28:10 -0700
Subject: [PATCH 1/9] update bib and blog post
---
_posts/2025-08-18-diff-distill.md | 289 +++++++++++++++++-
_posts/2025-08-21-cvpr25.md | 8 +-
.../bibliography/2025-08-18-diff-distill.bib | 63 ++--
3 files changed, 294 insertions(+), 66 deletions(-)
diff --git a/_posts/2025-08-18-diff-distill.md b/_posts/2025-08-18-diff-distill.md
index e2955ee..0a2b585 100644
--- a/_posts/2025-08-18-diff-distill.md
+++ b/_posts/2025-08-18-diff-distill.md
@@ -2,9 +2,9 @@
layout: distill
title: A Unified Framework for Diffusion Distillation
description: In this blog post, we introduce a set of notations that can be well adapted to recent works on one-step or few-step diffusion models.
-tags: metrics video generative-models
+tags: generative-models diffusion flows
giscus_comments: true
-date: 2025-08-18
+date: 2025-08-21
featured: true
authors:
@@ -13,7 +13,7 @@ authors:
affiliations:
name: UBC
- name: Qi Yan
- url: "https://qiyan98.github.io
+ url: "https://qiyan98.github.io"
affiliations:
name: UBC
@@ -27,20 +27,20 @@ bibliography: 2025-08-18-diff-distill.bib
# jekyll-toc plugin (https://github.com/toshimaru/jekyll-toc).
toc:
- name: Introduction
- - name: Fréchet Video Motion Distance (FVMD)
+ - name: Notation at a Glance
+ - name: ODE Distillation methods
- subsections:
- - name: Video Key Points Tracking
- - name: Key Points Velocity and Acceleration Fields
- - name: Motion Feature
- - name: Visualizations
- - name: Fréchet Video Motion Distance
- - name: Experiments
+ - name: MeanFlow
+ - name: Consistency Models
+ - name: Flow Anchor Consistency Model
+ - name: Align Your Flow
+ - name: Connections
- subsections:
- - name: Sanity Check
- - name: Sensitivity Analysis
- - name: Quantitative Results
- - name: Human Study
- - name: Summary
+ - name: Shortcut Model
+ - name: ReFlow
+ - name: Inductive Moment Matching
+ - name: Distribution Matching Distillation
+ - name: Closing Thoughts
# Below is an example of injecting additional post-specific styles.
# If you use this post as a template, delete this _styles block.
@@ -59,4 +59,261 @@ toc:
# text-align: center;
# font-size: 16px;
# }
----
\ No newline at end of file
+---
+
+## Introduction
+
+Diffusion and flow-based models have taken over generative AI space, enabling unprecedented capabilities in videos, audios, and text generation. Nonetheless, there is a caveat - they are painfully **slow** during inference. Generating a single high-quality sample will require running through hundreds of denoising steps, which translate to high costs and long wait times.
+
+At its core, diffusion models (equivalently, flow matching models) operate by iteratively refining noisy data into high-quality outputs through a series of denoising steps. Similar to divide-and-conquer algorithms Common ones like Mergesort, locating the median and Fast Fourior Transform. , diffusion models first *divide* the difficult denoising task into subtasks and *conquer* one of these at a time during training. To obtain a sample, we make a sequence of recursive predictions which means we need to *conquer* the entire task end-to-end.
+
+This challenge has spurred research into acceleration strategies across multiple grandular levels, including hardware optimization (e.g., high-FLOPs GPUs), mixed-precision training, quantization (e.g., using bitsandbytes), and parameter-efficient fine-tuning (e.g., LoRA adapters). In this blog, we focus on an orthogonal approach, ODE distillation techniques, which minimize Number of Function Evaluations (NFEs) so that we can generate high-quality samples with as few denoising steps as possible.
+
+Distillation, in general, is a technique that transfers knowledge from a complex, high-performance model (the *teacher*) to a more efficient, customized model (the *student*). Recent distillation methods have achieved remarkable reductions in sampling steps, from hundreds to just a few and even **one** step, while preserving the sample quality. This advancement paves the way for real-time applications and deployment in resource-constrained environments.
+
+
+## Notation at a Glance
+
+Let's denote the data distribution and the noise distribution by $$\mathbf{x}_0\sim p_{\text{data}}, \mathbf{x}_1\sim p_{\text{noise}}$$ respectively, according to the original flow matching setup. The target is to reconstruct the marginal flow path with high precision as $$\mathbf{x}_t\sim p_t, t\in[0,1]$$, and we denote a conditional flow path by $$\mathbf{x}_t\sim p_t(\cdot \vert \mathbf{x}_0).$$In pratice, the most common one is the Gaussian conditional probability path. This is because it induces a Gaussian conditional vector field with analytical form. Checkout the detail in the table.
+
+Most of the conditional flow paths are designed as the linear interpolation between noise and data for simplicity, and we can express sampling from a marginal path
+$$\mathbf{x}_t = \alpha(t)\mathbf{x}_0 + \beta(t)\mathbf{x}_1$$ where $\alpha(t), \beta(t)$ are predefined schedules. For every datapoint $\mathbf{x}_0\in \mathbb{R}^d$, let $$v(\mathbf{x}_t, t\vert\mathbf{x}_0)=\mathbb{E}_{p_t(v_t | \mathbf{x}_0)}[v_t]$$ denote a conditional vector field so that the corresponding ODE yields the conditional probability path above,
+
+$$
+\require{physics}
+\dv{\mathbf{x}_t}{t}=v(\mathbf{x}_t, t\vert\mathbf{x}_0),\quad \mathbf{x}_0\sim p_{\text{data}}
+$$
+
+We provide some popular instances Note we ignore the diffusion models with SDE formulation like DDPM since we concentrate on ODE distillation in this blog. of these schedules in the table below.
+
+| Method | Probability Path $p_t$ | Vector Field $v(\mathbf{x}_t, t\vert\mathbf{x}_0)$ |
+|--------|---------------------------|------------------------------|
+| Gaussian |$\mathcal{N}(\alpha(t)\mathbf{x}_0,\beta^2(t)I_d)$ | $\left(\dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t\right) \mathbf{x}_0 + \frac{\dot{\beta}_t}{\beta_t}\mathbf{x}_1$|
+| FM | $\mathcal{N}(\mathbf{x}; t\mathbf{x}_1, (1-t+\sigma t)^2)$ | $\frac{\mathbf{x}_1 - (1-\sigma)\mathbf{x}_t}{1-\sigma+\sigma t}$ |
+| iCFM | $\mathcal{N}( t\mathbf{x}_1 + (1-t)\mathbf{x}_0, \sigma^2)$ | $\mathbf{x}_1 - \mathbf{x}_0$ |
+| OT-CFM | $q(z) = \pi(\mathbf{x}_0, \mathbf{x}_1)$ | $\mathbf{x}_1 - \mathbf{x}_0$ |
+| VP-SI | $\mathcal{N}( \cos(\pi t/2)\mathbf{x}_0 + \sin(\pi t/2)\mathbf{x}_1, \sigma^2)$ | $\frac{\pi}{2}(\cos(\pi t/2)\mathbf{x}_1 - \sin(\pi t/2)\mathbf{x}_0)$ |
+
+The simplest form of conditional flow path is $$\mathbf{x}_t = (1-t)\mathbf{x}_0 + t\mathbf{x}_1$$ with the corresponding default conditional velocity field OT target $v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbb{E}[\dot{\mathbf{x}}_t\vert \mathbf{x}_0]=\mathbf{x}_1- \mathbf{x}_0.$
+
+Borrowed from this [slide](https://rectifiedflow.github.io/assets/slides/icml_07_distillation.pdf) at this year ICML, the objective of ODE distillation have been categorized into three cases, forward loss, backward loss and tri-consistency loss.
+
+
+
+
+Training: minimizing the conditional FM loss is equivalent to minimize the marginal FM loss, so the optimization problem becomes
+
+$$
+\arg\min_\theta\mathbb{E}_{\mathbf{x}_0, \mathbf{x}_1, t}
+\left[ w(t) \left\| v_\theta(\mathbf{x}_t, t) - v(\mathbf{x}_t, t | \mathbf{x}_0) \right\|_2^2 \right]
+$$
+
+(explain w(t) !!!) Optimization problem
+
+Sampling: Solve $$\dfrac{d}{dt}\mathbf{x}_t=v_\theta(\mathbf{x}_t, t)$$ from the initial condition $$\mathbf{x}_1\sim p_{\text{noise}}$$ Use any ODE solver to take a couple of hundreds discrete steps. (iterative refinements)
+
+
+## ODE Distillation methods
+
+
+### MeanFlow
+
+>Default conditional flow path and default conditional velocity field OT target
+
+We define our **average velocity field** as
+$$
+u(\mathbf{x}_t, t, s) \triangleq \frac{1}{t - s} \int_s^t v(\mathbf{x}_\tau, \tau) d\tau
+$$
+
+Differentiate both sides w.r.t. $t$ and consider that $s$ is independent of $t$ we obtain
+
+$$
+\require{physics}
+v(\mathbf{x}_t, t)=u +(t-s)\dv{u}{t}
+$$
+
+where we compute the total derivative of $u$ w.r.t. $t$.
+Expand this we obtain
+
+$u_\text{tgt}=v - (t-s)(v\partial_{\mathbf{x}_t}u + \partial_t u)$
+
+**Training:**
+
+$$
+\mathbb{E}_{\mathbf{x}_0, \mathbf{x}_1, t, s}
+\left[ w(t) \left\| u_\theta(\mathbf{x}_t, t, s) - u_\text{tgt}(\mathbf{x}_t, t, s | \mathbf{x}_0) \right\|_2^2 \right]
+
+$$
+
+where $u_\text{tgt}=v - (t-s)(v\partial_{\mathbf{x}_t}u_{\theta^-} + \partial_t u_{\theta^-})$
+
+Total derivative of $u$ is derived via this expression: `dudt=jvp(u_theta, (xt, s, t), (v, 0, 1))`
+
+
+**Sampling:**
+
+$$
+\mathbf{x}_s = \mathbf{x}_t - (t-s)u_\theta(\mathbf{x}_t, t, s)
+$$
+
+
+### CM
+
+>Default conditional flow path and default conditional velocity field OT target
+
+CMs train a neural network $f_\theta(\mathbf{x}_t, t)$ to map noisy inputs $\mathbf{x}_t$ directly to their corresponding clean samples $\mathbf{x}_0$. Consequently, $f_\theta(\mathbf{x}_t, t)$ must satisfy the **Boundary conditions**$f_\theta(\mathbf{x}_0, 0) = \mathbf{x}_0$, which is typically enforced by parameterizing
+
+$$f_\theta(\mathbf{x}_t, t) = c_{\text{skip}}(t)\mathbf{x}_t + c_{\text{out}}(t)F_\theta(\mathbf{x}_t, t), c_{\text{skip}}(0) = 1, c_{\text{out}}(0) = 0.$$
+
+
+CMs are trained to have consistent outputs between adjacent timesteps. They can be trained from scratch or distilled from given diffusion or flow models.
+
+1. **Discretized CM**
+
+- **Training:**
+$$
+\mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) d\left(f_\theta(\mathbf{x}_t, t), f_{\theta^-}(\mathbf{x}_{t-\Delta t}, t - \Delta t)\right) \right],
+$$
+
+- **Sampling**:
+
+$$
+\hat{\mathbf{x}}_0 = f_\theta(\mathbf{x}_1, 1)
+$$
+where $\theta^-$ denotes $\text{stopgrad}(\theta)$, $w(t)$ is a weighting function, $\Delta t > 0$ is the distance between adjacent time steps, and $d(\cdot, \cdot)$ is a distance function.
+
+Common choices include
+$\ell_2$ loss $d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$,
+Pseudo-Huber loss $d(\mathbf{x}, \mathbf{y}) = \sqrt{||\mathbf{x} - \mathbf{y}||_2^2 + c^2} - c$
+LPIPS loss.
+
+
+Discrete-time CMs are sensitive to the choice of $\Delta t$, and require manually designed annealing schedules The noisy sample $\mathbf{x}_{t-\Delta t}$ at the preceding timestep $t - \Delta t$ is often obtained from $\mathbf{x}_t$ by numerically solving the PF-ODE, which can cause additional discretization errors.
+
+
+2. **Continuous CM**
+
+When using $d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$ and taking the limit $\Delta t \to 0$, Song et al. show that the gradient with respect to $\theta$ converges to
+- **Training:**
+$$
+\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) f_\theta^{\top}(\mathbf{x}_t, t) \frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t)}{\text{d}t} \right]
+$$ where
+
+$$
+\frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t)}{\text{d}t} = \nabla_{\mathbf{x}_t} f_{\theta^-}(\mathbf{x}_t, t) \frac{\text{d}\mathbf{x}_t}{\text{d}t} + \partial_t f_{\theta^-}(\mathbf{x}_t, t)
+$$
+is the tangent of $f_{\theta^-}$ at $(\mathbf{x}_t, t)$ along the trajectory of the PF-ODE $\frac{\text{d}\mathbf{x}_t}{\text{d}t}$
+
+- **Sampling:**
+
+Same as the Discretized Version.
+
+### FACM
+
+>Default conditional flow path and default conditional velocity field OT target
+> $f_\theta(\mathbf{x}_t, t) = \mathbf{x}_t + (1-t)F_\theta(\mathbf{x}_t, t)$
+
+This special case of consistency function holds only if $\mathbf{x}_0\sim p_{\text{noise}},\mathbf{x}_1\sim p_{\text{data}}$ which is opposite of what we have defined in the Problem Setup. To align with our definition, this consistency function that we choose should be
+
+
+$f_\theta(\mathbf{x}_t, t) = \mathbf{x}_t - tF_\theta(\mathbf{x}_t, t)$
+
+**Consistency property** requires the total derivative of the consistency function to be zero
+
+$$
+\dfrac{df_\theta(\mathbf{x}_t, t)}{dt} = 0
+$$
+Borrow from consistency function defined from **CM**, we derive that the neural network must satisfy
+
+$$F_\theta(\mathbf{x}_t, t) = v - t\frac{dF_\theta(\mathbf{x}_t, t)}{dt}.$$
+Notice this is equivalent to **MeanFlow** where $s=0$ . (!!! requires explanation) This means CM objective directly forces the network $F_\theta(\mathbf{x}_t, t)$ to learn the properties of an average velocity field, thus enabling the 1-step generation shortcut.
+
+
+**Training:**
+$c_{CM}=(t,1), c_{FM}=(t,t)$
+
+![[Screenshot 2025-08-14 at 15.18.09.png]]
+!!! **Rewrite** the algorithm FACM in our notation latex code
+
+**Sampling:**
+1-step CM is the same as CM
+
+Multi-step sampling (NFE ≥ 2) follows a standard iterative refinement process.
+Equally spaced time stamp $t_i=\frac{i-1}{N}, i\in[N]$
+
+!!! Change to our notation
+$$
+\hat{\mathbf{x}}_1 = \mathbf{x}_{t_i} + (1 - t_i) F_\theta(\mathbf{x}_{t_i}, c_\text{CM})
+$$
+And we can continue by computing the next sample $\mathbf{x}_{t_{i+1}} = t_{i+1}\hat{\mathbf{x}}_1 + (1 - t_{i+1})\mathbf{x}_0,$
+
+
+### AYF - Flow Maps
+
+Let's define what is a flow map. Flow maps generalize diffusion, flow-based and consistency models within a single unified framework by training a neural network $f_\theta(\mathbf{x}_t, t, s)$ to map noisy inputs $\mathbf{x}_t$ directly to any point $\mathbf{x}_s$ along the PF-ODE in a single step. Unlike consistency models, which only perform well for single- or two-step generation but degrade in multi-step sampling, flow maps remain effective at all step counts.
+
+Flow Maps are CMs when $s=0$
+
+**General BC**
+$f_\theta(\mathbf{x}_t, t, t) = \mathbf{x}_t$ for all $t$. So that we have
+
+$f_\theta(\mathbf{x}_t, t, s) = c_{\text{skip}}(t, s)\mathbf{x}_t + c_{\text{out}}(t, s)\mathbf{F}_\theta(\mathbf{x}_t, t, s)$ where $c_{\text{skip}}(t, t) = 1$ and $c_{\text{out}}(t, t) = 0$ for all $t$.
+
+In this work, we set $c_{\text{skip}}(t, s) = 1$ and $c_{\text{out}}(t, s) = (s - t)$
+
+Hence, we have $f_\theta(\mathbf{x}_t, t, s) = \mathbf{x}_t + (s-t)\mathbf{F}_\theta(\mathbf{x}_t, t, s)$
+
+**Training:**
+
+1. AYF-Eulerian Map Distillation
+Let $f_\theta(\mathbf{x}_t, t, s)$ be the flow map. Consider the loss function defined between two adjacent starting timesteps $t$ and $t' = t + \epsilon(s - t)$ for a small $\epsilon > 0$,}
+
+$$\mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\|f_\theta(\mathbf{x}_t, t, s) - f_{\theta^-}(\mathbf{x}_{t'}, t', s)\|_2^2\right],$$
+ where $\mathbf{x}_{t'}$ is obtained by applying a 1-step Euler solver to the PF-ODE from $t$ to $t'$. In the limit as $\epsilon \to 0$, the gradient of this objective with respect to $\theta$ converges to:
+ $$ \nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w'(t, s)\text{sign}(t - s) \cdot \mathbf{f}_\theta^\top(\mathbf{x}_t, t, s) \cdot \frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t, s)}{\text{d}t}\right],$$
+where $w'(t, s) = w(t, s) \times |t - s|$.
+
+
+2. AYF-Lagrangian Map Distillation
+Let $f_\theta(\mathbf{x}_t, t, s)$ be the flow map. Consider the loss function defined between two adjacent ending timesteps $s$ and $s' = s + \epsilon(t - s)$ for a small $\epsilon > 0$,}$$\mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\|f_\theta(\mathbf{x}_t, t, s) - ODE_{s' \to s}[f_{\theta^-}(\mathbf{x}_t, t, s')]\|_2^2\right],$$ where $ODE_{t \to s}(\mathbf{x})$ refers to running a 1-step Euler solver on the PF-ODE starting from $\mathbf{x}$ at timestep $t$ to timestep $s$. In the limit as $\epsilon \to 0$, the gradient of this objective with respect to $\theta$ converges to: $$\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w'(t, s)\text{sign}(s - t) \cdot \mathbf{f}_\theta^\top(\mathbf{x}_t, t, s) \cdot \left(\frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t, s)}{\text{d}s} - \mathbf{v}_\phi(f_{\theta^-}(\mathbf{x}_t, t, s), s)\right)\right],$$where $w'(t, s) = w(t, s) \times |t - s|$.
+
+
+**Connections:**
+1. In AYF-EMD: the standard flow matching loss appears if $s\to t$
+2. In AYF-EMD: this reduces to continuous CM when $s=0$
+3. The gradient of MeanFlow objective matches the AYF-EMD objective using an Euler parametrization up to a constant
+
+$$\mathcal{L}_{\text{MeanFlow}}(\theta) = \mathbb{E}_{\mathbf{x}_t, t, s}\left[\left\|\mathbf{F}_\theta(\mathbf{x}_t, t, s) - \left(\frac{\text{d}\mathbf{x}_t}{\text{d}t} - (t - s)\frac{\text{d}\mathbf{F}_{\theta^-}(\mathbf{x}_t, t, s)}{\text{d}t}\right)\right\|_2^2\right].$$
+4. AYF-EMD objective and EMD loss in Flow Maps (no SG, and let $\epsilon\to 0$)
+$$
+\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\left\|\partial_t f_\theta(\mathbf{x}_t, t, s) + \nabla_{\mathbf{x}} f_\theta(\mathbf{x}_t, t, s) \cdot \frac{\text{d}\mathbf{x}_t}{\text{d}t}\right\|_2^2\right] = \nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\left\|\frac{\text{d}f_\theta(\mathbf{x}_t, t, s)}{\text{d}t}\right\|_2^2\right].
+$$
+5. AYF-LMD objective and the LMD loss (let $\epsilon\to 0$)
+
+$$
+\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\left\|\partial_s f_\theta(\mathbf{x}_t, t, s) - \mathbf{v}_\phi(f_\theta(\mathbf{x}_t, t, s), s)\right\|_2^2\right]
+$$
+
+## Shortcut Models
+They propose an objective combining flow matching and a self-consistency loss
+$$
+\mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}_t, t, s}\left[\left\|\mathbf{F}_\theta(\mathbf{x}_t, t, t) - \frac{\text{d}\mathbf{x}_t}{\text{d}t}\right\|_2^2 + \left\|\mathbf{f}_\theta(\mathbf{x}_t, t, s) - \mathbf{f}_{\theta^-}\left(\mathbf{f}_{\theta^-}\left(\mathbf{x}_t, t, \frac{t + s}{2}\right), \frac{t + s}{2}, s\right)\right\|_2^2\right]
+$$
+
+## Inductive Moment Matching
+
+According to the notation defined in **AYF - Flow maps**, it uses an MMD loss to match distributions of $\mathbf{f}_\theta(\mathbf{x}_t, t, s)$ and $\mathbf{f}_{\theta^-}(\mathbf{x}_r,r,s)$ where $s< r< t$ .
+
+
+## Distribution Matching Distillation
+
+
+# Closing Thoughts
+We have done flow matching ODE distillation on human motion trajectory (put the reference here). Compared to more common approaches such as adversarial distillation derived from GANs or Maximum Mean Discrepancy as used in [IMM](#inductive-moment-matching), IMLE is a relatively niche method that aligns two distributions directly from their samples.
+
+
+
+Table incorporates the pros and cons in all dimensions for every methods
+### References
+
+ABC all the images that I scrape from the other papers
\ No newline at end of file
diff --git a/_posts/2025-08-21-cvpr25.md b/_posts/2025-08-21-cvpr25.md
index fe5bf88..6d23dfe 100644
--- a/_posts/2025-08-21-cvpr25.md
+++ b/_posts/2025-08-21-cvpr25.md
@@ -1,10 +1,10 @@
---
layout: distill
title: CVPR 2025 in a nutshell
-description: In this blog post, we introduce a set of notations that can be well adapted to recent works on one-step or few-step diffusion models.
-tags: metrics video generative-models
+description: In the blog post, we would love to share my mindset about this blog
+tags:
giscus_comments: true
-date: 2025-08-18
+date: 2025-08-21
featured: true
authors:
@@ -13,7 +13,7 @@ authors:
affiliations:
name: UBC
-bibliography: 2025-08-18-diff-distill.bib
+bibliography: 2025-08-21-cvpr25.bib
# Optionally, you can add a table of contents to your post.
# NOTES:
diff --git a/assets/bibliography/2025-08-18-diff-distill.bib b/assets/bibliography/2025-08-18-diff-distill.bib
index 1c4a32b..75c69a7 100644
--- a/assets/bibliography/2025-08-18-diff-distill.bib
+++ b/assets/bibliography/2025-08-18-diff-distill.bib
@@ -9,55 +9,26 @@ @misc{lipman_flow_2023
urldate = {2024-07-05},
date = {2023-02-08},
eprinttype = {arxiv},
- eprint = {2210.02747 [cs, stat]},
- keywords = {Computer Science - Machine Learning, Computer Science - Artificial Intelligence, Statistics - Machine Learning},
- file = {arXiv.org Snapshot:C\:\\Users\\robin\\Zotero\\storage\\Z965SN3B\\2210.html:text/html},
+ eprint = {2210.02747 [cs, stat]}
}
-@misc{chen_neural_2019,
- title = {Neural Ordinary Differential Equations},
- url = {http://arxiv.org/abs/1806.07366},
- doi = {10.48550/arXiv.1806.07366},
- abstract = {We introduce a new family of deep neural network models. Instead of specifying a discrete sequence of hidden layers, we parameterize the derivative of the hidden state using a neural network. The output of the network is computed using a black-box differential equation solver. These continuous-depth models have constant memory cost, adapt their evaluation strategy to each input, and can explicitly trade numerical precision for speed. We demonstrate these properties in continuous-depth residual networks and continuous-time latent variable models. We also construct continuous normalizing flows, a generative model that can train by maximum likelihood, without partitioning or ordering the data dimensions. For training, we show how to scalably backpropagate through any {ODE} solver, without access to its internal operations. This allows end-to-end training of {ODEs} within larger models.},
- number = {{arXiv}:1806.07366},
- publisher = {{arXiv}},
- author = {Chen, Ricky T. Q. and Rubanova, Yulia and Bettencourt, Jesse and Duvenaud, David},
- urldate = {2024-07-17},
- date = {2019-12-13},
- eprinttype = {arxiv},
- eprint = {1806.07366 [cs, stat]},
- keywords = {Computer Science - Machine Learning, Computer Science - Artificial Intelligence, Statistics - Machine Learning},
- file = {arXiv.org Snapshot:C\:\\Users\\robin\\Zotero\\storage\\CF8G6BFT\\1806.html:text/html},
+@article{albergo2023stochastic,
+ title={Stochastic interpolants: A unifying framework for flows and diffusions},
+ author={Albergo, Michael S and Boffi, Nicholas M and Vanden-Eijnden, Eric},
+ journal={arXiv preprint arXiv:2303.08797},
+ year={2023}
}
-@misc{grathwohl_ffjord_2018,
- title = {{FFJORD}: Free-form Continuous Dynamics for Scalable Reversible Generative Models},
- url = {http://arxiv.org/abs/1810.01367},
- doi = {10.48550/arXiv.1810.01367},
- shorttitle = {{FFJORD}},
- abstract = {A promising class of generative models maps points from a simple distribution to a complex distribution through an invertible neural network. Likelihood-based training of these models requires restricting their architectures to allow cheap computation of Jacobian determinants. Alternatively, the Jacobian trace can be used if the transformation is specified by an ordinary differential equation. In this paper, we use Hutchinson's trace estimator to give a scalable unbiased estimate of the log-density. The result is a continuous-time invertible generative model with unbiased density estimation and one-pass sampling, while allowing unrestricted neural network architectures. We demonstrate our approach on high-dimensional density estimation, image generation, and variational inference, achieving the state-of-the-art among exact likelihood methods with efficient sampling.},
- number = {{arXiv}:1810.01367},
- publisher = {{arXiv}},
- author = {Grathwohl, Will and Chen, Ricky T. Q. and Bettencourt, Jesse and Sutskever, Ilya and Duvenaud, David},
- urldate = {2024-07-17},
- date = {2018-10-22},
- eprinttype = {arxiv},
- eprint = {1810.01367 [cs, stat]},
- keywords = {Computer Science - Machine Learning, Statistics - Machine Learning, Computer Science - Computer Vision and Pattern Recognition},
- file = {arXiv.org Snapshot:C\:\\Users\\robin\\Zotero\\storage\\K6KNG2ZG\\1810.html:text/html},
+@article{tong2023improving,
+ title={Improving and generalizing flow-based generative models with minibatch optimal transport},
+ author={Tong, Alexander and Fatras, Kilian and Malkin, Nikolay and Huguet, Guillaume and Zhang, Yanlei and Rector-Brooks, Jarrid and Wolf, Guy and Bengio, Yoshua},
+ journal={arXiv preprint arXiv:2302.00482},
+ year={2023}
}
-@online{huang_how_nodate,
- title = {How I Understand Flow Matching - {YouTube}},
- url = {https://www.youtube.com/watch?v=DDq_pIfHqLs},
- author = {Huang, Jia-Bin},
- urldate = {2024-08-11},
-}
-
-@online{m_tomczak_flow_nodate,
- title = {Flow Matching: Matching flows instead of scores},
- url = {https://jmtomczak.github.io/blog/18/18_fm.html},
- author = {M. Tomczak, Jakub},
- urldate = {2024-08-11},
- file = {18_flow_matching:C\:\\Users\\robin\\Zotero\\storage\\KJABUQZF\\18_fm.html:text/html},
-}
+@article{liu2022flow,
+ title={Flow straight and fast: Learning to generate and transfer data with rectified flow},
+ author={Liu, Xingchao and Gong, Chengyue and Liu, Qiang},
+ journal={arXiv preprint arXiv:2209.03003},
+ year={2022}
+}
\ No newline at end of file
From d795c72a65734dffcac1479c5d1cc96023096f1b Mon Sep 17 00:00:00 2001
From: Felix Fu <841808303@qq.com>
Date: Mon, 25 Aug 2025 21:26:18 -0700
Subject: [PATCH 2/9] intermediate update, write up until Align Your Flow
---
_posts/2025-08-18-diff-distill.md | 239 +++++++++---------
.../bibliography/2025-08-18-diff-distill.bib | 90 +++++++
blog/2025/diff-distill/FACM_training.png | Bin 0 -> 225463 bytes
.../teaser_probpath_velocity_field.png | Bin 0 -> 184898 bytes
4 files changed, 204 insertions(+), 125 deletions(-)
create mode 100644 blog/2025/diff-distill/FACM_training.png
create mode 100644 blog/2025/diff-distill/teaser_probpath_velocity_field.png
diff --git a/_posts/2025-08-18-diff-distill.md b/_posts/2025-08-18-diff-distill.md
index 0a2b585..1a70759 100644
--- a/_posts/2025-08-18-diff-distill.md
+++ b/_posts/2025-08-18-diff-distill.md
@@ -1,7 +1,7 @@
---
layout: distill
title: A Unified Framework for Diffusion Distillation
-description: In this blog post, we introduce a set of notations that can be well adapted to recent works on one-step or few-step diffusion models.
+description: The explosive growth in one-step and few-step diffusion models has taken the field deep into the weeds of complex notations. In this blog, we cut through the confusion by proposing a coherent set of notations that reveal the connections among these methods.
tags: generative-models diffusion flows
giscus_comments: true
date: 2025-08-21
@@ -12,10 +12,6 @@ authors:
url: "https://felix-yuxiang.github.io/"
affiliations:
name: UBC
- - name: Qi Yan
- url: "https://qiyan98.github.io"
- affiliations:
- name: UBC
bibliography: 2025-08-18-diff-distill.bib
@@ -63,210 +59,204 @@ toc:
## Introduction
-Diffusion and flow-based models have taken over generative AI space, enabling unprecedented capabilities in videos, audios, and text generation. Nonetheless, there is a caveat - they are painfully **slow** during inference. Generating a single high-quality sample will require running through hundreds of denoising steps, which translate to high costs and long wait times.
+Diffusion and flow-based models have taken over generative AI space, enabling unprecedented capabilities in videos, audios, and text generation. Nonetheless, there is a caveat - they are painfully **slow** during inference. Generating a single high-quality sample will require running through hundreds of denoising steps, which translate to high costs and long wait times.
At its core, diffusion models (equivalently, flow matching models) operate by iteratively refining noisy data into high-quality outputs through a series of denoising steps. Similar to divide-and-conquer algorithms Common ones like Mergesort, locating the median and Fast Fourior Transform. , diffusion models first *divide* the difficult denoising task into subtasks and *conquer* one of these at a time during training. To obtain a sample, we make a sequence of recursive predictions which means we need to *conquer* the entire task end-to-end.
-This challenge has spurred research into acceleration strategies across multiple grandular levels, including hardware optimization (e.g., high-FLOPs GPUs), mixed-precision training, quantization (e.g., using bitsandbytes), and parameter-efficient fine-tuning (e.g., LoRA adapters). In this blog, we focus on an orthogonal approach, ODE distillation techniques, which minimize Number of Function Evaluations (NFEs) so that we can generate high-quality samples with as few denoising steps as possible.
+This challenge has spurred research into acceleration strategies across multiple grandular levels, including hardware optimization, mixed precision training, [quantization](https://github.com/bitsandbytes-foundation/bitsandbytes), and parameter-efficient fine-tuning. In this blog, we focus on an orthogonal approach, **ODE distillation**, which minimize Number of Function Evaluations (NFEs) so that we can generate high-quality samples with as few denoising steps as possible.
Distillation, in general, is a technique that transfers knowledge from a complex, high-performance model (the *teacher*) to a more efficient, customized model (the *student*). Recent distillation methods have achieved remarkable reductions in sampling steps, from hundreds to just a few and even **one** step, while preserving the sample quality. This advancement paves the way for real-time applications and deployment in resource-constrained environments.
## Notation at a Glance
+
+
+ {% include figure.liquid loading="eager" path="blog/2025/diff-distill/teaser_probpath_velocity_field.png" class="img-fluid rounded z-depth-1" %}
+
+
+
+From left to right:conditional and marginal probability paths, conditional and marginal velocity fields. The velocity field induces a flow that dictates its instanenous movement across all points in space.
+
-Let's denote the data distribution and the noise distribution by $$\mathbf{x}_0\sim p_{\text{data}}, \mathbf{x}_1\sim p_{\text{noise}}$$ respectively, according to the original flow matching setup. The target is to reconstruct the marginal flow path with high precision as $$\mathbf{x}_t\sim p_t, t\in[0,1]$$, and we denote a conditional flow path by $$\mathbf{x}_t\sim p_t(\cdot \vert \mathbf{x}_0).$$In pratice, the most common one is the Gaussian conditional probability path. This is because it induces a Gaussian conditional vector field with analytical form. Checkout the detail in the table.
-
-Most of the conditional flow paths are designed as the linear interpolation between noise and data for simplicity, and we can express sampling from a marginal path
-$$\mathbf{x}_t = \alpha(t)\mathbf{x}_0 + \beta(t)\mathbf{x}_1$$ where $\alpha(t), \beta(t)$ are predefined schedules. For every datapoint $\mathbf{x}_0\in \mathbb{R}^d$, let $$v(\mathbf{x}_t, t\vert\mathbf{x}_0)=\mathbb{E}_{p_t(v_t | \mathbf{x}_0)}[v_t]$$ denote a conditional vector field so that the corresponding ODE yields the conditional probability path above,
+The modern approachs of generative modelling consist of picking some samples from a base distribution $$\mathbf{x}_1\sim p_{\text{noise}}$$, typically an isotropic Gaussian, and learning a map such that $$\mathbf{x}_0\sim p_{\text{data}}$$. The connection between these two distributions can be expressed by establishing an initial value problem controlled by the **velocity field** $v(\mathbf{x}_t, t)$,
$$
\require{physics}
-\dv{\mathbf{x}_t}{t}=v(\mathbf{x}_t, t\vert\mathbf{x}_0),\quad \mathbf{x}_0\sim p_{\text{data}}
+\dv{\psi_t(\mathbf{x}_t)}{t}=v(\psi_t(\mathbf{x}_t), t),\quad\psi_0(\mathbf{x}_0)=\mathbf{x}_0,\quad \mathbf{x}_0\sim p_{\text{data}} \tag{1}
$$
-We provide some popular instances Note we ignore the diffusion models with SDE formulation like DDPM since we concentrate on ODE distillation in this blog. of these schedules in the table below.
+where the **flow** $\psi_t:\mathbb{R}^d\times[0,1]\to \mathbb{R}^d$ is a diffeomorphic map with $$\psi_t(\mathbf{x}_t)$$ defined as the solution to the above ODE. If the flow satisfies the push-forward equationThis is also known as the change of variable equation: $[\phi_t]_\# p_0(x) = p_0(\phi_t^{-1}(x)) \det \left[ \frac{\partial \phi_t^{-1}}{\partial x}(x) \right].$ $$p_t=[\psi_t]_\#p_0$$, we say a **probability path** $$(p_t)_{t\in[0,1]}$$ is generated from the vector field. The goal of flow matching is to find a velocity field $$v_\theta(\mathbf{x}_t, t)$$ so that it transforms $$\mathbf{x}_1\sim p_{\text{noise}}$$ to $$\mathbf{x}_0\sim p_{\text{data}}$$ when integrated. In order to receive supervision at each time step, one must predefine a condition probability path $$p_t(\cdot \vert \mathbf{x}_0)$$In pratice, the most common one is the Gaussian conditional probability path. This arises from a Gaussian conditional vector field, whose analytical form can be derived from the continuity equation. $$\frac{\partial p_t}{\partial t} + \nabla \cdot (p_t v) = 0$$ See the table for details. associated with its velocity field. For every datapoint $$\mathbf{x}_0\in \mathbb{R}^d$$, let $$v(\mathbf{x}_t, t\vert\mathbf{x}_0)=\mathbb{E}_{p_t(v_t \vert \mathbf{x}_0)}[v_t]$$ denote a conditional velocity field so that the corresponding ODE (1) yields the conditional flow.
+
+Most of the conditional probability paths are designed as the **differentiable** interpolation between noise and data for simplicity, and we can express sampling from a marginal path
+$$\mathbf{x}_t = \alpha(t)\mathbf{x}_0 + \beta(t)\mathbf{x}_1$$ where $$\alpha(t), \beta(t)$$ are predefined schedules. The stochastic interpolant paper defines this probability path that summarizes all diffusion models, with several assumptions. Here, we use a simpler interpolant for clean illustration.
+
-| Method | Probability Path $p_t$ | Vector Field $v(\mathbf{x}_t, t\vert\mathbf{x}_0)$ |
+
+We provide some popular instances We ignore the diffusion models with SDE formulation like DDPM on purpose since we concentrate on ODE distillation in this blog. of these schedules in the table below.
+
+| Method | Probability Path $p_t$ | Vector Field $u(\mathbf{x}_t, t\vert\mathbf{x}_0)$ |
|--------|---------------------------|------------------------------|
-| Gaussian |$\mathcal{N}(\alpha(t)\mathbf{x}_0,\beta^2(t)I_d)$ | $\left(\dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t\right) \mathbf{x}_0 + \frac{\dot{\beta}_t}{\beta_t}\mathbf{x}_1$|
-| FM | $\mathcal{N}(\mathbf{x}; t\mathbf{x}_1, (1-t+\sigma t)^2)$ | $\frac{\mathbf{x}_1 - (1-\sigma)\mathbf{x}_t}{1-\sigma+\sigma t}$ |
-| iCFM | $\mathcal{N}( t\mathbf{x}_1 + (1-t)\mathbf{x}_0, \sigma^2)$ | $\mathbf{x}_1 - \mathbf{x}_0$ |
-| OT-CFM | $q(z) = \pi(\mathbf{x}_0, \mathbf{x}_1)$ | $\mathbf{x}_1 - \mathbf{x}_0$ |
-| VP-SI | $\mathcal{N}( \cos(\pi t/2)\mathbf{x}_0 + \sin(\pi t/2)\mathbf{x}_1, \sigma^2)$ | $\frac{\pi}{2}(\cos(\pi t/2)\mathbf{x}_1 - \sin(\pi t/2)\mathbf{x}_0)$ |
+| Gaussian |$$\mathcal{N}(\alpha(t)\mathbf{x}_0,\beta^2(t)I_d)$$ | $$\left(\dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t\right) \mathbf{x}_0 + \frac{\dot{\beta}_t}{\beta_t}\mathbf{x}_1$$|
+| FM | $$\mathcal{N}(t\mathbf{x}_1, (1-t+\sigma t)^2I_d)$$ | $$\frac{\mathbf{x}_1 - (1-\sigma)\mathbf{x}_t}{1-\sigma+\sigma t}$$ |
+| iCFM | $$\mathcal{N}( t\mathbf{x}_1 + (1-t)\mathbf{x}_0, \sigma^2I_d)$$ | $$\mathbf{x}_1 - \mathbf{x}_0$$ |
+| OT-CFM | Same prob. path above with $$q(z) = \pi(\mathbf{x}_0, \mathbf{x}_1)$$ | $$\mathbf{x}_1 - \mathbf{x}_0$$ |
+| VP-SI | $$\mathcal{N}( \cos(\pi t/2)\mathbf{x}_0 + \sin(\pi t/2)\mathbf{x}_1, \sigma^2I_d)$$ | $$\frac{\pi}{2}(\cos(\pi t/2)\mathbf{x}_1 - \sin(\pi t/2)\mathbf{x}_0)$$ |
-The simplest form of conditional flow path is $$\mathbf{x}_t = (1-t)\mathbf{x}_0 + t\mathbf{x}_1$$ with the corresponding default conditional velocity field OT target $v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbb{E}[\dot{\mathbf{x}}_t\vert \mathbf{x}_0]=\mathbf{x}_1- \mathbf{x}_0.$
+The simplest form of conditional probability path is $$\mathbf{x}_t = (1-t)\mathbf{x}_0 + t\mathbf{x}_1$$ with the corresponding default conditional velocity field OT target $$v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbb{E}[\dot{\mathbf{x}}_t\vert \mathbf{x}_0]=\mathbf{x}_1- \mathbf{x}_0.$$
-Borrowed from this [slide](https://rectifiedflow.github.io/assets/slides/icml_07_distillation.pdf) at this year ICML, the objective of ODE distillation have been categorized into three cases, forward loss, backward loss and tri-consistency loss.
+Borrowed from this [slide](https://rectifiedflow.github.io/assets/slides/icml_07_distillation.pdf) at ICML2025, the objective of ODE distillation have been categorized into three cases, i.e., (a) forward loss, (b) backward loss and (c) tri-consistency loss.
+!!! a video explaining these three losses
-Training: minimizing the conditional FM loss is equivalent to minimize the marginal FM loss, so the optimization problem becomes
+Training: Since minimizing the conditional Flow Matching (FM) loss is equivalent to minimize the marginal FM loss, the optimization problem becomes
$$
\arg\min_\theta\mathbb{E}_{\mathbf{x}_0, \mathbf{x}_1, t}
\left[ w(t) \left\| v_\theta(\mathbf{x}_t, t) - v(\mathbf{x}_t, t | \mathbf{x}_0) \right\|_2^2 \right]
$$
+where $w(t)$ is a reweighting function.
-(explain w(t) !!!) Optimization problem
-
-Sampling: Solve $$\dfrac{d}{dt}\mathbf{x}_t=v_\theta(\mathbf{x}_t, t)$$ from the initial condition $$\mathbf{x}_1\sim p_{\text{noise}}$$ Use any ODE solver to take a couple of hundreds discrete steps. (iterative refinements)
+Sampling: Solve $$\require{physics} \dv{\mathbf{x}_t}{t}=v_\theta(\mathbf{x}_t, t)$$ from the initial condition $$\mathbf{x}_1\sim p_{\text{noise}}.$$ Typically, an Euler solver or another high-order ODE solver is employed, taking a few hundred discrete steps through iterative refinements.
## ODE Distillation methods
+Before introducing ODE distillation methods, it is imperative to define a general flow map $$f_{t\to s}(\mathbf{x}_t, t, s)$$ where it maps any noisy input $$\mathbf{x}_t, t\in[0,1]$$ to any point $$\mathbf{x}_s, s\in[0,1]$$ on the ODE that describes the probability flow aformationed. This is a generalization of flow-based distillation and consistency models within a single unified framework. The flow map is well-defined only if its **boundary conditions** satisfy $$f_{t\to t}(\mathbf{x}_t, t, t) = \mathbf{x}_t$$ for all time steps. One popular way to meet the condition is to parameterize the model as $$ f_{t\to s}(\mathbf{x}_t, t, s)= c_{\text{skip}}(t, s)\mathbf{x}_t + c_{\text{out}}(t,s)F_{t\to s}(\mathbf{x}_t, t, s) $$ where $$c_{\text{skip}}(t, t) = 1$$ and $$c_{\text{out}}(t, t) = 0$$ for all $$t$$.
+At its core, ODE distillation boils down to how to strategically construct the training objective of the flow map $$f_{t\to s}(\mathbf{x}_t, t, s)$$ so that it can be efficiently evaluated during sampling. In addition, we need orchestrate the schedule of $$(t,s)$$ pairs for better training dynamics.
-### MeanFlow
-
->Default conditional flow path and default conditional velocity field OT target
+### MeanFlow
+MeanFlow can be trained from scratch or distilled from a pretrained FM model. The conditional probability path is defined as the linear interpolation between noise and data $$\mathbf{x}_t = (1-t)\mathbf{x}_0 + t\mathbf{x}_1$$ with the corresponding default conditional velocity field OT target $$v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbf{x}_1- \mathbf{x}_0.$$ The main contribution consists of identifying and defining a **average velocity field** which coincides with our flow map as
-We define our **average velocity field** as
$$
-u(\mathbf{x}_t, t, s) \triangleq \frac{1}{t - s} \int_s^t v(\mathbf{x}_\tau, \tau) d\tau
+F_{t\to s}(\mathbf{x}_t, t, s)=u(\mathbf{x}_t, t, s) \triangleq \frac{1}{t - s} \int_s^t v(\mathbf{x}_\tau, \tau) d\tau
$$
-Differentiate both sides w.r.t. $t$ and consider that $s$ is independent of $t$ we obtain
+where $$c_{\text{out}}(t,s)=t-s$$. This is great since it attributes actual physical meaning to our flow map.
+
+Differentiating both sides w.r.t. $t$ and consider the assumption that $s$ is independent of $t$, we obtain the MeanFlow identity
$$
\require{physics}
-v(\mathbf{x}_t, t)=u +(t-s)\dv{u}{t}
+v(\mathbf{x}_t, t)=F_{t\to s}(\mathbf{x}_t, t, s) +(t-s)\dv{F_{t\to s}(\mathbf{x}_t, t, s)}{t}
$$
-where we compute the total derivative of $u$ w.r.t. $t$.
-Expand this we obtain
-
-$u_\text{tgt}=v - (t-s)(v\partial_{\mathbf{x}_t}u + \partial_t u)$
+where we further compute the total derivative and derive the target $$F_{t\to s}^{\text{tgt}}(\mathbf{x}_t, t, s)$$.
-**Training:**
+Training: Adapting to our flow map notation, the training objective turns to
$$
\mathbb{E}_{\mathbf{x}_0, \mathbf{x}_1, t, s}
-\left[ w(t) \left\| u_\theta(\mathbf{x}_t, t, s) - u_\text{tgt}(\mathbf{x}_t, t, s | \mathbf{x}_0) \right\|_2^2 \right]
-
+\left[ w(t) \left\| F^\theta_{t\to s}(\mathbf{x}_t, t, s) - F_{t\to s}^{\text{tgt}}(\mathbf{x}_t, t, s | \mathbf{x}_0) \right\|_2^2 \right]
$$
-where $u_\text{tgt}=v - (t-s)(v\partial_{\mathbf{x}_t}u_{\theta^-} + \partial_t u_{\theta^-})$
-Total derivative of $u$ is derived via this expression: `dudt=jvp(u_theta, (xt, s, t), (v, 0, 1))`
+where $$F_{t\to s}^{\text{tgt}}(\mathbf{x}_t, t, s\vert\mathbf{x}_0)=v - (t-s)(v\partial_{\mathbf{x}_t}F^{\theta^-}_{t\to s}(\mathbf{x}_t, t, s) + \partial_t F^{\theta^-}_{t\to s}(\mathbf{x}_t, t, s))$$ and $$\theta^-$$ means `stopgrad()`. Note `stopgrad` aims to avoid high order gradient computation. There are a couple of choices for $$v$$, we can substitute it with $$F_{t\to t}(\mathbf{x}_t, t, t)$$ or $$v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbf{x}_1- \mathbf{x}_0.$$ Again, MeanFlow adopts the latter to reduce computation.
+
+Loss type
+Type (b) backward loss
+
+In practice, the total derivative of $$F_{t\to s}(\mathbf{x}_t, t, s)$$ and the evaluation can be done in a single function call: `f, dfdt=jvp(f_theta, (xt, s, t), (v, 0, 1))`. Despite `jvp` operation only introduces one extra backward pass, it still incurs expensive and unstable training. SpiltMeanFlow circumvents this issue by enforcing another consistency identity $$(t-s)F_{t\to s} = (t-r)F_{t\to r}+(r-s)F_{r\to s}$$ where $$sSampling:
+Either one-step or multi-step sampling can be performed. It is intuitive to obtain the following expression by the definition of average velocity field
$$
-\mathbf{x}_s = \mathbf{x}_t - (t-s)u_\theta(\mathbf{x}_t, t, s)
+\mathbf{x}_s = \mathbf{x}_t - (t-s)f^\theta_{t\to s}(\mathbf{x}_t, t, s).
$$
+In particular, we achieve one-step inference by setting $t=1, s=0$ and sampling from $$\mathbf{x}_1\sim p_{\text{noise}}$$.
-### CM
-
->Default conditional flow path and default conditional velocity field OT target
-CMs train a neural network $f_\theta(\mathbf{x}_t, t)$ to map noisy inputs $\mathbf{x}_t$ directly to their corresponding clean samples $\mathbf{x}_0$. Consequently, $f_\theta(\mathbf{x}_t, t)$ must satisfy the **Boundary conditions**$f_\theta(\mathbf{x}_0, 0) = \mathbf{x}_0$, which is typically enforced by parameterizing
+### Consistency Models
-$$f_\theta(\mathbf{x}_t, t) = c_{\text{skip}}(t)\mathbf{x}_t + c_{\text{out}}(t)F_\theta(\mathbf{x}_t, t), c_{\text{skip}}(0) = 1, c_{\text{out}}(0) = 0.$$
+Essentially, consistency models (CMs) are our flow map when $$s=0$$, i.e., $$f_{t\to 0}(\mathbf{x}_t, t, 0).$$
+**Discretized CM**
-CMs are trained to have consistent outputs between adjacent timesteps. They can be trained from scratch or distilled from given diffusion or flow models.
-
-1. **Discretized CM**
-
-- **Training:**
-$$
-\mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) d\left(f_\theta(\mathbf{x}_t, t), f_{\theta^-}(\mathbf{x}_{t-\Delta t}, t - \Delta t)\right) \right],
-$$
-
-- **Sampling**:
+CMs are trained to have consistent outputs between adjacent timesteps along the ODE trajectory. They can be trained from scratch by consistency training or distilled from given diffusion or flow models via consistency distillation like MeanFlow.
+- Training: When expressed in our flow map notation, the objective becomes
+
$$
-\hat{\mathbf{x}}_0 = f_\theta(\mathbf{x}_1, 1)
+\mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) d\left(f_{t \to 0}^\theta(\mathbf{x}_t, t,0), f_{t \to 0}^{\theta^-}(\mathbf{x}_{t-\Delta t}, t - \Delta t,0)\right) \right],
$$
-where $\theta^-$ denotes $\text{stopgrad}(\theta)$, $w(t)$ is a weighting function, $\Delta t > 0$ is the distance between adjacent time steps, and $d(\cdot, \cdot)$ is a distance function.
-
-Common choices include
-$\ell_2$ loss $d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$,
-Pseudo-Huber loss $d(\mathbf{x}, \mathbf{y}) = \sqrt{||\mathbf{x} - \mathbf{y}||_2^2 + c^2} - c$
-LPIPS loss.
-
-Discrete-time CMs are sensitive to the choice of $\Delta t$, and require manually designed annealing schedules The noisy sample $\mathbf{x}_{t-\Delta t}$ at the preceding timestep $t - \Delta t$ is often obtained from $\mathbf{x}_t$ by numerically solving the PF-ODE, which can cause additional discretization errors.
+where $$\theta^-$$ denotes $$\text{stopgrad}(\theta)$$, $$w(t)$$ is a weighting function, $$\Delta t > 0$$ is the distance between adjacent time steps, and $d(\cdot, \cdot)$ is a distance metric.Common choices include $\ell_2$ loss $d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$, pseudo-Huber loss $d(\mathbf{x}, \mathbf{y}) = \sqrt{||\mathbf{x} - \mathbf{y}||_2^2 + c^2} - c$ and LPIPS loss.
+- Sampling:
+It is natural to conduct one-step sampling with CM
-2. **Continuous CM**
-
-When using $d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$ and taking the limit $\Delta t \to 0$, Song et al. show that the gradient with respect to $\theta$ converges to
-- **Training:**
$$
-\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) f_\theta^{\top}(\mathbf{x}_t, t) \frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t)}{\text{d}t} \right]
-$$ where
-
+\hat{\mathbf{x}}_0 = f^{\theta}_{1\to 0}(\mathbf{x}_1, 1,0),
$$
-\frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t)}{\text{d}t} = \nabla_{\mathbf{x}_t} f_{\theta^-}(\mathbf{x}_t, t) \frac{\text{d}\mathbf{x}_t}{\text{d}t} + \partial_t f_{\theta^-}(\mathbf{x}_t, t)
-$$
-is the tangent of $f_{\theta^-}$ at $(\mathbf{x}_t, t)$ along the trajectory of the PF-ODE $\frac{\text{d}\mathbf{x}_t}{\text{d}t}$
-
-- **Sampling:**
-
-Same as the Discretized Version.
-
-### FACM
->Default conditional flow path and default conditional velocity field OT target
-> $f_\theta(\mathbf{x}_t, t) = \mathbf{x}_t + (1-t)F_\theta(\mathbf{x}_t, t)$
+while multi-step sampling is also possible since we can compute the next noisy output $$\mathbf{x}_{t-\Delta t}\sim p_{t-\Delta t}(\cdot\vert \mathbf{x}_0)$$ using the prescribed conditional probability path at our discretion. Discrete-time CMs depend heavily on the choice of $$\Delta t$$ and often require carefully designed annealing schedules. To obtain the noisy sample $$\mathbf{x}_{t-\Delta t}$$ at the previous step, one typically evolves backward $$\mathbf{x}_t$$ by numerically solving the ODE, which can introduce additional discretization errors.
-This special case of consistency function holds only if $\mathbf{x}_0\sim p_{\text{noise}},\mathbf{x}_1\sim p_{\text{data}}$ which is opposite of what we have defined in the Problem Setup. To align with our definition, this consistency function that we choose should be
+**Continuous CM**
-
-$f_\theta(\mathbf{x}_t, t) = \mathbf{x}_t - tF_\theta(\mathbf{x}_t, t)$
-
-**Consistency property** requires the total derivative of the consistency function to be zero
+When using $$d(\mathbf{x}, \mathbf{y}) = ||\mathbf{x} - \mathbf{y}||_2^2$$ and taking the limit $\Delta t \to 0$, Song et al. show that the gradient with respect to $\theta$ converges to a new objective with no $$\Delta t$$ involved.
+- Training: In our notation, the objective is
$$
-\dfrac{df_\theta(\mathbf{x}_t, t)}{dt} = 0
-$$
-Borrow from consistency function defined from **CM**, we derive that the neural network must satisfy
+\require{physics}
+\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t} \left[ w(t) (f^\theta)^{\top}_{t\to 0}(\mathbf{x}_t, t,0) \dv{f^{\theta^-}_{t\to 0}(\mathbf{x}_t, t,0)}{t} \right]
+$$
-$$F_\theta(\mathbf{x}_t, t) = v - t\frac{dF_\theta(\mathbf{x}_t, t)}{dt}.$$
-Notice this is equivalent to **MeanFlow** where $s=0$ . (!!! requires explanation) This means CM objective directly forces the network $F_\theta(\mathbf{x}_t, t)$ to learn the properties of an average velocity field, thus enabling the 1-step generation shortcut.
+where $$ \require{physics} \dv{f^{\theta^-}_{t\to 0}(\mathbf{x}_t, t,0)}{t} = \nabla_{\mathbf{x}_t} f^{\theta^-}_{t\to 0}(\mathbf{x}_t, t,0) \dv{\mathbf{x}_t}{t} + \partial_t f^{\theta^-}_{t\to 0}(\mathbf{x}_t, t,0)$$ is the tangent of $f^{\theta^-}_{t\to 0}$ at $(\mathbf{x}_t, t)$ along the trajectory of the ODE defined (1). Consistency Trajectory Models extend this objective so that the forward loss (type (a)) becomes globally optimized. In this context, their intuition is that $$f^\theta_{t \to s}(\mathbf{x}_t, t, s)\approx f^\theta_{r \to s}(\texttt{Solver}_{t\to r}(\mathbf{x}_t, t, r), r, s).$$ The composition order on the right-hand side depends on the assumption of the solver of the teacher model.
+- Sampling
-**Training:**
-$c_{CM}=(t,1), c_{FM}=(t,t)$
+Same as the Discretized Version. CTMs introduce a new sampling method called $$\gamma$$-sampling which controls the noise level of diffusing the intermediate noisy sample according to the conditional probability path during multi-step sampling.
-![[Screenshot 2025-08-14 at 15.18.09.png]]
-!!! **Rewrite** the algorithm FACM in our notation latex code
+
+Loss type
+Type (b) backward loss, while CTMs optimize type (a) forward loss, both locally and globally.
+
-**Sampling:**
-1-step CM is the same as CM
+### Flow Anchor Consistency Model
-Multi-step sampling (NFE ≥ 2) follows a standard iterative refinement process.
-Equally spaced time stamp $t_i=\frac{i-1}{N}, i\in[N]$
+Similar to MeanFlow preliminary, Flow Anchor Consistency Model (FACM) also adopts the linear conditional probability path $$\mathbf{x}_t = (1-t)\mathbf{x}_0 + t\mathbf{x}_1$$ with the corresponding default conditional velocity field OT target $$v(\mathbf{x}_t, t \vert \mathbf{x}_0)=\mathbf{x}_1- \mathbf{x}_0.$$ In our flow maps notation, FACM parameterizes the model as $$ f^\theta_{t\to s}(\mathbf{x}_t, t, 0)= \mathbf{x}_t - tF^\theta_{t\to s}(\mathbf{x}_t, t, 0) $$ where $$c_{\text{skip}}(t,s)=1$$ and $$c_{\text{out}}(t,s)=-t$$.
-!!! Change to our notation
+FACM imposes a **consistency property** which requires the total derivative of the consistency function to be zero
$$
-\hat{\mathbf{x}}_1 = \mathbf{x}_{t_i} + (1 - t_i) F_\theta(\mathbf{x}_{t_i}, c_\text{CM})
+\require{physics}
+\dv{t}f^\theta_{t \to 0}(\mathbf{x}, t, 0) = 0.
$$
-And we can continue by computing the next sample $\mathbf{x}_{t_{i+1}} = t_{i+1}\hat{\mathbf{x}}_1 + (1 - t_{i+1})\mathbf{x}_0,$
+By substituting the parameterization of FACM, we have
-### AYF - Flow Maps
+$$\require{physics}
+F^\theta_{t\to 0}(\mathbf{x}_t, t, 0)=v(\mathbf{x}_t, t)-t\dv{F^\theta_{t\to 0}(\mathbf{x}_t, t, 0)}{t}.
+$$
-Let's define what is a flow map. Flow maps generalize diffusion, flow-based and consistency models within a single unified framework by training a neural network $f_\theta(\mathbf{x}_t, t, s)$ to map noisy inputs $\mathbf{x}_t$ directly to any point $\mathbf{x}_s$ along the PF-ODE in a single step. Unlike consistency models, which only perform well for single- or two-step generation but degrade in multi-step sampling, flow maps remain effective at all step counts.
+Notice this is equivalent to [MeanFlow](#meanflow) where $$s=0$$. This indicates CM objective directly forces the network $F^\theta_{t\to 0}(\mathbf{x}_t, t, 0)$ to learn the properties of an average velocity field heading towards the data distribution, thus enabling the 1-step generation shortcut.
-Flow Maps are CMs when $s=0$
-**General BC**
-$f_\theta(\mathbf{x}_t, t, t) = \mathbf{x}_t$ for all $t$. So that we have
+Training: FACM training alogrithm equipped with our flow map notation. Notice that $$d_1, d_2$$ are $\ell_2$ with cosine loss and norm $\ell_2$ loss respectively, plus reweighting. Interestingly, they separate the training of FM and CM on disentangled time intervals. When training with CM target, we let $$s=0, t\in[0,1]$$. On the other hand, when training with FM target, we set $$t'=2-t, t'\in[1,2]$$.
+
+
+ {% include figure.liquid loading="eager" path="blog/2025/diff-distill/facm_training.png" class="img-fluid rounded z-depth-1" %}
+
+
-$f_\theta(\mathbf{x}_t, t, s) = c_{\text{skip}}(t, s)\mathbf{x}_t + c_{\text{out}}(t, s)\mathbf{F}_\theta(\mathbf{x}_t, t, s)$ where $c_{\text{skip}}(t, t) = 1$ and $c_{\text{out}}(t, t) = 0$ for all $t$.
+Sampling: Same as CM.
+
+Loss type
+Type (b) backward loss
+
-In this work, we set $c_{\text{skip}}(t, s) = 1$ and $c_{\text{out}}(t, s) = (s - t)$
-Hence, we have $f_\theta(\mathbf{x}_t, t, s) = \mathbf{x}_t + (s-t)\mathbf{F}_\theta(\mathbf{x}_t, t, s)$
+!!! starting from here
+### Align Your Flow
-**Training:**
+Our notation is a small modification of this paper, where we indicate the direction of the distillation.
+Training
1. AYF-Eulerian Map Distillation
-Let $f_\theta(\mathbf{x}_t, t, s)$ be the flow map. Consider the loss function defined between two adjacent starting timesteps $t$ and $t' = t + \epsilon(s - t)$ for a small $\epsilon > 0$,}
+Let $f_\theta(\mathbf{x}_t, t, s)$ be the flow map. Consider the loss function defined between two adjacent starting timesteps $t$ and $t' = t + \epsilon(s - t)$ for a small $\epsilon > 0$,
$$\mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\|f_\theta(\mathbf{x}_t, t, s) - f_{\theta^-}(\mathbf{x}_{t'}, t', s)\|_2^2\right],$$
where $\mathbf{x}_{t'}$ is obtained by applying a 1-step Euler solver to the PF-ODE from $t$ to $t'$. In the limit as $\epsilon \to 0$, the gradient of this objective with respect to $\theta$ converges to:
@@ -278,7 +268,7 @@ where $w'(t, s) = w(t, s) \times |t - s|$.
Let $f_\theta(\mathbf{x}_t, t, s)$ be the flow map. Consider the loss function defined between two adjacent ending timesteps $s$ and $s' = s + \epsilon(t - s)$ for a small $\epsilon > 0$,}$$\mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\|f_\theta(\mathbf{x}_t, t, s) - ODE_{s' \to s}[f_{\theta^-}(\mathbf{x}_t, t, s')]\|_2^2\right],$$ where $ODE_{t \to s}(\mathbf{x})$ refers to running a 1-step Euler solver on the PF-ODE starting from $\mathbf{x}$ at timestep $t$ to timestep $s$. In the limit as $\epsilon \to 0$, the gradient of this objective with respect to $\theta$ converges to: $$\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w'(t, s)\text{sign}(s - t) \cdot \mathbf{f}_\theta^\top(\mathbf{x}_t, t, s) \cdot \left(\frac{\text{d}f_{\theta^-}(\mathbf{x}_t, t, s)}{\text{d}s} - \mathbf{v}_\phi(f_{\theta^-}(\mathbf{x}_t, t, s), s)\right)\right],$$where $w'(t, s) = w(t, s) \times |t - s|$.
-**Connections:**
+**Remarks:**
1. In AYF-EMD: the standard flow matching loss appears if $s\to t$
2. In AYF-EMD: this reduces to continuous CM when $s=0$
3. The gradient of MeanFlow objective matches the AYF-EMD objective using an Euler parametrization up to a constant
@@ -294,26 +284,25 @@ $$
\nabla_\theta \mathbb{E}_{\mathbf{x}_t, t, s}\left[w(t, s)\left\|\partial_s f_\theta(\mathbf{x}_t, t, s) - \mathbf{v}_\phi(f_\theta(\mathbf{x}_t, t, s), s)\right\|_2^2\right]
$$
-## Shortcut Models
+## Connections
+
+### Shortcut Models
They propose an objective combining flow matching and a self-consistency loss
$$
\mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}_t, t, s}\left[\left\|\mathbf{F}_\theta(\mathbf{x}_t, t, t) - \frac{\text{d}\mathbf{x}_t}{\text{d}t}\right\|_2^2 + \left\|\mathbf{f}_\theta(\mathbf{x}_t, t, s) - \mathbf{f}_{\theta^-}\left(\mathbf{f}_{\theta^-}\left(\mathbf{x}_t, t, \frac{t + s}{2}\right), \frac{t + s}{2}, s\right)\right\|_2^2\right]
$$
-## Inductive Moment Matching
+### Inductive Moment Matching
According to the notation defined in **AYF - Flow maps**, it uses an MMD loss to match distributions of $\mathbf{f}_\theta(\mathbf{x}_t, t, s)$ and $\mathbf{f}_{\theta^-}(\mathbf{x}_r,r,s)$ where $s< r< t$ .
-## Distribution Matching Distillation
+### Distribution Matching Distillation
-# Closing Thoughts
-We have done flow matching ODE distillation on human motion trajectory (put the reference here). Compared to more common approaches such as adversarial distillation derived from GANs or Maximum Mean Discrepancy as used in [IMM](#inductive-moment-matching), IMLE is a relatively niche method that aligns two distributions directly from their samples.
+## Closing Thoughts
+We have done flow matching ODE distillation on human motion trajectory. Compared to more common approaches such as adversarial distillation derived from GANs or Maximum Mean Discrepancy as used in [IMM](#inductive-moment-matching), IMLE is a relatively niche method that aligns two distributions directly from their samples.
Table incorporates the pros and cons in all dimensions for every methods
-### References
-
-ABC all the images that I scrape from the other papers
\ No newline at end of file
diff --git a/assets/bibliography/2025-08-18-diff-distill.bib b/assets/bibliography/2025-08-18-diff-distill.bib
index 75c69a7..cd8b283 100644
--- a/assets/bibliography/2025-08-18-diff-distill.bib
+++ b/assets/bibliography/2025-08-18-diff-distill.bib
@@ -31,4 +31,94 @@ @article{liu2022flow
author={Liu, Xingchao and Gong, Chengyue and Liu, Qiang},
journal={arXiv preprint arXiv:2209.03003},
year={2022}
+}
+
+@article{hu2021lora,
+ title={Lora: Low-rank adaptation of large language models. arXiv 2021},
+ author={Hu, Edward J and Shen, Yelong and Wallis, Phillip and Allen-Zhu, Zeyuan and Li, Yuanzhi and Wang, Shean and Wang, Lu and Chen, Weizhu},
+ journal={arXiv preprint arXiv:2106.09685},
+ volume={10},
+ year={2021}
+}
+
+@article{micikevicius2017mixed,
+ title={Mixed precision training},
+ author={Micikevicius, Paulius and Narang, Sharan and Alben, Jonah and Diamos, Gregory and Elsen, Erich and Garcia, David and Ginsburg, Boris and Houston, Michael and Kuchaiev, Oleksii and Venkatesh, Ganesh and others},
+ journal={arXiv preprint arXiv:1710.03740},
+ year={2017}
+}
+
+@inproceedings{fu2025moflowonestep,
+ author = {Fu, Yuxiang and Yan, Qi and Wang, Lele and Li, Ke and Liao, Renjie},
+ title = {MoFlow: One-Step Flow Matching for Human Trajectory Forecasting via Implicit Maximum Likelihood Estimation based Distillation},
+ journal = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
+ year = {2025},
+}
+
+@misc{lipman2024flowmatchingguidecode,
+ title={Flow Matching Guide and Code},
+ author={Yaron Lipman and Marton Havasi and Peter Holderrieth and Neta Shaul and Matt Le and Brian Karrer and Ricky T. Q. Chen and David Lopez-Paz and Heli Ben-Hamu and Itai Gat},
+ year={2024},
+ eprint={2412.06264},
+ archivePrefix={arXiv},
+ primaryClass={cs.LG},
+ url={https://arxiv.org/abs/2412.06264},
+}
+
+@article{boffi2025build,
+ title={How to build a consistency model: Learning flow maps via self-distillation},
+ author={Boffi, Nicholas M and Albergo, Michael S and Vanden-Eijnden, Eric},
+ journal={arXiv preprint arXiv:2505.18825},
+ year={2025}
+}
+
+@article{geng2025mean,
+ title={Mean flows for one-step generative modeling},
+ author={Geng, Zhengyang and Deng, Mingyang and Bai, Xingjian and Kolter, J Zico and He, Kaiming},
+ journal={arXiv preprint arXiv:2505.13447},
+ year={2025}
+}
+
+@article{peng2025flow,
+ title={Flow-Anchored Consistency Models},
+ author={Peng, Yansong and Zhu, Kai and Liu, Yu and Wu, Pingyu and Li, Hebei and Sun, Xiaoyan and Wu, Feng},
+ journal={arXiv preprint arXiv:2507.03738},
+ year={2025}
+}
+
+@article{guo2025splitmeanflow,
+ title={SplitMeanFlow: Interval Splitting Consistency in Few-Step Generative Modeling},
+ author={Guo, Yi and Wang, Wei and Yuan, Zhihang and Cao, Rong and Chen, Kuan and Chen, Zhengyang and Huo, Yuanyuan and Zhang, Yang and Wang, Yuping and Liu, Shouda and others},
+ journal={arXiv preprint arXiv:2507.16884},
+ year={2025}
+}
+
+@article{ho2020denoising,
+ title={Denoising diffusion probabilistic models},
+ author={Ho, Jonathan and Jain, Ajay and Abbeel, Pieter},
+ journal={Advances in neural information processing systems},
+ volume={33},
+ pages={6840--6851},
+ year={2020}
+}
+
+@article{song2020score,
+ title={Score-based generative modeling through stochastic differential equations},
+ author={Song, Yang and Sohl-Dickstein, Jascha and Kingma, Diederik P and Kumar, Abhishek and Ermon, Stefano and Poole, Ben},
+ journal={arXiv preprint arXiv:2011.13456},
+ year={2020}
+}
+
+@article{lu2024simplifying,
+ title={Simplifying, stabilizing and scaling continuous-time consistency models},
+ author={Lu, Cheng and Song, Yang},
+ journal={arXiv preprint arXiv:2410.11081},
+ year={2024}
+}
+
+@article{kim2023consistency,
+ title={Consistency trajectory models: Learning probability flow ode trajectory of diffusion},
+ author={Kim, Dongjun and Lai, Chieh-Hsin and Liao, Wei-Hsiang and Murata, Naoki and Takida, Yuhta and Uesaka, Toshimitsu and He, Yutong and Mitsufuji, Yuki and Ermon, Stefano},
+ journal={arXiv preprint arXiv:2310.02279},
+ year={2023}
}
\ No newline at end of file
diff --git a/blog/2025/diff-distill/FACM_training.png b/blog/2025/diff-distill/FACM_training.png
new file mode 100644
index 0000000000000000000000000000000000000000..e379d53fb64d82c7623552b9a587b1adff6b4f01
GIT binary patch
literal 225463
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