生成模型学习笔记(二)

之后有可能要从事生成类模型的研究和应用,在这里记录一下学习笔记和心得。
Alt


3. 扩散模型(Diffusion Model)

3.1 扩散模型原理

  扩散模型是对一系列隐变量进行建模的模型,即 p θ ( x 0 : T ) p_{\theta}(x_{0:T}) pθ(x0:T),其中 θ \theta θ 是模型参数, x 0 x_0 x0是真实数据, x 1 : T x_{1:T} x1:T 是隐变量。隐变量都是由真实数据 x 0 x_0 x0 进行逐步地扩散而来,这个过程表示为前向过程(forward process)或扩散过程(diffusion process),记作 q ( x 1 : T ∣ x 0 ) q(x_{1:T}|x_0) q(x1:Tx0)。前向过程满足马尔可夫性,即 q ( x t ∣ x 1 : t − 1 ) = q ( x t ∣ x t − 1 ) q(x_t|x_{1:t-1})=q(x_t|x_{t-1}) q(xtx1:t1)=q(xtxt1),则前向过程的联合概率可以表示为 q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}|x_0)=\prod_{t=1}^Tq(x_t|x_{t-1}) q(x1:Tx0)=t=1Tq(xtxt1)

  前向过程认为每一步的隐变量都是上一步的扩散,或者叫加噪,具体来说可以认为 x t = 1 − β t x t − 1 + β t ϵ t x_t=\sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t xt=1βt xt1+βt ϵt,其中 { β t } 1 ≤ t ≤ T \{\beta_t\}_{1\leq t\leq T} {βt}1tT 是一组很小的参数,对应每一步扩散的幅度。每一步的扩散可以表示为 q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1})=\mathcal{N}(\sqrt{1-\beta_t}x_{t-1},\beta_tI) q(xtxt1)=N(1βt xt1,βtI)。而 p θ ( x 0 : T ) p_{\theta}(x_{0:T}) pθ(x0:T) 表示从隐变量回到样本数据的过程,表示为反向过程(reverse process),即 p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{0:T})=p(x_T)\prod_{t=1}^T p_{\theta}(x_{t-1}|x_t) pθ(x0:T)=p(xT)t=1Tpθ(xt1xt),其中 x T x_T xT 经过了多步的扩散后已经几乎变为随机噪声,因此认为 p ( x T ) = N ( 0 , I ) p(x_T)=\mathcal{N}(0,I) p(xT)=N(0,I)

3.2 去噪扩散概率模型(Denoising Diffusion Probabilistic Model,DDPM)

3.2.1 DDPM原理概述

  DDPM是扩散模型生成数据的开山之作,通过训练一个去噪网络,对采样到的随机噪声进行逐步去噪,最终还原为有价值的的数据。这个过程有点像雕塑,雕像就在大理石之中,只要找到多余的部分并去除就可以还原出雕像的面貌。为了训练这个去噪网络,DDPM先对样本数据逐步加噪,并将每一步的噪声用于去噪网络的训练。
Alt

  相比于GAN、VAE等一步到位的模型,DDPM更像是逐步化的VAE,但核心思想是对噪声进行预测而非直接对数据进行预测,前者被认为更加简单和可行。同时DDPM也解耦了样本空间和隐空间变量的一一对应关系,比VAE更加方便。多步生成效果也比单步生成更好,这在集成学习,残差网络,自回归模型等研究中已经多次见过,每一步都可以对上一步进行精细化微调,使得预测结果更加合理。
Alt

3.2.2 DDPM公式推导

  同VAE,DDPM也分为Encoder和Decoder,对应扩散模型的前向过程和反向过程。前者对数据逐步加噪使其最终几乎完全成为随机噪声,后者对随机噪声进行逐步去噪最终成为生成的数据。同时模型也分为Training过程和Sampling过程(也可以叫Learning过程和Inference过程)。而DDPM的优化目标也是变分下界
Alt

  DDPM的变分下界可以改写为:Alt
这里截取了原论文的公式,DDPM的论文中将目标函数写作变分下界的负值,因此最大化变分下界就是最小化上面这个式子。对于 L T L_T LT,已经保证了 p ( x T ) = N ( 0 , I ) p(x_T)=\mathcal{N}(0,I) p(xT)=N(0,I) 且前向过程使得 q ( x T ∣ x ) q(x_T|x) q(xTx) 尽可能接近 N ( 0 , I ) \mathcal{N}(0,I) N(0,I) ,因此这一项通过前向过程的定义已经得到了优化。对于 L T L_T LT 也同样与前向过程相关而非模型参数,因此模型需要学习的只有最小化 L t − 1 L_{t-1} Lt1,即使得前向过程的后验分布 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 与通过模型输出的反向过程的 p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{t-1}|x_t) pθ(xt1xt) 之间的KL散度。

  为了训练模型,我们首先要对前向过程中每一步的后验概率 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 进行计算。可以利用贝叶斯公式得:
q ( x t − 1 ∣ x t , x 0 ) = q ( x t − 1 , x t , x 0 ) q ( x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x 0 ) q ( x t ∣ x 0 ) q ( x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) , (3.1) \begin{align*}q(x_{t-1}|x_t,x_0)&=\frac{q(x_{t-1},x_t,x_0)}{q(x_t,x_0)}\\ &=\frac{q(x_t|x_{t-1},x_0)q(x_{t-1}|x_0)q(x_0)}{q(x_t|x_0)q(x_0)}\\ &=\frac{q(x_t|x_{t-1},x_0)q(x_{t-1}|x_0)}{q(x_t|x_0)},\end{align*}\tag{3.1} q(xt1xt,x0)=q(xt,x0)q(xt1,xt,x0)=q(xtx0)q(x0)q(xtxt1,x0)q(xt1x0)q(x0)=q(xtx0)q(xtxt1,x0)q(xt1x0),(3.1)
其中 q ( x t ∣ x t − 1 , x 0 ) q(x_t|x_{t-1},x_0) q(xtxt1,x0) 可以通过马尔可夫性进行化简为 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)(这里看似不起眼,其实有伏笔,后续研究将针对这里做改进),而其他两项需要通过前向传播逐步计算。

  在DDPM中,前向过程的每一步加噪可以通过预设定的幅度进行,无需学习得到。因此模型首先设定加噪和去噪的步数 T T T,并设定一组超参数 { β t } 1 ≤ t ≤ T \{\beta_t\}_{1\leq t\leq T} {βt}1tT,并一起计算其他几个会用到的超参数 { α t = 1 − β t } 1 ≤ t ≤ T \{\alpha_t=1-\beta_t\}_{1\leq t\leq T} {αt=1βt}1tT { α ˉ t = ∏ τ = 1 t α τ } 1 ≤ t ≤ T \{\bar{\alpha}_t=\prod_{\tau=1}^t\alpha_{\tau}\}_{1\leq t\leq T} {αˉt=τ=1tατ}1tT。则根据3.1中的式子, x t = α t x t − 1 + β t ϵ t = α t [ α t − 1 x t − 2 + β t − 1 ϵ t − 1 ] + β t ϵ t = α t ⋅ α t − 1 x t − 2 + α t ⋅ β t − 1 ϵ t − 1 + β t ϵ t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t=\sqrt{\alpha_t}[\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{\beta_{t-1}}\epsilon_{t-1}]+\sqrt{\beta_t}\epsilon_t=\sqrt{\alpha_t\cdot\alpha_{t-1}}x_{t-2}+\sqrt{\alpha_t\cdot\beta_{t-1}}\epsilon_{t-1}+\sqrt{\beta_t}\epsilon_t xt=αt xt1+βt ϵt=αt [αt1 xt2+βt1 ϵt1]+βt ϵt=αtαt1 xt2+αtβt1 ϵt1+βt ϵt,根据高斯分布可加性, α t ⋅ β t − 1 ϵ t − 1 + β t ϵ t ∼ N ( 0 , ( α t ⋅ β t − 1 + β t ) I ) \sqrt{\alpha_t\cdot\beta_{t-1}}\epsilon_{t-1}+\sqrt{\beta_t}\epsilon_t\sim\mathcal{N}(0,(\alpha_t\cdot\beta_{t-1}+\beta_t)I) αtβt1 ϵt1+βt ϵtN(0,(αtβt1+βt)I),因此一直向前计算可得 x t = α ˉ t x 0 + γ ϵ x_t=\sqrt{\bar{\alpha}_t}x_0+\gamma\epsilon xt=αˉt x0+γϵ γ \gamma γ 计算比较麻烦,可以近似表示为 1 − α ˉ t \sqrt{1-\bar{\alpha}_t} 1αˉt ,因此前向过程无需逐步计算,而是可以一步得到
x t = α ˉ t x 0 + 1 − α ˉ t ϵ ,        x t ∼ N ( α ˉ t x 0 , 1 − α ˉ t ) (3.2) x_t=\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon,\ \ \ \ \ \ x_t\sim\mathcal{N}(\sqrt{\bar{\alpha}_t}x_0,1-\bar{\alpha}_t)\tag{3.2} xt=αˉt x0+1αˉt ϵ,      xtN(αˉt x0,1αˉt)(3.2)
将该式带入式(3.1)可得(下面的式子实际上应该严格按照多元高斯分布推导,但过程太过繁杂为了表意直观,按照一元高斯分布列写):
q ( x t − 1 ∣ x t , x 0 ) = 2 π ⋅ ( 1 − α ˉ t ) 2 π β t 2 π ⋅ ( 1 − α ˉ t − 1 ) ⋅ exp ⁡ { ( x t − α t x t − 1 ) 2 2 β t + ( x t − 1 − α ˉ t − 1 x 0 ) 2 2 ( 1 − α ˉ t − 1 ) − ( x t − α ˉ t x 0 ) 2 2 ( 1 − α ˉ t ) } q(x_{t-1}|x_t,x_0)=\frac{\sqrt{2\pi\cdot(1-\bar{\alpha}_t)}}{\sqrt{2\pi\beta_t}\sqrt{2\pi\cdot(1-\bar{\alpha}_{t-1})}}\cdot\exp\left\{\frac{(x_t-\sqrt{\alpha_t}x_{t-1})^2}{2\beta_t}+\frac{(x_{t-1}-\sqrt{\bar{\alpha}_{t-1}}x_{0})^2}{2(1-\bar{\alpha}_{t-1})}-\frac{(x_t-\sqrt{\bar{\alpha}_{t}}x_{0})^2}{2(1-\bar{\alpha}_{t})}\right\} q(xt1xt,x0)=2πβt 2π(1αˉt1) 2π(1αˉt) exp{2βt(xtαt xt1)2+2(1αˉt1)(xt1αˉt1 x0)22(1αˉt)(xtαˉt x0)2}
经过一系列复杂的多元高斯概率密度函数的化简后,可以得到:
q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ ( x t , x 0 ) , Σ ~ ( x t , x 0 ) ) , μ ~ ( x t , x 0 ) = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t , Σ ~ ( x t , x 0 ) = 1 − α ˉ t − 1 1 − α ˉ t β t I , (3.3) \begin{align*}q(x_{t-1}|x_t,x_0)&=\mathcal{N}\left(\tilde{\mu}(x_t,x_0),\tilde{\Sigma}(x_t,x_0)\right),\\ \tilde{\mu}(x_t,x_0)&=\frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha}_t}x_0+\frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha}_t}x_t,\\ \tilde{\Sigma}(x_t,x_0)&=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_tI\end{align*},\tag{3.3} q(xt1xt,x0)μ~(xt,x0)Σ~(xt,x0)=N(μ~(xt,x0),Σ~(xt,x0)),=1αˉtαˉt1 βtx0+1αˉtαt (1αˉt1)xt,=1αˉt1αˉt1βtI,(3.3)
由此就可以最小化 L t − 1 L_{t-1} Lt1 来使模型得到训练,但似乎还不太明确如何调整模型 θ \theta θ 让KL散度降低。DDPM的论文中提到, q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 的方差是由预设定的超参数决定的,而模型的 p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{t-1}|x_t) pθ(xt1xt) 的方差几乎可以认为是固定的(也有论文讨论其方差并不固定的问题,但实际工作验证了可以将其视为固定而不会对模型性能有影响)。因此对两个方差固定的高斯分布,只需要令二者均值接近就可以减小KL散度

  回到刚刚的问题,如何调整模型 θ \theta θ ,来让二者均值接近呢?需要寻找模型计算 p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{t-1}|x_t) pθ(xt1xt) 均值的方法。由式(3.2)可反推 x 0 = 1 α ˉ t ( x t − 1 − α ˉ t ϵ ) x_0=\frac{1}{\sqrt{\bar{\alpha}_t}}(x_t-\sqrt{1-\bar{\alpha}_t}\epsilon) x0=αˉt 1(xt1αˉt ϵ)将该式带入式(3.3)中的均值可得:
μ ~ ( x t , x 0 ) = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ ) , (3.4) \tilde{\mu}(x_t,x_0)=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon\right),\tag{3.4} μ~(xt,x0)=αt 1(xt1αˉt 1αtϵ),(3.4)

  到这里我们终于知道如何用模型计算 p θ ( x t − 1 ∣ x t ) p_{\theta}(x_{t-1}|x_t) pθ(xt1xt) 并使其靠近 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0),只要通过模型预测其中的噪声 ϵ \epsilon ϵ,即可算得 μ θ ( x t , t ) = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ θ ) \mu_{\theta}(x_t,t)=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_{\theta}\right) μθ(xt,t)=αt 1(xt1αˉt 1αtϵθ),则目标函数可以改写为
L t − 1 = E q [ 1 2 σ t 2 ∥ μ ~ ( x t , x 0 ) − μ θ ( x t , t ) ∥ 2 ] + C = E q [ 1 2 σ t 2 ⋅ 1 α t ⋅ 1 − α t 1 − α ˉ t ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] + C = 1 2 σ t 2 ⋅ 1 α t ⋅ 1 − α t 1 − α ˉ t ⋅ E q [ ∥ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) ∥ 2 ] + C \begin{align*}L_{t-1}&=\mathbb{E}_q\left[\frac{1}{2\sigma_t^2}\left\|\tilde{\mu}(x_t,x_0)-\mu_{\theta}(x_t,t)\right\|^2\right]+C\\ &=\mathbb{E}_q\left[\frac{1}{2\sigma_t^2}\cdot\frac{1}{\sqrt{\alpha_t}}\cdot\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\left\|\epsilon-\epsilon_{\theta}(x_t,t)\right\|^2\right]+C\\ &=\frac{1}{2\sigma_t^2}\cdot\frac{1}{\sqrt{\alpha_t}}\cdot\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\cdot\mathbb{E}_q\left[\left\|\epsilon-\epsilon_{\theta}(\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon,t)\right\|^2\right]+C\end{align*} Lt1=Eq[2σt21μ~(xt,x0)μθ(xt,t)2]+C=Eq[2σt21αt 11αˉt 1αtϵϵθ(xt,t)2]+C=2σt21αt 11αˉt 1αtEq[ ϵϵθ(αˉt x0+1αˉt ϵ,t) 2]+C

  根据上面的所有推导可以得到DDPM的算法为:Alt
其中 ϵ θ \epsilon_{\theta} ϵθ 为噪声预测器,而sampling中的公式4就是用模型来计算式(3.4),但sampling中第四行还有一项 σ t z \sigma_tz σtz,主要是在每一步去噪时再加入一个微小噪声( σ t \sigma_t σt 远小于1),对于这个操作目前还没找到可靠解释,但可以确定的是如果不加这一项生成的结果会很差而没有语义信息(下图右)。台大李宏毅老师给出的解释是,语义本来就不是由最大概率的子部分所组成的,这一点无论在图像、语音还是语言都有体现,如下图左,如果用一个自回归模型(如GPT)不断预测下一个词来生成语言,则人类的语言很少被模型判定为高概率的句子(下图左),而如果一直以最高概率的词作为预测结果,生成的句子可能会非常无聊且容易重复。因此在DDPM生成数据的过程中,每一步都必须保持一定的随机性,并在后续步骤中对这些随机性进行调整,才能最终得到有意义的数据。
在这里插入图片描述

3.3 基于分数的扩散模型(Score-based Diffusion Model)

3.3.1 先前基于分数的生成模型(Score-based Generative Model,SGM)

3.3.1.1 分数Score的由来

  生成模型需要对数据的分布进行建模,受基于能量的模型(Energy-based Model,EBM)启发,我们通常把数据分布建模为 p θ = e − f θ ( x ) Z θ p_{\theta}=\frac{e^{-f_{\theta}(x)}}{Z_{\theta}} pθ=Zθefθ(x),其中 θ \theta θ 为模型参数, Z θ = ∫ x e − f θ ( x ) d x Z_{\theta}=\int_xe^{-f_{\theta}(x)}dx Zθ=xefθ(x)dx 为归一化因子,为了使建模的分布积分为1。我们通常使用最大似然的方法训练模型(Normalized flow、VAE以及DDPM都是这一类方法),即 θ ^ = max ⁡ θ ∑ i = 1 N log ⁡ p θ ( x i ) = max ⁡ θ [ ∑ i = 1 N − f θ ( x i ) − N log ⁡ Z θ ] \hat{\theta}=\underset{\theta}{\max}\sum_{i=1}^N\log p_{\theta}(x_i)=\underset{\theta}{\max}[\sum_{i=1}^N-f_{\theta}(x_i)-N\log Z_{\theta}] θ^=θmaxi=1Nlogpθ(xi)=θmax[i=1Nfθ(xi)NlogZθ],但计算 Z θ Z_{\theta} Zθ 需要对整个样本空间进行遍历,无法精确求解,因此需要对这个问题进行简化。

  基于分数的方法通过改变优化目标来解决上述问题,既然无法求解似然函数,那就可以用分数Score:
s θ ( x ) = ▽ x log ⁡ p θ ( x ) = ▽ x [ − f θ ( x ) − log ⁡ Z θ ] = ▽ x [ − f θ ( x ) ] s_{\theta}(x)=\bigtriangledown_x\log p_{\theta}(x)=\bigtriangledown_x[-f_{\theta}(x)-\log Z_{\theta}]=\bigtriangledown_x[-f_{\theta}(x)] sθ(x)=xlogpθ(x)=x[fθ(x)logZθ]=x[fθ(x)]
来训练模型,从而约去归一化因子。其思想是不需要直接对概率分布进行计算,只要对归一化之前的概率分布,即能量函数 f θ ( x ) f_{\theta}(x) fθ(x) 进行优化就可以,最后等模型训练好了直接从中抽样就自然完成了归一化。

  而基于分数的方法通过计算 ▽ x log ⁡ p θ ( x ) \bigtriangledown_x\log p_{\theta}(x) xlogpθ(x) 并使其不断靠近真实分数 ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_x\log p_{data}(x) xlogpdata(x) ,则模型所建模的分布也会逐渐接近真实分布。这个思想可以理解为,对未归一化的分布进行优化就是调整分布的形状,与归一化后的分布只差一个放缩的系数,只要其形状和真实分布的形状相近,就能保证归一化后的分布与真实分布非常接近,而形状就是概率密度函数对 x x x 的导数。因此SGM的目标函数,也被称为Fisher散度,表示为:
min ⁡ θ L = min ⁡ θ E p d a t a ( x ) [ ∥ ▽ x log ⁡ p d a t a ( x ) − s θ ( x ) ∥ 2 ] \underset{\theta}{\min}\mathcal{L}=\underset{\theta}{\min}\mathbb{E}_{p_{data}(x)}[\|\bigtriangledown_x\log p_{data}(x)-s_{\theta}(x)\|^2] θminL=θminEpdata(x)[xlogpdata(x)sθ(x)2]

  这里可以联想到DDPM。在DDPM中,其Inference过程是认为隐变量是真实数据加了噪声得来,要逐步预测这个噪声并减去,使其渐渐靠近真实数据分布。如果把单步隐变量视作模型建模的分布 p θ ( x ) p_{\theta}(x) pθ(x),则需要预测的噪声可以理解为模型分布与真实分布之差,因此这个噪声与上面提到的分数其实都是提供了让模型分布靠近真实分布的信息,DDPM与基于分数的模型的目标函数也有相同形式。(下面这句是我自己的理解)不同的是DDPM的模型分布向着 p d a t a ( x 0 ) − p d a t a ( x t ) p_{data}(x_0)-p_{data}(x_t) pdata(x0)pdata(xt) 的方向移动,而基于分数的模型分布向着 ▽ x log ⁡ p d a t a ( x ) = lim ⁡ Δ x → 0 p d a t a ( x t + Δ x ) + p d a t a ( x t ) Δ x \bigtriangledown_x\log p_{data}(x)=\lim_{\Delta x\rightarrow0}\frac{p_{data}(x_t+\Delta x)+p_{data}(x_t)}{\Delta x} xlogpdata(x)=limΔx0Δxpdata(xt+Δx)+pdata(xt) 的方向移动。

3.3.1.2 分数匹配(Score Matching)

  但这又有个问题,我们并不知道真实分布 p d a t a ( x ) p_{data}(x) pdata(x),何来计算真实分数呢?大佬Song Yang给出了一个方法,即为分数匹配。具体来说,先将上面的目标函数拆开:
L = E p d a t a ( x ) [ ∥ ▽ x log ⁡ p d a t a ( x ) − s θ ( x ) ∥ 2 ] = ∫ x p d a t a ( x ) ⋅ ∥ ▽ x log ⁡ p d a t a ( x ) − s θ ( x ) ∥ 2 d x = ∫ x p d a t a ( x ) ⋅ [ ▽ x log ⁡ p d a t a ( x ) − s θ ( x ) ] T ⋅ [ ▽ x log ⁡ p d a t a ( x ) − s θ ( x ) ] d x = ∫ x p d a t a ( x ) ⋅ [ ▽ x log ⁡ p d a t a ( x ) T ▽ x log ⁡ p d a t a ( x )                 − 2 ▽ x log ⁡ p d a t a ( x ) T s θ ( x ) + s θ ( x ) T s θ ( x ) ] d x \begin{align*}\mathcal{L}&=\mathbb{E}_{p_{data}(x)}[\|\bigtriangledown_x\log p_{data}(x)-s_{\theta}(x)\|^2]\\ &=\int_xp_{data}(x)\cdot\|\bigtriangledown_x\log p_{data}(x)-s_{\theta}(x)\|^2dx\\ &=\int_xp_{data}(x)\cdot[\bigtriangledown_x\log p_{data}(x)-s_{\theta}(x)]^T\cdot[\bigtriangledown_x\log p_{data}(x)-s_{\theta}(x)]dx\\ &=\int_xp_{data}(x)\cdot[\bigtriangledown_x\log p_{data}(x)^T\bigtriangledown_x\log p_{data}(x)\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -2\bigtriangledown_x\log p_{data}(x)^Ts_{\theta}(x)+s_{\theta}(x)^Ts_{\theta}(x)]dx \end{align*} L=Epdata(x)[xlogpdata(x)sθ(x)2]=xpdata(x)xlogpdata(x)sθ(x)2dx=xpdata(x)[xlogpdata(x)sθ(x)]T[xlogpdata(x)sθ(x)]dx=xpdata(x)[xlogpdata(x)Txlogpdata(x)               2xlogpdata(x)Tsθ(x)+sθ(x)Tsθ(x)]dx
其中第一项 ▽ x log ⁡ p d a t a ( x ) T ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_x\log p_{data}(x)^T\bigtriangledown_x\log p_{data}(x) xlogpdata(x)Txlogpdata(x) θ \theta θ 无关,因此可以视作常数,我们继续对第二第三项进行化简,其中因为 ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_x\log p_{data}(x) xlogpdata(x) s θ ( x ) s_{\theta}(x) sθ(x) 都是向量,其每个元素是对 x = [ x 1 , ⋯   , x p ] x=[x_1,\cdots,x_p] x=[x1,,xp] 每个维度求偏导,即 s θ ( x ) = ▽ x log ⁡ p θ ( x ) = [ ∂ p θ ( x ) ∂ x 1 , ⋯   , ∂ p θ ( x ) ∂ x p ] s_{\theta}(x)=\bigtriangledown_x\log p_{\theta}(x)=[\frac{\partial p_{\theta}(x)}{\partial x_1},\cdots,\frac{\partial p_{\theta}(x)}{\partial x_p}] sθ(x)=xlogpθ(x)=[x1pθ(x),,xppθ(x)],因此记 s θ , x i ( x ) = ∂ p θ ( x ) ∂ x i s_{\theta,x_i}(x)=\frac{\partial p_{\theta}(x)}{\partial x_i} sθ,xi(x)=xipθ(x),可以按照维度将上面的式子拆开为:
L = ∫ x p d a t a ( x ) ⋅ [ − 2 ▽ x log ⁡ p d a t a ( x ) T s θ ( x ) + s θ ( x ) T s θ ( x ) ] d x = ∫ x p d a t a ( x ) ⋅ [ − 2 ∑ i = 1 p ▽ x i log ⁡ p d a t a ( x ) ⋅ s θ , x i ( x ) + ∑ i = 1 p s θ , x i 2 ( x ) ] d x \begin{align*}\mathcal{L}&=\int_xp_{data}(x)\cdot\left[-2\bigtriangledown_x\log p_{data}(x)^Ts_{\theta}(x)+s_{\theta}(x)^Ts_{\theta}(x)\right]dx\\ &=\int_xp_{data}(x)\cdot\left[-2\sum_{i=1}^p\bigtriangledown_{x_i}\log p_{data}(x)\cdot s_{\theta,x_i}(x)+\sum_{i=1}^ps_{\theta,x_i}^2(x)\right]dx \end{align*} L=xpdata(x)[2xlogpdata(x)Tsθ(x)+sθ(x)Tsθ(x)]dx=xpdata(x)[2i=1pxilogpdata(x)sθ,xi(x)+i=1psθ,xi2(x)]dx
其中后面一项比较容易求解,无需 p d a t a ( x ) p_{data}(x) pdata(x) 信息,我们再继续对前一项化简:
∫ x p d a t a ( x ) ⋅ [ − 2 ∑ i = 1 p ▽ x i log ⁡ p d a t a ( x ) ⋅ s θ , x i ( x ) ] d x = ∫ x p d a t a ( x ) ⋅ [ − 2 ∑ i = 1 p 1 p d a t a ( x ) ⋅ ▽ x i p d a t a ( x ) ⋅ s θ , x i ( x ) ] d x = − 2 ∫ x [ ∑ i = 1 p ▽ x i p d a t a ( x ) ⋅ s θ , x i ( x ) ] d x = − 2 ∑ i = 1 p ∫ x i [ ∂ p d a t a ( x ) ∂ x i ⋅ s θ , x i ( x ) ] d x i , 分部积分 = − 2 ∑ i = 1 p { [ p d a t a ( x ) ⋅ s θ , x i ( x ) ] ∣ − ∞ + ∞ ⏟ = 0 − ∫ x i [ p d a t a ( x ) ⋅ ∂ s θ , x i ( x ) ∂ x i ] d x i } = 2 ∫ x p d a t a ( x ) ⋅ [ ∑ i = 1 p ∂ s θ , x i ( x ) ∂ x i ] d x = 2 ∫ x p d a t a ( x ) ⋅ [ t r ( ▽ x s θ ( x ) ) ] d x \begin{align*}&\int_xp_{data}(x)\cdot\left[-2\sum_{i=1}^p\bigtriangledown_{x_i}\log p_{data}(x)\cdot s_{\theta,x_i}(x)\right]dx\\ =&\int_xp_{data}(x)\cdot\left[-2\sum_{i=1}^p\frac{1}{p_{data}(x)}\cdot\bigtriangledown_{x_i}p_{data}(x)\cdot s_{\theta,x_i}(x)\right]dx\\ =&-2\int_x\left[\sum_{i=1}^p\bigtriangledown_{x_i}p_{data}(x)\cdot s_{\theta,x_i}(x)\right]dx\\ =&-2\sum_{i=1}^p\int_{x_i}\left[\frac{\partial p_{data}(x)}{\partial x_i}\cdot s_{\theta,x_i}(x)\right]dx_i,分部积分\\ =&-2\sum_{i=1}^p\left\{\underset{=0}{\underbrace{\left[p_{data}(x)\cdot s_{\theta,x_i}(x)\right]|_{-\infty}^{+\infty}}}-\int_{x_i}\left[p_{data}(x)\cdot \frac{\partial s_{\theta,x_i}(x)}{\partial x_i}\right]dx_i \right\}\\ =&2\int_{x}p_{data}(x)\cdot \left[\sum_{i=1}^p\frac{\partial s_{\theta,x_i}(x)}{\partial x_i}\right]dx\\ =&2\int_{x}p_{data}(x)\cdot \left[tr(\bigtriangledown_{x}s_{\theta}(x))\right]dx \end{align*} ======xpdata(x)[2i=1pxilogpdata(x)sθ,xi(x)]dxxpdata(x)[2i=1ppdata(x)1xipdata(x)sθ,xi(x)]dx2x[i=1pxipdata(x)sθ,xi(x)]dx2i=1pxi[xipdata(x)sθ,xi(x)]dxi,分部积分2i=1p =0 [pdata(x)sθ,xi(x)]+xi[pdata(x)xisθ,xi(x)]dxi 2xpdata(x)[i=1pxisθ,xi(x)]dx2xpdata(x)[tr(xsθ(x))]dx
其中 t r ( ▽ x s θ ( x ) ) tr(\bigtriangledown_{x}s_{\theta}(x)) tr(xsθ(x)) 表示 ▽ x s θ ( x ) \bigtriangledown_{x}s_{\theta}(x) xsθ(x)(或 ∂ 2 p θ ( x ) ∂ x 2 \frac{\partial^2 p_{\theta}(x)}{\partial x^2} x22pθ(x))的主对角线元素之和(其他元素为 ∂ 2 p θ ( x ) ∂ x i ∂ x j ∣ i ≠ j \frac{\partial^2 p_{\theta}(x)}{\partial x_i\partial x_j}|_{i\neq j} xixj2pθ(x)i=j)。

  因此原目标函数可以化为:
L = E p d a t a [ ∥ s θ ( x ) ∥ 2 + 2 t r ( ▽ x s θ ( x ) ) ] \mathcal{L}=\mathbb{E}_{p_{data}}\left[\|s_{\theta}(x)\|^2+2tr(\bigtriangledown_{x}s_{\theta}(x))\right] L=Epdata[sθ(x)2+2tr(xsθ(x))]
到此便完成了化简,现在的目标函数巧妙避过了计算 ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_{x}\log p_{data}(x) xlogpdata(x),使得目标函数便于计算,只需要调整模型 θ \theta θ 使得 L \mathcal{L} L 最小化即可训练模型。

3.3.1.3 郎之万动力学(Langevin Dynamics)

  郎之万动力学源于物理学中对能量的研究,如同我们最初定义模型分布时,受到基于能量的模型的启发, p θ = e − f θ ( x ) Z θ p_{\theta}=\frac{e^{-f_{\theta}(x)}}{Z_{\theta}} pθ=Zθefθ(x),对分布中的一个样本 x x x,其能量函数 E ( x ) = f θ ( x ) E(x)=f_{\theta}(x) E(x)=fθ(x),因此能量越高的地方概率密度越低,而物理学中对布朗运动(微小粒子随机游走)的研究告诉我们,粒子的运动轨迹存在随机性而无法预测,但其总是趋于从能量高的地方移动向能量低的地方。因此用郎之万动力学的视角看样本数据的生成,可以理解为数据从能量高(概率密度低)的地方流向能量低(概率密度高)的地方,尽管我们并不知道真实数据的概率密度函数,但只要让数据随着能量流动,最终生成的数据都集中在概率密度高的地方,便会接近真实数据的分布。这个过程是数据生成的过程,可以通过郎之万动力学方程来建模,公式为:
x t = x t − 1 + ϵ 2 ▽ x p d a t a ( x t − 1 ) + ϵ z t x_t=x_{t-1}+\frac{\epsilon}{2}\bigtriangledown_xp_{data}(x_{t-1})+\sqrt{\epsilon}z_t xt=xt1+2ϵxpdata(xt1)+ϵ zt
其中 ▽ x p ( x t − 1 ) \bigtriangledown_xp(x_{t-1}) xp(xt1) 通过训练好的分数模型 s θ ( x t − 1 ) s_{\theta}(x_{t-1}) sθ(xt1) 算得, ϵ \epsilon ϵ 是预定义的步长,需要是一个很小的值,经过较多步长后收敛于真实数据分布。 z t ∼ N ( 0 , I ) z_t\sim\mathcal{N}(0,I) ztN(0,I) 模拟游走过程中的随机性,避免生成的数据遵循确定性分布从而丢失语义信息和多样性(这里可以回顾3.2.2 DDPM公式推导中最后一段),初始值 x 0 x_0 x0 可以从一个预设定的简单分布中抽样,例如高斯分布。

  如果把每一步的游走看做状态转移,则基于郎之万动力学的Inference(数据生成)过程可以看做一个马尔可夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)的过程,则可以使用MCMC的研究成果来优化这个过程,例如引入 Metropolis-Hastings 算法,对每一次的游走选择接收或不接受,理论上可以加快Inference速度(虽然作者说作用并不大),但这同样丢失了游走过程中的部分随机性,不利于数据的生成。

