拡散モデルを一度でも自分で実装しようとすると、たいてい同じところでつまずきます。順方向の $q(\bm{x}_t \mid \bm{x}_0)$ を書き下し、$\beta_t$ のスケジュールを決め、逆方向のガウス近似の分散をどう置くか悩み、損失を $\bm{\epsilon}$ 予測にするか $\bm{x}_0$ 予測にするか迷い、SNRで重み付けするかどうかで結果が変わる — 本質はどこにあるのか、だんだん見えなくなってきます。
Flow Matching は、この山盛りの設計項目を一度ぜんぶ捨てます。やることは驚くほど単純です。
- ノイズ $\bm{x}_0$ とデータ $\bm{x}_1$ をランダムに1組取ってくる
- その2点を直線で結ぶ。時刻 $t$ の位置は $\bm{x}_t = (1-t)\bm{x}_0 + t\bm{x}_1$
- その直線の速度 $\bm{x}_1 – \bm{x}_0$ を、ニューラルネットに二乗誤差で回帰させる
これだけです。ノイズスケジュールもスコア関数も逆時間SDEも出てきません。生成するときは、学習した速度場に沿って $t=0$ から $t=1$ までODEを解くだけ。それで拡散モデルと同等以上の品質が出る、というのがFlow Matchingの主張です。
なぜこんなことが許されるのか。ここが本記事の核心で、Conditional Flow Matching(CFM) という定理がその根拠になります。「本当に回帰したい速度場は計算できないが、計算できる別の量を回帰しても勾配が完全に一致する」— この一点さえ通れば、あとは全部素直な回帰問題に落ちます。
Flow Matchingが効いてくる場面は具体的です。
- 大規模な画像・動画生成: Stable Diffusion 3 や Flux はrectified flow(線形補間経路のFlow Matching)を学習目的として採用しています。ノイズスケジュール調整という不安定要因が消えるので、高解像度・大規模スケールでの学習が安定します
- 少ステップ生成: 経路が直線に近いほど、ODEを粗く刻んでも誤差が出ません。後で見る reflow を1回かけると、本記事の実験では1ステップ生成の誤差が実に 267分の1 になります
- 拡散以外の橋渡し: 出発点をガウスノイズに限る必要がありません。低解像度画像 → 高解像度画像、あるタンパク質構造 → 別の構造、といった「分布Aから分布Bへ」の問題を同じ枠組みで書けます
本記事の内容
- 連続正規化フロー(CNF)の復習 — ODE、連続の式、そして「従来のCNFはなぜ学習が重かったのか」
- Flow Matching損失の定義と、真の速度場 $u_t$ が計算できないという致命的な問題
- Conditional Flow Matching — 周辺化定理と勾配一致定理を1行ずつ導出する(記事の核心)
- 線形補間経路で目標速度が $\bm{x}_1-\bm{x}_0$ という拍子抜けするほど単純な形になること
- 拡散モデル(DDPM/スコアベース)との関係 — スコア関数と速度場を結ぶ変換式を導出し、数値で検証する
- Rectified Flow と reflow による経路の直線化、そして少ステップ生成
- ODEソルバ(Euler/Heun)とステップ数・生成品質の関係を実測する
- 実務上の利点 — 学習の安定性、経路設計の自由度
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
Flow Matchingの直感 — ノイズからデータへの「引っ越し」
生成モデルがやりたいことは、突き詰めると 簡単な分布を難しい分布に化けさせる ことです。手元にあるのは標準ガウス $p_0 = \mathcal{N}(\bm{0}, \bm{I})$ からいくらでもサンプルを取れる乱数生成器で、欲しいのは「猫の画像の分布 $q$」からのサンプルです。
ここで、ガウス分布から取った点の集まりを引っ越し前の荷物、データ分布を引っ越し先だと思ってみます。引っ越しには2つの決め方があります。
- どの荷物をどこに運ぶか(対応づけ)
- どんな経路で運ぶか(軌跡)
拡散モデルは、この引っ越しを「じわじわノイズを足して壊し、それを逆再生する」という遠回りな方法で決めていました。壊し方(ノイズスケジュール)を決めると経路が自動的に決まる、という設計です。逆にいえば、経路を直接いじる自由がありません。
Flow Matchingは発想を逆にします。先に経路を決めてしまうのです。しかも、いちばん素直な経路 — 直線 — を選びます。

