U7.1 25 分鐘閱讀 2026年10月

U7.1 不重新訓練,怎麼取得這次要求的引導方向?

知識秘境(Beta) 第一次學這個單元?從知識秘境(Beta)開始:先想、先選,內容再一段段浮現 →

本篇重用3 篇

模型會生成圖片了,但這一次我想要它畫一隻在雪山上滑雪板的柯基

在 U7.0 裡,我們整理了讓生成結果符合要求的幾種方法:conditional training 在訓練時加入 condition,fine-tuning 則用新資料更新模型。但如果不想為這次需求重新訓練,我們就得保留原本的參數,只在 sampling 時想辦法引導它;這就是 test-time steering。

我們想一個具體的情況:模型學過各種動物、建築物、風景與風格的圖片,但這一次我們想要它畫一隻在雪山上滑雪板的柯基。如果照原本的方法,隨意給一個 noise 去抽樣,模型很可能生成其他動物或風景。

即使是 text-to-image model——也就是接收一段文字(text)描述,根據它生成圖片(image)的模型——也可能沒有完整照著我們的意思畫。例如畫成哈士奇在滑雪,或是有柯基和雪山,卻讓牠站在雪地;也可能畫出滑雪板,卻把場景換成公園。

那我們在不重新訓練模型的情況下,
能不能在圖片還沒生成完時,就提醒它往「雪山上滑雪板的柯基」的方向改?

想像你正在畫這張圖,草稿還只有幾條模糊的線,品種、動作與場景都還沒確定;繼續畫下去,就可能出現剛才那幾種結果。旁邊的朋友不必替你畫,只要看看目前的草稿,提醒你「這樣比較像柯基」「這個姿勢比較像在滑雪板」「背景要是雪山」,我們就可以邊畫邊調整,不必等整張畫完才重來。

所以我們需要的,不一定是另一個會生成圖片的模型;一個能判斷「現在這張圖有多符合要求」的模型,也可能提供修改的線索。

尚未定形的草稿可能變成哈士奇在雪山滑雪板、柯基站在雪地、柯基在公園滑雪板,或符合要求的柯基在雪山滑雪板;朋友在畫的途中提供提醒。

圖:草稿還沒畫完,品種、動作或場景都可能畫錯。朋友在畫的途中提醒,畫圖的人再繼續修改。

我們想生成的,是哪一群照片?

完整的要求包含品種、場景與動作,我們先從其中一項開始:牠是不是柯基? 令 c=c=「柯基」。我們想生成的是合理資料中、有柯基的那一群照片,而不只是讓某個評分模型給高分。想像先從相簿挑出所有有柯基的照片;其中仍有各種背景、姿勢與外觀。這一群乾淨照片的 distribution,就是 p0(x0∣c)p_0(x_0\mid c):固定 cc,看照片 x0x_0 如何分布。

不過生成途中拿到的是 noisy image xtx_t,不是已經完成的乾淨圖片 x0x_0。這裡沿用 U1 的時間方向:tt 越大噪聲越多,sampling 從大的 tt 往 00 走。若把剛才那群柯基照片都按照 forward process 加噪到時間 tt,它們形成的 distribution 就是 pt(xt∣c)p_t(x_t\mid c)。

pt(xt∣c)p_t(x_t\mid c) 越大,表示帶有柯基的照片被加噪後,在 xtx_t 附近越密集。若去噪時也維持「柯基」這個條件,我們的目標就是讓這群 noisy images 回到有柯基的照片。依照 U1.3,對應的方向是它的 conditional score:

st(xt∣c)=∇xtlog⁡pt(xt∣c).s_t(x_t\mid c)=\nabla_{x_t}\log p_t(x_t\mid c).

它指向指定 cc 後,noisy data 的 density 在當下位置上升最快的方向。原本的 unconditional score st(xt)=∇xtlog⁡pt(xt)s_t(x_t)=\nabla_{x_t}\log p_t(x_t) 則看所有資料,並不特別指定柯基。指定「柯基」後,原本的方向到底多了什麼?

把這次要求提供的方向找出來

要比較這兩支方向,我們可以先看看它們對應的 densities 有什麼關係。沒錯!又是使用 Bayes rule 的時候:

