常见的生成模型(Generative Models)如 GAN、VAE 和基于流( Flow-based )的模型。他们在生成高质量样本方面取得了巨大成功,但每个都有其自身的局限性。 GAN 因其对抗性训练性质,其训练过程难以收敛以及生成多样性欠佳。 VAE 依赖于替代损失(surrogate loss)。流模型必须使用专门的架构来构建可逆变换。

扩散模型( Diffusion Models )的灵感来自非平衡热力学。定义了扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习逆向扩散过程以从噪声中构造所需的数据样本与 VAE 或流模型不同,扩散模型是通过固定过程学习的,并且潜在变量具有高维度(与原始数据相同)

图 1. 不同类型的生成模型概述。

1. Diffusion Models

已经提出了几种基于扩散的生成模型,其中包含类似的思想,包括

  • 扩散概率模型(diffusion probabilistic models):https://arxiv.org/abs/1503.03585
  • 噪声条件评分网络(noise-conditioned score network): https://arxiv.org/abs/1907.05600
  • 去噪扩散概率模型(denoising diffusion probabilistic models): https://arxiv.org/abs/2006.11239

1.1 Forward diffusion process

给定从真实数据分布中采样的数据点 x0∼q(x)\mathbf{x}_0 \sim q(\mathbf{x})x0​∼q(x) ,定义一个前向扩散过程,其中在 TTT 步中向样本添加少量高斯噪声,产生一系列噪声样本 x1,…,xT\mathbf{x}_1, \dots, \mathbf{x}_Tx1​,…,xT​ 。步长由方差表控制 {βt∈(0,1)}t=1T\{\beta_t \in (0, 1)\}_{t=1}^T{βt​∈(0,1)}t=1T​

q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x1:T∣x0)=∏t=1Tq(xt∣xt−1)q(\mathbf{x}_t \vert \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t; \sqrt{1 - \beta_t} \mathbf{x}_{t-1}, \beta_t\mathbf{I}) \quad q(\mathbf{x}_{1:T} \vert \mathbf{x}_0) = \prod^T_{t=1} q(\mathbf{x}_t \vert \mathbf{x}_{t-1}) q(xt​∣xt−1​)=N(xt​;1−βt​​xt−1​,βt​I)q(x1:T​∣x0​)=t=1∏T​q(xt​∣xt−1​)

随着步长 ttt 变大,数据样本 x0\mathbf{x}_0x0​ 逐渐失去其可区分的特征。最终当 T→∞T \to \inftyT→∞ 时,xT\mathbf{x}_TxT​ 等价于各向同性高斯分布


图 2. 通过缓慢添加(去除)噪声生成样本的正向(反向)扩散过程的马尔可夫链。

通过缓慢添加(去除)噪声生成样本的马尔可夫链的正向(反向)扩散过程

上述过程的一个很好的特性是,可以用重新参数化技巧在任何任意时间步长 ttt 的封闭形式下对 xt\mathbf{x}_txt​ 进行采样

使得 αt=1−βt\alpha_t = 1 - \beta_tαt​=1−βt​ 以及 αˉt=∏i=1Tαi\bar{\alpha}_t = \prod_{i=1}^T \alpha_iαˉt​=∏i=1T​αi​:

xt=αtxt−1+1−αtzt−1;where zt−1,zt−2,⋯∼N(0,I)=αtαt−1xt−2+1−αtαt−1zˉt−2;where zˉt−2merges two Gaussians (*).=…=αˉtx0+1−αˉtzq(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)\begin{aligned} \mathbf{x}_t &= \sqrt{\alpha_t}\mathbf{x}_{t-1} + \sqrt{1 - \alpha_t}\mathbf{z}_{t-1} & \text{ ;where } \mathbf{z}_{t-1}, \mathbf{z}_{t-2}, \dots \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) \\ &= \sqrt{\alpha_t \alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{1 - \alpha_t \alpha_{t-1}} \bar{\mathbf{z}}_{t-2} & \text{ ;where } \bar{\mathbf{z}}_{t-2} \text{ merges two Gaussians (*).} \\ &= \dots \\ &= \sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t}\mathbf{z} \\ q(\mathbf{x}_t \vert \mathbf{x}_0) &= \mathcal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t} \mathbf{x}_0, (1 - \bar{\alpha}_t)\mathbf{I}) \end{aligned} xt​q(xt​∣x0​)​=αt​​xt−1​+1−αt​​zt−1​=αt​αt−1​​xt−2​+1−αt​αt−1​​zˉt−2​=…=αˉt​​x0​+1−αˉt​​z=N(xt​;αˉt​​x0​,(1−αˉt​)I)​ ;where zt−1​,zt−2​,⋯∼N(0,I) ;where zˉt−2​ merges two Gaussians (*).

(*) **当合并两个具有不同方差的高斯时,N(0,σ12I)\mathcal{N}(\mathbf{0}, \sigma_1^2\mathbf{I})N(0,σ12​I) 和 N(0,σ22I)\mathcal{N}(\mathbf{0}, \sigma_2^2\mathbf{I})N(0,σ22​I),新分布为 N(0,(σ12+σ22)I)\mathcal{N}(\mathbf{0}, (\sigma_1^2 + \sigma_2^2)\mathbf{I})N(0,(σ12​+σ22​)I) 。这里合并的标准差是 **
(1−αt)+αt(1−αt−1)=1−αtαt−1\sqrt{(1 - \alpha_t) + \alpha_t (1-\alpha_{t-1})} = \sqrt{1 - \alpha_t\alpha_{t-1}} (1−αt​)+αt​(1−αt−1​)​=1−αt​αt−1​​