図1では、$t=0$ の青い点(ガウス分布)と $t=1$ のオレンジの点(2つの月の形をしたデータ分布)を、ランダムに1対1で結んでいます。緑の線分がその「引っ越し経路」で、途中の矢印がその経路を進む速度ベクトルです。
この図から読み取れる要点は3つあります。第一に、経路は完全に自分で決められるということ。ここでは直線を選びましたが、それは私たちが選んだからで、データが決めたわけではありません。第二に、直線を選ぶと速度が時間によらず一定 $\bm{x}_1 – \bm{x}_0$ になり、目標値が拍子抜けするほど単純になります。第三に、この対応づけはいまのところでたらめです。青い点と赤い点をランダムに組にしただけなので、経路どうしが交差します。この交差が後で効いてくるので、頭の片隅に置いておいてください。
ここで当然の疑問が出ます。この「1本の直線」はあくまで1組のペアに対する経路です。生成のときには $\bm{x}_1$ がわからないのだから、$\bm{x}_1 – \bm{x}_0$ という速度は使えません。ではニューラルネットは何を学ぶのか — その答えを出すために、まず流れと分布の関係を整理する必要があります。
連続正規化フロー(CNF)の復習
速度場が分布を運ぶ
点の集まりが時間とともに動く様子を、ODEで書きます。
$$ \frac{d}{dt}\bm{x}_t = v_t(\bm{x}_t), \qquad \bm{x}_0 \sim p_0 $$
ここで $v_t : \mathbb{R}^d \to \mathbb{R}^d$ が速度場(ベクトル場) です。各点にどちら向きにどれだけの速さで動くかを指定する、風の場のようなものだと思ってください。
このODEの解を、初期値 $\bm{x}$ からスタートして時刻 $t$ まで進めた点として $\psi_t(\bm{x})$ と書きます。$\psi_t$ はフローと呼ばれ、$\mathbb{R}^d$ から $\mathbb{R}^d$ への滑らかな全単射になります(ODEの解の一意性から、軌跡は交わらないので単射です)。
初期分布 $p_0$ の点をすべて $\psi_t$ で運んだ結果の分布を、押し出し測度の記号で
$$ p_t = [\psi_t]_\# p_0 $$
と書きます。$v_t$ を与えると分布の時間発展 $p_t$ が決まる — この $p_t$ を 確率経路(probability path) と呼び、「$v_t$ は $p_t$ を生成する」と言います。
連続の式(continuity equation)
速度場と確率経路の関係を、微分方程式の形で書き下しておきます。これがFlow Matchingの全部の議論の土台になります。
主張は次の連続の式です。
$$ \frac{\partial p_t(\bm{x})}{\partial t} + \nabla \cdot \bigl( p_t(\bm{x})\, v_t(\bm{x}) \bigr) = 0 \tag{1} $$
流体力学の質量保存則とまったく同じ形です。$p_t v_t$ が「確率の流束」で、その発散(湧き出し)のぶんだけ密度が減る、と読みます。確率は途中で生まれも消えもしないので、こうなるのが自然です。
導出しておきましょう。任意の滑らかでコンパクト台を持つテスト関数 $\varphi$ を取り、期待値の時間微分を2通りに計算します。まず、期待値を初期分布での積分に書き直してから微分します。
$$ \frac{d}{dt}\mathbb{E}_{\bm{x}\sim p_t}[\varphi(\bm{x})] = \frac{d}{dt}\mathbb{E}_{\bm{x}\sim p_0}\bigl[\varphi(\psi_t(\bm{x}))\bigr] $$
右辺は積分の中身だけが $t$ に依存するので、微分を中に入れて連鎖律を使えます。$\frac{d}{dt}\psi_t(\bm{x}) = v_t(\psi_t(\bm{x}))$ を使うと
$$ = \mathbb{E}_{\bm{x}\sim p_0}\bigl[\nabla\varphi(\psi_t(\bm{x})) \cdot v_t(\psi_t(\bm{x}))\bigr] = \int p_t(\bm{x})\, \nabla\varphi(\bm{x}) \cdot v_t(\bm{x})\, d\bm{x} $$
最後の等号で、$\psi_t$ による押し出しの定義($p_0$ 上の $\psi_t$ の関数の期待値 $=$ $p_t$ 上の期待値)を使いました。ここで部分積分すると、$\varphi$ を微分から外せます。
$$ \int p_t \,\nabla\varphi \cdot v_t \, d\bm{x} = -\int \varphi(\bm{x})\, \nabla\cdot\bigl(p_t(\bm{x})v_t(\bm{x})\bigr)\, d\bm{x} $$
一方、$\mathbb{E}_{p_t}[\varphi] = \int \varphi\, p_t\, d\bm{x}$ を直接 $t$ で微分すれば $\int \varphi\, \partial_t p_t\, d\bm{x}$ です。2つの表式を等しいと置いて移項すると
$$ \int \varphi(\bm{x}) \Bigl[ \partial_t p_t(\bm{x}) + \nabla\cdot\bigl(p_t(\bm{x}) v_t(\bm{x})\bigr) \Bigr] d\bm{x} = 0 $$
これが任意の $\varphi$ について成り立つので、角括弧の中身が恒等的に0でなければなりません。式(1)が出ました。
なぜ従来のCNFは学習が重かったのか
連続の式からもう1つ、有名な関係式が出ます。軌跡に沿った対数密度の変化を追いかけると
$$ \frac{d}{dt}\log p_t(\bm{x}_t) = \partial_t \log p_t + \nabla \log p_t \cdot v_t = \frac{1}{p_t}\Bigl( \partial_t p_t + \nabla p_t \cdot v_t \Bigr) $$
1つ目の等号は全微分($\bm{x}_t$ が動くぶんと $p_t$ 自体が変わるぶん)です。ここに連続の式 $\partial_t p_t = -\nabla\cdot(p_t v_t) = -p_t \nabla\cdot v_t – \nabla p_t \cdot v_t$ を代入すると、$\nabla p_t \cdot v_t$ の項が打ち消し合います。
$$ \frac{d}{dt}\log p_t(\bm{x}_t) = \frac{1}{p_t}\bigl( -p_t \nabla\cdot v_t – \nabla p_t \cdot v_t + \nabla p_t\cdot v_t \bigr) = -\nabla\cdot v_t(\bm{x}_t) \tag{2} $$
これが instantaneous change of variables(瞬間的な変数変換公式)で、Neural ODE の中核をなす式です。式(2)を $t$ について積分すれば、生成したサンプルの厳密な対数尤度が計算できます。
しかし、これを学習の目的関数として使おうとすると地獄が始まります。1回のパラメータ更新のたびに、
- ODEを数値積分してサンプルを $t=0$ から $t=1$ まで運び(ネットワークを数十〜数百回評価)
- その各ステップでヤコビアンのトレース $\nabla\cdot v_\theta$ を求め(Hutchinson推定器で近似しても余計な誤差が乗る)
- さらに全体を通して誤差逆伝播する(adjoint法を使ってもODEをもう一度解き直す)
必要があります。これがシミュレーションベース学習で、画像のような高次元データにスケールしませんでした。正規化フローの表現力は魅力的なのに、拡散モデルに大きく水をあけられていた理由がここにあります。
Flow Matchingの出発点は、この一点にあります。尤度を計算せずに、速度場を直接教師あり回帰で当てにいけないか? これができれば、ODEを解かずに学習できます。
Flow Matching損失 — 理想的だが計算できない
やりたいことは明快です。理想の速度場 $u_t$ が既知だと仮定して、ニューラルネット $v_\theta(\bm{x}, t)$ をそれに合わせにいきます。
$$ \mathcal{L}_{\mathrm{FM}}(\theta) = \mathbb{E}_{t \sim \mathcal{U}[0,1],\ \bm{x} \sim p_t} \bigl\| v_\theta(\bm{x}, t) – u_t(\bm{x}) \bigr\|^2 \tag{3} $$
ここで $u_t$ は、$p_0 = \mathcal{N}(\bm{0},\bm{I})$ から $p_1 = q$(データ分布)へ向かう確率経路 $p_t$ を生成する速度場です。もし $\mathcal{L}_{\mathrm{FM}} = 0$ にできれば、$v_\theta$ は $p_t$ を正確に生成するので、$t=0$ から $t=1$ までODEを解くだけでデータ分布からサンプリングできます。ODEも尤度計算も学習ループから消え、ただの二乗誤差回帰になります。
ところが、この式はまったく使えません。理由は2つあります。
- $u_t$ が未知。そもそも $p_t$ をどう作るのかすら決めていませんし、決めたとしても $u_t$ の閉じた式は普通は書けません
- $p_t$ からサンプリングできない。期待値の外側の $\bm{x}\sim p_t$ を取る手段がありません
つまり式(3)は、損失の値も、その勾配も、1回たりとも計算できない目的関数です。ここで諦めるか、あるいは「計算できる別の損失で代用できないか」を考えるか。Flow Matchingの本質的な貢献は、後者に対する答えにあります。
確率経路を「条件付き」で組み立てる
$p_t$ を丸ごと設計しようとするから難しいのです。そこで発想を変えて、1個のデータ点に条件付けた簡単な経路をたくさん作り、それを混ぜて $p_t$ を作ることにします。
条件変数 $z$ を導入します($z$ が何かは後で決めます。データ点 $\bm{x}_1$ そのものでも、ペア $(\bm{x}_0,\bm{x}_1)$ でも構いません)。$z$ の分布を $q(z)$ とし、各 $z$ に対して条件付き確率経路 $p_t(\bm{x}\mid z)$ と、それを生成する条件付き速度場 $u_t(\bm{x}\mid z)$ を用意します。この2つは条件付きの連続の式
$$ \partial_t p_t(\bm{x}\mid z) + \nabla\cdot\bigl(p_t(\bm{x}\mid z)\, u_t(\bm{x}\mid z)\bigr) = 0 \tag{4} $$
を満たすものとします。そのうえで、周辺確率経路を
$$ p_t(\bm{x}) = \int p_t(\bm{x} \mid z)\, q(z)\, dz \tag{5} $$
と定義します。条件付き経路を、$z$ の分布で平均したものです。
条件付き経路の設計に課す要求は、両端だけです。$t=0$ ですべての $z$ について $p_0(\bm{x}\mid z) = \mathcal{N}(\bm{0},\bm{I})$、$t=1$ で混ぜた結果 $p_1(\bm{x})$ がデータ分布 $q(\bm{x})$ になること。この2つさえ満たせば、途中の経路は好きに設計できます。
いちばん素直な選択は $z = \bm{x}_1$(データ点そのもの)で、経路として直線補間を取るものです。$\bm{x}_0 \sim \mathcal{N}(\bm{0},\bm{I})$ と $\bm{x}_1 \sim q$ から
$$ \bm{x}_t = (1-t)\bm{x}_0 + t\,\bm{x}_1 $$
を作れば、条件付き経路は $p_t(\bm{x}\mid \bm{x}_1) = \mathcal{N}(\bm{x};\ t\bm{x}_1,\ (1-t)^2\bm{I})$ になります(ガウス変数の線形変換なので、平均 $t\bm{x}_1$、共分散 $(1-t)^2\bm{I}$ です)。$t=0$ で $\mathcal{N}(\bm{0},\bm{I})$、$t=1$ で $\delta(\bm{x}-\bm{x}_1)$ に潰れるので、$z$ について混ぜれば $p_1 = q$ になります。要求はちゃんと満たされています。