pt(xt∣c)=pt(xt) pt(c∣xt)p(c).p_t(x_t\mid c) =\frac{p_t(x_t)\,p_t(c\mid x_t)}{p(c)}.

右邊先保留所有 noisy images 的 density pt(xt)p_t(x_t),再乘上 pt(c∣xt)p_t(c\mid x_t)——也就是「看到目前這張帶噪聲的圖 xtx_t,它原本來自有柯基(類別 cc)的圖片的機率」。分母 p(c)p(c) 是資料中這個類別的比例,讓相乘後的 density 積分為 11;它不隨圖片 xtx_t 改變。

pt(xt∣c)p_t(x_t\mid c) 和 pt(c∣xt)p_t(c\mid x_t) 不同:前者固定「柯基」,想看帶噪聲的圖片怎麼分布;後者固定目前帶噪聲的圖片,判斷它有多可能來自有柯基的照片。

先取 log,把乘法拆成加法:

log⁡pt(xt∣c)=log⁡pt(xt)+log⁡pt(c∣xt)−log⁡p(c).\begin{aligned} \log p_t(x_t\mid c) &=\log p_t(x_t)\\ &\quad+\log p_t(c\mid x_t)\\ &\quad-\log p(c). \end{aligned}

接著固定 tt 與 cc,對 xtx_t 微分。最後一項是常數(與 xtx_t 無關),因此 gradient 為零:

st(xt∣c)=st(xt)+∇xtlog⁡pt(c∣xt).\boxed{ s_t(x_t\mid c) =s_t(x_t)+\nabla_{x_t}\log p_t(c\mid x_t) }.

第一項保留原本資料 density 的方向,第二項增加指定類別的影響。它們可以相加,不只是因為都是向量,而是因為 Bayes rule 中的乘法,取 log 後變成了加法。

那第二項怎麼讀呢?因為 log 不改變機率高低的順序,∇xtlog⁡pt(c∣xt)\nabla_{x_t}\log p_t(c\mid x_t) 指出:在小小的改動幅度下,往哪裡改動目前圖片,能讓它來自柯基的 log-probability 上升得最快。就像朋友指出目前的輪廓往哪裡改,會更像柯基。微分的對象是目前圖片 xtx_t,不是模型參數。

把這支 conditional score 放進 U1 的 reverse dynamics,才對應從 noise 回到指定類別的資料。現在問題變得更具體了:

這支 condition 額外提供的方向,
我們能從哪裡取得?

補充有了 conditional score,就一定抽到正確的 conditional distribution 嗎?

想像只拿相簿裡的柯基照片,按照 U1 的 forward process 一路加噪到 TT。最後那群 noisy images 的分布,就是 pT(xT∣c)p_T(x_T\mid c)。若要把這串分布的變化原樣倒走,不只每一步的方向要對,還要從這個加噪後的分布出發;換了起始分布,就不能直接套用「會回到原本 p0(x0∣c)p_0(x_0\mid c)」的結果。

那為什麼實作時可以從 N(0,I)\mathcal N(0,I) 開始?回想 U1 的式子:

xT=αˉT x0+1−αˉT ϵ,ϵ∼N(0,I).x_T=\sqrt{\bar\alpha_T}\,x_0+\sqrt{1-\bar\alpha_T}\,\epsilon, \qquad \epsilon\sim\mathcal N(0,I).

當 αˉT\bar\alpha_T 很小,照片那一項幾乎消失,noise 的係數則接近 11。不管原本是柯基還是其他照片,加噪後的分布都接近同一個 standard Gaussian,我們才用它近似 pT(xT∣c)p_T(x_T\mid c)。但只要照片那一項還沒完全消失,兩者就未必相同;這是起始分布的近似誤差。

起點之外,網路估計的 score 可能偏離理想方向;即使方向估得準,有限步 sampler 仍只在選定的幾個時刻計算它,再近似中間怎麼移動,可能漏掉途中方向的變化。

所以 Bayes rule 確認的是兩支精確方向相加,就是所需的 conditional score;它沒有讓起始分布、網路估計與 sampling 的近似自動變成精確。

手上有一個能判斷品種的模型呢?