通常,当样本变得更嘈杂时,可以承受更大的更新步长,所以 β1<β2<⋯<βT\beta_1 < \beta_2 < \dots < \beta_Tβ1​<β2​<⋯<βT​ 因此 αˉ1>⋯>αˉT\bar{\alpha}_1 > \dots > \bar{\alpha}_Tαˉ1​>⋯>αˉT​

Connection with stochastic gradient Langevin dynamics

Langevin dynamics 是物理学中的一个概念,用于对分子系统进行统计建模。结合随机梯度下降,stochastic gradient Langevin dynamics (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.226.363) 可以仅使用马尔可夫更新链中的梯度 ∇xlog⁡p(x)\nabla_\mathbf{x} \log p(\mathbf{x})∇x​logp(x) 从概率密度 p(x)p(\mathbf{x})p(x) 生成样本:

xt=xt−1+ϵ2∇xlog⁡p(xt−1)+ϵzt,where zt∼N(0,I)\mathbf{x}_t = \mathbf{x}_{t-1} + \frac{\epsilon}{2} \nabla_\mathbf{x} \log p(\mathbf{x}_{t-1}) + \sqrt{\epsilon} \mathbf{z}_t ,\quad\text{where } \mathbf{z}_t \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) xt​=xt−1​+2ϵ​∇x​logp(xt−1​)+ϵ​zt​,where zt​∼N(0,I)

其中 ϵ\epsilonϵ 为步长,当 T→∞,ϵ→0T \to \infty, \epsilon \to 0T→∞,ϵ→0 , xT\mathbf{x}_TxT​ 等于真实概率密度 p(x)p(\mathbf{x})p(x)。

与标准 SGD 相比,stochastic gradient Langevin dynamics 将高斯噪声注入到参数更新中,以避免陷入局部最小值。

1.2 Reverse diffusion process

如果可以反转上述过程并从 q(xt−1∣xt)q(\mathbf{x}_{t-1} \vert \mathbf{x}_t)q(xt−1​∣xt​) 中采样,将能够从高斯噪声输入 xT∼N(0,I)\mathbf{x}_T \sim \mathcal{N}(\mathbf{0}, \mathbf{I})xT​∼N(0,I) 中重新创建真实样本。值得一提的是,如果 βtβ_tβt​ 足够小,q(xt−1∣xt)q(\mathbf{x}_{t-1} \vert \mathbf{x}_t)q(xt−1​∣xt​) 也将是高斯分布的。不过估计 q(xt−1∣xt)q(\mathbf{x}_{t-1} \vert \mathbf{x}_t)q(xt−1​∣xt​) 是不可行的,因为它需要使用整个数据集,因此需要学习一个模型 pθp_θpθ​ 来逼近这些条件概率,以便运行反向扩散过程。

pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))p_\theta(\mathbf{x}_{0:T}) = p(\mathbf{x}_T) \prod^T_{t=1} p_\theta(\mathbf{x}_{t-1} \vert \mathbf{x}_t) \quad p_\theta(\mathbf{x}_{t-1} \vert \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t)) pθ​(x0:T​)=p(xT​)t=1∏T​pθ​(xt−1​∣xt​)pθ​(xt−1​∣xt​)=N(xt−1​;μθ​(xt​,t),Σθ​(xt​,t))

图 3. 数据建模的扩散模型训练示例。

值得注意的是,当以 x0\mathbf{x}_0x0​ 为条件时,反向条件概率是易于处理的:

q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI)q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_{t-1}; \color{blue}{\tilde{\boldsymbol{\mu}}}(\mathbf{x}_t, \mathbf{x}_0), \color{red}{\tilde{\beta}_t} \mathbf{I})q(xt−1​∣xt​,x0​)=N(xt−1​;μ~​(xt​,x0​),β~​t​I)

使用贝叶斯定理,则有:

q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)∝exp⁡(−12((xt−αtxt−1)2βt+(xt−1−αˉt−1x0)21−αˉt−1−(xt−αˉtx0)21−αˉt))=exp⁡(−12(xt2−2αtxtxt−1+αtxt−12βt+xt−12−2αˉt−1x0xt−1+αˉt−1x021−αˉt−1−(xt−αˉtx0)21−αˉt))=exp⁡(−12((αtβt+11−αˉt−1)xt−12−(2αtβtxt+2αˉt−11−αˉt−1x0)xt−1+C(xt,x0)))\begin{aligned} q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0) &= q(\mathbf{x}_t \vert \mathbf{x}_{t-1}, \mathbf{x}_0) \frac{ q(\mathbf{x}_{t-1} \vert \mathbf{x}_0) }{ q(\mathbf{x}_t \vert \mathbf{x}_0) } \\ &\propto \exp \Big(-\frac{1}{2} \big(\frac{(\mathbf{x}_t - \sqrt{\alpha_t} \mathbf{x}_{t-1})^2}{\beta_t} + \frac{(\mathbf{x}_{t-1} - \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0)^2}{1-\bar{\alpha}_{t-1}} - \frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0)^2}{1-\bar{\alpha}_t} \big) \Big) \\ &= \exp \Big(-\frac{1}{2} \big(\frac{\mathbf{x}_t^2 - 2\sqrt{\alpha_t} \mathbf{x}_t \color{blue}{\mathbf{x}_{t-1}} \color{black}{+ \alpha_t} \color{red}{\mathbf{x}_{t-1}^2} }{\beta_t} + \frac{ \color{red}{\mathbf{x}_{t-1}^2} \color{black}{- 2 \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0} \color{blue}{\mathbf{x}_{t-1}} \color{black}{+ \bar{\alpha}_{t-1} \mathbf{x}_0^2} }{1-\bar{\alpha}_{t-1}} - \frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0)^2}{1-\bar{\alpha}_t} \big) \Big) \\ &= \exp\Big( -\frac{1}{2} \big( \color{red}{(\frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}})} \mathbf{x}_{t-1}^2 - \color{blue}{(\frac{2\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{2\sqrt{\bar{\alpha}_{t-1}}}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0)} \mathbf{x}_{t-1} \color{black}{ + C(\mathbf{x}_t, \mathbf{x}_0) \big) \Big)} \end{aligned} q(xt−1​∣xt​,x0​)​=q(xt​∣xt−1​,x0​)q(xt​∣x0​)q(xt−1​∣x0​)​∝exp(−21​(βt​(xt​−αt​​xt−1​)2​+1−αˉt−1​(xt−1​−αˉt−1​​x0​)2​−1−αˉt​(xt​−αˉt​​x0​)2​))=exp(−21​(βt​xt2​−2αt​​xt​xt−1​+αt​xt−12​​+1−αˉt−1​xt−12​−2αˉt−1​​x0​xt−1​+αˉt−1​x02​​−1−αˉt​(xt​−αˉt​​x0​)2​))=exp(−21​((βt​αt​​+1−αˉt−1​1​)xt−12​−(βt​2αt​​​xt​+1−αˉt−1​2αˉt−1​​​x0​)xt−1​+C(xt​,x0​)))​