図2は、この $p_t$ からの実サンプル(3000点)を時刻ごとに描いたものです。$\bm{x}_0$ と $\bm{x}_1$ を実際にサンプリングして $(1-t)\bm{x}_0 + t\bm{x}_1$ を計算しただけなので、どの $t$ でも追加のコストなしに一発で $p_t$ からサンプルが取れている点に注目してください。
この図から3つのことが読み取れます。第一に、$t=0.25$ ではまだほぼガウスのままで、$t=0.75$ あたりで急に月の形が浮かび上がってきます。第二に、中間の $t=0.5$ では分布が明らかに二山構造ではなく、ガウスで潰れた単峰に近い形をしています。第三に、$p_t$ は「ガウスとデータの中間」であって、単にデータにノイズを足したものではないことです(データ側も $t$ 倍に縮んでいます)。この「一発でサンプルが取れる」という性質こそが、次に見るCFMを実用的にしている決定的な条件です。
Conditional Flow Matching — 記事の核心
さて、条件付き経路をたくさん用意して混ぜれば $p_t$ が作れるところまで来ました。しかし、まだ大問題が残っています。混ぜた後の $p_t$ を生成する速度場 $u_t$ は何なのか。
ここから2つの定理を証明します。定理1で $u_t$ の正体を突き止め、定理2でそれを計算しなくてよいことを示します。
定理1(周辺化定理)— 周辺速度場は条件付き速度場の期待値
主張: 条件付き速度場を、時刻 $t$ に点 $\bm{x}$ にいるという条件のもとで平均した
$$ u_t(\bm{x}) = \int u_t(\bm{x} \mid z)\, \frac{p_t(\bm{x}\mid z)\, q(z)}{p_t(\bm{x})}\, dz = \mathbb{E}_{z \sim p(z \mid \bm{x}_t = \bm{x})}\bigl[ u_t(\bm{x}\mid z) \bigr] \tag{6} $$
は、周辺確率経路 $p_t$ を生成する。
重み $\frac{p_t(\bm{x}\mid z) q(z)}{p_t(\bm{x})}$ はベイズの定理そのもので、「時刻 $t$ に点 $\bm{x}$ を観測したとき、その裏にいた条件変数が $z$ である事後確率」です。つまり式(6)は、$\bm{x}$ を通過しうるすべての条件付き経路の速度を、その経路らしさで重み付け平均したものです。
証明: 周辺経路 $p_t$ と速度場 $u_t$ が連続の式(1)を満たすことを直接確かめます。まず式(5)を $t$ で微分し、微分を積分の中に入れます。
$$ \partial_t p_t(\bm{x}) = \partial_t \int p_t(\bm{x}\mid z)q(z)\, dz = \int \partial_t p_t(\bm{x}\mid z)\, q(z)\, dz $$
ここで条件付きの連続の式(4)を使い、$\partial_t p_t(\bm{x}\mid z)$ を発散の形に置き換えます。
$$ = -\int \nabla\cdot\bigl( p_t(\bm{x}\mid z)\, u_t(\bm{x}\mid z) \bigr) q(z)\, dz $$
発散 $\nabla\cdot$ は $\bm{x}$ に関する微分で、積分は $z$ に関するものなので、順序を交換できます。
$$ = -\nabla\cdot \left( \int p_t(\bm{x}\mid z)\, u_t(\bm{x}\mid z)\, q(z)\, dz \right) $$
最後に、括弧の中を $p_t(\bm{x})$ で割って掛け直すと、ちょうど式(6)の定義が現れます。
$$ = -\nabla\cdot\left( p_t(\bm{x}) \int u_t(\bm{x}\mid z) \frac{p_t(\bm{x}\mid z)q(z)}{p_t(\bm{x})} dz \right) = -\nabla\cdot\bigl( p_t(\bm{x})\, u_t(\bm{x}) \bigr) $$
移項すれば $\partial_t p_t + \nabla\cdot(p_t u_t) = 0$、すなわち連続の式です。証明完了。$\blacksquare$
この定理が言っているのは、探していた $u_t$ は「条件付き速度の加重平均」であるということです。$u_t$ の正体はわかりました。しかし式(6)には $p_t(\bm{x})$ という積分(データ全体にわたる和)が入っているので、やはり計算できません。