假設 generative model 原本不接收 cc,只能估計所有資料的 base score。於是我們突發奇想找來一個看圖片、判斷狗的品種的模型:給它一張圖,它就估計裡面是柯基、哈士奇或其他品種的機率。這種用來判斷輸入屬於哪個類別的模型,稱為分類器(classifier)。它不需要會畫圖,只需要提供判斷;不過,只判斷品種,也不保證場景與動作都畫對。

我們希望 classifier 去估計剛才的 pt(c∣xt)p_t(c\mid x_t)。因為途中還是 noisy image,一般只看過乾淨圖片的 classifier 未必看得懂;就像朋友若只會辨認完成的畫,卻看不懂草稿,也幫不上生成途中的修改。因此,它必須學過不同 noise levels 下的判斷,輸入也包含時間 tt。

把這個 classifier 記成 pϕ(c∣xt,t)p_\phi(c\mid x_t,t),ϕ\phi 是它的參數;generative model 的 sθ(xt,t)s_\theta(x_t,t) 則估計 base score。照剛才的 Bayes 等式,生成時可以組合成

s~θ(xt,t,c)=sθ(xt,t)+∇xtlog⁡pϕ(c∣xt,t).\widetilde s_\theta(x_t,t,c) =s_\theta(x_t,t)+\nabla_{x_t}\log p_\phi(c\mid x_t,t).

這就是 Dhariwal 與 Nichol [1] 使用的 classifier guidance:固定兩個模型,把 classifier 對目前圖片的 gradient 交給 sampler。兩個估計都精確時,這支合成方向就是 conditional score。

同一個 noisy state 上,base score 與 classifier gradient 相加得到 conditional score

圖:在同一個 (xt,t)(x_t,t),base score 加上 classifier 的 log-probability gradient。兩者精確時,合成方向就是 conditional score;箭頭與等高線為示意。

補充Noisy classifier 怎麼訓練?

Dhariwal 與 Nichol [1] 從有類別標籤的 training pair (x0,c)(x_0,c) 出發,像 U1 一樣抽 tt 與 Gaussian noise ϵ\epsilon,算出 xtx_t,再訓練

Lcls(ϕ)=E(x0,c),t,ϵ[−log⁡pϕ(c∣xt,t)].L_{\mathrm{cls}}(\phi) =\mathbb E_{(x_0,c),t,\epsilon} \left[-\log p_\phi(c\mid x_t,t)\right].

pϕ(c∣xt,t)p_\phi(c\mid x_t,t) 是 classifier 對正確類別給的機率。機率越高,負 log 就越小;這個 loss 讓它學不同 noise levels 下的類別機率。高 noise 時資訊不足,答案也可以是不確定的機率,不是要求每張圖都猜中。Expectation 平均資料 pair、抽到的時間與加入的 noise;製造其中的 xtx_t 只需沿用 diffusion 的 forward process,不仰賴 generative model。

補充Sampling 時對 classifier 反向傳播,不就又是在訓練模型嗎?

反向傳播是計算微分的方法,不一定要更新參數。訓練 classifier 時,我們算 ∇ϕLcls\nabla_\phi L_{\mathrm{cls}} 並更新 ϕ\phi;sampling 時則固定 ϕ\phi 與 θ\theta,只算 ∇xtlog⁡pϕ(c∣xt,t)\nabla_{x_t}\log p_\phi(c\mid x_t,t),把結果交給 sampler 改動 xtx_t。

就像朋友的判斷方式沒有改變,我們改的是他正在看的草稿。要看的是微分對象與實際更新的量,不是有沒有做反向傳播。

補充把 log-probability 學得準,一階導數也會準嗎?

沿用 U1.0 的地形畫面,把這裡的 log-probability 當成高度:兩片地形的高度接近,不代表坡度也接近。 在地面鋪上一層很小、卻很密的波紋,高度可能只差一點點,坡度卻差很多。同樣地,即使 log⁡pϕ(c∣xt,t)\log p_\phi(c\mid x_t,t) 接近真正的 log⁡pt(c∣xt)\log p_t(c\mid x_t),對 xtx_t 微分後的 gradient 仍不一定接近;而 classifier guidance 真正拿來改動圖片的,正是這個一階導數。