其中 C(xt,x0)C(\mathbf{x}_t, \mathbf{x}_0)C(xt​,x0​) 是一些不涉及 xt−1\mathbf{x}_{t-1}xt−1​ 的函数,省略了细节。按照标准的高斯密度函数,均值和方差可以参数化如下(回顾一下,αt=1−βt\alpha_t = 1 - \beta_tαt​=1−βt​ 和 αˉt=∏i=1Tαi\bar{\alpha}_t = \prod_{i=1}^T \alpha_iαˉt​=∏i=1T​αi​):
β~t=1/(αtβt+11−αˉt−1)=1/(αt−αˉt+βtβt(1−αˉt−1))=1−αˉt−11−αˉt⋅βtμ~t(xt,x0)=(αtβtxt+αˉt−11−αˉt−1x0)/(αtβt+11−αˉt−1)=(αtβtxt+αˉt−11−αˉt−1x0)1−αˉt−11−αˉt⋅βt=αt(1−αˉt−1)1−αˉtxt+αˉt−1βt1−αˉtx0\begin{aligned} \tilde{\beta}_t &= 1/(\frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}}) = 1/(\frac{\alpha_t - \bar{\alpha}_t + \beta_t}{\beta_t(1 - \bar{\alpha}_{t-1})}) = \color{green}{\frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t} \\ \tilde{\boldsymbol{\mu}}_t (\mathbf{x}_t, \mathbf{x}_0) &= (\frac{\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1} }}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0)/(\frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}}) \\ &= (\frac{\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1} }}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0) \color{green}{\frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t} \\ &= \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1 - \bar{\alpha}_t} \mathbf{x}_0\\ \end{aligned} β~​t​μ~​t​(xt​,x0​)​=1/(βt​αt​​+1−αˉt−1​1​)=1/(βt​(1−αˉt−1​)αt​−αˉt​+βt​​)=1−αˉt​1−αˉt−1​​⋅βt​=(βt​αt​​​xt​+1−αˉt−1​αˉt−1​​​x0​)/(βt​αt​​+1−αˉt−1​1​)=(βt​αt​​​xt​+1−αˉt−1​αˉt−1​​​x0​)1−αˉt​1−αˉt−1​​⋅βt​=1−αˉt​αt​​(1−αˉt−1​)​xt​+1−αˉt​αˉt−1​​βt​​x0​​

由于不错的属性,可以代表 x0=1αˉt(xt−1−αˉtzt)\mathbf{x}_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t}\mathbf{z}_t)x0​=αˉt​​1​(xt​−1−αˉt​​zt​) 并将其代入上式得到:

μ~t=αt(1−αˉt−1)1−αˉtxt+αˉt−1βt1−αˉt1αˉt(xt−1−αˉtzt)=1αt(xt−βt1−αˉtzt)\begin{aligned} \tilde{\boldsymbol{\mu}}_t &= \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1 - \bar{\alpha}_t} \frac{1}{\sqrt{\bar{\alpha}_t}}(\mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t}\mathbf{z}_t) \\ &= \color{cyan}{\frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \mathbf{z}_t \Big)} \end{aligned} μ~​t​​=1−αˉt​αt​​(1−αˉt−1​)​xt​+1−αˉt​αˉt−1​​βt​​αˉt​​1​(xt​−1−αˉt​​zt​)=αt​​1​(xt​−1−αˉt​​βt​​zt​)​
如图 2 所示,这种设置与 VAE 非常相似,因此可以使用变分下限来优化负对数似然。

variational lower bound 变分下限(也叫 evidence lower bound, ELBO)

为了衡量两个分布 q(Z)q(Z)q(Z) 和 p(Z∣X)p(Z|X)p(Z∣X) 的相似程度,常用的度量标准是 Kullback-Leibler (KL) 散度。变分推理的 KL 散度为:

