搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    U5.6 8 分鐘閱讀 2026年10月

    U5.6 實作:先有解析答案,再檢查 CD 與 CT 學到了什麼

    本篇重用2 篇

    我們要驗證哪三個問題?

    U5.0 已算出 denoiser 不等於終點 map;U5.3 又分開了 CT 單筆方向、Euler 平均位置與精確 trajectory。現在若直接換成複雜圖片,我們很難判斷程式錯了,還是模型尚未訓好。

    因此先用同一個可算到底的資料分布 x0∼N(0,1)x_0\sim\mathcal N(0,1)。本篇的實驗任務是:先檢查可推得的等式,再實際訓練網路,最後比較 map error 與 sampling law。這些機制確認後,才有理由擴展到 two moons 或圖片。

    下載完整 Python 程式(NumPy) · 下載可獨立執行的 notebook

    python -m pip install numpy
    python dma_fast_maps.py --unit 5 --steps 2500 --seeds 0 1 2 --out u5-results

    程式包含可訓練的單隱藏層 tanh MLP、backprop、Adam、CD/CT、抽樣與輸出表格,沒有依賴前面未提供的 toy.py 或 checkpoint。用 NumPy 展開小網路,是為了讓 target 與梯度停止的位置能直接檢查;不是將解析 map 冒充訓好的網路。

    先建立可以用來對答案的函數

    沿用 xt=x0+tϵx_t=x_0+t\epsilon,則

    pt=N(0,1+t2),vt(x)=tx1+t2,f(x,t)=x1+t2.\begin{aligned} p_t&=\mathcal N(0,1+t^2),\\ v_t(x)&=\frac{tx}{1+t^2},\\ f(x,t)&=\frac{x}{\sqrt{1+t^2}}. \end{aligned}

    第一行用獨立 Gaussian 的變異數相加;第二行從 score −x/(1+t2)-x/(1+t^2) 換成 VE velocity;第三行由沿 trajectory 不變的 xt/1+t2x_t/\sqrt{1+t^2} 得到。這些是 oracle functions,只在評估與明確標示的 teacher 位置使用。

    本實驗取 T=2T=2,直接從精確 pT=N(0,5)p_T=\mathcal N(0,5) 抽起點,排除有限 TT 的 prior mismatch。這與實際生成常用 N(0,T2)\mathcal N(0,T^2) 近似不同;不能把兩種起點混在同一個歸因裡。

    固定一個 noisy input,檢查 CT 平均位置

    固定 xt=xx_t=x 時,Gaussian posterior 是

    x0∣xt=x∼N(x1+t2,t21+t2).x_0\mid x_t=x\sim\mathcal N\left( \frac{x}{1+t^2},\frac{t^2}{1+t^2}\right).

    因此可以真的抽出許多相容的 x0x_0,以 ϵ=(x−x0)/t\epsilon=(x-x_0)/t 找回各自的 noise,再算 x0+(t−h)ϵx_0+(t-h)\epsilon。程式輸出 u5-local.csv,列出三個間隔的條件平均誤差、條件標準差與 Euler 對精確位置的差距。

    先寫下猜測:hh 減半時,標準差與 Euler error 各應怎麼縮小?對照 U5.3,前者按 hh 變化,後者在光滑區域由二階量控制。有限樣本的質心還有 Monte Carlo error;不能替單次平均指定一個必然通過的任意小門檻。

    用同一個網路,只改相鄰位置的來源

    MLP 在訓練函數外定義,cm_forward 將它包成邊界參數化。與理論篇相同,t=0t=0 時 skip 係數為 11、output 係數為 00,所以訓練前已保證 fθ(x,0)=xf_\theta(x,0)=x。

    每個 batch 抽 x0,ϵx_0,\epsilon 與相鄰時間 s<ts<t,合成 xt=x0+tϵx_t=x_0+t\epsilon。CD 與 CT 只在下列這一行不同:

    lower = xt - (t-s)*ve_velocity(xt, t) if mode == 'CD' else x0+s*eps

    CD 使用 oracle velocity 當 teacher,但仍只是 Euler step;CT 使用同一份資料與 noise。兩者再共同執行

    target, _ = cm_forward(net, lower, s, T)
    pred, (features, hidden, out) = cm_forward(net, xt, t, T)
    weight = 1 / (t-s)
    net.update(features, hidden, 2*weight*(pred-target)*out/batch)

    target 在數值上用當前參數計算,但 backprop 只經過 pred;最後一行的 out 是參數化的 output 係數。程式的 manual backprop 不會沿 lower 或 target branch 傳梯度。這是完整可執行的 stopped-gradient 更新,不是省略 optimizer 的 pseudocode。

    本程式使用平方 discrepancy、均勻網格與逐階加密,目的是對照推導;它不是 iCT 完整的 image-training recipe。要測 pseudo-Huber 或不同時間抽樣,可以每次只換一項設計。

    課堂提問Q1

    CD 使用精確 velocity teacher。如果它生成的分布還有差距,可以把差距全部叫作 teacher error 嗎?

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

    不行。這個 teacher 的 velocity 是解析的,但相鄰位置仍使用 Euler,且學生只有有限網路與有限更新。要分開檢查:Euler 對精確相鄰位置的誤差、學生對終點 map 的誤差,以及 sample-based distribution estimate 的誤差。

    程式因此保留 oracle sampler 作對照:連精確 map 的有限樣本 empirical W2W_2 也通常不為零。若 learned map 的數字已接近它的地板,不能用一個很小的差就宣告方法優劣。

    一步與多步,用不同數字回答不同問題

    u5-results.csv 的 map_rmse 在一步時,對同一個起點比較 fθ(xT,T)f_\theta(x_T,T) 與解析 f(xT,T)f(x_T,T);這能直接量函數差距。empirical_w2 則將生成與獨立 reference samples 各自排序後,比較同順位的位置:

    W^2=1n∑i=1n(x(i)−y(i))2.\widehat W_2 =\sqrt{\frac1n\sum_{i=1}^n \big(x_{(i)}-y_{(i)}\big)^2}.

    這是一維等權 empirical distributions 的精確 W2W_2,不是 population W2W_2 的精確值。每個 seed 使用 40964096 個樣本,並保留獨立資料 reference。

    多步使用 cm_sample:每次先回乾淨端,再用新 noise 合成下一個 τ\tau 的輸入。calls 是 CM 求值次數;oracle 也走完全相同的多步程序。先預測哪些項目應保持在抽樣地板附近,再執行比較。

    一次實際執行的設定為 25002500 updates、seeds 0,1,20,1,2、每組 40964096 samples;一步 empirical W2W_2 的三種子範圍為 CD 0.04380.0438–0.06480.0648、CT 0.04680.0468–0.08330.0833,oracle 0.04260.0426–0.05360.0536。這些區間是三次結果的最小與最大值,不是信賴區間,也不足以排出一般方法名次。

    接著改哪一個因素?

    1. 固定 network、seed 與更新數,只改 max_grid,分開看 local target 表與 trained map RMSE,檢查是否真的能由前者預測後者。
    2. 將 CD 的 Euler 相鄰點換成解析 ψt→s(xt)\psi_{t\to s}(x_t),讓兩個版本使用相同初始參數,比較 finite-gap 誤差。
    3. 將起點改成 N(0,T2)\mathcal N(0,T^2),比較 oracle 的變化,單獨量 prior mismatch。
    4. 用 U5.5 的 f^=(1+ct)f\hat f=(1+ct)f 代替網路,直接核對 Gaussian variance recurrence,再回來看 learned map 是否符合相同簡化。

    互動 demo:先用解析答案對照。 每個數字由目前參數重新計算;實際訓練結果另見實作程式。

    消化一下

    想一想

    為什麼本篇從 N(0,1+T2)\mathcal N(0,1+T^2) 抽起點?

    想一想

    Oracle 的 empirical W2W_2 非零,表示什麼?

    想一想

    程式的停止梯度在哪裡實現?

    參考文獻

    主要理論參考:The Principles of Diffusion Models,§11.2 的 CD/CT、sampling 與 §11.3 的停止梯度更新;Gaussian oracle 與小型 NumPy 網路是本課程實驗。正文的符號沿用本課程;方法實作細節再對照下列原始論文。

    1. Song, Dhariwal, Chen & Sutskever, Consistency Models (ICML 2023)。
    2. Song & Dhariwal, Improved Techniques for Training Consistency Models (ICLR 2024)。
    3. Karras, Aittala, Aila & Laine, Elucidating the Design Space of Diffusion-Based Generative Models (NeurIPS 2022)。
    4. Liu, Gong & Liu, Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow (ICLR 2023)。