這也回到 U1.0 的目標:我們要的是像原本資料的圖片,而不只是讓另一個模型給高分。Kawar、Ganz 與 Elad [3] 因此研究 classifier 的 robustness——圖片受到小幅擾動時,分類判斷是否仍穩定——以及這類 classifier 能否提供更符合人眼理解的 guidance;分類準確率高,本身並沒有保證這件事。

沒有 classifier,能不能只靠模型自己?

這次,我們考慮一個已經做過 U7.0 中 conditional training 的 pretrained model,估計的目標是 conditional score ∇xtlog⁡pt(xt∣c)\nabla_{x_t}\log p_t(x_t\mid c)。它用 (x0,c)(x_0,c) 配對訓練,預測 xtx_t 中的 noise 時,網路也會收到 cc;所以模型原本就能接收類別或文字的 condition。

它已經能 conditional generation,為什麼還要找額外方向?我們這次想進一步控制的是:能不能在 sampling 時,少一些結果的多樣性,換取更高的單張樣本品質? 這是 Ho 與 Salimans 的原論文 [2] 想保留的品質/多樣性取捨,不是讓模型第一次知道 condition。

那我們可不可以不仰賴 classifier,只靠模型自己本身,就取得能加強 condition 的方向? 把同一張草稿交給模型,一次指定柯基,另一次不指定類別;比較兩次修改方向,也許就能看出這個要求額外改變了什麼。

conditional 與 unconditional prediction 的差,
能不能替代 classifier 原本要提供的方向?

我們想找的,是指定「柯基」之後,模型多做了哪些修改,而不是它在有 condition 時給出的整個修改方向。回想剛才從 Bayes rule 得到的關係:

st(xt∣c)=st(xt)+∇xtlog⁡pt(c∣xt).s_t(x_t\mid c) =s_t(x_t)+\nabla_{x_t}\log p_t(c\mid x_t).

左邊的 conditional score st(xt∣c)s_t(x_t\mid c),是考慮「這張圖要有柯基」後的方向。右邊第一項 st(xt)s_t(x_t) 是不指定類別時,讓圖片更像原本資料的 base score;第二項才是「這次要柯基」額外提供的方向。也就是說,conditional score 裡已經包含 base score,不是整支方向都只來自「柯基」這個要求。

所以,若想單獨拿到 condition 增加的那一部分,我們就可以在等式兩邊都減去 st(xt)s_t(x_t)。右邊的 base score 抵消後,只留下:

∇xtlog⁡pt(c∣xt)=st(xt∣c)−st(xt).\nabla_{x_t}\log p_t(c\mid x_t) =s_t(x_t\mid c)-s_t(x_t).

回到草稿的例子:先問「如果這張圖要畫柯基,現在該怎麼改?」,再問「如果沒有指定品種,現在該怎麼改?」。把前者減去後者,就是我們想取出的、因為指定柯基而增加的修改。「不指定類別」不是要求沒有柯基,而是仍考慮所有類別的資料。

這裡比較的是同一張 xtx_t、同一個時間 tt 上的兩個答案,不是兩張生成完的圖片,也不是不同生成階段的方向。兩支 score 都精確時,它們的差就等於 classifier 原本要提供的 gradient;實作時,網路給的是兩支 score 的估計,因此用它們的差來近似這個方向,不必真的訓練 classifier。

不過,剛才的等式告訴我們的是:如果有這兩個答案,就能這樣相減。 它還沒有保證手上的模型會回答兩種情況。假如 training 時每次都把 cc 交給網路,它學過的是「看到 xtx_t、tt 和 cc 時該怎麼預測」;現在突然拿掉 cc,就換成了訓練時未必見過的輸入。

那麼,要怎麼讓同一個模型,也學會「不指定類別」時的回答?

同一個模型怎麼學會兩種回答?

Ho 與 Salimans [2] 在 training 時偶爾把 cc 換成空 condition ∅\varnothing,也就是明確告訴模型「這一次不提供類別或 prompt」。這個做法稱為 conditioning dropout。把實際送進網路的 condition 記成 c~\widetilde c:有時保留 cc,有時換成 ∅\varnothing。沿用 U1 的 denoising regression,就能寫成