KL[q(Z)∥p(Z∣X)]=∫Zq(Z)log⁡q(Z)p(Z∣X)=−∫Zq(Z)log⁡p(Z∣X)q(Z)=−(∫Zq(Z)log⁡p(X,Z)q(Z)−∫Zq(Z)log⁡p(X))=−∫Zq(Z)log⁡p(X,Z)q(Z)+log⁡p(X)∫Zq(Z)=−L+log⁡p(X)\begin{aligned} KL\left[q(Z) \| p(Z|X)\right] &= \int_Z q(Z) \log \frac{q(Z)}{p(Z|X)} \\ &= -\int_Z q(Z) \log \frac{p(Z|X)}{q(Z)} \\ &= - \left(\int_Z q(Z) \log \frac{p(X,Z)}{q(Z)} - \int_Z q(Z) \log p(X)\right) \\ &= -\int_Z q(Z) \log \frac{p(X,Z)}{q(Z)} + \log p(X) \int_Z q(Z) \\ &= -L + \log p(X) \end{aligned} KL[q(Z)∥p(Z∣X)]​=∫Z​q(Z)logp(Z∣X)q(Z)​=−∫Z​q(Z)logq(Z)p(Z∣X)​=−(∫Z​q(Z)logq(Z)p(X,Z)​−∫Z​q(Z)logp(X))=−∫Z​q(Z)logq(Z)p(X,Z)​+logp(X)∫Z​q(Z)=−L+logp(X)​

其中 LLL 为上述的变分下限。又由 ∫Zq(Z)=1\int_Z q(Z) = 1∫Z​q(Z)=1 可得:
L=log⁡p(X)−KL[q(Z)∥p(Z∣X)]L = \log p(X) - KL\left[q(Z) \| p(Z|X)\right] L=logp(X)−KL[q(Z)∥p(Z∣X)]
因为 KL 散度总是大于等于 0,可以推导出:
L≤log⁡p(X)L \leq \log p(X) L≤logp(X)

−log⁡pθ(x0)≤−log⁡pθ(x0)+DKL(q(x1:T∣x0)∥pθ(x1:T∣x0))=−log⁡pθ(x0)+Ex1:T∼q(x1:T∣x0)[log⁡q(x1:T∣x0)pθ(x0:T)/pθ(x0)]=−log⁡pθ(x0)+Eq[log⁡q(x1:T∣x0)pθ(x0:T)+log⁡pθ(x0)]=Eq[log⁡q(x1:T∣x0)pθ(x0:T)]Let LVLB=Eq(x0:T)[log⁡q(x1:T∣x0)pθ(x0:T)]≥−Eq(x0)log⁡pθ(x0)\begin{aligned} - \log p_\theta(\mathbf{x}_0) &\leq - \log p_\theta(\mathbf{x}_0) + D_\text{KL}(q(\mathbf{x}_{1:T}\vert\mathbf{x}_0) \| p_\theta(\mathbf{x}_{1:T}\vert\mathbf{x}_0) ) \\ &= -\log p_\theta(\mathbf{x}_0) + \mathbb{E}_{\mathbf{x}_{1:T}\sim q(\mathbf{x}_{1:T} \vert \mathbf{x}_0)} \Big[ \log\frac{q(\mathbf{x}_{1:T}\vert\mathbf{x}_0)}{p_\theta(\mathbf{x}_{0:T}) / p_\theta(\mathbf{x}_0)} \Big] \\ &= -\log p_\theta(\mathbf{x}_0) + \mathbb{E}_q \Big[ \log\frac{q(\mathbf{x}_{1:T}\vert\mathbf{x}_0)}{p_\theta(\mathbf{x}_{0:T})} + \log p_\theta(\mathbf{x}_0) \Big] \\ &= \mathbb{E}_q \Big[ \log \frac{q(\mathbf{x}_{1:T}\vert\mathbf{x}_0)}{p_\theta(\mathbf{x}_{0:T})} \Big] \\ \text{Let }L_\text{VLB} &= \mathbb{E}_{q(\mathbf{x}_{0:T})} \Big[ \log \frac{q(\mathbf{x}_{1:T}\vert\mathbf{x}_0)}{p_\theta(\mathbf{x}_{0:T})} \Big] \geq - \mathbb{E}_{q(\mathbf{x}_0)} \log p_\theta(\mathbf{x}_0) \end{aligned} −logpθ​(x0​)Let LVLB​​≤−logpθ​(x0​)+DKL​(q(x1:T​∣x0​)∥pθ​(x1:T​∣x0​))=−logpθ​(x0​)+Ex1:T​∼q(x1:T​∣x0​)​[logpθ​(x0:T​)/pθ​(x0​)q(x1:T​∣x0​)​]=−logpθ​(x0​)+Eq​[logpθ​(x0:T​)q(x1:T​∣x0​)​+logpθ​(x0​)]=Eq​[logpθ​(x0:T​)q(x1:T​∣x0​)​]=Eq(x0:T​)​[logpθ​(x0:T​)q(x1:T​∣x0​)​]≥−Eq(x0​)​logpθ​(x0​)​

使用 Jensen 不等式也很容易得到相同的结果。假设我们想最小化交叉熵作为学习目标,

Jensen 不等式:

过一个下凸函数上任意两点所作割线一定在这两点间的函数图象的上方,即:
tf(x1)+(1−t)f(x2)≥f(tx1+(1−t)x2),0≤t≤1.t f(x_1) + (1-t) f(x_2) \geq f \left (t x_1 + (1-t) x_2 \right ), 0 \leq t \leq 1. tf(x1​)+(1−t)f(x2​)≥f(tx1​+(1−t)x2​),0≤t≤1.
概率论版本

μ\muμ 是个概率测度。函数 ggg 换作实值随机变量 XXX。在 Ω\OmegaΩ 空间上,任何函数相对于概率测度 μ\muμ 的积分就成了期望值。这不等式就说,若 φ\varphiφ 是任一凸函数,则:
φ(E(X))≤E(φ(X))\varphi(\mathbb{E}(X)) \leq \mathbb{E}(\varphi(X)) φ(E(X))≤E(φ(X))

