U6.2 16 分鐘閱讀 2026年9月

U6.2 Consistency Function:同一條軌跡,同一個終點

本篇重用M2.0河面上的箭頭:Vector Field 與 ODE·M2.1從一片葉子到一群葉子:Flow Map 與 Pushforward

先看一條軌跡

畫一條 PF-ODE 的軌跡:從 t=Tt=T 的一團噪聲出發,往 t=0t=0 走,落在一張乾淨的圖上。上一篇 Q1 的 GG 只管這條軌跡的兩端;progressive distillation 管的是相鄰網格點之間。現在換一個看法:這條軌跡上的每一個點,不管它在 t=Tt=Tt=T/2t=T/2 還是 t=0.01t=0.01,它們有一個共同點——都會走到同一個終點。

把「這個點會走到哪裡」當成一個函數。給軌跡上任何一點 (xt,t)(x_t,t),回答「它的終點是什麼」。這個函數在整條軌跡上是常數,換到另一條軌跡才換值。

這就是 Song et al. [1] 的 consistency function

f(xt,t)=該點所在 PF-ODE 軌跡在乾淨端的位置.f(x_t,t)=\text{該點所在 PF-ODE 軌跡在乾淨端的位置}.

(原文把乾淨端放在一個很小的 t=εt=\varepsilonε=0.002\varepsilon=0.002)而不是 t=0t=0 本身,因為 t0t\to0 時 score 的數值行為不好;所以嚴格說 f(xt,t)=xεf(x_t,t)=x_\varepsilon。下面所有「終點」都指 xεx_\varepsilon,讀的時候當成 x0x_0 即可。)

U2.1 的 flow map 記號說,f(,t)=ψtεf(\cdot,t)=\psi_{t\to\varepsilon}:一端固定在乾淨端、另一端任意的 flow map。上一篇的 G=ψTε=f(,T)G=\psi_{T\to\varepsilon}=f(\cdot,T) 是它在 t=Tt=T 那一片的值。所以「學 ff」比「學 GG」要求更多——不只要會從純噪聲一步到終點,也要會從任何一個半噪聲的點一步到終點。這正是上一篇說 PD 只解掉一半的那件事:學生要看過所有的 tt,而且不是固定步長,是直接到底。

這個 ff 必須滿足什麼

邊界條件。 在乾淨端,點就是它自己的終點:

f(x,ε)=x.f(x,\varepsilon)=x .

自我一致性(self-consistency)。 同一條軌跡上任兩點的輸出相同:

f(xt,t)=f(xt,t)對同一條軌跡上的所有 t,t.f(x_t,t)=f(x_{t'},t')\qquad\text{對同一條軌跡上的所有 }t,t' .

用 flow map 寫,就是 f(xt,t)=f(ψtt(xt),t)f(x_t,t)=f\big(\psi_{t\to t'}(x_t),t'\big)

這兩條合起來唯一決定 ff:從任何 (xt,t)(x_t,t) 出發,沿軌跡走到 ε\varepsilon,自我一致性說值不變,邊界條件說那裡的值就是 xεx_\varepsilon。少了任何一條都不行,而且缺邊界條件時壞得很明顯——常數函數 fcf\equiv c 滿足自我一致性(任何兩點輸出當然相同),卻什麼都沒學到。邊界條件是把這個平凡解排除掉的東西。這件事馬上會影響參數化與損失的設計。

課堂提問Q1

上一節說了,缺邊界條件時自我一致性有平凡解。下一節會把 fθ(x,ε)=xf_\theta(x,\varepsilon)=x 寫死在架構裡。但看起來有更省事的做法:在損失裡多加一項 fθ(x,ε)x2\|f_\theta(x,\varepsilon)-x\|^2,讓網路自己學會邊界就好。

這兩種做法差在哪裡?

先想一想,再展開看整理後的答案

差在平凡解還在不在搜尋空間裡

加一個損失項,等於讓兩個目標互相拉扯:一致性項把 fθf_\theta 往「在每條軌跡上是常數」拉——那一族解裡包含常數映射——邊界項再把它往回拉。兩邊都不是硬約束,所以訓練可以停在中間的任何地方,而且停在哪裡取決於兩項的權重、學習率、初始化。更糟的是這個拉扯不會隨訓練變小:一致性項在平凡解上是嚴格的 0,它永遠有動機往那邊走。

寫進架構之後,fθ(x,ε)=xf_\theta(x,\varepsilon)=x每一組參數都成立。平凡解不是被懲罰,是根本不在參數空間裡——沒有任何一組 θ\theta 能讓 fθf_\theta 是常數。剩下的損失就只做它該做的事:把乾淨端那個已經正確的值沿軌跡傳出去。

這個對比值得記住,因為它在別的地方也成立:一個條件如果是「答案的定義」的一部分,就寫進架構;如果只是「希望它大致成立」,才放進損失。 cskip,coutc_{\text{skip}},c_{\text{out}} 那組係數不是為了漂亮,是在做這件事。

(也因為這樣,U6.3 的 CT 才能完全不用 teacher:它手上沒有任何外部的正確答案,全部的訊號都從這個邊界長出來。錨要是軟的,就什麼都撐不住了。)

參數化:讓邊界自動成立

現在用網路 fθf_\theta 逼近 ff。邊界條件 f(x,ε)=xf(x,\varepsilon)=x 既是精度問題、也是上面那個退化解的唯一防線,所以不能交給網路「學會」;要把它寫進架構。Song et al. 沿用 EDM [2] 的形式:

  fθ(x,t)=cskip(t)x+cout(t)Fθ(x,t)  ,cskip(ε)=1,cout(ε)=0.\boxed{\;f_\theta(x,t)=c_{\text{skip}}(t)\,x+c_{\text{out}}(t)\,F_\theta(x,t)\;},\qquad c_{\text{skip}}(\varepsilon)=1,\quad c_{\text{out}}(\varepsilon)=0 .

FθF_\theta 是任意網路(原文用 U-Net),cskipc_{\text{skip}}coutc_{\text{out}} 是兩個只跟 tt 有關、我們自己選的可微函數。在 t=εt=\varepsilonfθ(x,ε)=xf_\theta(x,\varepsilon)=x,不管 FθF_\theta 輸出什麼——邊界條件對任何 θ\theta 都成立,平凡解 fcf\equiv c 從一開始就被排除。

具體的選擇(原文的版本,σd\sigma_d 是資料的標準差,取 0.50.5):

cskip(t)=σd2(tε)2+σd2,cout(t)=σd(tε)σd2+t2.c_{\text{skip}}(t)=\frac{\sigma_d^2}{(t-\varepsilon)^2+\sigma_d^2},\qquad c_{\text{out}}(t)=\frac{\sigma_d\,(t-\varepsilon)}{\sqrt{\sigma_d^2+t^2}} .

讀法:tt 接近 ε\varepsiloncskip1c_{\text{skip}}\approx1cout0c_{\text{out}}\approx0fθf_\theta 幾乎是恆等——這也符合真實的 ff:噪聲很小時終點就在腳邊。tt 很大時 cskip0c_{\text{skip}}\to0coutσdc_{\text{out}}\to\sigma_dfθσdFθf_\theta\approx\sigma_d F_\theta——網路直接輸出(尺度正確的)終點,因為此時 xx 幾乎是純噪聲、沒什麼值得保留的。中間是兩者的混合。

這個形式應該很眼熟。U1.2x0x_0-、ϵ\epsilon-、vv-prediction 是同一個 denoiser 的三個 affine 座標;EDM 的 denoiser D(x,t)=cskipx+coutFD(x,t)=c_{\text{skip}}x+c_{\text{out}}F 是同一組座標的另一種寫法——讓網路預測「xxx0x_0 之間、尺度被正規化過的那個差量」。consistency model 借用了 denoiser 的參數化來表示一個不是 denoiser 的東西:denoiser 輸出 E[x0xt]\mathbb E[x_0\mid x_t](後驗平均、一個 xtx_t 對很多 x0x_0),ff 輸出 ODE 軌跡的終點(一對一)。兩者在 tεt\to\varepsilon 時都趨近恆等,所以同一組 cskip,coutc_{\text{skip}},c_{\text{out}} 兩邊都合用;這也是為什麼 CM 的網路可以直接從訓好的 diffusion 模型初始化。

損失:相鄰兩點要一致

邊界條件交給架構之後,剩下要學的只有自我一致性。最直接的想法是:抽同一條軌跡上的兩點 (xt,t)(x_t,t)(xt,t)(x_{t'},t'),要求 fθf_\theta 在兩處輸出相同。

Song et al. 把時間切成網格 ε=t1<t2<<tN=T\varepsilon=t_1<t_2<\cdots<t_N=T只對相鄰的兩格要求一致:

  LCM=E[λ(tn)d(fθ(xtn+1,tn+1), fθ(x^tn,tn))]  \boxed{\;\mathcal L_{\text{CM}}=\mathbb E\Big[\lambda(t_n)\,d\Big(f_\theta\big(x_{t_{n+1}},t_{n+1}\big),\ f_{\theta^-}\big(\hat x_{t_n},t_n\big)\Big)\Big]\;}

逐項讀。xtn+1=x0+tn+1ϵx_{t_{n+1}}=x_0+t_{n+1}\epsilon 是普通的加噪聲;x^tn\hat x_{t_n}同一條軌跡上、往乾淨端走一格的點——它從哪裡來是下一篇的全部內容,這裡先當成已知。dd 是一個距離(原文用 2\ell_2 或 LPIPS),λ\lambda 是時間權重(原文取 1)。θ\theta^-目標網路的參數:原文用 θ\theta 的 EMA,並對這一側 stop-gradient。

兩個「為什麼」。

為什麼只用相鄰點就夠? 因為一致性會沿網格傳遞。fθ(,t1)f_\theta(\cdot,t_1) 由架構保證是恆等,所以是對的。(t1,t2)(t_1,t_2) 那一項把 fθ(,t2)f_\theta(\cdot,t_2) 拉向 f(,t1)f(\cdot,t_1) 的值——也就是拉向真值。(t2,t3)(t_2,t_3) 再把 t3t_3 拉向已經對了的 t2t_2。歸納下去,整條網格都被錨定到邊界。相鄰點的另一個好處是:從 xtn+1x_{t_{n+1}}x^tn\hat x_{t_n} 只需要走一小步,這一步的誤差是 O(Δt2)O(\Delta t^2)U3.2 的局部誤差);如果要求任意兩點一致,就得走很多步,把 teacher 的整條 ODE 又搬回來。

為什麼目標那一側要 stop-gradient? 如果兩側都讓梯度流過,網路最省事的辦法是把 fθ(,t)f_\theta(\cdot,t)t>εt>\varepsilon 都壓成幾乎不隨 xx 變、只在 t=εt=\varepsilon 附近急轉回恆等——一致性項近乎零,但什麼也沒學到。stop-gradient 讓資訊只能單向流動:tnt_n 那一側是「已經知道的答案」,tn+1t_{n+1} 那一側是「要被教會的」;配合上一段的歸納,資訊從邊界一路往 TT 傳。用 EMA 做目標則是另一層平滑,它在對付什麼、該不該用,留到 U6.4

展開細節這個損失和 progressive distillation 的關係

PD 要求「學生一步到 t−2Δ 的位置 = teacher 兩步的位置」,比較的是中間點;CM 要求「兩個相鄰點各自跳到終點,落點要相同」,比較的是終點。兩者都只用相鄰的網格點、都需要「同一條軌跡上再一點」。差別是 CM 沒有輪次:NN 個網格點一次全部訓、學生從頭到尾學的都是「直接到終點」,不會有「最後兩輪最難」的問題,因為沒有輪。時間網格 NN 在 CM 裡的角色也不同——它不是取樣步數,而是訓練時「相鄰」的密度;U6.3 會看到 NN 同時控制 bias 與 variance。

訓好之後,一步生成就是抽 xTN(0,T2I)x_T\sim\mathcal N(0,T^2I)、算 fθ(xT,T)f_\theta(x_T,T)。也可以多步(跳到終點、加噪聲到某個 tt、再跳),那是 U6.5 的題目。

損失裡還有一個空格沒填:x^tn\hat x_{t_n}——「同一條軌跡上、往乾淨端走一格的點」——到底怎麼算?有 teacher 就走一步 Euler;沒有 teacher 呢?

先消化一下

想一想

Consistency function f(xt,t)f(x_t,t) 與上一篇的一步生成器 G(xT)G(x_T) 的關係是:

想一想

為什麼邊界條件 f(x,ε)=xf(x,\varepsilon)=x 不能省?

想一想

參數化 fθ=cskip(t)x+cout(t)Fθf_\theta=c_{\text{skip}}(t)x+c_{\text{out}}(t)F_\theta 中,cskip(ε)=1c_{\text{skip}}(\varepsilon)=1cout(ε)=0c_{\text{out}}(\varepsilon)=0 的作用是:

想一想

CM 損失只要求相鄰兩個網格點一致,卻能學到整條網格上的 ff。理由是:

參考文獻

  1. Song, Y., Dhariwal, P., Chen, M., Sutskever, I. Consistency Models. ICML 2023.(定義、邊界條件、自我一致性、參數化、相鄰點損失。)
  2. Karras, T., Aittala, M., Aila, T., Laine, S. Elucidating the Design Space of Diffusion-Based Generative Models. NeurIPS 2022.(cskipc_{\text{skip}}coutc_{\text{out}} 的原始形式與 σd\sigma_d。)