来源:Ho, Salimans 2022 · arXiv:2207.12598 §2(背景)、§3.1(classifier guidance)。classifier guidance 本身出自 Dhariwal & Nichol 2021(arXiv:2105.05233),本节按 2207.12598 的写法讲,作为 CFG 的对照物。 读法:§1.1 补论文背景记号(VP、log 信噪比 $\lambda$);§1.2 把 $\varepsilon$ 预测接回 score;§1.3 回到 Score-SDE `10_可控生成与逆问题` §10 的条件 score 拆分(地基);§1.4 classifier guidance 把引导项加重;§1.5 classifier guidance 把分布变形成什么、为什么保真升多样降;§1.6 一个要点:guidance 施加在已条件模型上。 --- ## §1.1 背景记号:VP 前向与 log 信噪比 $\lambda$ 先定调:下面这套 VP 前向、log 信噪比 $\lambda$ 都是论文选用的记号。CFG 本身作用在 $\varepsilon$/score 的外推上,和前向是 VP(方差守恒)还是 VE(方差爆炸)无关、哪条线都能用;这一节交代这套符号,纯粹为了读论文时认得 $\alpha_\lambda$、$\sigma_\lambda$、$\lambda$,不是 CFG 依赖这套记号。 论文用连续时间写扩散,前向过程还是已学过的 VP(方差守恒)那一条,高斯形式和 DDPM 一模一样:给定干净图 $x$,$\lambda$ 处的加噪图 $z_\lambda$ 服从一个高斯,均值 $\alpha_\lambda x$($\alpha_\lambda$ 是信号系数、把干净图缩小多少)、噪声标准差 $\sigma_\lambda$,两者满足方差守恒 $\alpha_\lambda^2+\sigma_\lambda^2=1$(Score-SDE `03_前向_SDE` §3.4.2)。 > [!example] 新记号接旧识:VP、$\lambda$ 只是 DDPM 换了标签 > $\alpha_\lambda^2$ 就是此前的 $\bar\alpha_t$、$\sigma_\lambda^2$ 就是 $1-\bar\alpha_t$、$z_\lambda$ 就是 $x_t$;唯一换掉的是给时间贴的标签,DDPM 用整数步 $t$,这篇用 log 信噪比 $\lambda$。 那个新标签 $\lambda$ 就是信噪比取对数:信噪比(SNR,signal-to-noise ratio)= 信号能量 ÷ 噪声能量,在这里就是 $\alpha_\lambda^2/\sigma_\lambda^2$;取对数就得到 $\lambda$: > [!danger] 论文 · log 信噪比(时间坐标) > $\lambda=\log\frac{\alpha_\lambda^2}{\sigma_\lambda^2}$ $\lambda$ 大表示信号强、噪声少(接近干净图),$\lambda$ 小表示噪声多。(取对数是图方便:信噪比在扩散全程跨好多个数量级,取 log 压成一个数值合理、大致线性的坐标,好排噪声调度、公式也简洁。$\lambda$ 具体怎么定义对 CFG 不关键,记住「$\lambda$ 是噪声水平的刻度、大=噪少」即可。) 有了 $\lambda$ 这个坐标,前向的 $\alpha_\lambda$、$\sigma_\lambda$ 就被「$\lambda$ 是 log 信噪比」和「方差守恒」两条定死了。把这两个量写成 $\lambda$ 的函数解出来,就是论文式(1): > [!danger] 论文式(1) · VP 前向 > $q(z_\lambda\mid x)=\mathcal N(\alpha_\lambda x,\ \sigma_\lambda^2 I),\qquad \alpha_\lambda^2=\frac{1}{1+e^{-\lambda}},\quad \sigma_\lambda^2=1-\alpha_\lambda^2$ 式中 $\sigma_\lambda^2=1-\alpha_\lambda^2$ 就是方差守恒;$\alpha_\lambda^2=\dfrac{1}{1+e^{-\lambda}}$ 是「既要 $\lambda$ 是 log 信噪比、又要方差守恒」时 $\alpha_\lambda^2$ 唯一的样子,怎么从那两条解出来见下折叠。 条件生成的唯一改动和 DDPM 时一样:去噪网络多收一个条件 $c$ 当输入,写成 $\varepsilon_\theta(z_\lambda, c)$。训练目标仍是预测加进去的噪声(论文式(5),去噪 score matching),此处不展开。 > [!note]- 从 $\lambda$ 定义 + 方差守恒解出 $\alpha_\lambda^2=\dfrac{1}{1+e^{-\lambda}}$ > 手里两个条件:$\lambda=\log(\alpha_\lambda^2/\sigma_\lambda^2)$($\lambda$ 定义)和 $\alpha_\lambda^2+\sigma_\lambda^2=1$(方差守恒)。 > > 从 $\lambda$ 定义两边取指数: > $\frac{\alpha_\lambda^2}{\sigma_\lambda^2}=e^{\lambda}$ > 把 $\sigma_\lambda^2$ 乘过去: > $\alpha_\lambda^2=e^{\lambda}\sigma_\lambda^2$ > 代入方差守恒($\alpha_\lambda^2$ 换成 $e^{\lambda}\sigma_\lambda^2$): > $e^{\lambda}\sigma_\lambda^2+\sigma_\lambda^2=1$ > 左边提出 $\sigma_\lambda^2$: > $\sigma_\lambda^2(e^{\lambda}+1)=1$ > 解出 $\sigma_\lambda^2$: > $\sigma_\lambda^2=\frac{1}{1+e^{\lambda}}$ > 再由方差守恒 $\alpha_\lambda^2=1-\sigma_\lambda^2$,代入刚解出的 $\sigma_\lambda^2=\dfrac{1}{1+e^{\lambda}}$: > $\alpha_\lambda^2=1-\frac{1}{1+e^{\lambda}}$ > 通分($1$ 写成 $\dfrac{1+e^{\lambda}}{1+e^{\lambda}}$、分子 $(1+e^{\lambda})-1=e^{\lambda}$): > $\alpha_\lambda^2=\frac{e^{\lambda}}{1+e^{\lambda}}$ > 最后把 $\dfrac{e^{\lambda}}{1+e^{\lambda}}$ 化成论文式(1) 的写法,靠分子分母同除 $e^{\lambda}$。先如实写成大分数(上下各挂一个 $\div e^{\lambda}$,分数值不变): > $\alpha_\lambda^2=\cfrac{e^{\lambda}/e^{\lambda}}{(1+e^{\lambda})/e^{\lambda}}$ > 分子 $e^{\lambda}/e^{\lambda}=1$。分母 $1+e^{\lambda}$ 是两项,除以 $e^{\lambda}$ 时拆开各除: > $\frac{1+e^{\lambda}}{e^{\lambda}}=\frac{1}{e^{\lambda}}+\frac{e^{\lambda}}{e^{\lambda}}$ > 两项各算($\dfrac{1}{e^{\lambda}}=e^{-\lambda}$、$\dfrac{e^{\lambda}}{e^{\lambda}}=1$): > $\frac{1+e^{\lambda}}{e^{\lambda}}=e^{-\lambda}+1$ > 分母算到这里是 $e^{-\lambda}+1$,两项调下位置写成 $1+e^{-\lambda}$、对齐论文式(1) 里 $1$ 在前的写法。分子的 $1$ 配分母的 $1+e^{-\lambda}$,拼回大分数: > $\alpha_\lambda^2=\frac{1}{1+e^{-\lambda}}$ > 正好是论文式(1) 里那个。 ## §1.2 $\varepsilon$ 就是 score:把噪声预测接回 score 语言 guidance 的推导在 score 语言里最干净(引导 = 往某方向加一项),但扩散网络吐的是 $\varepsilon$。这两者只差一个已知系数,Score-SDE `01_score_是什么` §1.3–1.5 已经钉死: > [!danger] 论文 · $\varepsilon$ 与 score 的关系 > $\varepsilon_\theta(z_\lambda)\approx-\sigma_\lambda\,\nabla_{z_\lambda}\log p(z_\lambda)$ 读法直接。先摆出 score 的定义(Score-SDE `01_score_是什么` §1.3 学过): $\text{score}=\nabla_{z_\lambda}\log p(z_\lambda)$ 这正是框里等号右边那个梯度。乘上 $-\sigma_\lambda$,等号左边的 $\varepsilon$ 就解出来了: $\varepsilon_\theta(z_\lambda)=-\sigma_\lambda\cdot\text{score}$ 这个 $-\sigma_\lambda$ 的来历是前置单元 Score-SDE `01_score_是什么` §1.3 高斯加噪下的 score $=-\varepsilon/\sigma$(那节推过,此处不再展开)。有条件时同理,$\varepsilon_\theta(z_\lambda,c)\approx-\sigma_\lambda\nabla_{z_\lambda}\log p(z_\lambda\mid c)$。 **这条换算是全单元的翻译器:凡在 score 上做的线性组合,除以 $-\sigma_\lambda$ 就变成在 $\varepsilon$ 上做的同一个线性组合。** classifier guidance 与 CFG 都在 score 上想清楚、再翻回 $\varepsilon$ 落地。 ## §1.3 地基回顾:条件 score = 无条件 score + 引导项 Score-SDE `10_可控生成与逆问题` §10.2 已经推过一条贝叶斯,把条件 score 拆开。原样搬来(记号换成本单元的 $z_\lambda$、$c$): > [!danger] Score-SDE `10_可控生成与逆问题` §10.2 · 条件 score 拆分 > $\nabla_{z_\lambda}\log p(z_\lambda\mid c)=\nabla_{z_\lambda}\log p(z_\lambda)+\nabla_{z_\lambda}\log p(c\mid z_\lambda)$ > 第一项是无条件 score(已训好的那个网络),第二项 $\nabla\log p(c\mid z_\lambda)$ 是引导项,把样本往「更符合条件 $c$」推。 上式的来历是一条贝叶斯 $p(z_\lambda\mid c)=p(c\mid z_\lambda)p(z_\lambda)/p(c)$:取对数、对 $z_\lambda$ 求梯度,$\log p(c)$ 不含 $z_\lambda$ 梯度为零,剩下的就是上式(完整推导在 Score-SDE `10_可控生成与逆问题` §10.2)。**引导项 $\nabla\log p(c\mid z_\lambda)$ 由一个单独训练、吃带噪图输出类别概率的外挂分类器 $p(c\mid z_\lambda)$ 提供(对输入求梯度),这条路就叫 classifier guidance。** ## §1.4 classifier guidance:把引导项加重(系数 $1\to 1+w$) §1.3 那条拆分是个恒等式,只把条件 score「照实拼回」,引导项系数天然是 $1$。**classifier guidance 在这之上人为做一个修改:把引导项系数从 $1$ 改成 $1+w$**(多塞 $w$ 份引导,$w$ 是一个可调的引导强度)。这一步是定义、不是推导:并非从 §1.3 推出来,而是人为规定一个「更偏向 $c$」的新采样目标、用 $w$ 定偏多少。写成扩散网络吐的 $\varepsilon$ 形式,就是这条被定义出来的修改预测: > [!danger] 论文 §3.1 · classifier guidance 的修改预测 > $\tilde\varepsilon_\theta(z_\lambda,c)=\varepsilon_\theta(z_\lambda,c)-w\,\sigma_\lambda\,\nabla_{z_\lambda}\log p_\theta(c\mid z_\lambda)$ 逐项读:第一项 $\varepsilon_\theta(z_\lambda,c)$ 是原来的有条件预测,第二项是新加的引导,$-w\sigma_\lambda$ 乘上分类器梯度 $\nabla\log p_\theta(c\mid z_\lambda)$。采样时拿这条 $\tilde\varepsilon$ 顶替 $\varepsilon_\theta(z_\lambda,c)$。这条式子怎么从「引导项乘 $w$」来,详见本节末第一个折叠。 把这条修改预测对应到分布上,等于在采样一个被重新加权过的分布: > [!danger] 论文 §3.1 · classifier guidance 采到的分布 > $\tilde p_\theta(z_\lambda\mid c)\propto p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}$ 即在原条件分布 $p_\theta(z_\lambda\mid c)$ 上,再乘一个因子 $p_\theta(c\mid z_\lambda)^{w}$:分类器越确信这张图是类别 $c$,这个因子越大、权重被抬得越高。 这里 $w$ 落在指数上是幂、不是系数(怎么从 score 上「加 $w$ 份」的系数变成分布上的指数,见本节末第二个折叠)。 > [!note]- 从 score 上的「引导项乘 $w$」改写成这条 $\varepsilon$ 式 > 从 §1.3 的条件 score 拆分落到主线那条 $\tilde\varepsilon$,分五步。 > > 第一步 · 起点是 §1.3 的条件 score 拆分(引导项 $\nabla\log p(c\mid z_\lambda)$ 系数为 $1$): > $\nabla\log p(z_\lambda\mid c)=\nabla\log p(z_\lambda)+\nabla\log p(c\mid z_\lambda)$ > > 第二步 · classifier guidance 的动作是把引导项系数从 $1$ 加重到 $1+w$,等于在条件 score 上再加 $w$ 份引导项。加重后的 score 是: > $\nabla\log p(z_\lambda\mid c)+w\,\nabla\log p(c\mid z_\lambda)$ > ($w=0$ 就退回普通条件 score。) > > 第三步 · 翻回 $\varepsilon$。用 §1.2 的翻译器(整条 score 乘 $-\sigma_\lambda$ 就变 $\varepsilon$),把上式整个乘 $-\sigma_\lambda$: > $\tilde\varepsilon=-\sigma_\lambda\Big[\nabla\log p(z_\lambda\mid c)+w\,\nabla\log p(c\mid z_\lambda)\Big]$ > > 第四步 · 分配律拆开中括号($-\sigma_\lambda$ 乘进每一项): > $\tilde\varepsilon=-\sigma_\lambda\nabla\log p(z_\lambda\mid c)-w\,\sigma_\lambda\nabla\log p(c\mid z_\lambda)$ > > 第五步 · 第一项 $-\sigma_\lambda\nabla\log p(z_\lambda\mid c)$ 正是 §1.2 里有条件的 $\varepsilon_\theta(z_\lambda,c)$,换回去;第二项原样留着(分类器记成网络的 $p_\theta$)。得到主线那条: > $\tilde\varepsilon_\theta(z_\lambda,c)=\varepsilon_\theta(z_\lambda,c)-w\,\sigma_\lambda\,\nabla\log p_\theta(c\mid z_\lambda)$ > [!note]- 加重的 score 改写成这条分布 $\tilde p_\theta\propto p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}$ > 上面折叠第二步那条「加重的 score」,就是目标分布 $\tilde p_\theta$ 的 score(score 是 log 密度的梯度): > $\nabla\log\tilde p_\theta=\nabla\log p_\theta(z_\lambda\mid c)+w\,\nabla\log p_\theta(c\mid z_\lambda)$ > 第二项用对数律 $w\log a=\log a^{w}$ 把 $w$ 收进 log,再用 $\log a+\log b=\log(ab)$ 把两个 log 并成一个: > $\nabla\log\tilde p_\theta=\nabla\log\big[p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}\big]$ > 两边都是 $\nabla\log$、彼此相等。但「$\nabla\log$ 相等」只能推出两个分布差一个常数倍、推不出相等(求导把常数抹成 $0$、反推不回来,同不定积分要带 $+C$),所以只能写正比: > $\tilde p_\theta(z_\lambda\mid c)\propto p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}$ > 正是上面那条采到的分布。$w$ 从 score 里的系数落到分布里的指数,就在中间用对数律那一步。 > > 被正比号吸收的那个常数倍,是归一化常数 $Z=\int p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}\,\mathrm d z_\lambda$:右边这个乘积本身不归一化(全空间积分不一定为 $1$),真正的分布是这乘积除以 $Z$。而采样只用 score、$\nabla\log Z=0$、看不见 $Z$,所以丢掉 $Z$ 不影响采样,全程 $\propto$ 就够。 ## §1.5 直觉:为什么保真度升、多样性降 $w$ 往大调,这个加权的效果用一个玩具例子看最清楚。论文举了个三类高斯的例子(论文 Figure 2,即论文正文第 2 张插图,在 PDF 里):每一类原本是一个各向同性高斯,加上 guidance 后,每个条件分布明显变得非高斯,质量朝「远离别的类、分类器最确信」的方向收拢,越来越集中在小范围里。 放到真实模型上就是一句话: **$w$ 调大,每张样本更清晰、更贴合条件(保真度、Inception Score 升),代价是样本之间越来越像、多样性下降。** 这正是截断采样那条「保真对多样」的权衡,Dhariwal & Nichol 通过调 $w$ 在扩散上复现了这条权衡。 代价的来历也顺带看清:Inception Score 奖励「类别明确」的图,而 guidance 恰恰把样本往分类器高置信区推,于是分数被抬高。这也埋下 §0.2 的疑问,分数高有多少来自「真的更好」、多少来自「专门迎合了打分的分类器」,正是 CFG 要绕开的。 ## §1.6 一个要点:guidance 加在已条件模型上 这一节是个次要的设定澄清:引导因子到底加在哪个模型上。抓一个目标数就不绕了:最终要让类别确信度因子 $p_\theta(c\mid z_\lambda)$ 在分布里总共出现 $w+1$ 份(§1.4 加重进去 $w$ 份,条件模型那条路自带 $1$ 份,合计 $w+1$;分布里指数是几就是几份)。这 $w+1$ 份可以从两个起点凑出来: - 从条件模型 $p_\theta(z_\lambda\mid c)$ 起步:贝叶斯拆开 $p_\theta(z_\lambda\mid c)=p_\theta(c\mid z_\lambda)\,p_\theta(z_\lambda)/p_\theta(c)$,这一路自带 $1$ 份 $p_\theta(c\mid z_\lambda)$,再补 $w$ 份就凑够 $w+1$ 份。 - 从无条件模型 $p_\theta(z_\lambda)$ 起步:一份都不自带,得补满 $w+1$ 份才凑够。 两条路终点都是 $w+1$ 份 $p_\theta(c\mid z_\lambda)$、同一个分布(核对见下折叠)。$w$ 与 $w+1$ 的差,就是条件模型白送的那 $1$ 份。 终点既然一样,加在哪个模型上理论上都行;实践中 Dhariwal & Nichol 发现加在条件模型上效果最好,所以后文一律用「对条件模型加 $w$ 份」这个设定,CFG 也是。 > [!note]- 两种施加方式指向同一分布的核对 > 目标是核对 $p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}$(对条件模型加 $w$)和 $p_\theta(z_\lambda)\,p_\theta(c\mid z_\lambda)^{w+1}$(对无条件模型加 $w+1$)成正比。左边用贝叶斯把 $p_\theta(z_\lambda\mid c)$ 换成 $p_\theta(c\mid z_\lambda)p_\theta(z_\lambda)/p_\theta(c)$: > $p_\theta(z_\lambda\mid c)\,p_\theta(c\mid z_\lambda)^{w}=\frac{p_\theta(c\mid z_\lambda)\,p_\theta(z_\lambda)}{p_\theta(c)}\cdot p_\theta(c\mid z_\lambda)^{w}$ > $p_\theta(c)$ 不含 $z_\lambda$、当常数吸进正比号,两个 $p_\theta(c\mid z_\lambda)$ 因子指数相加($1+w$): > $\propto p_\theta(z_\lambda)\,p_\theta(c\mid z_\lambda)^{w+1}$ > 正是右边。所以两种施加方式指向同一个分布,差别只在实践效果。 ## 本节一条线 论文的背景记号几乎都是旧识:VP 前向(论文式(1))就是方差守恒那条,$\lambda=\log(\alpha_\lambda^2/\sigma_\lambda^2)$ 只是给噪声水平换了个用 log 信噪比来读的刻度($\lambda$ 大噪少,和 $\sigma$ 方向相反);$\varepsilon$ 与 score 差一个 $-\sigma_\lambda$,是贯穿全单元的翻译器。从 Score-SDE `10_可控生成与逆问题` §10 那条「条件 score = 无条件 score + 引导项」出发,classifier guidance 就是把引导项加重、系数从 $1$ 提到 $1+w$,写回 $\varepsilon$ 得到修改预测 $\tilde\varepsilon$,对应采一个被 $p_\theta(c\mid z_\lambda)^w$ 重新加权的分布;$w$ 越大质量越挤向分类器高置信区,保真度升、多样性降。classifier guidance 需要外挂一个带噪图分类器,下一节的 CFG 把这个引导项换成网络自己就能给出的东西。