図3は、この定理を絵にしたものです。左の (a) は $\bm{x}_1$ を1点に固定したとき(オレンジの星)の条件付き経路で、10個の異なる $\bm{x}_0$ から星に向かってまっすぐ伸びています。速度は $\bm{x}_1-\bm{x}_0$ で時間によらず一定なので、矢印はどれも経路と平行です。
右の (b) は、目標分布を6個のモードを持つ混合ガウスにしたとき、$t=0.5$ の評価点(黒丸)における様子です。灰色の細い矢印が各モードへの条件付き速度で、矢印の太さが事後確率 $\gamma_k$ を表しています。$\gamma_2 = 0.49$、$\gamma_1 = 0.43$ の2つのモードがほぼ拮抗し、残りは0.04以下です。赤い太矢印がそれらの加重平均、つまり周辺速度 $u_t(\bm{x})$ です。
ここで気づいてほしいのは、周辺速度はどの条件付き速度とも一致していないことです。長さも $|u_t| \approx 2.59$ と、各条件付き速度より短くなっています。方向の違う矢印を平均すると打ち消し合うからです。これがFlow Matchingの学習を理解する鍵になります。
定理2(勾配一致定理)— 条件付きを回帰すれば十分
ここからが本番です。計算できない式(3)の代わりに、計算できる次の損失を定義します。
$$ \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t\sim\mathcal{U}[0,1],\ z\sim q(z),\ \bm{x}\sim p_t(\cdot \mid z)} \bigl\| v_\theta(\bm{x},t) – u_t(\bm{x}\mid z) \bigr\|^2 \tag{7} $$
こちらは全部計算できます。$z$(=データ点)をデータセットから引き、$\bm{x}$ を条件付き経路から一発でサンプリングし、$u_t(\bm{x}\mid z)$ は閉じた式で書けるからです。
主張: $\theta$ に関する勾配について
$$ \nabla_\theta \mathcal{L}_{\mathrm{FM}}(\theta) = \nabla_\theta \mathcal{L}_{\mathrm{CFM}}(\theta) \tag{8} $$
が成り立つ。したがって $\mathcal{L}_{\mathrm{CFM}}$ を勾配降下で最小化することは、$\mathcal{L}_{\mathrm{FM}}$ を最小化することとまったく同じである。
証明: 両方の二乗ノルムを展開して、項ごとに比べます。
$$ \|v_\theta – u_t\|^2 = \|v_\theta\|^2 – 2\langle v_\theta,\ u_t\rangle + \|u_t\|^2 $$ $$ \|v_\theta – u_t(\cdot\mid z)\|^2 = \|v_\theta\|^2 – 2\langle v_\theta,\ u_t(\cdot\mid z)\rangle + \|u_t(\cdot\mid z)\|^2 $$
第3項はどちらも $\theta$ を含まないので、勾配を取れば消えます。以下、第1項と第2項をそれぞれ照合します。
第1項(二乗項)。$\mathcal{L}_{\mathrm{FM}}$ 側の期待値は $\bm{x}\sim p_t$ について取られています。ここで式(5)を代入すると
$$ \mathbb{E}_{\bm{x}\sim p_t}\|v_\theta(\bm{x},t)\|^2 = \int \|v_\theta(\bm{x},t)\|^2\, p_t(\bm{x})\, d\bm{x} = \int\!\!\int \|v_\theta(\bm{x},t)\|^2\, p_t(\bm{x}\mid z)\, q(z)\, dz\, d\bm{x} $$
右辺はまさに「$z\sim q$ を引いてから $\bm{x}\sim p_t(\cdot\mid z)$ を引く」という二段サンプリングの期待値です。したがって
$$ \mathbb{E}_{\bm{x}\sim p_t}\|v_\theta\|^2 = \mathbb{E}_{z,\, \bm{x}\sim p_t(\cdot\mid z)}\|v_\theta\|^2 $$
で、第1項は完全に一致します。当たり前といえば当たり前で、$p_t$ は条件付き経路を混ぜたものなのだから、$\bm{x}$ の分布は同じです。
第2項(交差項)。こちらが山場です。$\mathcal{L}_{\mathrm{FM}}$ 側の交差項に、定理1の式(6)をそのまま代入します。
$$ \mathbb{E}_{\bm{x}\sim p_t}\bigl\langle v_\theta(\bm{x},t),\ u_t(\bm{x}) \bigr\rangle = \int p_t(\bm{x}) \left\langle v_\theta(\bm{x},t),\ \int u_t(\bm{x}\mid z)\frac{p_t(\bm{x}\mid z)q(z)}{p_t(\bm{x})}dz \right\rangle d\bm{x} $$
内積は第2引数について線形なので、$z$ の積分を内積の外に出せます。そのとき、$p_t(\bm{x})$ が分母と約分してきれいに消えます。ここが証明の心臓部です。
$$ = \int\!\!\int \bigl\langle v_\theta(\bm{x},t),\ u_t(\bm{x}\mid z) \bigr\rangle\, p_t(\bm{x}\mid z)\, q(z)\, dz\, d\bm{x} = \mathbb{E}_{z,\, \bm{x}\sim p_t(\cdot\mid z)}\bigl\langle v_\theta,\ u_t(\cdot\mid z)\bigr\rangle $$
第2項も一致しました。まとめると、2つの損失の差は $\theta$ に依存しない項(第3項の差)だけです。
$$ \mathcal{L}_{\mathrm{FM}}(\theta) = \mathcal{L}_{\mathrm{CFM}}(\theta) + C, \qquad C = \mathbb{E}\|u_t\|^2 – \mathbb{E}\|u_t(\cdot\mid z)\|^2 $$
定数だけずれた2つの関数は、同じ勾配・同じ最小化点を持ちます。式(8)が示されました。$\blacksquare$
もうひとつの見方 — 二乗誤差の最小解は条件付き期待値
同じことを、回帰の一般論から見ると腹に落ちやすくなります。$Y$ を予測する二乗誤差回帰の最適解が条件付き期待値 $\mathbb{E}[Y\mid X]$ になる、というおなじみの事実です。
$$ \arg\min_{f} \mathbb{E}\bigl\|f(X) – Y\bigr\|^2 = \mathbb{E}[Y \mid X] $$
$\mathcal{L}_{\mathrm{CFM}}$ では $X = (\bm{x}_t, t)$、$Y = u_t(\bm{x}_t \mid z)$ です。したがって、$v_\theta$ が十分な表現力を持てば最適解は
$$ v^*(\bm{x},t) = \mathbb{E}\bigl[ u_t(\bm{x}_t \mid z) \mid \bm{x}_t = \bm{x} \bigr] = u_t(\bm{x}) $$
で、定理1の式(6)と完全に一致します。ネットワークは「ぶれた教師信号」を大量に浴びせられ、その平均を学ぶことで、誰も明示的に計算していない周辺速度場に自動的に収束する。これがCFMの仕組みです。
この見方には実務上の重要な帰結があります。教師信号 $u_t(\bm{x}\mid z)$ は $\bm{x}_t$ を与えても一意に決まらない(同じ $\bm{x}_t$ に複数の $z$ がありうる)ので、学習損失はゼロに落ちません。下限は条件付き分散
$$ \min_\theta \mathcal{L}_{\mathrm{CFM}} = \mathbb{E}_{t,\bm{x}_t}\Bigl[ \mathrm{Var}\bigl( u_t(\bm{x}_t\mid z) \mid \bm{x}_t \bigr) \Bigr] > 0 $$
です。実際、後で行う2次元トイデータの実験では、学習が十分収束した後も損失は4〜5あたりで振動し続けます。これは学習の失敗ではなく、正常な挙動です。損失の絶対値を見て「収束していない」と判断してはいけない、というのはFlow Matching系のモデルを扱ううえでの実務的な注意点になります。
ここまでで、「計算できない損失を、計算できる損失で代用してよい」という理論的な保証が取れました。次は、では条件付き速度 $u_t(\bm{x}\mid z)$ は具体的にどんな式になるのか、という各論に入ります。
ガウス条件経路 — 目標速度の一般形
条件付き経路として、次のアフィン・ガウス経路を考えます。実用されているFlow Matchingと拡散モデルは、ほぼすべてこの1つの族に収まります。
$$ p_t(\bm{x} \mid \bm{x}_1) = \mathcal{N}\bigl(\bm{x};\ \alpha_t \bm{x}_1,\ \sigma_t^2 \bm{I}\bigr) \tag{9} $$
$\alpha_t$ は「データ成分の強さ」、$\sigma_t$ は「ノイズ成分の強さ」を決めるスケジュールで、境界条件として $\alpha_0 = 0,\ \sigma_0 = 1$(出発点は標準ガウス)と $\alpha_1 = 1,\ \sigma_1 = 0$(到着点はデータ点そのもの)を課します。サンプリングは一発です。
$$ \bm{x}_t = \alpha_t \bm{x}_1 + \sigma_t \bm{x}_0, \qquad \bm{x}_0 \sim \mathcal{N}(\bm{0}, \bm{I}) $$
この経路の条件付き速度場を求めましょう。使うのはフロー写像から速度場を読み取るという手順です。$\bm{x}_1$ を固定して
$$ \psi_t(\bm{x}_0) = \alpha_t \bm{x}_1 + \sigma_t \bm{x}_0 $$
という写像を考えると、$\bm{x}_0 \sim \mathcal{N}(\bm{0},\bm{I})$ を押し出した先はちょうど $\mathcal{N}(\alpha_t\bm{x}_1, \sigma_t^2\bm{I}) = p_t(\cdot\mid\bm{x}_1)$ です。つまり $\psi_t$ は式(9)の経路を実現するフローそのものです。であれば、その速度場は $\psi_t$ を $t$ で微分すれば得られます。
$$ \frac{d}{dt}\psi_t(\bm{x}_0) = \dot{\alpha}_t \bm{x}_1 + \dot{\sigma}_t \bm{x}_0 $$
ただし速度場は「いま点 $\bm{x}$ にいるとき、どちらに動くか」の形で書かないといけません。$\bm{x} = \psi_t(\bm{x}_0)$ を逆に解いて $\bm{x}_0 = (\bm{x} – \alpha_t\bm{x}_1)/\sigma_t$ を代入すると、$\bm{x}_0$ が消えます。
$$ u_t(\bm{x} \mid \bm{x}_1) = \dot{\alpha}_t \bm{x}_1 + \frac{\dot{\sigma}_t}{\sigma_t}\bigl( \bm{x} – \alpha_t \bm{x}_1 \bigr) \tag{10} $$
これがアフィン・ガウス経路の条件付き速度場の一般形です。$\alpha_t, \sigma_t$ を決めれば自動的に決まる、完全に閉じた式であることに注目してください。定理2により、この式を教師信号にして回帰するだけでよいのです。
線形補間経路 — 目標速度が $\bm{x}_1 – \bm{x}_0$ になる
いちばん単純なスケジュール $\alpha_t = t,\ \sigma_t = 1-t$ を入れてみます。$\dot{\alpha}_t = 1,\ \dot{\sigma}_t = -1$ なので、式(10)は
$$ u_t(\bm{x}\mid\bm{x}_1) = \bm{x}_1 – \frac{1}{1-t}\bigl( \bm{x} – t\bm{x}_1 \bigr) = \frac{(1-t)\bm{x}_1 – \bm{x} + t\bm{x}_1}{1-t} = \frac{\bm{x}_1 – \bm{x}}{1-t} $$
となります。「いまいる場所から目的地 $\bm{x}_1$ に向かって、残り時間 $1-t$ で到着するのに必要な速さ」という、極めて素直な式です。
さらに、この式を実際の経路上の点 $\bm{x} = \bm{x}_t = (1-t)\bm{x}_0 + t\bm{x}_1$ で評価すると、驚くほど簡単になります。分子を計算すると
$$ \bm{x}_1 – \bm{x}_t = \bm{x}_1 – (1-t)\bm{x}_0 – t\bm{x}_1 = (1-t)(\bm{x}_1 – \bm{x}_0) $$
なので、$(1-t)$ が約分されて
$$ \boxed{\ u_t(\bm{x}_t \mid \bm{x}_1) = \bm{x}_1 – \bm{x}_0\ } \tag{11} $$
時間に一切依存しない、ただの差ベクトルになりました。直線を等速で進むのだから当たり前ではあるのですが、これが実装上は決定的です。CFM損失は次の形に書き下せます。
$$ \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t\sim\mathcal{U}[0,1],\ \bm{x}_0\sim\mathcal{N}(\bm{0},\bm{I}),\ \bm{x}_1\sim q} \Bigl\| v_\theta\bigl( (1-t)\bm{x}_0 + t\bm{x}_1,\ t \bigr) – (\bm{x}_1 – \bm{x}_0) \Bigr\|^2 \tag{12} $$
これがFlow Matchingの全貌です。ノイズスケジュールも、$\bar{\alpha}_t$ も、逆過程の分散も、SNRによる損失重み付けも、どこにもありません。
なお、式(11)の形で書くと $t=1$ での $1/(1-t)$ の発散も消えている点は実務的に重要です。条件変数を $\bm{x}_1$ 単独ではなくペア $z = (\bm{x}_0, \bm{x}_1)$ に取り直したと解釈すれば、条件付き経路は $p_t(\bm{x}\mid z) = \delta(\bm{x} – \bm{x}_t)$(1本の直線に潰れた退化した経路)で、その速度は $t$ によらず $\bm{x}_1 – \bm{x}_0$ — 特異点はどこにもありません。式(12)で $t$ を $[0,1]$ 全体から一様に取れるのは、このおかげです。