Ldrop(θ)=E(x0,c),t,ϵ,c~[∥ϵθ(xt,t,c~)−ϵ∥2].L_{\mathrm{drop}}(\theta) =\mathbb E_{(x_0,c),t,\epsilon,\widetilde c} \left[\left\|\epsilon_\theta(x_t,t,\widetilde c)-\epsilon\right\|^2\right].

每次仍從 training pair (x0,c)(x_0,c) 抽資料,抽 tt 與 noise ϵ\epsilon 算出 xtx_t;label 仍是加入的 ϵ\epsilon,多出的隨機動作只有「要不要把 cc 給模型」。保留 cc 時,它學這個 condition 下的 noise prediction;以與資料無關的機率拿掉 cc 時,它對所有類別的資料學 unconditional prediction。

訓練完後,同一個模型能提供 ϵθ(xt,t,c)\epsilon_\theta(x_t,t,c) 與 ϵθ(xt,t,∅)\epsilon_\theta(x_t,t,\varnothing),再用 U1.3 的換算得到 conditional score sθ(xt,t,c)s_\theta(x_t,t,c) 與 unconditional score sθ(xt,t,∅)s_\theta(x_t,t,\varnothing)。因此,剛才的額外方向可以用

sθ(xt,t,c)−sθ(xt,t,∅)s_\theta(x_t,t,c)-s_\theta(x_t,t,\varnothing)

來估計。參數是同一套,但 sampling 時仍需要兩種輸入的模型計算,才取得這兩個答案。 這是後面做法的前提:模型在 training 時就已經學過兩種回答,不是現在才拿掉 cc,或重新訓練它。

已經能 conditional generation,為什麼還要 guidance?

現在我們拿到 condition 增加的方向了,接著就可以回到剛才的品質/多樣性問題。如果只想按照 p0(x0∣c)p_0(x_0\mid c) 抽樣,理想的 conditional model 已經足夠;guidance 不是 conditional generation 必須多補的一項,而是讓我們選擇另一種 sampling 行為。

想像模型已經會根據「柯基」生成各種照片。但如果這次我們願意少一些變化,希望生成結果的品質更高、品種特徵更容易辨識,能不能不重新訓練,只在 sampling 時調整這個取捨?Ho 與 Salimans [2] 的原論文以 class-conditional ImageNet 模型為例,追求的正是這種控制;並不是因為模型原本不會接收 condition。

我們可以先保留模型原本的 conditional prediction,再沿著剛才找到的差值,多加一段修改。沿用本篇的 convention:w=1w=1 是原本的 conditional prediction,因此額外加強的幅度是 w−1w-1:

s~θ(xt,t,c)=sθ(xt,t,c)+(w−1)[sθ(xt,t,c)−sθ(xt,t,∅)].\begin{aligned} \widetilde s_\theta(x_t,t,c) &=s_\theta(x_t,t,c)\\ &\quad+(w-1)\big[s_\theta(x_t,t,c)-s_\theta(x_t,t,\varnothing)\big]. \end{aligned}

w=1w=1 時,第二項消失,我們就照原本的 conditional model 生成;w>1w>1 時,才繼續沿著「指定 cc 後多出的方向」加強。這就是 Ho 與 Salimans [2] 提出的 classifier-free guidance(CFG):不用外部 classifier,而是用模型自己的兩種回答完成這個調整。

為了和前面從 unconditional score 出發的寫法對照,我們把括號展開。Conditional score 的係數是 1+(w−1)=w1+(w-1)=w,unconditional score 的係數則是 −(w−1)=1−w-(w-1)=1-w。重新合併後,就得到常見的形式:

s~θ(xt,t,c)=sθ(xt,t,∅)+w[sθ(xt,t,c)−sθ(xt,t,∅)].\begin{aligned} \widetilde s_\theta(x_t,t,c) &=s_\theta(x_t,t,\varnothing)\\ &\quad+w\big[s_\theta(x_t,t,c)-s_\theta(x_t,t,\varnothing)\big]. \end{aligned}

它先保留 unconditional prediction,再把 condition 造成的差異乘上 ww。若這支差異改由外部 classifier 估計,就回到前面介紹的 classifier guidance:

s~θ(xt,t,c)=sθ(xt,t)+w∇xtlog⁡pϕ(c∣xt,t).\begin{aligned} \widetilde s_\theta(x_t,t,c) &=s_\theta(x_t,t)\\ &\quad+w\nabla_{x_t}\log p_\phi(c\mid x_t,t). \end{aligned}

w=0w=0 忽略 condition;w=1w=1 對應原本的 conditional prediction;w>1w>1 則刻意加強 condition。兩種方法用的是同一個 Bayes 關係,差在用什麼來估計這支方向。Classifier-free 拿掉的是外部 classifier,不是 training 時的 condition。

同一個網路的 conditional 與 unconditional prediction,以及 CFG 的差值外推

圖:同一套 θ\theta 對相同 noisy state 回答兩次,CFG 再沿兩個 prediction 的差值外推。右圖是 prediction space,不是生成軌跡。

課堂提問Q1

如果 w=1w=1 已經對應 conditional score,把 ww 調大,是不是代表 condition 估得更準?

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

不是。w=1w=1 對應理想的 conditional score;w>1w>1 則刻意讓 condition 對 sampling 的影響比 training distribution 裡更強,不是在修正成更精確的估計。

Dhariwal 與 Nichol [1]、Ho 與 Salimans [2] 的實驗都討論了生成品質與 diversity 的取捨:提醒變強,可能讓結果更集中在符合要求的樣本,也可能失去其他合理答案。差值中的估計誤差也會被放大;過大的 guidance 還可能造成過度飽和或不自然的紋理。ww 是 sampling 時的選擇,不是模型準確率的刻度。

補充w>1w>1 對應的是哪一個 density?

若每個 tt 的 score 估計都精確,

s~t(xt,c)=st(xt)+w∇xtlog⁡pt(c∣xt)=∇xtlog⁡[pt(xt)pt(c∣xt)w]=∇xtlog⁡[pt(xt)1−wpt(xt∣c)w].\begin{aligned} \widetilde s_t(x_t,c) &=s_t(x_t)+w\nabla_{x_t}\log p_t(c\mid x_t)\\ &=\nabla_{x_t}\log\big[p_t(x_t)p_t(c\mid x_t)^w\big]\\ &=\nabla_{x_t}\log\big[p_t(x_t)^{1-w}p_t(x_t\mid c)^w\big]. \end{aligned}

最後一行用了 Bayes rule;兩個括號中的量只差一個與 xtx_t 無關的 factor,所以 log-gradient 相同。w>1w>1 在固定的 tt 上對類別機率做 power reweighting;但這一族重新加權的 densities 未必滿足原 forward process 的演化方程,不能只靠這個 identity 宣稱 sampler 的終點一定是 pdata(x0)p(c∣x0)wp_{\mathrm{data}}(x_0)p(c\mid x_0)^w 的正規化版本。

網路輸出的是 noise,怎麼放進原本 sampler?

U1 的網路通常輸出 ϵθ\epsilon_\theta,而不是直接輸出 score。令 σt=1−αˉt\sigma_t=\sqrt{1-\bar\alpha_t} 表示該時刻的 noise amplitude,U1.3 給出的換算是

sθ(xt,t)=−ϵθ(xt,t)σt.s_\theta(x_t,t)=-\frac{\epsilon_\theta(x_t,t)}{\sigma_t}.

Conditional 與 unconditional prediction 都使用同一個 σt\sigma_t。我們只要把剛才的 guided score 寫成 −ϵ~θ/σt-\widetilde\epsilon_\theta/\sigma_t,就能把兩種做法換成原 sampler 使用的 noise prediction。

對 classifier guidance,先代入:

−ϵ~θ(xt,t,c)σt=−ϵθ(xt,t)σt+w∇xtlog⁡pϕ(c∣xt,t).\begin{aligned} -\frac{\widetilde\epsilon_\theta(x_t,t,c)}{\sigma_t} &=-\frac{\epsilon_\theta(x_t,t)}{\sigma_t}\\ &\quad+w\nabla_{x_t}\log p_\phi(c\mid x_t,t). \end{aligned}

兩邊乘上 −σt-\sigma_t,得到