3.3.1.4 分数匹配的问题与改进

  问题1:基于分数匹配的生成模型在训练时,若网络参数 θ \theta θ 较多,或数据维度 p p p 过大, t r ( ▽ x s θ ( x ) ) tr(\bigtriangledown_{x}s_{\theta}(x)) tr(xsθ(x)) 的计算也非常麻烦,Yang Song对此提出了两种解决方案:

  首先可以通过去噪分数匹配(Denoising Score Matching)的方法。我们无法对未知的数据分布计算 ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_x\log p_{data}(x) xlogpdata(x),但可以构建一个与 p d a t a ( x ) p_{data}(x) pdata(x) 相近的已知分布。即令 x ~ = x + σ ϵ \tilde{x}=x+\sigma\epsilon x~=x+σϵ,其中 ϵ ∼ N ( 0 , σ 2 I ) \epsilon\sim\mathcal{N}(0,\sigma^2 I) ϵN(0,σ2I),这样对每个样本 x x x,我们都有一个已知的分布 x ~ ∼ q σ ( x ~ ∣ x ) = N ( x , σ 2 I ) \tilde{x}\sim q_{\sigma}(\tilde{x}|x)=\mathcal{N}(x,\sigma^2 I) x~qσ(x~x)=N(x,σ2I),则可以对其求分数以使模型可以通过预测 s θ ( x ~ ) s_{\theta}(\tilde{x}) sθ(x~) 来为生成的数据提供方向,使其逐渐靠近 q σ ( x ~ ∣ x ) q_{\sigma}(\tilde{x}|x) qσ(x~x) 的分布,也就是在靠近真实分布 p d a t a ( x ) p_{data}(x) pdata(x)。去噪分数匹配的目标函数为:
min ⁡ θ E q σ ( x ~ ∣ x ) p d a t a ( x ) [ ∥ ▽ x ~ log ⁡ q σ ( x ~ ∣ x ) − s θ ( x ~ ) ∥ 2 ] = min ⁡ θ E q σ ( x ~ ∣ x ) p d a t a ( x ) [ ∥ x ~ − x σ 2 + s θ ( x ~ ) ∥ 2 ] \underset{\theta}{\min}\mathbb{E}_{q_{\sigma}(\tilde{x}|x)p_{data}(x)}\left[\left\|\bigtriangledown_{\tilde{x}}\log q_{\sigma}(\tilde{x}|x)-s_{\theta}(\tilde{x})\right\|^2\right]=\underset{\theta}{\min}\mathbb{E}_{q_{\sigma}(\tilde{x}|x)p_{data}(x)}\left[\left\|\frac{\tilde{x}-x}{\sigma^2}+s_{\theta}(\tilde{x})\right\|^2\right] θminEqσ(x~x)pdata(x)[x~logqσ(x~x)sθ(x~)2]=θminEqσ(x~x)pdata(x)[ σ2x~x+sθ(x~) 2]

  这个方法有点类似于VAE,认为每个样本数据都有其唯一对于的隐空间变量 z ∣ x ∼ N ( μ ( x ) , Σ ( x ) ) z|x\sim \mathcal{N}(\mu(x),\Sigma(x)) zxN(μ(x),Σ(x)),但其生成数据的Decoding方法更加有效和可解释,这个方法必须要保证对数据的扰动方差 σ \sigma σ 足够小以至于 q σ ( x ~ ∣ x ) ≈ p d a t a ( x ) q_{\sigma}(\tilde{x}|x)\approx p_{data}(x) qσ(x~x)pdata(x)

  另外还有一个方法是切片得分匹配(Sliced Score Matching),通过对高维 t r ( ▽ x s θ ( x ) ) tr(\bigtriangledown_{x}s_{\theta}(x)) tr(xsθ(x)) 进行降维来简化计算量,切片得分匹配的目标函数为:
min ⁡ θ E p ( v ) E p d a t a ( x ) [ ∥ s θ ( x ) ∥ 2 + 2 v T ▽ x s θ ( x ) v ] \underset{\theta}{\min}\mathbb{E}_{p(v)}\mathbb{E}_{p_{data}(x)}\left[\|s_{\theta}(x)\|^2+2v^T\bigtriangledown_{x}s_{\theta}(x)v\right] θminEp(v)Epdata(x)[sθ(x)2+2vTxsθ(x)v]
其中 v v v 是一个服从简单分布(如标准正态分布)的随机向量,通过该向量可以将 ▽ x s θ ( x ) \bigtriangledown_{x}s_{\theta}(x) xsθ(x) 映射到低维从而简化运算。

  问题2:真实世界的数据往往倾向于分布在低维流形,而此时针对整个高维空间定义的梯度 ▽ x log ⁡ p d a t a ( x ) \bigtriangledown_x\log p_{data}(x) xlogpdata(x) 将失去意义(计算出来也不准确),因此对于低维流形的数据,模型训练无法收敛到一致解。

  问题3:上述基于分数匹配的所有方法都可能出现分数估计不准确的问题,特别是对于数据分布稀疏的区域,由于这里数据少,其训练得到的模型不能计算出准确的梯度,如下图所示,颜色深度表示真实数据分布的密度,箭头表示该地区的分布。右图中 Estimated Scores 红色虚线框以外的部分很多地方分数都与左图 Data Scores不同,且越是远离两个数据集中区域则误差越大。