LCE=−Eq(x0)log⁡pθ(x0)=−Eq(x0)log⁡(∫pθ(x0:T)dx1:T)=−Eq(x0)log⁡(∫q(x1:T∣x0)pθ(x0:T)q(x1:T∣x0)dx1:T)=−Eq(x0)log⁡(Eq(x1:T∣x0)pθ(x0:T)q(x1:T∣x0))≤−Eq(x0:T)log⁡pθ(x0:T)q(x1:T∣x0)=Eq(x0:T)[log⁡q(x1:T∣x0)pθ(x0:T)]=LVLB\begin{aligned} L_\text{CE} &= - \mathbb{E}_{q(\mathbf{x}_0)} \log p_\theta(\mathbf{x}_0) \\ &= - \mathbb{E}_{q(\mathbf{x}_0)} \log \Big( \int p_\theta(\mathbf{x}_{0:T}) d\mathbf{x}_{1:T} \Big) \\ &= - \mathbb{E}_{q(\mathbf{x}_0)} \log \Big( \int q(\mathbf{x}_{1:T} \vert \mathbf{x}_0) \frac{p_\theta(\mathbf{x}_{0:T})}{q(\mathbf{x}_{1:T} \vert \mathbf{x}_{0})} d\mathbf{x}_{1:T} \Big) \\ &= - \mathbb{E}_{q(\mathbf{x}_0)} \log \Big( \mathbb{E}_{q(\mathbf{x}_{1:T} \vert \mathbf{x}_0)} \frac{p_\theta(\mathbf{x}_{0:T})}{q(\mathbf{x}_{1:T} \vert \mathbf{x}_{0})} \Big) \\ &\leq - \mathbb{E}_{q(\mathbf{x}_{0:T})} \log \frac{p_\theta(\mathbf{x}_{0:T})}{q(\mathbf{x}_{1:T} \vert \mathbf{x}_{0})} \\ &= \mathbb{E}_{q(\mathbf{x}_{0:T})}\Big[\log \frac{q(\mathbf{x}_{1:T} \vert \mathbf{x}_{0})}{p_\theta(\mathbf{x}_{0:T})} \Big] = L_\text{VLB} \end{aligned} LCE​​=−Eq(x0​)​logpθ​(x0​)=−Eq(x0​)​log(∫pθ​(x0:T​)dx1:T​)=−Eq(x0​)​log(∫q(x1:T​∣x0​)q(x1:T​∣x0​)pθ​(x0:T​)​dx1:T​)=−Eq(x0​)​log(Eq(x1:T​∣x0​)​q(x1:T​∣x0​)pθ​(x0:T​)​)≤−Eq(x0:T​)​logq(x1:T​∣x0​)pθ​(x0:T​)​=Eq(x0:T​)​[logpθ​(x0:T​)q(x1:T​∣x0​)​]=LVLB​​