ϵ~θ(xt,t,c)=ϵθ(xt,t)−wσt∇xtlog⁡pϕ(c∣xt,t).\begin{aligned} \widetilde\epsilon_\theta(x_t,t,c) &=\epsilon_\theta(x_t,t)\\ &\quad-w\sigma_t\nabla_{x_t}\log p_\phi(c\mid x_t,t). \end{aligned}

classifier gradient 在 score 空間是相加;換到 noise prediction 空間後,就變成從 ϵθ\epsilon_\theta 減掉它。負號與縮放都來自這個換算,不是另一個 sampling 假設。

對 CFG,三支 score 都有相同的 −1/σt-1/\sigma_t factor,代入後可寫成

−ϵ~θσt=−ϵθ(xt,t,∅)σt−wσt[ϵθ(xt,t,c)−ϵθ(xt,t,∅)].\begin{aligned} -\frac{\widetilde\epsilon_\theta}{\sigma_t} &=-\frac{\epsilon_\theta(x_t,t,\varnothing)}{\sigma_t}\\ &\quad-\frac{w}{\sigma_t} \big[\epsilon_\theta(x_t,t,c)-\epsilon_\theta(x_t,t,\varnothing)\big]. \end{aligned}

同樣乘上 −σt-\sigma_t,這次相同的 factor 全部消去:

ϵ~θ(xt,t,c)=ϵθ(xt,t,∅)+w[ϵθ(xt,t,c)−ϵθ(xt,t,∅)].\boxed{ \begin{aligned} \widetilde\epsilon_\theta(x_t,t,c) &=\epsilon_\theta(x_t,t,\varnothing)\\ &\quad+w\big[\epsilon_\theta(x_t,t,c)-\epsilon_\theta(x_t,t,\varnothing)\big]. \end{aligned} }

生成時把對應的 ϵ~θ\widetilde\epsilon_\theta 放進原本 sampler 就好。整個 sampling 過程中,generative model 的 θ\theta,以及外部 classifier 若存在時的 ϕ\phi,都不需要更新。

補充原 CFG 論文的 guidance strength 和這裡差了 11

本篇使用 w=0w=0 是 unconditional、w=1w=1 是 conditional 的 convention。Ho 與 Salimans [2] 則把「超出 conditional 的強度」記成 wpaperw_{\mathrm{paper}},其 noise prediction 寫成

ϵ~θ=(1+wpaper)ϵθ(xt,t,c)−wpaperϵθ(xt,t,∅).\begin{aligned} \widetilde\epsilon_\theta &=(1+w_{\mathrm{paper}})\epsilon_\theta(x_t,t,c)\\ &\quad-w_{\mathrm{paper}}\epsilon_\theta(x_t,t,\varnothing). \end{aligned}

兩者是同一個組合,只是本篇的 w=1+wpaperw=1+w_{\mathrm{paper}}。閱讀其他論文或程式時,要對照公式,而不是只比較 guidance scale 的數字。

Classifier guidance 也可以加在已經 conditional training 的 model 上,如 Dhariwal 與 Nichol [1] 的實驗。這時原本就有 conditional score,classifier 提供的是額外加強,因此「不額外加強」的係數從 00 起算;不能直接套用本篇從 unconditional score 出發、w=1w=1 才得到 conditional score 的說法。

補充Negative prompt 改變的是哪個比較基準?

實作上還可以把空 condition 換成一個 negative prompt c−c^-,例如希望避免的「模糊」。同一個模型分別看正向 prompt cc 與 c−c^-,再做

ϵ~θ=ϵθ(xt,t,c−)+w[ϵθ(xt,t,c)−ϵθ(xt,t,c−)].\begin{aligned} \widetilde\epsilon_\theta &=\epsilon_\theta(x_t,t,c^-)\\ &\quad+w\big[\epsilon_\theta(x_t,t,c)-\epsilon_\theta(x_t,t,c^-)\big]. \end{aligned}

這條式子從 c−c^- 的 prediction 出發,沿著兩者的差往 cc 外推。它提供的是相對基準,不是保證某個物件絕不出現的禁止清單;也不再是剛才 conditional 減 unconditional 的 Bayes identity。

補充Flow Matching 也能學兩種回答嗎?