図4は、目標分布を6モードの混合ガウスにしたときの周辺速度場 $u_t(\bm{x})$ を解析的に厳密計算して描いたものです(混合ガウスなら式(6)の積分が有限和になるので、閉じた形で計算できます)。背景の濃淡が $p_t(\bm{x})$ の密度です。
3つの時刻を比べると、Flow Matchingの動作が一目でわかります。$t=0.1$ では $p_t$ はほぼ標準ガウスの単峰で、速度場はどこも「外向きに広がれ」という素直な流れです。$t=0.5$ になると密度に6つの山の兆しが現れ、速度場は原点付近で放射状に分岐し始めます。$t=0.9$ では6つのモードが完全に分離し、速度場は各モードに吸い込まれる形になっています。
ここで注目すべきは、個々の条件付き経路は直線なのに、平均して得られる周辺速度場は明らかに曲がっていることです。$t=0.5$ の原点付近の矢印は、どのモードにも真っ直ぐ向かっていません。方向の違う速度を平均した結果です。この「平均による曲がり」が、後で見る少ステップ生成の障害になります。
拡散モデルとの関係 — 経路の選び方が違うだけ
ここまで線形補間ばかり見てきましたが、式(10)は $\alpha_t, \sigma_t$ を自由に選べる一般形でした。では拡散モデルはどのスケジュールに対応するのか。答えは「分散保存(VP)型」、すなわち
$$ \alpha_t = \sin\frac{\pi t}{2}, \qquad \sigma_t = \cos\frac{\pi t}{2} $$
のような $\alpha_t^2 + \sigma_t^2 = 1$ を満たす族です(DDPMの記号では $\alpha_t = \sqrt{\bar{\alpha}}$、$\sigma_t = \sqrt{1-\bar{\alpha}}$ にあたります)。分散保存という名前どおり、$\bm{x}_1$ の大きさが1程度なら $\bm{x}_t$ の分散が $t$ によらずほぼ一定に保たれます。

図7は2つのスケジュールを4つの角度から比べたものです。(a) は条件付き経路そのもので、線形補間(緑の実線)は定義どおり直線ですが、三角スケジュール(赤の破線)は円弧を描きます。$(\alpha_t, \sigma_t) = (\sin\frac{\pi t}{2}, \cos\frac{\pi t}{2})$ が単位円上を動くので、$\bm{x}_t = \alpha_t\bm{x}_1 + \sigma_t\bm{x}_0$ は $\bm{x}_0$ と $\bm{x}_1$ が張る平面内で楕円弧を描くわけです。(b) のスケジュール曲線を見ると、線形補間では $\alpha_t^2+\sigma_t^2$(灰色)が $t=0.5$ で0.5まで落ち込む、つまり中間時刻で分布が縮むことが確認できます。図2の $t=0.5$ のパネルで分布が小さく見えたのは、これが理由です。
(c)(d) は、周辺速度場のODEを実際にRK4で積分した軌跡です。始点と終点を結ぶ弦からのずれ(最大値を弦長で正規化)を測ると、線形補間が 0.090、三角スケジュールが 0.195 で、拡散型の経路は線形補間の2倍以上曲がっていることが数値で確認できます。この差が、後で見るステップ数の要求に直結します。
つまり 拡散モデルはFlow Matchingの特殊例 です。「ノイズを足して壊す」という物語から出発したせいで曲がった経路を選ばされていた、と見ることもできます。
スコア関数と速度場の変換式
もう少し踏み込んで、拡散モデルが学習しているスコア関数 $s_t(\bm{x}) = \nabla\log p_t(\bm{x})$ と、Flow Matchingが学習している速度場 $u_t(\bm{x})$ の関係を導きます。結論を先に言うと、同じ経路 $p_t$ のもとでは両者は1対1に変換でき、情報量として完全に等価です。
まず、スコアも条件付きの期待値で書けることを確認します。式(5)の両辺の勾配を取り、$\nabla p = p\,\nabla\log p$ を使うと
$$ \nabla p_t(\bm{x}) = \int \nabla p_t(\bm{x}\mid\bm{x}_1)\, q(\bm{x}_1)d\bm{x}_1 = \int p_t(\bm{x}\mid\bm{x}_1)\,\nabla\log p_t(\bm{x}\mid\bm{x}_1)\, q(\bm{x}_1) d\bm{x}_1 $$
両辺を $p_t(\bm{x})$ で割れば、定理1とまったく同じ構造の式が出ます。
$$ s_t(\bm{x}) = \nabla\log p_t(\bm{x}) = \mathbb{E}\bigl[ \nabla\log p_t(\bm{x}\mid\bm{x}_1) \mid \bm{x}_t = \bm{x} \bigr] $$
これはデノイジングスコアマッチングの正当性そのもの(1行で示せます)。ガウス経路(9)では $\nabla\log p_t(\bm{x}\mid\bm{x}_1) = -(\bm{x}-\alpha_t\bm{x}_1)/\sigma_t^2 = -\bm{x}_0/\sigma_t$ なので
$$ s_t(\bm{x}) = -\frac{1}{\sigma_t}\,\mathbb{E}\bigl[\bm{x}_0 \mid \bm{x}_t = \bm{x}\bigr] \tag{13} $$
スコアとは「いま見ている点に混ざっているノイズの期待値」を $-\sigma_t$ で割ったもの、という読み方ができます。DDPMの $\bm{\epsilon}$ 予測ネットワークがまさに $\mathbb{E}[\bm{x}_0\mid\bm{x}_t]$ を当てにいっているわけです。
一方、周辺速度場も同じく条件付き期待値です。式(10)の元になった $\dot\alpha_t\bm{x}_1 + \dot\sigma_t\bm{x}_0$ を平均すればよいので
$$ u_t(\bm{x}) = \dot{\alpha}_t\, \hat{\bm{x}}_1 + \dot{\sigma}_t\, \hat{\bm{x}}_0, \qquad \hat{\bm{x}}_i := \mathbb{E}[\bm{x}_i \mid \bm{x}_t = \bm{x}] $$
ここで、恒等式 $\bm{x}_t = \alpha_t\bm{x}_1 + \sigma_t\bm{x}_0$ の両辺の条件付き期待値を取ると、$\alpha_t\hat{\bm{x}}_1 + \sigma_t\hat{\bm{x}}_0 = \bm{x}$ という制約が得られます。式(13)より $\hat{\bm{x}}_0 = -\sigma_t s_t(\bm{x})$ なので、これを制約に入れて $\hat{\bm{x}}_1$ について解きます。
$$ \hat{\bm{x}}_1 = \frac{\bm{x} – \sigma_t \hat{\bm{x}}_0}{\alpha_t} = \frac{\bm{x} + \sigma_t^2 s_t(\bm{x})}{\alpha_t} $$
これと $\hat{\bm{x}}_0 = -\sigma_t s_t$ を $u_t$ の式に代入して、$s_t$ の係数をまとめます。
$$ u_t(\bm{x}) = \frac{\dot{\alpha}_t}{\alpha_t}\bigl(\bm{x} + \sigma_t^2 s_t(\bm{x})\bigr) – \dot{\sigma}_t \sigma_t s_t(\bm{x}) = \frac{\dot{\alpha}_t}{\alpha_t}\bm{x} + \sigma_t^2\left( \frac{\dot{\alpha}_t}{\alpha_t} – \frac{\dot{\sigma}_t}{\sigma_t} \right) s_t(\bm{x}) $$
ここで信号対雑音比 $\lambda_t := \alpha_t/\sigma_t$ を導入すると、$\frac{d}{dt}\log\lambda_t = \frac{\dot\alpha_t}{\alpha_t} – \frac{\dot\sigma_t}{\sigma_t} = \frac{\dot\lambda_t}{\lambda_t}$ なので、括弧の中身がそのままSNRの対数微分になります。
$$ \boxed{\ u_t(\bm{x}) = \frac{\dot{\alpha}_t}{\alpha_t}\,\bm{x} + \sigma_t^2\,\frac{\dot{\lambda}_t}{\lambda_t}\, s_t(\bm{x})\ } \tag{14} $$
逆に解けば $s_t$ が $u_t$ から求まるので、両者は完全に等価な情報を持っています。線形補間経路($\alpha_t=t,\ \sigma_t=1-t$)で計算すると $\frac{\dot\alpha}{\alpha}=\frac1t$、$\frac{\dot\sigma}{\sigma}=-\frac{1}{1-t}$ なので、$\sigma_t^2\left(\frac1t + \frac{1}{1-t}\right) = \frac{(1-t)^2 + t(1-t)}{t} = \frac{1-t}{t}$ となり
$$ u_t(\bm{x}) = \frac{\bm{x} + (1-t)\, s_t(\bm{x})}{t} $$
という気持ちのいい形になります。