为了将方程中的每个项转换为可分析计算的,可以将目标进一步重写为几个 KL 散度和熵项的组合:
LVLB=Eq(x0:T)[log⁡q(x1:T∣x0)pθ(x0:T)]=Eq[log⁡∏t=1Tq(xt∣xt−1)pθ(xT)∏t=1Tpθ(xt−1∣xt)]=Eq[−log⁡pθ(xT)+∑t=1Tlog⁡q(xt∣xt−1)pθ(xt−1∣xt)]=Eq[−log⁡pθ(xT)+∑t=2Tlog⁡q(xt∣xt−1)pθ(xt−1∣xt)+log⁡q(x1∣x0)pθ(x0∣x1)]=Eq[−log⁡pθ(xT)+∑t=2Tlog⁡(q(xt−1∣xt,x0)pθ(xt−1∣xt)⋅q(xt∣x0)q(xt−1∣x0))+log⁡q(x1∣x0)pθ(x0∣x1)]=Eq[−log⁡pθ(xT)+∑t=2Tlog⁡q(xt−1∣xt,x0)pθ(xt−1∣xt)+∑t=2Tlog⁡q(xt∣x0)q(xt−1∣x0)+log⁡q(x1∣x0)pθ(x0∣x1)]=Eq[−log⁡pθ(xT)+∑t=2Tlog⁡q(xt−1∣xt,x0)pθ(xt−1∣xt)+log⁡q(xT∣x0)q(x1∣x0)+log⁡q(x1∣x0)pθ(x0∣x1)]=Eq[log⁡q(xT∣x0)pθ(xT)+∑t=2Tlog⁡q(xt−1∣xt,x0)pθ(xt−1∣xt)−log⁡pθ(x0∣x1)]=Eq[DKL(q(xT∣x0)∥pθ(xT))⏟LT+∑t=2TDKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))⏟Lt−1−log⁡pθ(x0∣x1)⏟L0]\begin{aligned} L_\text{VLB} &= \mathbb{E}_{q(\mathbf{x}_{0:T})} \Big[ \log\frac{q(\mathbf{x}_{1:T}\vert\mathbf{x}_0)}{p_\theta(\mathbf{x}_{0:T})} \Big] \\ &= \mathbb{E}_q \Big[ \log\frac{\prod_{t=1}^T q(\mathbf{x}_t\vert\mathbf{x}_{t-1})}{ p_\theta(\mathbf{x}_T) \prod_{t=1}^T p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t) } \Big] \\ &= \mathbb{E}_q \Big[ -\log p_\theta(\mathbf{x}_T) + \sum_{t=1}^T \log \frac{q(\mathbf{x}_t\vert\mathbf{x}_{t-1})}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)} \Big] \\ &= \mathbb{E}_q \Big[ -\log p_\theta(\mathbf{x}_T) + \sum_{t=2}^T \log \frac{q(\mathbf{x}_t\vert\mathbf{x}_{t-1})}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)} + \log\frac{q(\mathbf{x}_1 \vert \mathbf{x}_0)}{p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1)} \Big] \\ &= \mathbb{E}_q \Big[ -\log p_\theta(\mathbf{x}_T) + \sum_{t=2}^T \log \Big( \frac{q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)}\cdot \frac{q(\mathbf{x}_t \vert \mathbf{x}_0)}{q(\mathbf{x}_{t-1}\vert\mathbf{x}_0)} \Big) + \log \frac{q(\mathbf{x}_1 \vert \mathbf{x}_0)}{p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1)} \Big] \\ &= \mathbb{E}_q \Big[ -\log p_\theta(\mathbf{x}_T) + \sum_{t=2}^T \log \frac{q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)} + \sum_{t=2}^T \log \frac{q(\mathbf{x}_t \vert \mathbf{x}_0)}{q(\mathbf{x}_{t-1} \vert \mathbf{x}_0)} + \log\frac{q(\mathbf{x}_1 \vert \mathbf{x}_0)}{p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1)} \Big] \\ &= \mathbb{E}_q \Big[ -\log p_\theta(\mathbf{x}_T) + \sum_{t=2}^T \log \frac{q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)} + \log\frac{q(\mathbf{x}_T \vert \mathbf{x}_0)}{q(\mathbf{x}_1 \vert \mathbf{x}_0)} + \log \frac{q(\mathbf{x}_1 \vert \mathbf{x}_0)}{p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1)} \Big]\\ &= \mathbb{E}_q \Big[ \log\frac{q(\mathbf{x}_T \vert \mathbf{x}_0)}{p_\theta(\mathbf{x}_T)} + \sum_{t=2}^T \log \frac{q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)}{p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t)} - \log p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1) \Big] \\ &= \mathbb{E}_q [\underbrace{D_\text{KL}(q(\mathbf{x}_T \vert \mathbf{x}_0) \parallel p_\theta(\mathbf{x}_T))}_{L_T} + \sum_{t=2}^T \underbrace{D_\text{KL}(q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0) \parallel p_\theta(\mathbf{x}_{t-1} \vert\mathbf{x}_t))}_{L_{t-1}} \underbrace{- \log p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1)}_{L_0} ] \end{aligned} LVLB​​=Eq(x0:T​)​[logpθ​(x0:T​)q(x1:T​∣x0​)​]=Eq​[logpθ​(xT​)∏t=1T​pθ​(xt−1​∣xt​)∏t=1T​q(xt​∣xt−1​)​]=Eq​[−logpθ​(xT​)+t=1∑T​logpθ​(xt−1​∣xt​)q(xt​∣xt−1​)​]=Eq​[−logpθ​(xT​)+t=2∑T​logpθ​(xt−1​∣xt​)q(xt​∣xt−1​)​+logpθ​(x0​∣x1​)q(x1​∣x0​)​]=Eq​[−logpθ​(xT​)+t=2∑T​log(pθ​(xt−1​∣xt​)q(xt−1​∣xt​,x0​)​⋅q(xt−1​∣x0​)q(xt​∣x0​)​)+logpθ​(x0​∣x1​)q(x1​∣x0​)​]=Eq​[−logpθ​(xT​)+t=2∑T​logpθ​(xt−1​∣xt​)q(xt−1​∣xt​,x0​)​+t=2∑T​logq(xt−1​∣x0​)q(xt​∣x0​)​+logpθ​(x0​∣x1​)q(x1​∣x0​)​]=Eq​[−logpθ​(xT​)+t=2∑T​logpθ​(xt−1​∣xt​)q(xt−1​∣xt​,x0​)​+logq(x1​∣x0​)q(xT​∣x0​)​+logpθ​(x0​∣x1​)q(x1​∣x0​)​]=Eq​[logpθ​(xT​)q(xT​∣x0​)​+t=2∑T​logpθ​(xt−1​∣xt​)q(xt−1​∣xt​,x0​)​−logpθ​(x0​∣x1​)]=Eq​[LT​DKL​(q(xT​∣x0​)∥pθ​(xT​))​​+t=2∑T​Lt−1​DKL​(q(xt−1​∣xt​,x0​)∥pθ​(xt−1​∣xt​))​​L0​−logpθ​(x0​∣x1​)​​]​
分别标记变分下界损失中的每个分量:
LVLB=LT+LT−1+⋯+L0where LT=DKL(q(xT∣x0)∥pθ(xT))Lt=DKL(q(xt∣xt+1,x0)∥pθ(xt∣xt+1))for 1≤t≤T−1L0=−log⁡pθ(x0∣x1)\begin{aligned} L_\text{VLB} &= L_T + L_{T-1} + \dots + L_0 \\ \text{where } L_T &= D_\text{KL}(q(\mathbf{x}_T \vert \mathbf{x}_0) \parallel p_\theta(\mathbf{x}_T)) \\ L_t &= D_\text{KL}(q(\mathbf{x}_t \vert \mathbf{x}_{t+1}, \mathbf{x}_0) \parallel p_\theta(\mathbf{x}_t \vert\mathbf{x}_{t+1})) \text{ for }1 \leq t \leq T-1 \\ L_0 &= - \log p_\theta(\mathbf{x}_0 \vert \mathbf{x}_1) \end{aligned} LVLB​where LT​Lt​L0​​=LT​+LT−1​+⋯+L0​=DKL​(q(xT​∣x0​)∥pθ​(xT​))=DKL​(q(xt​∣xt+1​,x0​)∥pθ​(xt​∣xt+1​)) for 1≤t≤T−1=−logpθ​(x0​∣x1​)​
LVLBL_{VLB}LVLB​ 中的每个 KL 项(L0L_0L0​ 除外)比较两个高斯分布,因此可以以封闭形式计算它们。 LTL_TLT​ 是常数,在训练期间可以忽略,因为 qqq 没有可学习的参数,而 xTx_TxT​ 是高斯噪声。 L0L_0L0​ 使用从 N(x0;μθ(x1,1),Σθ(x1,1))\mathcal{N}(x_0;μ_θ(x_1,1),Σ_θ(x_1,1))N(x0​;μθ​(x1​,1),Σθ​(x1​,1)) 派生的单独离散解码器。