可以沿用 U2.1 的 regression:reference process 仍寫成 ItI_t,label 仍是 ∂tIt\partial_t I_t,只把網路收到的 condition 隨機換成 c~\widetilde c:

Ldrop,FM(θ)=E[∥vθ(It,t,c~)−∂tIt∥2].L_{\mathrm{drop,FM}}(\theta) =\mathbb E\left[\left\|v_\theta(I_t,t,\widetilde c)-\partial_t I_t\right\|^2\right].

Expectation 平均時間、reference path 的端點配對與 condition dropout。生成時同樣能組合

v~θ(x,t,c)=vθ(x,t,∅)+w[vθ(x,t,c)−vθ(x,t,∅)].\begin{aligned} \widetilde v_\theta(x,t,c) &=v_\theta(x,t,\varnothing)\\ &\quad+w\big[v_\theta(x,t,c)-v_\theta(x,t,\varnothing)\big]. \end{aligned}

在 U2.3 那種 Gaussian 起點的 affine interpolation 下,velocity 與 score 有共同的轉換公式,可以對照上述推導;對任意 path,則不能直接把 velocity 的差叫作 classifier gradient。

Classifier guidance 與 CFG,實際上差在哪裡?

兩種方法都能在 sampling 時調整 condition 的影響。依照 Dhariwal 與 Nichol [1]、Ho 與 Salimans [2] 的做法,我們可以把差異整理成:

項目Classifier guidanceCFG
額外模型需訓練 noisy classifier,估計 log⁡pt(c∣xt)\log p_t(c\mid x_t)。X
Conditioning 訓練X需要 conditional training+unconditional training(conditioning dropout)。
每一步 samplingsθ(xt,t)+w∇xtlog⁡pϕ(c∣xt,t)\begin{aligned}&s_\theta(x_t,t)\\&+w\nabla_{x_t}\log p_\phi(c\mid x_t,t)\end{aligned}sθ(xt,t,c)+(w−1)[sθ(xt,t,c)−sθ(xt,t,∅)]\begin{aligned}&s_\theta(x_t,t,c)\\&+(w-1)\big[s_\theta(x_t,t,c)\\&\qquad-s_\theta(x_t,t,\varnothing)\big]\end{aligned}
用在模型沒看過的新 condition可以透過另外訓練或更換 noisy classifier。X
主要優點生成與判斷可分開設計。不需額外 classifier 或其 gradient。
主要限制額外訓練成本;classifier 估計的 log⁡pt(c∣xt)\log p_t(c\mid x_t) 準,不代表 gradient 也準。訓練時要考慮兩種 prediction;差值誤差也可能放大。

表中的 conditioning 訓練指 generative model;classifier 仍需有類別標籤的資料。這裡的新 condition 指模型沒有相應 conditional prediction 的要求,不是 text-to-image 模型沒見過的一句新 prompt。

不用 classifier,不代表 sampling 一定更快。 一邊多算 classifier 的 gradient,另一邊多算一種 generative-model prediction;實際成本要看模型大小與實作。兩者加強 guidance 時,也都可能犧牲 diversity,不是強度越大就一定越好。

消化一下

想一想

Bayes 推導中,−log⁡p(c)-\log p(c) 為什麼消失?

想一想

在本篇的 convention 下,w=1w=1 時 CFG 的 noise prediction 等於什麼?

想一想

從 score 換成 noise prediction 後,classifier gradient 前面為什麼變成 −wσt-w\sigma_t?

想一想

conditioning dropout 在 training 時做了什麼?

想一想

CFG 拿掉了 classifier guidance 的哪個成本?

參考文獻

  1. Dhariwal, P., Nichol, A. Diffusion Models Beat GANs on Image Synthesis. NeurIPS 2021.(Classifier guidance 與 fidelity/diversity trade-off。)
  2. Ho, J., Salimans, T. Classifier-Free Diffusion Guidance. 2022.(CFG、conditioning dropout 與 quality/diversity trade-off。)
  3. Kawar, B., Ganz, R., Elad, M. Enhancing Diffusion-Based Image Synthesis with Robust Classifier Guidance. 2022.(Classifier gradient 的 robustness。)