図8の左 (a) は、6モード混合ガウスに対して $u_t$ と $s_t$ をそれぞれ厳密計算し、式(14)の右辺と左辺の差の最大絶対値を $t$ ごとにプロットしたものです。線形補間で最大 $4.0\times10^{-14}$、三角スケジュールで最大 $3.5\times10^{-14}$ — 倍精度浮動小数点の丸め誤差そのもののレベルで、式(14)が恒等式として成り立っていることが確認できます。
右 (b) は同じ $p_t$($t=0.6$)に対する2つの場の向きを重ねたものです。水色が速度場、赤がスコア場(向きのみ)で、両者は一致しません。スコアは常に「密度が濃いほうへ」を指すのに対し、速度は「密度が濃いほうへ」+「$\dot\alpha_t/\alpha_t \cdot \bm{x}$ という膨張成分」の合成だからです。式(14)を見れば、この差がちょうど第1項ぶんであることがわかります。
$\bm{\epsilon}$予測・$\bm{x}_0$予測・$\bm{v}$予測は同じものの言い換え
同じ計算から、拡散モデルでよく議論される予測パラメータ化の関係もすぐ出ます。$\bm{\epsilon}_\theta(\bm{x},t) \approx \hat{\bm{x}}_0$(ノイズ予測)を使うと
$$ u_t(\bm{x}) = \frac{\dot{\alpha}_t}{\alpha_t}\bm{x} + \left( \dot{\sigma}_t – \frac{\dot{\alpha}_t \sigma_t}{\alpha_t} \right)\bm{\epsilon}_\theta(\bm{x},t) $$
という別の変換式になります。つまり $\bm{\epsilon}$予測・$\bm{x}_0$予測・速度予測は、$\bm{x}$ を含む1次のアフィン変換で互いに移り合う同じネットワークです。違いは損失における実効的な重み付けだけで、どのパラメータ化を選ぶかは「どの $t$ での誤差を重く見るか」を選ぶことに相当します。Flow Matchingの線形補間経路が実務で好まれるのは、この重み付けが $t$ によらずほぼ均等になり、余計なチューニングが要らないからです。
拡散モデルのサンプリングODEとの一致
最後に、スコアベース生成モデルの確率フローODE(probability flow ODE)
$$ \frac{d\bm{x}}{d\tau} = f_\tau \bm{x} – \frac{1}{2} g_\tau^2\, \nabla\log \tilde{p}_\tau(\bm{x}) $$
との関係を見ておきます($\tau$ は拡散の慣習に合わせて $\tau=0$ がデータ、$\tau=1$ がノイズ、$f,g$ は前向きSDE $d\bm{x} = f_\tau\bm{x}\,d\tau + g_\tau d\bm{w}$ の係数です)。$\tau = 1-t$ と時間を反転させると $\frac{d\bm{x}}{dt} = -\frac{d\bm{x}}{d\tau}$ であり、標準的な対応 $f_\tau = \frac{d}{d\tau}\log\tilde{\alpha}_\tau$、$g_\tau^2 = -2\tilde{\sigma}_\tau^2\frac{d}{d\tau}\log\tilde{\lambda}_\tau$ を入れると、符号がすべて反転して
$$ \frac{d\bm{x}}{dt} = \frac{\dot{\alpha}_t}{\alpha_t}\bm{x} + \sigma_t^2 \frac{\dot{\lambda}_t}{\lambda_t}s_t(\bm{x}) = u_t(\bm{x}) $$
となり、式(14)と完全に一致します。拡散モデルのODEサンプラは、三角スケジュールを選んだFlow MatchingのODEそのものです。DDIMやDPM-Solverといった高速サンプラの理論が、そのままFlow Matchingにも使える理由がここにあります。
ここまでで理論は出揃いました。次は、この単純な損失が本当に動くのかを実際に手を動かして確かめます。
実装 — 損失は数行で書ける
式(12)をそのままコードにします。目標分布は、円周上に並んだ8個のガウス混合にしましょう。モードが離れているので、生成がうまくいっているかどうかが目で見て判断しやすいためです。
import numpy as np, torch, torch.nn as nn
torch.manual_seed(0)
# 目標分布: 半径2.5の円周上に並ぶ8個のガウス(2次元)
K, R = 8, 2.5
ang = torch.arange(K) * (2 * np.pi / K)
MU = torch.stack([R * torch.cos(ang), R * torch.sin(ang)], dim=1)
def sample_data(n):
k = torch.randint(0, K, (n,))
return MU[k] + 0.25 * torch.randn(n, 2)
# 速度場 v_theta(x, t): 入力は x(2次元) と t(1次元) を連結した3次元
net = nn.Sequential(nn.Linear(3, 128), nn.SiLU(),
nn.Linear(128, 128), nn.SiLU(),
nn.Linear(128, 2))
opt = torch.optim.Adam(net.parameters(), lr=2e-3)
for step in range(4000):
x1 = sample_data(512) # データ側の端点
x0 = torch.randn(512, 2) # ノイズ側の端点
t = torch.rand(512, 1) # t ~ U[0,1]
xt = (1 - t) * x0 + t * x1 # 線形補間経路の上の点
target = x1 - x0 # 条件付き速度(時間によらず一定)
loss = ((net(torch.cat([xt, t], 1)) - target) ** 2).sum(1).mean()
opt.zero_grad(); loss.backward(); opt.step()
if (step + 1) % 1000 == 0:
print(f"step {step+1:5d} loss = {loss.item():.3f}")
step 1000 loss = 4.865
step 2000 loss = 4.951
step 3000 loss = 5.328
step 4000 loss = 4.894
出力から2つのことが読み取れます。第一に、学習ループにODEソルバもヤコビアンのトレースも一切登場していません。$\bm{x}_t$ を作るのは1行の線形補間、教師信号は引き算1回です。従来のCNFが1ステップごとにODEを解いていたのと比べると、計算量の桁が違います。第二に、損失が4.9前後で下げ止まっていること。これは前節で議論した条件付き分散の下限に達したためで、失敗ではありません。同じ $\bm{x}_t$ に対して複数の $(\bm{x}_0,\bm{x}_1)$ ペアがありえる以上、教師信号は本質的にばらつきます。ネットワークはそのばらつきの平均を学んでおり、それが周辺速度場です。
学習した速度場でサンプリングしてみます。ODEは最も素朴なEuler法で解きます。
@torch.no_grad()
def euler_sample(n, n_steps):
x = torch.randn(n, 2) # t=0 のガウスノイズ
h = 1.0 / n_steps
for i in range(n_steps):
t = torch.full((n, 1), i * h)
x = x + h * net(torch.cat([x, t], 1)) # Euler法の1ステップ
return x
def energy_distance(X, Y):
d = lambda A, B: torch.cdist(A, B).mean()
return (2 * d(X, Y) - d(X, X) - d(Y, Y)).item()
torch.manual_seed(1)
real = sample_data(2000)
for n_steps in [1, 2, 4, 8, 64]:
gen = euler_sample(2000, n_steps)
print(f"Euler {n_steps:3d} ステップ エネルギー距離 = {energy_distance(gen, real):.4f}")
print(f"基準(実データ同士) エネルギー距離 = {energy_distance(sample_data(2000), real):.4f}")
Euler 1 ステップ エネルギー距離 = 1.4363
Euler 2 ステップ エネルギー距離 = 0.3457
Euler 4 ステップ エネルギー距離 = 0.0387
Euler 8 ステップ エネルギー距離 = 0.0193
Euler 64 ステップ エネルギー距離 = 0.0069
基準(実データ同士) エネルギー距離 = 0.0013
エネルギー距離は $2\mathbb{E}\|X-Y\| – \mathbb{E}\|X-X’\| – \mathbb{E}\|Y-Y’\|$ で定義される分布間の距離で、2つの分布が一致するときにのみ0になります(有限標本では0にならないので、最下行に「実データ同士の値」を基準として出しています)。
結果から読み取れることは明確です。ステップ数を増やすほど単調に改善し、64ステップで基準値の5倍程度まで近づきます。一方、1ステップではエネルギー距離1.44と全く形になっていません。これは学習の失敗ではなく、ODEの離散化誤差です。図4で見たように周辺速度場は曲がっているので、直線1本で近似すると大きくずれます。この「曲がり」をどう扱うかが、次の2節のテーマです。

