Skip to content

DDPM 實作驗收:時間係數怎麼對上 batch|CMU 10-423 作業 2

2026年9月30日1 分鐘
TL;DR會抄加噪公式,還不代表 diffusion 實作正確。

查詞與收藏

正在載入查詞工具…

🌏 English version

影片狀態:錄影需登入或課程授權。 本文依公開投影片與作業整理,數值例子為本站補充,不是課堂逐字稿。

會抄加噪公式,還不代表 diffusion 實作正確。作業 2 的核心是把時間係數、影像 batch、網路預測與逆向取樣對起來。本篇提供一個能手算的 broadcasting 例子,再建立測試與診斷順序;不提供官方 TODO 的完整解答。先備是 autograd、第 7–8 堂的前向/逆向公式,與 CNN 的張量觀念。

官方底本是 hw2.zip。檔案要求修改 diffusion.py 與 unet.py 的 TODO,starter 的 test_diffusion.py 可做部分驗收。注意此作業 p_losses 指定比較真實與預測噪聲的 L1 loss,而上一堂介紹 DDPM 論文常用的 simplified MSE。兩個目標要分清楚,不為「更標準」就改掉作業設定。

環境與資料先過一輪

下載並解壓官方 archive,在隔離環境依 requirements 安裝套件,再執行 python test_diffusion.py。先辨認 import、路徑與未實作 TODO 的失敗,再診斷公式。官方包附帶影像資料,先讀實際 transforms 與模型的 image_size,不把原始檔案尺寸當成進入 U-Net 的尺寸。

原導讀記錄資料影像為 36×36、模型預設 image_size 為 32。這提醒我們 resize/crop 是資料流的一部分。生成影像是否正常前,先印出一個 batch 的 shape、範圍、channel 次序與訓練/驗證來源;不要直接拿看起來像圖片的 tensor 當作已經符合輸入契約。

自擬兩筆 batch 的完整加噪

用 [B,C,H,W]=[2,1,1,2] 的小 batch。乾淨值 A=[2,0]、B=[1,−1],選定 timestep 的 ᾱ 分別為 0.64 與 0.81;本次抽的噪聲 A=[1,−1]、B=[0,2]。每筆時間不同,但同一筆的係數要作用到所有畫素。

A 的訊號/噪聲係數是 0.8 與 0.6,因此 noisy A=[2.2,−0.6]。B 的係數是 0.9 與 √0.19≈0.4359,因此 noisy B=[0.9,−0.0282]。將兩筆收整合 batch,t 的 shape 是 [2],查表取係數後需整理成 [2,1,1,1],才能 broadcast 到原影像 shape。

若係數保留 [2],它會對上最後一個寬度維度,恰好 W=2 時程式甚至能跑,卻讓每筆的不同畫素用了不同 timestep。這是為甚麼只測 B=1 或恰巧平方的 shape 很危險:錯誤可能被維度巧合藏起來。

訓練目標要對上同一份噪聲

假設模型對四個位置的噪聲都預測 0。作業的 mean L1 是 (|1|+|−1|+|0|+|2|)/4=1。若採用 mean MSE 則是 (1+1+0+4)/4=1.5。兩者不是同一個報告尺度,梯度也不同;對誤差為零的 L1,框架通常採零次梯度。

如果 q_sample 與 loss 各自重新抽噪聲,輸入由一份 ε 建成、標籤卻是另一份,學習問題就變了。測試時注入固定噪聲,先證明 input-target 關係,再讓訓練使用隨機抽樣。不要用「每次 loss 都不同」當成正確隨機性的證據。

逆向鏈另做邊界測試

官方取樣程式由預測噪聲估計 x̂₀、限制它的範圍,再使用 posterior mean/variance 做一步逆向取樣。clip 可以避免極端估計,但也會改變直接線性換算結果,因此測試 clip 時必須區分範圍內與範圍外例子。

最後一步通常不加新噪聲。實作若採零起算 t,要先寫下「程式 t=0 對應數學哪一個步驟」,不能同時用 ᾱ₀=1 的數學 sentinel 與查表第一個已加噪係數,造成 off-by-one。測試最早/最晚索引、每筆不同 t,以及固定 z 下的逆向結果。

U-Net 另有空間維度問題。downsample 次數、skip connections 與 upsample 必須把同尺度 tensor 接起來;shape 正確只是最低條件。time embedding 是否真的影響輸出,也值得用同一 x、兩個 t 做檢查。

訓練、評估與提交證據

先讓小 batch 完成 forward/backward,確認應更新的參數收到有限梯度,再做短 smoke run。報告訓練步數、seed、資料子集、loss 定義與生成參數。少量樣本可看 pipeline 是否運作,不能證明整個分佈品質。

FID 還要確認 reference folder 與 preprocess。原導讀指出 PDF 描述與 starter 建 reference path 的方式可能不同;實際使用哪個資料夾應按本次執行查明,不直接沿用檔案敘述。測試透過、訓練成功、FID 計算與官方評分是不同證據。

變式題與答案

若 batch=3、channels=2、height=4、width=5,t 為 [3],查表後 broadcast 係數的 shape 應為甚麼?答案 [3,1,1,1],不是 [3,2,4,5] 的必要實體複製,也不是 [3]。

前例把模型預測改成真實噪聲,L1=0;但若逆向 variance 或索引錯,取樣仍可失敗。這說明噪聲目標、均值換算與逆向迴圈要各自驗收。接下來系列進入參數調適,沿用「明確目標、形狀與梯度」這套檢查方法。

上一篇|下一篇|系列總覽

課程影片來源

官方錄影入口位於 SCS Panopto。匿名資料夾未載入並提示登入;這表示未取得公開播放內容,不代表沒有錄影。原音與字幕須依課程授權存取。

參考資料