1.3 Parameterization of LtL_tLt​ for Training Loss

我们需要学习一个神经网络来逼近反向扩散过程中的条件概率分布 pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))p_\theta(\mathbf{x}_{t-1} \vert \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t))pθ​(xt−1​∣xt​)=N(xt−1​;μθ​(xt​,t),Σθ​(xt​,t)) ,通过训练 μθ\mu_\thetaμθ​ 来预测 μ~t=1αt(xt−βt1−αˉtzt)\tilde{\boldsymbol{\mu}}_t = \frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \mathbf{z}_t \Big)μ~​t​=αt​​1​(xt​−1−αˉt​​βt​​zt​) 。因为 xtx_txt​ 在训练时可用作输入,可以重新参数化高斯噪声项,以使其在时间步 ttt 从输入 xtx_txt​ 预测 ztz_tzt​:
μθ(xt,t)=1αt(xt−βt1−αˉtzθ(xt,t))Thus xt−1=N(xt−1;1αt(xt−βt1−αˉtzθ(xt,t)),Σθ(xt,t))\begin{aligned} \boldsymbol{\mu}_\theta(\mathbf{x}_t, t) &= \color{cyan}{\frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \mathbf{z}_\theta(\mathbf{x}_t, t) \Big)} \\ \text{Thus }\mathbf{x}_{t-1} &= \mathcal{N}(\mathbf{x}_{t-1}; \frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \mathbf{z}_\theta(\mathbf{x}_t, t) \Big), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t)) \end{aligned} μθ​(xt​,t)Thus xt−1​​=αt​​1​(xt​−1−αˉt​​βt​​zθ​(xt​,t))=N(xt−1​;αt​​1​(xt​−1−αˉt​​βt​​zθ​(xt​,t)),Σθ​(xt​,t))​
损失项 LtL_tLt​ 被参数化以最小化与 μ~\tilde{\boldsymbol{\mu}}μ~​
Lt=Ex0,z[12∥Σθ(xt,t)∥22∥μ~t(xt,x0)−μθ(xt,t)∥2]=Ex0,z[12∥Σθ∥22∥1αt(xt−βt1−αˉtzt)−1αt(xt−βt1−αˉtzθ(xt,t))∥2]=Ex0,z[βt22αt(1−αˉt)∥Σθ∥22∥zt−zθ(xt,t)∥2]=Ex0,z[βt22αt(1−αˉt)∥Σθ∥22∥zt−zθ(αˉtx0+1−αˉtzt,t)∥2]\begin{aligned} L_t &= \mathbb{E}_{\mathbf{x}_0, \mathbf{z}} \Big[\frac{1}{2 \| \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t) \|^2_2} \| \color{blue}{\tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t, \mathbf{x}_0)} - \color{green}{\boldsymbol{\mu}_\theta(\mathbf{x}_t, t)} \|^2 \Big] \\ &= \mathbb{E}_{\mathbf{x}_0, \mathbf{z}} \Big[\frac{1}{2 \|\boldsymbol{\Sigma}_\theta \|^2_2} \| \color{blue}{\frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \mathbf{z}_t \Big)} - \color{green}{\frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \boldsymbol{\mathbf{z}}_\theta(\mathbf{x}_t, t) \Big)} \|^2 \Big] \\ &= \mathbb{E}_{\mathbf{x}_0, \mathbf{z}} \Big[\frac{ \beta_t^2 }{2 \alpha_t (1 - \bar{\alpha}_t) \| \boldsymbol{\Sigma}_\theta \|^2_2} \|\mathbf{z}_t - \mathbf{z}_\theta(\mathbf{x}_t, t)\|^2 \Big] \\ &= \mathbb{E}_{\mathbf{x}_0, \mathbf{z}} \Big[\frac{ \beta_t^2 }{2 \alpha_t (1 - \bar{\alpha}_t) \| \boldsymbol{\Sigma}_\theta \|^2_2} \|\mathbf{z}_t - \mathbf{z}_\theta(\sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t}\mathbf{z}_t, t)\|^2 \Big] \end{aligned} Lt​​=Ex0​,z​[2∥Σθ​(xt​,t)∥22​1​∥μ~​t​(xt​,x0​)−μθ​(xt​,t)∥2]=Ex0​,z​[2∥Σθ​∥22​1​∥αt​​1​(xt​−1−αˉt​​βt​​zt​)−αt​​1​(xt​−1−αˉt​​βt​​zθ​(xt​,t))∥2]=Ex0​,z​[2αt​(1−αˉt​)∥Σθ​∥22​βt2​​∥zt​−zθ​(xt​,t)∥2]=Ex0​,z​[2αt​(1−αˉt​)∥Σθ​∥22​βt2​​∥zt​−zθ​(αˉt​​x0​+1−αˉt​​zt​,t)∥2]​