図5は、より難しい「2つの月」を目標分布として同じ学習を行った結果です(入力を $\bm{x}$ と $t$ の周期的特徴量とした隠れ幅192の4層MLP、6000ステップ)。(a) の軌跡を見ると、$t=0$ の青い点群から出発した流れが月の形へ収束していく様子がわかります。軌跡がゆるやかに曲がっている点、そして互いに交差していない点に注目してください。ODEの解は一意なので、軌跡は原理的に交差できません。
(b) は4000点を生成して実データと重ねたもので、エネルギー距離は 0.0040、実データ同士の基準値 0.0035 とほぼ同じ水準です。三日月の細い先端まで再現できています。(c) は $t=0.5$ における学習した速度場で、$p_{0.5}$ のサンプル(水色)が存在する領域では月の形に向かう流れが、外側では中央に引き戻す流れができています。学習データが薄い領域でも破綻していないのは、ネットワークの平滑性のおかげです。
サンプリング — ソルバとステップ数
生成は $t=0$ から $t=1$ までODEを解くだけですが、どう解くかで必要な計算量が変わります。詳しくは常微分方程式の数値解法 — オイラー法からルンゲ=クッタ法までを参照してください。ここでは代表的な2つを押さえます。
Euler法(1次、1ステップあたり関数評価1回):
$$ \bm{x}_{t+h} = \bm{x}_t + h\, v_\theta(\bm{x}_t, t) $$
Heun法(2次、1ステップあたり関数評価2回): いったんEulerで先を覗いてから、両端の速度の平均で進み直します。
$$ \tilde{\bm{x}} = \bm{x}_t + h\, v_\theta(\bm{x}_t, t), \qquad \bm{x}_{t+h} = \bm{x}_t + \frac{h}{2}\Bigl( v_\theta(\bm{x}_t,t) + v_\theta(\tilde{\bm{x}}, t+h) \Bigr) $$
生成のコストはステップ数ではなく関数評価回数(NFE: number of function evaluations) で測るのが公平です。Heunは1ステップで2回評価するので、同じNFEならEulerの半分のステップ数しか刻めません。高次ソルバが常に得とは限らない理由がここにあります。

図6は、図5で学習した同じネットワークを使い、ソルバとステップ数を変えて実測したものです。上段のサンプルを見ると、1ステップでは原点付近の一点に潰れ、2ステップで大まかな形、4ステップで月の輪郭、8ステップでほぼ完成、という進み方をします。エネルギー距離は 1.2560 → 0.3417 → 0.0619 → 0.0136 と、ステップ数を倍にするごとに3.7〜5.5分の1に減っています。Euler法の1次精度から素朴に期待される「2分の1」より速いのは、この領域の誤差が「分布の形が崩壊しているかどうか」という大きな効果に支配されているためです。
下段の両対数プロットが本題です。NFEが小さい領域(2〜3)ではEulerが優勢で、NFE=2 でEuler 0.3417 に対しHeun(1ステップ)は 0.6974 と2倍悪い。刻みが粗すぎると、Heunの「先を覗く」評価が当てにならないからです。ところがNFE=4を境に逆転し、Heunは 0.0336 対 Euler 0.0619 と優位に立ちます。さらにHeunは NFE=8で0.0045 と有限標本のノイズ床 0.0035 にほぼ到達するのに対し、Eulerが同水準(0.0043)に届くのは NFE=24 — 3倍のコストを要します。
もう1つ重要な読み取りがあります。両方の曲線がNFE 20〜30あたりで床(灰色の破線)に張り付き、それ以上増やしても改善しないことです。この床は「学習した速度場がどれだけ正しいか」ではなく、有限標本で距離を測ることによる統計的な誤差です。ODEを精密に解いても、モデルそのものの誤差より良くはなりません。ステップ数を増やすのは、ある水準までは効くがそこで頭打ちになるという当たり前の事実を、数値で確認しておくのは有益です。
では、この「必要ステップ数」自体を減らすことはできないのでしょうか。図4と図5で見たように、周辺速度場が曲がっているのが原因でした。ならば、曲がりそのものを取り除けばよい — それがRectified Flowの発想です。
Rectified Flow と reflow — 経路をまっすぐにする
なぜ経路は曲がるのか
もう一度、図1に戻ります。ノイズ点とデータ点をランダムに組にした結果、経路どうしが交差していました。ここに本質があります。
いま、2本の条件付き直線経路が時刻 $t$ に同じ点 $\bm{x}$ で交差したとします。1本目は右上へ、2本目は左上へ向かっているとしましょう。ところがODEの速度場は、各点にただ1つのベクトルしか割り当てられません。定理1により、そこに入るのは2つの平均 — つまり真上向きです。どちらの条件付き経路とも違う方向になります。
これが、個々の経路は直線なのに周辺の流れが曲がる理由です。ODEの解軌跡は交差できない(解の一意性)ので、交差を避けるために迂回するしかない。図3(b)で、周辺速度がどの条件付き速度とも一致せず、長さも $|u_t|\approx 2.59$ と短くなっていたのは、まさにこの打ち消し合いです。
裏を返せば、交差しない対応づけ(カップリング)を使えば、周辺の流れも直線になるはずです。
直線性の指標
「どれだけ直線か」を数値化します。$\bm{x}_0$ から出発してODEを解いた終点を $\bm{X}_1$ とするとき
$$ S(v_\theta) = \int_0^1 \mathbb{E}_{\bm{x}_0}\Bigl\| (\bm{X}_1 – \bm{x}_0) – v_\theta\bigl( (1-t)\bm{x}_0 + t\bm{X}_1,\ t \bigr) \Bigr\|^2 dt \tag{15} $$
と定義します。もし軌跡が完全な直線なら、$\bm{x}_t$ は始点と終点の線形補間に一致し、そこでの速度は定数 $\bm{X}_1 – \bm{x}_0$ になるので $S=0$ です。逆に $S$ が大きいほど軌跡は曲がっています。
$S$ には直接的な意味があります。$S=0$ ならEuler法1ステップで厳密解が得られるからです。実際、速度が軌跡上で一定なら $\bm{x}_0 + 1\cdot v_\theta(\bm{x}_0, 0) = \bm{x}_0 + (\bm{X}_1-\bm{x}_0) = \bm{X}_1$ となります。$S$ は少ステップ生成のしやすさをそのまま測る量です。
reflow の手続き
Rectified Flow(Liu et al., 2023)が提案する reflow は、拍子抜けするほど単純な3手順です。
- 独立カップリング($\bm{x}_0$ と $\bm{x}_1$ をランダムに組む)でCFMを学習し、$v_1$ を得る
- $\bm{z}\sim\mathcal{N}(\bm{0},\bm{I})$ をたくさん引き、$v_1$ のODEを解いて $\bm{X}_1 = \mathrm{ODE}_{v_1}(\bm{z})$ を計算する。このペア $(\bm{z}, \bm{X}_1)$ を新しいカップリングとして保存する
- そのペアを使って、まったく同じCFM損失で $v_2$ を学習し直す
新しいカップリングの決定的な性質は、$\bm{z}$ から $\bm{X}_1$ への写像が決定的であることです。ODEの解は一意なので、同じ $\bm{z}$ からは必ず同じ $\bm{X}_1$ に行きます。つまり交差がありません。しかも周辺分布は保たれます — $\bm{z}$ の分布は $\mathcal{N}(\bm{0},\bm{I})$ のまま、$\bm{X}_1$ の分布は $v_1$ が生成する分布(≒データ分布)のままです。生成品質を保ったまま、対応づけだけを整理していることになります。
理論的には、reflowは任意の凸コスト $c$ に対する輸送コスト $\mathbb{E}[c(\bm{X}_1-\bm{z})]$ を増やさないことが示されます。回数を重ねるほど直線に近づき、$S$ は単調に減少します。

