U5.6 實作:先有解析答案,再檢查 CD 與 CT 學到了什麼
我們要驗證哪三個問題?
U5.0 已算出 denoiser 不等於終點 map;U5.3 又分開了 CT 單筆方向、Euler 平均位置與精確 trajectory。現在若直接換成複雜圖片,我們很難判斷程式錯了,還是模型尚未訓好。
因此先用同一個可算到底的資料分布 。本篇的實驗任務是:先檢查可推得的等式,再實際訓練網路,最後比較 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 冒充訓好的網路。
先建立可以用來對答案的函數
沿用 ,則
第一行用獨立 Gaussian 的變異數相加;第二行從 score 換成 VE velocity;第三行由沿 trajectory 不變的 得到。這些是 oracle functions,只在評估與明確標示的 teacher 位置使用。
本實驗取 ,直接從精確 抽起點,排除有限 的 prior mismatch。這與實際生成常用 近似不同;不能把兩種起點混在同一個歸因裡。
固定一個 noisy input,檢查 CT 平均位置
固定 時,Gaussian posterior 是
因此可以真的抽出許多相容的 ,以 找回各自的 noise,再算 。程式輸出 u5-local.csv,列出三個間隔的條件平均誤差、條件標準差與 Euler 對精確位置的差距。
先寫下猜測: 減半時,標準差與 Euler error 各應怎麼縮小?對照 U5.3,前者按 變化,後者在光滑區域由二階量控制。有限樣本的質心還有 Monte Carlo error;不能替單次平均指定一個必然通過的任意小門檻。
用同一個網路,只改相鄰位置的來源
MLP 在訓練函數外定義,cm_forward 將它包成邊界參數化。與理論篇相同, 時 skip 係數為 、output 係數為 ,所以訓練前已保證 。
每個 batch 抽 與相鄰時間 ,合成 。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 也通常不為零。若 learned map 的數字已接近它的地板,不能用一個很小的差就宣告方法優劣。
一步與多步,用不同數字回答不同問題
u5-results.csv 的 map_rmse 在一步時,對同一個起點比較 與解析 ;這能直接量函數差距。empirical_w2 則將生成與獨立 reference samples 各自排序後,比較同順位的位置:
這是一維等權 empirical distributions 的精確 ,不是 population 的精確值。每個 seed 使用 個樣本,並保留獨立資料 reference。
多步使用 cm_sample:每次先回乾淨端,再用新 noise 合成下一個 的輸入。calls 是 CM 求值次數;oracle 也走完全相同的多步程序。先預測哪些項目應保持在抽樣地板附近,再執行比較。
一次實際執行的設定為 updates、seeds 、每組 samples;一步 empirical 的三種子範圍為 CD –、CT –,oracle –。這些區間是三次結果的最小與最大值,不是信賴區間,也不足以排出一般方法名次。
接著改哪一個因素?
- 固定 network、seed 與更新數,只改
max_grid,分開看 local target 表與 trained map RMSE,檢查是否真的能由前者預測後者。 - 將 CD 的 Euler 相鄰點換成解析 ,讓兩個版本使用相同初始參數,比較 finite-gap 誤差。
- 將起點改成 ,比較 oracle 的變化,單獨量 prior mismatch。
- 用 U5.5 的 代替網路,直接核對 Gaussian variance recurrence,再回來看 learned map 是否符合相同簡化。
互動 demo:先用解析答案對照。 每個數字由目前參數重新計算;實際訓練結果另見實作程式。
消化一下
參考文獻
主要理論參考:The Principles of Diffusion Models,§11.2 的 CD/CT、sampling 與 §11.3 的停止梯度更新;Gaussian oracle 與小型 NumPy 網路是本課程實驗。正文的符號沿用本課程;方法實作細節再對照下列原始論文。
- Song, Dhariwal, Chen & Sutskever, Consistency Models (ICML 2023)。
- Song & Dhariwal, Improved Techniques for Training Consistency Models (ICLR 2024)。
- Karras, Aittala, Aila & Laine, Elucidating the Design Space of Diffusion-Based Generative Models (NeurIPS 2022)。
- Liu, Gong & Liu, Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow (ICLR 2023)。