Simplification

在忽略加权项的简化目标下,训练扩散模型效果更好:
Ltsimple=Ex0,zt[∥zt−zθ(αˉtx0+1−αˉtzt,t)∥2]L_t^\text{simple} = \mathbb{E}_{\mathbf{x}_0, \mathbf{z}_t} \Big[\|\mathbf{z}_t - \mathbf{z}_\theta(\sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t}\mathbf{z}_t, t)\|^2 \Big] Ltsimple​=Ex0​,zt​​[∥zt​−zθ​(αˉt​​x0​+1−αˉt​​zt​,t)∥2]
最后一个简单的目标是:
Lsimple=Ltsimple+CL_\text{simple} = L_t^\text{simple} + C Lsimple​=Ltsimple​+C
其中 CCC 是一个不依赖于 θθθ 的常数。

图 4 DDPM 中的训练和采样算法

参考资料

  • What are Diffusion Models? | Lil’Log (lilianweng.github.io)
  • Understanding the Variational Lower Bound (xyang35.github.io)
  • [2006.11239] Denoising Diffusion Probabilistic Models (arxiv.org)

Diffusion Models - 扩散模型(一)相关推荐

  1. 2022年11月100篇 diffusion models 扩散模型 汇总!

    在生成图像方面,自从NIPS 2014的一篇开山之作: Generative Adversarial Nets 论文:https://proceedings.neurips.cc/paper/2014 ...

  2. Diffusion Models扩散模型简单讲解与简单实现

    Diffusion Models 图中: x 0 x_0 x0​为图像, z z z为采样自正态分布的噪音 扩散模型**是受非平衡热力学的启发.它们定义一个扩散步骤的马尔可夫链,逐渐向数据添加随机噪声 ...

  3. 井喷式爆发!2022年11月100篇 diffusion models 扩散模型 汇总!

    点击上方"摸鱼吧算法工程师"卡片,关注星标 获取有趣.好玩的前沿干货! 001  (2022-11-30) Maximum Likelihood Estimation for a ...

  4. 【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt

    Diffusion Models专栏文章汇总:入门与实战 前言:今年prompt learning提示学习和diffusion models扩散模型实在是太火了,最新的ICLR 2023的一项工作把两 ...

  5. 【CV】Latent diffusion model 扩散模型体验

    note 文章目录 note 一.diffusion模型 1.1 Stable Diffusion简介 1.2 和GAN对比的优势 二.Latent diffusion model原理 2.1 潜在空 ...

  6. 【diffusion】扩散模型详解!理论+代码

    0.项目视频详解 视频教程见B站https://www.bilibili.com/video/BV1e8411a7mz 1.diffusion模型理论(推导出损失函数) 1.1.背景 随着人工智能在图 ...

  7. Diffusion Models专栏文章汇总:入门与实战

    最新最全Diffusion Models论文.代码汇总 1.Diffusion Models扩散模型与深度学习(数学原理和代码解读) 这篇文章适合小白入门看,能快速了解diffusion models ...

  8. 扩散模型 | 矢量艺术图形生成

    点击上方"摸鱼吧算法工程师"卡片,关注星标 获取有趣.好玩的前沿干货! https://arxiv.org/pdf/2211.11319.pdf VectorFusion: Tex ...

  9. high-resolution image synthesis with latent diffusion models

    如何通俗理解扩散模型? - 知乎泻药.实验室最近人人都在做扩散,从连续到离散,从CV到NLP,基本上都被diffusion洗了一遍.但是观察发现,里面的数学基础并不是模型应用的必须.其实大部分的研究者 ...

最新文章

  1. 资源 | 《统计学习方法》的Python 3.6复现,实测可用
  2. 八句经典座右铭必有一句适合你
  3. shell 工具_shell 脚本加密工具 - shc
  4. html表单ui图片,semantic-ui 表单(示例代码)
  5. layui上传报错会有哪些原因_一到冬天,为什么会比别人更怕冷?有哪些原因?...
  6. hibernate映射-单向n-n关联关系
  7. 小帅小胖智能机器人价格_小胖机器人CEO魏然:机器人+教育,是未来教育大势所趋...
  8. JavaScript 设计模式之代理模式
  9. No package ‘glib-2.0‘ found/No package ‘gobject-2.0‘ found
  10. 统计自然语言处理(第二版)学习笔记:第一章
  11. 铁路车辆工程使用计算机软件,铁路车辆工程论文
  12. PJSIP添加G729编码
  13. 教士、神父、教父、牧师有什么区别?
  14. [量化-034]金融哲学-道德经解读-005-“道”是什么
  15. 如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
  16. 明星直播的品牌效应,这几个关键数据你一定要知道!
  17. operator理解
  18. 翼机通,别让垄断的剑刺向自己
  19. 红灯检测宇视科技专利分析与总结1
  20. qt-python-matlab

热门文章

  1. 中南民族大学计算机科学学院转专业好吗,中南民族大学计算机科学学院
  2. putty怎么查看MySQL密码_putty mysql修改密码
  3. 王者荣耀qq区服务器位置,王者荣耀:qq区单排现状,射手可能是最难的一个位置,为什么?...
  4. 用python写简易计算器_Python制作简易计算器
  5. Three TextureLoader纹理贴图不显示图片(显示黑色)的原因分析
  6. 30、python散点图绘制简单操作
  7. hiv实验室抗体筛查流程图_检验科各种流程图.doc
  8. kalibr标定realsenseD435i(一)--imu标定
  9. Linux内核及内核编程之五Linux下的C编程特点
  10. TestNG自动化测试框架详解