図9は、図5と同じ2つの月のデータでreflowを1回実行した結果です。上段の軌跡を比べると違いは歴然です。左の $v_1$(1回目の学習)は軌跡が大きく湾曲し、直線性の指標は $S = 1.2292$。右のreflow後の $v_2$ はほぼ完全な直線束になっており、$S = 0.0005$ — 約2500分の1です。
下段はその帰結です。$v_1$ のEuler 1ステップ生成(左)はエネルギー距離 1.2560 で、サンプルが原点付近の一点に潰れてしまっています。ところが $v_2$(右)では 0.0047、有限標本のノイズ床 0.0035 とほぼ同じ水準に達しています。1ステップ生成の誤差が267分の1になり、月の形が1回の関数評価で復元できています。
学習ログにも面白い痕跡が残ります。$v_1$ の学習損失は4.1〜4.6で下げ止まったのに対し、reflow後の $v_2$ の損失は 0.0006 まで落ちます。前に議論したとおり、CFM損失の下限は条件付き分散 $\mathrm{Var}(u_t(\bm{x}_t\mid z)\mid \bm{x}_t)$ でした。reflowのカップリングは決定的なので、$\bm{x}_t$ が決まれば $(\bm{z}, \bm{X}_1)$ もほぼ一意に決まり、条件付き分散が消えるのです。損失の値そのものが、経路の交差の量を測っているわけです。
なお、reflowにはコストもあります。手順2でODEを大量に解く必要があり、また $v_1$ の生成誤差が $v_2$ の学習データに焼き込まれるため、回数を重ねると品質がわずかに劣化していきます。実務では1〜2回に留め、その後に蒸留を組み合わせるのが一般的です。
実務的な利点と設計の自由度
理論と実験を踏まえて、Flow Matchingが実務で選ばれる理由を整理します。
1. 学習が安定する。 目標値が $\bm{x}_1-\bm{x}_0$ という $O(1)$ スケールの量で、$t$ によらずスケールが一定です。拡散モデルでは $t$ によって $\bm{\epsilon}$ 予測と $\bm{x}_0$ 予測のどちらが自然かが変わり、SNRに応じた損失重み付け(min-SNR重み付けなど)を入れないと学習が偏りました。Flow Matchingでは $t\sim\mathcal{U}[0,1]$ の素朴なサンプリングで素直に学習が進みます。実際、Stable Diffusion 3 の論文(Esser et al., 2024)は rectified flow の定式化を採用し、$t$ のサンプリング分布を中央を厚くしたロジット正規分布にする程度の工夫で高解像度学習を安定させたと報告しています。
2. 経路を自由に設計できる。 式(10)は $\alpha_t, \sigma_t$ を自由に選べる一般形でした。線形補間と三角スケジュールは両端にすぎず、目的に応じて中間を選べます。さらに条件変数 $z$ の選び方も自由です。ミニバッチ内で $\bm{x}_0$ と $\bm{x}_1$ の割り当てを最適輸送で決める OT-CFM は、交差を減らして最初から直線に近い流れを作る手法で、reflowを事前に一部済ませたような効果があります。
3. 出発点がガウスである必要がない。 拡散モデルは「ノイズを足して壊す」という物語に縛られていたので、終点は必ずガウスでした。Flow Matchingは $p_0$ と $p_1$ の両方を自由に選べます。低解像度画像→高解像度画像、劣化画像→復元画像、あるタンパク質の構造→別の構造といった問題を、まったく同じ損失で書けます。$\bm{x}_0$ を「対応する低解像度画像」にするだけです。
4. 少ステップ生成と相性がよい。 直線経路を選び、reflowで整えれば、図9で見たとおり1〜4ステップで実用的な品質に届きます。拡散モデルの高速化が「曲がった経路をいかに巧妙に近似するか」(DDIM、DPM-Solverなど)だったのに対し、Flow Matchingはそもそも曲がりを作らないという方向で攻められます。
5. 拡散の資産をそのまま使える。 式(14)で見たようにスコアと速度は1対1なので、ネットワーク構造(U-Net、DiT)、条件付け(classifier-free guidance)、高速ソルバの理論は、ほぼ書き換えなしで流用できます。実際、既存の拡散モデルのコードベースで変更が必要なのは、損失の数行とサンプラの時間の向きだけ、ということも珍しくありません。
一方で注意点もあります。線形補間経路は $t\to 1$ で $\sigma_t\to0$ となるため、データ分布に特異性がある(多様体上に乗っている)場合には $t=1$ 近傍で速度場が急峻になります。実務ではデータを潜在空間に落としてから(オートエンコーダの潜在変数上で)Flow Matchingを行うことで、この問題を緩和しています。また、CFM損失の値そのものはモデルの良し悪しを表さないので、評価には必ず生成サンプルの指標を使う必要があります。
まとめ
本記事では、Flow Matchingの数理を導出から実験まで通して解説しました。
- 連続正規化フローは速度場 $v_t$ とODEで分布を運ぶ枠組みで、分布と速度場は連続の式 $\partial_t p_t + \nabla\cdot(p_t v_t) = 0$ で結ばれる。従来のCNFは尤度学習のために毎回ODEを解く必要があり、高次元にスケールしなかった
- Flow Matching損失 $\mathbb{E}\|v_\theta – u_t\|^2$ は理想的だが、真の速度場 $u_t$ も $p_t$ からのサンプリングも計算できない
- Conditional Flow Matching がこれを解く。定理1(周辺化)は $u_t(\bm{x}) = \mathbb{E}[u_t(\bm{x}\mid z)\mid \bm{x}_t=\bm{x}]$ を示し、定理2(勾配一致)は交差項で $p_t(\bm{x})$ が約分されることから $\nabla_\theta\mathcal{L}_{\mathrm{FM}} = \nabla_\theta\mathcal{L}_{\mathrm{CFM}}$ を示す。計算できない量を、計算できる量の回帰で当てにいける
- 線形補間経路 $\bm{x}_t = (1-t)\bm{x}_0 + t\bm{x}_1$ を選ぶと、目標速度は $\bm{x}_1 – \bm{x}_0$ という時間に依存しない差ベクトルになる。学習ループはわずか数行
- CFM損失はゼロに落ちない。下限は条件付き分散で、これは正常な挙動である
- 拡散モデルはFlow Matchingの特殊例。分散保存スケジュールを選んだ場合に対応し、経路は円弧を描く(実測で線形補間の2倍以上曲がる)。スコアと速度は $u_t = \frac{\dot\alpha_t}{\alpha_t}\bm{x} + \sigma_t^2\frac{\dot\lambda_t}{\lambda_t}s_t$ で1対1に変換でき、数値検証でも $10^{-14}$ の精度で一致する
- サンプリングはEuler/HeunでODEを解くだけ。NFEが小さいうちはEuler、NFE=4以上ではHeunが有利で、Heunは3分の1のコストで同水準に届く
- Rectified Flow / reflow は経路の交差を取り除いて流れを直線化する。実験では直線性の指標が約2500分の1、1ステップ生成の誤差が267分の1になった
Flow Matchingが本当に変えたのは、生成モデルを考えるときの主語かもしれません。「どうやってデータを壊すか」ではなく「どの経路で運ぶか」を主語にすると、拡散モデルもrectified flowも同じ地図の上の別の点として見えてきます。
次のステップとして、以下の記事も参考にしてください。