Alt

  问题4:生成的结果和真实分布不同。例如,考虑真实数据服从一个混合分布 p d a t a ( x ) = a p 1 ( x ) + ( 1 − a ) p 2 ( x ) p_{data}(x)=ap_1(x)+(1-a)p_2(x) pdata(x)=ap1(x)+(1a)p2(x) (如下图a),同时满足 { p 2 ( x ) = 0 , if  p 1 ( x ) > 0 p 1 ( x ) = 0 , if  p 2 ( x ) > 0 \left\{\begin{matrix}p_2(x)=0,&\text{if}\ p_1(x)>0\\p_1(x)=0,&\text{if}\ p_2(x)>0\end{matrix}\right. {p2(x)=0,p1(x)=0,if p1(x)>0if p2(x)>0,则该分布的分数为 ▽ x log ⁡ p d a t a ( x ) = { ▽ x [ log ⁡ ( a ) + log ⁡ p 1 ( x ) ] , if  p 1 ( x ) > 0 ▽ x [ log ⁡ ( 1 − a ) + log ⁡ p 2 ( x ) ] , if  p 2 ( x ) > 0 = { ▽ x log ⁡ p 1 ( x ) , if  p 1 ( x ) > 0 ▽ x log ⁡ p 2 ( x ) , if  p 2 ( x ) > 0 \bigtriangledown_x\log p_{data}(x)=\left\{\begin{matrix}\bigtriangledown_x\left[\log(a)+\log p_1(x)\right],&\text{if}\ p_1(x)>0\\\bigtriangledown_x\left[\log(1-a)+\log p_2(x)\right],&\text{if}\ p_2(x)>0\end{matrix}\right.=\left\{\begin{matrix}\bigtriangledown_x\log p_1(x),&\text{if}\ p_1(x)>0\\\bigtriangledown_x\log p_2(x),&\text{if}\ p_2(x)>0\end{matrix}\right. xlogpdata(x)={x[log(a)+logp1(x)],x[log(1a)+logp2(x)],if p1(x)>0if p2(x)>0={xlogp1(x),xlogp2(x),if p1(x)>0if p2(x)>0,则在梯度信息中混合比例的 a a a 失效,致使生成的数据本来应该按照两个分布的支撑区域的面积占比分布,但此时只能按照采样的区域面积占比分布(例如下图b,真实数据分布应该是0.3:0.7之类的,但是生成的数据分布却像是0.5:0.5)
Alt

3.3.1.5 噪声条件分数网络(Noise Conditional Score Network,NCSN)

  为了解决上述问题2~4,研究者们想到了使用噪声来填充样本空间,既可以对低维流形的数据填充高维信息,又可以增加低数据密度区域的样本数量。这个方法类似于前面提到的去噪分数匹配,即对加噪后的数据进行学习,这使得模型在所有区域都获得了尽可能多的信息来精确估计分数。然而这依然有个问题,如果用来填充样本空间的噪声很小,则对上述问题改进不大,如果噪声很大,则会破坏原数据的分布,导致模型学习到的也是一个被破坏的分布的分数。

  为了解决上述问题,Song Yang et al. 提出了噪声条件分数网络(NCSN),该方法对样本数据添加不同尺度的噪声,并分别用于训练不同的分数网络,在inference时以数据所在的尺度来选择网络计算分数。具体来说,设置一系列从大到小的方差 { σ i } 1 ≤ i ≤ L \{\sigma_i\}_{1\leq i\leq L} {σi}1iL(论文中说设置为等比数列比较好),从而得到一系列扰动后的样本数据 { x ~ i = x + σ i I } 1 ≤ i ≤ L \{\tilde{x}_i=x+\sigma_iI\}_{1\leq i\leq L} {x~i=x+σiI}1iL,这些所有的样本数据足够填充样本空间。再对扰动后的样本数据 x ~ t \tilde{x}_t x~t 分别训练一系列分数网络 { N e t i } 1 ≤ i ≤ L \{Net_i\}_{1\leq i\leq L} {Neti}1iL,使得从远离真实数据的简单分布开始采样 x ~ 0 \tilde{x}_0 x~0,从 N e t L Net_L NetL 开始计算分数,针对不同尺度噪声的数据逐步使用不同的分数网络,并不断趋近于真实分布,这个过程更加类似DDPM的逐步加噪和去噪的方法。

  实际上并不需要训练多个分数网络,而是使用一个网络来拟合所有尺度的分数,此时尺度,或者说方差 σ i \sigma_i σi 作为条件一起输入分数网络,这也是该方法叫条件分数网络的原因,表示为 s θ ( x ~ , σ ) s_{\theta}(\tilde{x},\sigma) sθ(x~,σ)。模型训练中对于单个尺度的数据损失函数如下:
l ( σ i ) = E p d a t a ( x ) E x ~ ∼ N ( x , σ i I ) [ ∥ x ~ − x σ i 2 + s θ ( x ~ , σ i ) ∥ 2 ] l(\sigma_i)=\mathbb{E}_{p_{data}(x)}\mathbb{E}_{\tilde{x}\sim\mathcal{N}(x,\sigma_iI)}\left[\left\|\frac{\tilde{x}-x}{\sigma_i^2}+s_{\theta}(\tilde{x},\sigma_i)\right\|^2\right] l(σi)=Epdata(x)Ex~N(x,σiI)[ σi2x~x+sθ(x~,σi) 2]而整个网络的损失函数为: L = 1 T ∑ t = 1 T λ ( σ t ) l ( σ t ) \mathcal{L}=\frac{1}{T}\sum_{t=1}^T\lambda(\sigma_t)l(\sigma_t) L=T1t=1Tλ(σt)l(σt)这里加入了单个尺度损失函数的权重函数 λ ( σ i ) \lambda(\sigma_i) λ(σi),因为单个尺度损失函数对总的模型训练的贡献(比重)会受 σ t \sigma_t σt 影响,从而不能均衡地训练模型。论文中使用的权重函数为 λ ( σ i ) = σ i 2 \lambda(\sigma_i)=\sigma_i^2 λ(σi)=σi2

  对于NCSN的inference,因为其逐尺度逐步地生成数据,也被叫做退火郎之万动力学(Annealed Langevin Dynamics)方法,公式为:
x ~ t = x ~ t − 1 + α i 2 ▽ x ~ s θ ( x ~ t − 1 , σ i ) + α i z t , \tilde{x}_t=\tilde{x}_{t-1}+\frac{\alpha_i}{2}\bigtriangledown_{\tilde{x}}s_{\theta}(\tilde{x}_{t-1},\sigma_i)+\sqrt{\alpha_i}z_t, x~t=x~t1+2αix~sθ(x~t1,σi)+αi zt,
其中 α i \alpha_i αi 是一个随步数变化的步长,通常设置 α i ∝ σ i 2 \alpha_i\propto \sigma_i^2 αiσi2

  作者还提出NCSN可以直接用于Inpainting(图像修补)任务,直接对缺失的部分进行生成即可。算法伪代码如下,只比NCSN生成模型多了第9行:
Alt
其中 m 是mask矩阵,y是待修复的图像。

  • 35
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值