扩散模型:利用非均衡热力学的深度无监督学习

Deep Unsupervised Learning using Nonequilibrium Thermodynamics

  • 扩散模型:利用非均衡热力学的深度无监督学习
    • 1. 扩散模型简介
      • 1.1 扩散概率模型
      • 1.2 与其他工作的关联
      • 1.3 预备知识
    • 2. 算法
      • 2.1. 正向轨迹
      • 2.2. 反向轨迹
      • 2.3. 模型概率
      • 2.4 训练
      • 2.5 乘法分布,并计算后验
      • 2.6 反向过程的熵
    • 3. 实验
      • 3.1 玩具问题
      • 3.3 图像数据集

给定数据的概率分布估计问题:机器学习中的一个核心问题是使用概率分布族对复杂的数据集进行建模,

    1. 要求高度灵活
    1. 在这些族中,学习、抽样、推理和评估仍然在分析或计算上是可处理的。

在历史上,概率模型会在两个相互冲突的目标之间进行权衡:可处理性灵活性

  • 易于处理的模型可以进行分析评估,并很容易地拟合数据(例如,高斯分布或拉普拉斯分布),这些模型无法恰当地描述在丰富的数据集中的结构。
  • 灵活的模型可以被塑造成适合任意数据中的结构。例如,我们可以用任何(非负的)函数 ϕ(x)\phi(\mathbf{x})ϕ(x) 来定义模型从而产生灵活的分布 p(x)=ϕ(x)Zp(\mathbf{x})=\frac{\phi(\mathbf{x})}{Z}p(x)=Zϕ(x)​,其中 ZZZ 是一个归一化常数。然而,计算这个归一化常数通常是很棘手的。从这种灵活的模型中进行评估、训练或抽取样本通常需要一个非常昂贵的蒙特卡罗积分过程。

存在着各种各样的解析近似来改善(但没有消除)这种权衡,例如:

改善这种权衡的方法
平均场论及其展开式(T, 1982; Tanaka, 1998)
变分贝叶斯(Jordan et al., 1999)
对比散度 (Welling & Hinton, 2002; Hinton, 2002)
最小概率流(Sohl-Dickstein et al., 2011b;a)
最小KL收缩 (Lyu, 2011)
正确的评分规则 (Gneiting & Raftery, 2007; Parry et al., 2012)
分数匹配(Hyvarinen, 2005)
伪似然 (Besag, 1975)
循环信念传播(Murphy et al., 1999)
非参数方法(Gershman & Blei, 2012)

1. 扩散模型简介

扩散模型是可以同时实现灵活性和可处理性的方法,

1.1 扩散概率模型

扩散概率模型的基本思路:

  • 第一步:受非平衡统计物理学的启发,通过迭代的正向(或推理)扩散过程系统地、缓慢地破坏数据分布中的结构。
  • 第二步:学习一个反向扩散过程,恢复数据中的结构,产生一个高度灵活和易于处理的数据生成模型。

第一步,使用一个马尔可夫链来将一个分布逐渐转换为另一个分布,这是在非平衡统计物理学(Jarzynski,1997)和序列蒙特卡罗(Neal,2001)中使用的一个想法。

第二步,我们建立了一个生成的马尔可夫链,它使用一个扩散过程将一个简单的已知分布(例如一个高斯分布)转换为一个目标(要建模的数据)分布。我们不是使用这个马尔可夫链来近似地评估一个“已被另外定义的模型”,而是明确地将“概率模型”定义为马尔可夫链的端点。由于扩散链中的每一步都有一个可解析计算的概率,故全链也可以进行解析计算,因此只需要计算该马氏链的转移概率。

优点:灵活且易处理

这种方法允许我们快速学习、采样和评估具有数千层或时间步长的深度生成模型中的概率,并且

  1. 模型结构的极端灵活性: 由于任何光滑的目标分布都存在扩散过程,因此该方法可以捕获任意形式的数据分布。
  2. 易处理: 精确采样;在这个框架中的学习包括估计一个扩散过程的小扰动p^(x(t−1)∣x(t))\hat{p}\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)p^​(x(t−1)∣x(t))。估计小的扰动比用一个单一的、不可解析的归一化势函数明确地描述完整的分布更容易处理。
  3. 与其他分布容易相乘,例如计算学习模型下的条件概率和后验概率;
  4. 容易估计模型的对数似然性和个体状态的概率;

模拟验证:我们通过训练一个二维瑞士卷、二进制序列、手写数字(MNIST)和几个自然图像(CIFAR-10、树皮和枯叶)数据集的高对数似然模型,证明了这些扩散概率模型的效用。

1.2 与其他工作的关联

训练推理和生成概率模型相互对抗的唤醒睡眠(wake-sleep)算法(Hinton, 1995; Dayan et al.,1995)在近20年里一直没有被探索,最近发展这一想法的工作数量激增。(Kingma & Welling, 2013; Gregor et al., 2013; Rezende et al., 2014;
Ozair & Bengio, 2014)开发的变分学习和推理算法,允许灵活的生成模型和潜在变量的后验分布直接相互训练。

这些论文中的变分界与我们的训练目标相似。然而动机和模型形式都是完全不同的,以下是与这些技术相关的差异和优势:

  1. 我们使用来自物理学、准静态过程和退火重要性采样的思想来开发我们的框架,而不是使用变分贝叶斯方法。
  2. 我们展示了如何轻松地将学习到的分布与另一个概率分布相乘(例如用一个条件分布来计算一个后验分布)
  3. 由于推理模型和生成模型之间的目标不对称性,我们解决了训练推理模型特别具有挑战性的困难。我们将正向(推理)过程限制为一个简单的函数形式,这样反向(生成)过程将具有相同的函数形式。
  4. 我们用数千个层(或时间步长)来训练模型,而不是只有少数几个层。
  5. 我们提供了在每一层(或时间步长)的熵产生的上界和下界

有许多相关的技术来训练概率模型(总结如下),为生成模型开发高度灵活的形式,训练随机轨迹,或学习贝叶斯网络的反转

  1. 重新加权的唤醒睡眠(wake-sleep)扩展和改进原始唤醒睡眠(wake-sleep)的学习规则。
  2. 生成随机网络训练一个马尔可夫核,使其平衡分布与数据分布相匹配。
  3. 神经自回归分布估计器(以及它们的循环和深度扩展)将一个联合分布分解为每个维度上的一系列可处理的条件分布序列。
  4. 对抗性网络(Goodfelletal.,2014)训练一个生成模型,对抗一个试图区分生成的样本与真实数据的分类器。
  5. (Schmidhuber,1992)中的一个类似目标学习了一个具有边缘独立单元的表示的双向映射。
  6. 在(Rippel & Adams,2013;Dinh,2014)双射确定性映射被学习到一个简单的阶乘密度函数的潜在表示。
  7. Stuhlmuller,2013学习了贝叶斯网络的随机逆。
  8. 条件高斯尺度混合物(MCGSMs)的混合物(Theesetal.,2012)描述了一个使用高斯尺度混合物的数据集,其参数依赖于一系列因果邻域序列。
  9. 此外,学习从简单的潜在分布到数据分布的灵活的生成映射还有很重要的工作——早期的例子包括(MacKay,1995),其中神经网络作为生成模型被引入,以及(Bishop et al.,1998),其中随机流形映射从潜在空间学习到数据空间。

我们将与对抗性网络和MCGSMs进行实验比较。

1.3 预备知识

  1. 来自物理学的相关思想包括Jarzynski等式, 这在机器学习中被称为退火重要性采样(AIS), 它使用一个马尔可夫链缓慢地将一个分布转换为另一个分布来计算一个归一化常数的比率,AIS也可以使用反向轨迹而不是正向轨迹来执行.
  2. 朗之万动力学是福克-普朗克方程的随机实现,展示了如何定义一个以任何目标分布为平衡分布的高斯扩散过程。在(Suykens & Vandewalle, 1995)中,使用福克-普朗克方程进行随机优化。
  3. 最后,Kolmogorov正向和反向方程(Feller,1949)表明,对于许多正向扩散过程,反向扩散过程可以用相同的函数形式来描述。

2. 算法

我们的目标是定义一个正向(或推理)扩散过程,它将任何复杂的数据分布转换为一个简单的、易于处理的分布,然后学习这个扩散过程的有限时间反转,它定义了我们的生成模型分布(见图1)。

  • 假设有一个瑞士卷的分布(可以把图片当作是高维向量,但是这个分布太过复杂,我们没办法给出他的表达式),但是我们可以很容易得到瑞士卷的各种图片,例如下面第一张图片是这个分布的一个样本,训练过程中,我们输入多张瑞士卷的图片,训练完成后可以得到p(x(t)∣x(t+1))p(x_{(t)}|x_{(t+1)})p(x(t)​∣x(t+1)​),那么当输入一张噪声的图片,通过反向的马氏链可以得到任意张瑞士卷图片。
  • 提出的建模框架对二维瑞士卷数据进行训练,
    • 最上面一行显示了来自向前轨迹 q(x(0⋯T))q\left(\mathbf{x}^{(0 \cdots T)}\right)q(x(0⋯T)) 的时间切片,数据的分布(左)经历高斯扩散(Gaussian diffusion),逐渐将其转化为单位协方差高斯分布(右)。
    • 中间一行显示了训练后的反向轨迹 p(x(0⋯T))p\left(\mathbf{x}^{(0 \cdots T)}\right)p(x(0⋯T)) 的相应时间切片,一个单位协方差高斯分布(右)通过学习到的均值和协方差函数进行高斯扩散过程,并逐渐转换回数据分布(左);
    • 最下面一行显示了漂移项 fμ(x(t),t)−x(t)\mathbf{f}_\mu\left(\mathbf{x}^{(t)}, t\right)-\mathbf{x}^{(t)}fμ​(x(t),t)−x(t) 对于相同的反向扩散过程.

本文内容:我们首先描述了正向的、推理的扩散过程。然后展示如何训练和使用反向的、生成式的扩散过程来评估概率。我们还推导了反向过程的熵界,并展示了学习到的分布如何乘以任何第二个分布(例如,在图像绘制或去噪时计算后验).

2.1. 正向轨迹

我们标记了数据分布 q(x(0))q\left(\mathbf{x}^{(0)}\right)q(x(0))(这个分布是未知的,在算法中,我们输入的是这个分布的多个样本(输入的还有噪声图片),在这个理论分析中我们需要把他写作q(x(0))q\left(\mathbf{x}^{(0)}\right)q(x(0))), 通过对 π(y)\pi(\mathbf{y})π(y) 重复应用马尔可夫扩散核 Tπ(y∣y′;β)T_\pi\left(\mathbf{y} \mid \mathbf{y}^{\prime} ; \beta\right)Tπ​(y∣y′;β),数据分布逐渐转换为可处理的分布 π(y)\pi(\mathbf{y})π(y), 其中,β\betaβ 是扩散速率,
π(y)=∫dy′Tπ(y∣y′;β)π(y′)q(x(t)∣x(t−1))=Tπ(x(t)∣x(t−1);βt)\begin{aligned} \pi(\mathbf{y}) &=\int d \mathbf{y}^{\prime} T_\pi\left(\mathbf{y} \mid \mathbf{y}^{\prime} ; \beta\right) \pi\left(\mathbf{y}^{\prime}\right) \\ q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right) &=T_\pi\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)} ; \beta_t\right) \end{aligned} π(y)q(x(t)∣x(t−1))​=∫dy′Tπ​(y∣y′;β)π(y′)=Tπ​(x(t)∣x(t−1);βt​)​
因此,从数据分布开始进行 TTT 步扩散后的正向轨迹为
q(x(0⋯T))=q(x(0))∏t=1Tq(x(t)∣x(t−1))q\left(\mathbf{x}^{(0 \cdots T)}\right)=q\left(\mathbf{x}^{(0)}\right) \prod_{t=1}^T q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right) q(x(0⋯T))=q(x(0))t=1∏T​q(x(t)∣x(t−1))
对于下面所示的实验,q(x(t)∣x(t−1))q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right)q(x(t)∣x(t−1)) 对应于高斯扩散到一个具有单位协方差的高斯分布,或二项扩散到一个独立的二项分布。表1给出了高斯分布和二项分布的扩散核。

2.2. 反向轨迹

下面的轨迹与上面的轨迹相同但是方向相反,
p(x(T))=π(x(T))p(x(0⋯T))=p(x(T))∏t=1Tp(x(t−1)∣x(t))\begin{aligned} p\left(\mathbf{x}^{(T)}\right) &=\pi\left(\mathbf{x}^{(T)}\right) \\ p\left(\mathbf{x}^{(0 \cdots T)}\right) &=p\left(\mathbf{x}^{(T)}\right) \prod_{t=1}^T p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right) \end{aligned} p(x(T))p(x(0⋯T))​=π(x(T))=p(x(T))t=1∏T​p(x(t−1)∣x(t))​

  • 对于高斯扩散和二项扩散,对于连续扩散(小步长的极限β),扩散过程的反转与正向过程具有相同的函数形式(Feller,1949)
  • 因为 q(x(t)∣x(t−1))q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right)q(x(t)∣x(t−1)) 是高斯(二项)分布,若 βt\beta_tβt​ 较小, 则 q(x(t−1)∣x(t))q\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)q(x(t−1)∣x(t)) 也是高斯(二项)分布,扩散轨迹越长,扩散速率 β\betaβ 就越小。

在学习过程中,只需要估计高斯扩散核的均值和协方差,或二项式核的位翻转概率。

  • fμ(x(t),t)\mathbf{f}_\mu\left(\mathbf{x}^{(t)}, t\right)fμ​(x(t),t) 和 fΣ(x(t),t)\mathbf{f}_{\Sigma}\left(\mathbf{x}^{(t)}, t\right)fΣ​(x(t),t) 是定义高斯分布的逆马尔可夫变换的均值和协方差的函数,
  • fb(x(t),t)\mathbf{f}_b\left(\mathbf{x}^{(t)}, t\right)fb​(x(t),t) 是为二项分布提供位翻转概率的函数。

运行该算法的计算代价是这些函数的代价,乘以时间步数。对于本文的所有结果,都使用多层感知器来定义这些函数,不过广泛的回归或函数拟合技术也适用,包括非参数方法。

2.3. 模型概率

数据生成模型的概率为
p(x(0))=∫dx(1⋯T)p(x(0⋯T))p\left(\mathbf{x}^{(0)}\right)=\int d \mathbf{x}^{(1 \cdots T)} p\left(\mathbf{x}^{(0 \cdots T)}\right) p(x(0))=∫dx(1⋯T)p(x(0⋯T))
这个积分是难以处理的——但从退火重要性抽样和Jarzynski等式中得到提示,即我们评估正向和反向轨迹的相对概率,并在正向轨迹上平均,
p(x(0))=∫dx(1⋯T)p(x(0⋯T))q(x(1⋯T)∣x(0))q(x(1⋯T)∣x(0))=∫dx(1⋯T)q(x(1⋯T)∣x(0))p(x(0⋯T))q(x(1⋯T)∣x(0))=∫dx(1⋯T)q(x(1⋯T)∣x(0))p(x(T))∏t=1Tp(x(t−1)∣x(t))q(x(t)∣x(t−1))\begin{aligned} p\left(\mathbf{x}^{(0)}\right) &=\int d \mathbf{x}^{(1 \cdots T)} p\left(\mathbf{x}^{(0 \cdots T)}\right) \frac{q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)}{q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)} \\ &=\int d \mathbf{x}^{(1 \cdots T)} q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right) \frac{p\left(\mathbf{x}^{(0 \cdots T)}\right)}{q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)} \\ &=\int d \mathbf{x}^{(1 \cdots T)} q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right) p\left(\mathbf{x}^{(T)}\right) \prod_{t=1}^T \frac{p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)}{q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right)} \end{aligned} p(x(0))​=∫dx(1⋯T)p(x(0⋯T))q(x(1⋯T)∣x(0))q(x(1⋯T)∣x(0))​=∫dx(1⋯T)q(x(1⋯T)∣x(0))q(x(1⋯T)∣x(0))p(x(0⋯T))​=∫dx(1⋯T)q(x(1⋯T)∣x(0))p(x(T))t=1∏T​q(x(t)∣x(t−1))p(x(t−1)∣x(t))​​
这可以通过对正向轨迹 q(x(1⋯T)∣x(0))q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)q(x(1⋯T)∣x(0)) 的样本进行平均来快速估计。因为对于无穷小的β,轨迹上的正向分布和反向分布可以完全相同(见第2.2节),如果它们是相同的,那么只需要从 q(x(1⋯T)∣x(0))q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)q(x(1⋯T)∣x(0)) 中得到的一个样本就可以精确地计算上述积分,这可以通过替换看出。这对应于统计物理学中的准静态过程的情况。

2.4 训练

训练相当于最大化模型的对数似然性,
L=∫dx(0)q(x(0))log⁡p(x(0))=∫dx(0)q(x(0))log⁡[∫dx(1⋯T)q(x(1⋯T)∣x(0))p(x(T))∏t=1Tp(x(t−1)∣x(t))q(x(t)∣x(t−1))]\begin{aligned} L &=\int d \mathbf{x}^{(0)} q\left(\mathbf{x}^{(0)}\right) \log p\left(\mathbf{x}^{(0)}\right) \\ &=\int d \mathbf{x}^{(0)} q\left(\mathbf{x}^{(0)}\right)\log \left[\begin{array}{c} \int d \mathbf{x}^{(1 \cdots T)} q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right) p\left(\mathbf{x}^{(T)}\right) \prod_{t=1}^T \frac{p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)}{q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right)} \end{array}\right] \end{aligned} L​=∫dx(0)q(x(0))logp(x(0))=∫dx(0)q(x(0))log[∫dx(1⋯T)q(x(1⋯T)∣x(0))p(x(T))∏t=1T​q(x(t)∣x(t−1))p(x(t−1)∣x(t))​​]​
它有一个由Jensen不等式提供的下界
L≥∫dx(0⋯T)q(x(0⋯T))log⁡[p(x(T))∏t=1Tp(x(t−1)∣x(t))q(x(t)∣x(t−1))]L \geq \int d \mathbf{x}^{(0 \cdots T)} q\left(\mathbf{x}^{(0 \cdots T)}\right) \log \left[p\left(\mathbf{x}^{(T)}\right) \prod_{t=1}^T \frac{p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)}{q\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)}\right)}\right] L≥∫dx(0⋯T)q(x(0⋯T))log[p(x(T))t=1∏T​q(x(t)∣x(t−1))p(x(t−1)∣x(t))​]
附录B所述,对于我们的扩散轨迹,这可以简化为,
L≥KK=−∑t=2T∫dx(0)dx(t)q(x(0),x(t))DKL(q(x(t−1)∣x(t),x(0))∣∣p(x(t−1)∣x(t)))+Hq(X(T)∣X(0))−Hq(X(1)∣X(0))−Hp(X(T))\begin{aligned} L & \geq K \\ K=&-\sum_{t=2}^T \int d \mathbf{x}^{(0)} d \mathbf{x}^{(t)} q\left(\mathbf{x}^{(0)}, \mathbf{x}^{(t)}\right) \\ & D_{K L}\left(q\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}, \mathbf{x}^{(0)}\right)|| p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)\right) \\ &+H_q\left(\mathbf{X}^{(T)} \mid \mathbf{X}^{(0)}\right)-H_q\left(\mathbf{X}^{(1)} \mid \mathbf{X}^{(0)}\right)-H_p\left(\mathbf{X}^{(T)}\right) \end{aligned} LK=​≥K−t=2∑T​∫dx(0)dx(t)q(x(0),x(t))DKL​(q(x(t−1)∣x(t),x(0))∣∣p(x(t−1)∣x(t)))+Hq​(X(T)∣X(0))−Hq​(X(1)∣X(0))−Hp​(X(T))​
其中熵和KL发散可以解析计算。这个界的推导与变分贝叶斯方法中的对数似然界的推导相似。在第2.3节中,如果正向和反向轨迹相同,对应于一个准静态过程,则方程中的不等式变成一个等式。

训练的目的:包括找到最大化对数似然下界的反向马尔可夫转换,
p^(x(t−1)∣x(t))=argmax⁡p(x(t−1)∣x(t))K\hat{p}\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)=\underset{p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)}{\operatorname{argmax}} K p^​(x(t−1)∣x(t))=p(x(t−1)∣x(t))argmax​K
高斯扩散和二项扩散的具体估计目标见表1. 因此,估计概率分布的任务被简化为对设置一个高斯序列的均值和协方差的函数进行回归(或为一个序列的伯努利试验设置状态翻转概率)

设置扩散速率 βt\beta_tβt​: 正向轨迹中 βt\beta_tβt​ 的选择对训练模型的性能很重要。例如,在AIS中,正确的中间分布规划可以大大提高对数配分函数估计的精度,在热力学中,当在平衡分布之间移动时所采取的时间表决定了自由能的损失量。

  • 在高斯扩散的情况下,我们通过对K的梯度上升来学习正向扩散 β2⋯T\beta_{2 \cdots T}β2⋯T​。第一步的方差β1固定为一个小常数,以防止过拟合。使用“冻结噪音”明确来自 q(x(1⋯T)∣x(0))q\left(\mathrm{x}^{(1 \cdots T)} \mid \mathrm{x}^{(0)}\right)q(x(1⋯T)∣x(0)) 的样本对 β1⋯T\beta_{1 \cdots T}β1⋯T​ 的依赖——将噪声作为一个附加的辅助变量,在计算K相对于参数的偏导数时保持不变。
  • 对于二项式扩散,离散状态空间使梯度与冻结噪声不可能上升。我们选择正向扩散计划 β1⋯T\beta_{1 \cdots T}β1⋯T​ 来消除每个扩散步骤中原始信号的常数分数1/T,得到的扩散速率为 βt=(T−t+1)−1\beta_t =(T−t+1)^{−1}βt​=(T−t+1)−1。

2.5 乘法分布,并计算后验

诸如计算后验值p(x(0)∣y)=p(y∣x(0))p(x(0))/p(y)p(\mathbf x^{(0)}|\mathbf y)=p(\mathbf y|\mathbf{x}^{(0)})p(\mathbf x^{(0)})/p(\mathbf{y})p(x(0)∣y)=p(y∣x(0))p(x(0))/p(y)以进行信号去噪或推断缺失值等任务需要模型分布 p(x(0))p\left(\mathbf{x}^{(0)}\right)p(x(0)) 乘上第二个分布(有界正函数)r(x(0))r\left(\mathbf{x}^{(0)}\right)r(x(0)), 产生一个新分布 p~(x(0))∝p(x(0))r(x(0))\tilde{p}\left(\mathbf{x}^{(0)}\right) \propto p\left(\mathbf{x}^{(0)}\right) r\left(\mathbf{x}^{(0)}\right)p~​(x(0))∝p(x(0))r(x(0)).

对于许多技术,包括变分自编码器、nade、gsn和大多数图形编码器,乘法分布来说是昂贵和困难的。

在扩散模型下,这是很简单的,因为第二个分布可以被视为扩散过程中每一步的一个小扰动,或者通常精确地乘以每个扩散步骤。图3和图5展示了使用扩散模型对自然图像进行去噪和内绘制。


提出的框架在CIFAR-10数据集上训练。

  • (a)保留数据示例(类似于训练数据);
  • (b)保留数据被方差为1高斯噪声破坏(SNR= 1);
  • ( c)去噪图像,通过对以(b)中的图像为条件的去噪图像的后验分布进行采样生成;
  • (d)由扩散模型生成的样本。


图像修复

  • (a) 树皮图像;
  • (b) 同样的图像将中心100×100像素区域替换为各向同性高斯噪声。这是反向轨迹初始的p~(x(T))\tilde{p}\left(\mathbf{x}^{(T)}\right)p~​(x(T));
  • (c ) 树皮图像训练的扩散概率模型已经有了p(x(0))p(\mathbf x^{(0)})p(x(0)),从基于图像其余区域作为r(x(0))=p(y∣x(0))p(x(0))r\left(\mathbf{x}^{(0)}\right)=p(\mathbf y|\mathbf{x}^{(0)})p(\mathbf x^{(0)})r(x(0))=p(y∣x(0))p(x(0)),中心100×100区域关于“缺失区域后验分布”采样。从后验得到的样本如第2.5节所述生成,其中 r(x(0))r\left(\mathbf{x}^{(0)}\right)r(x(0)) 对已知数据设置为狄拉克函数,对缺失数据设置为常数。

修正边际分布 p~(x(t))\tilde{p}\left(\mathbf{x}^{(t)}\right)p~​(x(t))

为了计算 p~(x(0))\tilde{p}\left(\mathbf{x}^{(0)}\right)p~​(x(0)),我们用每个中间分布乘以一个相应的函数 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t)). 我们使用分布之上的倾斜或马尔可夫过渡来表示它属于一个以这种方式修改的轨迹。p~(x(0⋯T))\tilde{p}\left(\mathbf{x}^{(0 \cdots T)}\right)p~​(x(0⋯T)) 是修正的反向轨迹,它是从分布开始 p~(x(T))=1Z~Tp(x(T))r(x(T))\tilde{p}\left(\mathbf{x}^{(T)}\right)=\frac{1}{\tilde{Z}_T} p\left(\mathbf{x}^{(T)}\right) r\left(\mathbf{x}^{(T)}\right)p~​(x(T))=Z~T​1​p(x(T))r(x(T)) 并且通过中间分布的序列来进行
p~(x(t))=1Z~tp(x(t))r(x(t)),\tilde{p}\left(\mathbf{x}^{(t)}\right)=\frac{1}{\tilde{Z}_t} p\left(\mathbf{x}^{(t)}\right) r\left(\mathbf{x}^{(t)}\right), p~​(x(t))=Z~t​1​p(x(t))r(x(t)),

修正扩散步骤 p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1))

反向扩散过程 p(x(t)∣x(t+1))p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p(x(t)∣x(t+1)) 服从平衡条件
p(x(t)=∫dx(t+1)p(xt)∣x(t+1))p(xt+1))p\left(\mathbf{x}^{(t}\right)=\int d \mathbf{x}^{(t+1)} p\left(\mathbf{x}^{t)} \mid \mathbf{x}^{(t+1)}\right) p\left(\mathbf{x}^{t+1)}\right) p(x(t)=∫dx(t+1)p(xt)∣x(t+1))p(xt+1))
我们希望扰动的马尔可夫核 p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1)) 服从扰动分布的平衡条件(p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1)) 可由 p~(x(t))\tilde{p}\left(\mathbf{x}^{(t)}\right)p~​(x(t)) 表示),
p~(x(t))=∫dx(t+1)p~(x(t)∣x(t+1))p~(xt+1))\tilde{p}\left(\mathbf{x}^{(t)}\right)=\int d \mathbf{x}^{(t+1)} \tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right) \tilde{p}\left(\mathbf{x}^{t+1)}\right) p~​(x(t))=∫dx(t+1)p~​(x(t)∣x(t+1))p~​(xt+1))
将修正边际分布 p~(x(t))\tilde{p}\left(\mathbf{x}^{(t)}\right)p~​(x(t)) 的表达式代入
p(x(t))r(x(t))Z~t=∫dx(t+1)p~(x(t)∣x(t+1))p(x(t+1))r(x(t+1))Z~t+1\frac{p\left(\mathbf{x}^{(t)}\right) r\left(\mathbf{x}^{(t)}\right)}{\tilde{Z}_t}=\int d \mathbf{x}^{(t+1)} \tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right) \frac{p\left(\mathbf{x}^{(t+1)}\right) r\left(\mathbf{x}^{(t+1)}\right)}{\tilde{Z}_{t+1}} Z~t​p(x(t))r(x(t))​=∫dx(t+1)p~​(x(t)∣x(t+1))Z~t+1​p(x(t+1))r(x(t+1))​
p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1)) 可由 p(x(t)){p}\left(\mathbf{x}^{(t)}\right)p(x(t)) 表示
p(x(t))=∫dx(t+1)p~(x(t)∣x(t+1))Z~tr(x(t+1))Z~t+1r(x(t))p(x(t+1))p\left(\mathbf{x}^{(t)}\right)=\int d \mathbf{x}^{(t+1)} \tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right) \frac{\tilde{Z}_t r\left(\mathbf{x}^{(t+1)}\right)}{\tilde{Z}_{t+1} r\left(\mathbf{x}^{(t)}\right)} p\left(\mathbf{x}^{(t+1)}\right) p(x(t))=∫dx(t+1)p~​(x(t)∣x(t+1))Z~t+1​r(x(t))Z~t​r(x(t+1))​p(x(t+1))
显然,下式是上式的一个解
p~(x(t)∣x(t+1))=p(x(t)∣x(t+1))Z~t+1r(x(t))Z~tr(x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)=p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right) \frac{\tilde{Z}_{t+1} r\left(\mathbf{x}^{(t)}\right)}{\tilde{Z}_t r\left(\mathbf{x}^{(t+1)}\right)} p~​(x(t)∣x(t+1))=p(x(t)∣x(t+1))Z~t​r(x(t+1))Z~t+1​r(x(t))​
这个式子可能不对应于一个归一化的概率分布,需要选择 p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1)) 相应的标准化分布。对于高斯分布,由于其方差较小,每个扩散步骤相对于 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t)) 通常达到非常急剧的峰值,这意味着 r(x(t))r(x(t+1))\frac{r\left(\mathbf{x}^{(t)}\right)}{r\left(\mathbf{x}^{(t+1)}\right)}r(x(t+1))r(x(t))​ 可以看作对 p(x(t)∣x(t+1))p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p(x(t)∣x(t+1)) 一个小扰动。一个高斯的小扰动影响平均值,而不是归一化常数,所以在这种情况下,下式和上式是等价的(见附录C)。
p~(x(t)∣x(t+1))=1Z~t(x(t+1))p(x(t)∣x(t+1))r(x(t))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)=\frac{1}{\tilde{Z}_t\left(\mathbf{x}^{(t+1)}\right)} p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right) r\left(\mathbf{x}^{(t)}\right) p~​(x(t)∣x(t+1))=Z~t​(x(t+1))1​p(x(t)∣x(t+1))r(x(t))
其中 Z~t(x(t+1))\tilde{Z}_t\left(\mathbf{x}^{(t+1)}\right)Z~t​(x(t+1)) 是归一化常量.

r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t)) 应用和选择

r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t)) 的应用

  • 如果 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t))足够光滑,那么它可以看作是对反向扩散核 p(x(t)∣x(t+1))p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p(x(t)∣x(t+1)) 的一个小扰动,那么 p~(x(t)∣x(t+1))\tilde{p}\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p~​(x(t)∣x(t+1)) 和 p(x(t)∣x(t+1))p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p(x(t)∣x(t+1)) 将会有一个相同的函数形式(但是对高斯核有扰动均值,或对二项式核有扰动翻转率)。扰动扩散核在表1给出,附录C中推导出了高斯分布。
  • 如果 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t))与高斯(或二项式)分布相乘可有显式形式,然后它与反向扩散核 p(x(t)∣x(t+1))p\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t+1)}\right)p(x(t)∣x(t+1)) 相乘有显式形式,这应用于 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t)) 由一些坐标子集的狄拉克函数组成,如图5中的图像修复示例所示

应该选择在运动轨迹的过程中缓慢变化的 r(x(t))r\left(\mathbf{x}^{(t)}\right)r(x(t))。对于本文的实验,我们选择它为常数,
r(x(t))=r(x(0))r\left(\mathbf{x}^{(t)}\right)=r\left(\mathbf{x}^{(0)}\right) r(x(t))=r(x(0))
另一个方便的选择是 r(x(t))=r(x(0))T−tTr\left(\mathbf{x}^{(t)}\right)=r\left(\mathbf{x}^{(0)}\right)^{\frac{T-t}{T}}r(x(t))=r(x(0))TT−t​,对反向轨迹的起始分布没有贡献。这确保从反向轨迹初始分布 p~(x(T))\tilde{p}\left(\mathbf{x}^{(T)}\right)p~​(x(T)) 采样仍然是简单的.

2.6 反向过程的熵

由于正向过程已知,我们可以推导出反向轨迹中每一步的条件熵的上界和下界,从而推导出对数似然的上下界
Hq(X(t)∣X(t−1))+Hq(X(t−1)∣X(0))−Hq(X(t)∣X(0))≤Hq(X(t−1)∣X(t))≤Hq(X(t)∣X(t−1))\begin{gathered} H_q\left(\mathbf{X}^{(t)} \mid \mathbf{X}^{(t-1)}\right)+H_q\left(\mathbf{X}^{(t-1)} \mid \mathbf{X}^{(0)}\right)-H_q\left(\mathbf{X}^{(t)} \mid \mathbf{X}^{(0)}\right) \\ \leq H_q\left(\mathbf{X}^{(t-1)} \mid \mathbf{X}^{(t)}\right) \leq H_q\left(\mathbf{X}^{(t)} \mid \mathbf{X}^{(t-1)}\right) \end{gathered} Hq​(X(t)∣X(t−1))+Hq​(X(t−1)∣X(0))−Hq​(X(t)∣X(0))≤Hq​(X(t−1)∣X(t))≤Hq​(X(t)∣X(t−1))​
其中,上界和下界都只依赖于 q(x(1⋯T)∣x(0))q\left(\mathbf{x}^{(1 \cdots T)} \mid \mathbf{x}^{(0)}\right)q(x(1⋯T)∣x(0)),并且可以进行解析计算。该推导方法见附录A

3. 实验

我们在各种连续数据集和一个二值数据集上训练扩散概率模型。然后,我们演示了从训练过的模型中采样和缺失数据的绘制,并将模型性能与其他技术进行比较。在所有情况下,目标函数和梯度都使用Theano计算,除CIFAR-10外,模型训练都采用了SFO。CIFAR-10的结果使用了对该算法的开源实现,并对RMSprop进行优化。表1中报告了我们的模型提供的对数似然的下界。


对数似然的下界K,对每个训练的模型在一个保留集上计算。右列是相对于各向同性高斯分布或独立二项分布的改进。Lnull是 π(x(0))\pi\left(\mathbf{x}^{(0)}\right)π(x(0)) 的对数似然值,在计算对数似然值之前,除Binary Heartbeat外的所有数据集都按一个常数进行缩放,使其方差为1。

3.1 玩具问题

在科学学科中,玩具问题或类似谜题的问题是一个没有直接科学意义的问题,但被用作解释性工具,以说明可能由其他更复杂的问题实例共享的特征,或作为解释特定,更一般解决问题的技巧。玩具问题对于测试和演示方法很有用。研究人员可以使用玩具问题来比较不同算法的性能。它们也适合游戏设计。

例如,在设计大型系统时,大问题通常被分解为许多较小的玩具问题,这些问题已被详细理解。通常,这些问题提炼出复杂问题的一些重要方面,以便可以单独研究它们。因此,玩具问题通常非常有助于在更复杂的问题中提供对特定现象的直觉。

图1-瑞士卷:利用径向基函数网络生成 fμ(x(t),t)\mathbf{f}_\mu\left(\mathbf{x}^{(t)}, t\right)fμ​(x(t),t) 和 fΣ(x(t),t)\mathbf{f}_{\Sigma}\left(\mathbf{x}^{(t)}, t\right)fΣ​(x(t),t),建立了二维瑞士卷分布的扩散概率模型。如图1所示,我们成功地学习了瑞士卷的分布

生成模型 p(x(0⋯T))p\left(\mathbf{x}^{(0 \cdots T)}\right)p(x(0⋯T)) 由初始分布为单位协方差高斯分布的40个高斯扩散构成。训练一个具有单隐层和16个隐藏单元的(归一化)径向基函数网络,生成反向轨迹均值 fμ(x(t),t)\mathbf{f}_\mu\left(\mathbf{x}^{(t)}, t\right)fμ​(x(t),t) 和协方差函数 fΣ(x(t),t)\mathbf{f}_{\Sigma}\left(\mathbf{x}^{(t)}, t\right)fΣ​(x(t),t), 每个函数的顶部输出层在每个时间步中都是独立学习的,但对于所有其他层,权重在所有时间步中和两个函数中共享。fΣ(x(t),t)\mathbf{f}_{\Sigma}\left(\mathbf{x}^{(t)}, t\right)fΣ​(x(t),t) 的顶层输出是通过一个s型符号将其限制在0到1之间。

图2-二进制心跳分布:
在长度为20的简单二进制序列上训练一个扩散概率模型,其中每5次出现一个1,其余为0,使用多层感知器生成反向轨迹的伯努利率 fb(x(t),t)\mathbf{f}_b\left(\mathbf{x}^{(t)}, t\right)fb​(x(t),t),真实分布下的对数似然是 log⁡2(15)=−2.322\log _2\left(\frac{1}{5}\right)=-2.322log2​(51​)=−2.322。

生成模型由2000个二项扩散的时间步长组成,其初始化为一个独立的二项分布,与数据 (p(xi(T)=1)=0.2)\left(p\left(x_i^{(T)}=1\right)=0.2\right)(p(xi(T)​=1)=0.2) 具有相同的平均活动。训练一个具有s型非线性的多层感知器,20个输入单元和3个具有50个单元的隐藏层,以生成反向轨迹的伯努利率 fb(x(t),t)\mathbf{f}_b\left(\mathbf{x}^{(t)}, t\right)fb​(x(t),t). 顶部输出层是独立学习的,但对于所有其他层,权重在所有时间步中共享。顶层输出通过s型符号传递,以将其限制在0和1之间。

3.3 图像数据集

我们在几个图像数据集上训练了高斯扩散概率模型。这些实验共享的多尺度卷积架构在附录D.2.1节中描述,并在图D.1中说明。

在所有情况下,都使用卷积网络为每个图像像素 iii 产生一个输出 yi∈R2Jy_i\in R^{2J}yi​∈R2J 的向量,yiy_iyi​ 中的元素被分为两个大小相等的子集 yμ\mathbf{y}^\muyμ, yΣ\mathbf{y}^{\Sigma}yΣ。卷积输出 yμy^\muyμ 用于时间依赖的“测试”函数(光滑且有紧支集)的每像素加权系数,对于每个像素 iii,生成输出 ziμ∈R\mathbf{z}_i^\mu \in \mathcal{R}ziμ​∈R
ziμ=∑j=1Jyijμgj(t)\mathbf{z}_i^\mu=\sum_{j=1}^J \mathbf{y}_{i j}^\mu g_j(t) ziμ​=j=1∑J​yijμ​gj​(t)
“测试”函数的形式为
gj(t)=exp⁡(−12w2(t−τj)2)∑k=1Jexp⁡(−12w2(t−τk)2),g_j(t)=\frac{\exp \left(-\frac{1}{2 w^2}\left(t-\tau_j\right)^2\right)}{\sum_{k=1}^J \exp \left(-\frac{1}{2 w^2}\left(t-\tau_k\right)^2\right)}, gj​(t)=∑k=1J​exp(−2w21​(t−τk​)2)exp(−2w21​(t−τj​)2)​,
其中 τj∈(0,T)\tau_j \in(0, T)τj​∈(0,T) 是凸起的中心,ω\omegaω 是凹凸中心之间的间距.

ZΣ\mathbf{Z}^{\Sigma}ZΣ 是以相同的方式由 yΣy^\SigmayΣ 生成的。对于所有的图像实验,除了树皮数据集使用 T=500T = 500T=500 的外,都使用了一些时间步长 $T = 100$0。

期望和方差 最后,将这些输出组合起来,产生每个像素 iii 的扩散均值和方差预测,
Σii=σ(ziΣ+σ−1(βt))μi=(xi−ziμ)(1−Σii)+ziμ\begin{aligned} \Sigma_{i i} &=\sigma\left(z_i^{\Sigma}+\sigma^{-1}\left(\beta_t\right)\right) \\ \mu_i &=\left(x_i-z_i^\mu\right)\left(1-\Sigma_{i i}\right)+z_i^\mu \end{aligned} Σii​μi​​=σ(ziΣ​+σ−1(βt​))=(xi​−ziμ​)(1−Σii​)+ziμ​​
其中 Σ\SigmaΣ 和 μ\muμ 都被参数化为正向扩散核 Tπ(x(t)∣x(t−1);βt)T_\pi\left(\mathbf{x}^{(t)} \mid \mathbf{x}^{(t-1)} ; \beta_t\right)Tπ​(x(t)∣x(t−1);βt​) 周围的扰动, ziμz_i^\muziμ​ 是应用 p(x(t−1)∣x(t))p\left(\mathbf{x}^{(t-1)} \mid \mathbf{x}^{(t)}\right)p(x(t−1)∣x(t)) 多次所产生的平衡分布的平均值, Σ\SigmaΣ 被限制为一个对角矩阵

多尺度卷积 我们希望实现通常通过池化网络实现的目标——具体来说,我们希望发现并利用训练数据中的长期和多尺度依赖关系。然而,由于网络输出是每个像素的系数向量,因此必须生成一个完整的分辨率,而不是下采样的特征图。因此,我们定义了由以下步骤组成的多尺度卷积层:

  • 执行平均池化,将图像降采样downsample到多个尺度。降采样以2次幂进行。
  • 在每个尺度上进行卷积。
  • 上采样所有尺度到全分辨率,并对得到的图像进行汇总。
  • 执行一个由软卷积器 (log⁡[1+exp⁡(⋅)])(\log [1+\exp (\cdot)])(log[1+exp(⋅)]) 组成的点态非线性变换

前三个线性操作的组成类似于一个多尺度卷积核的卷积,直到由上采样引入的阻塞伪影。这种实现多尺度卷积的方法在(Barron et al.,2013)中都有描述。

  1. 为了与之前在一个简单数据集上的工作进行直接比较,我们对MNIST数字进行了训练(LeCun & Cortes,1998)。

    来自MNIST模型的样本见附录图

    我们的训练算法提供了关于对数似然的一个渐近一致的下界。然而,大多数先前报道的关于连续MNIST对数似然的结果都依赖于从模型样本中计算出的基于参数窗口的估计
  2. 对CIFAR-10挑战数据集的训练图像进行概率模型,图3提供了来自训练模型的样本。





































1. 深度生成模型-扩散模型(非均衡热力学的深度无监督学习)相关推荐

  1. 2. 深度生成模型-扩散模型(去噪扩散概率模型)

    深度生成模型-扩散模型去噪扩散概率模型 1. 简介 2. 基础回顾 3. 扩散模型和去噪自动编码器 3.1 第一项:正向过程和 L T L_T L

  2. 【深度学习】扩散模型(Diffusion Model)详解

    [深度学习]扩散模型(Diffusion Model)详解 文章目录 [深度学习]扩散模型(Diffusion Model)详解 1. 介绍 2. 具体方法 2.1 扩散过程 2.2 逆扩散过程 2. ...

  3. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(附python代码实现)

    目录 前言 广播模型 扩散模型 几个高频面试题目 GAN.VAE和基于流的生成模型之间的区别

  4. 图像生成之扩散模型:靠加入类别条件,效果直达SOTA

    来源:AI蜗牛车 本文约1300字,建议阅读7分钟 比GAN更真实.还懂全景局部多角度构图. OpenAI去年年末推出的新作GLIDE,又让扩散模型小火了一把. 这个基于扩散模型的文本图像生成大模型参 ...

  5. 不用GAN、VAE,谷歌发明视频生成的扩散模型,实现新SOTA

    关注公众号,发现CV技术之美 本文转自机器之心,编辑:杜伟.陈萍. 扩散模型正在不断的「攻城略地」. 扩散模型并不是一个崭新的概念,早在2015年就已经被提出.其核心应用领域包括音频建模.语音合成.时 ...

  6. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(补充篇)

    目录 前言 算法原理 算法思想 扩散模型逆向过程方差 ​编辑的参数化

  7. 【人工智能】深度学习:扩散模型(Diffusion Model) [2]

    文章目录 ⚪ 建模 L t L_t Lt​

  8. 扩散模型与生成模型详解

    扩散模型与其他生成模型 什么是扩散模型 扩散模型的简介 生成建模是理解自然数据分布的开创性任务之一.VAE.GAN和Flow系列模型因其实用性能而在过去几年中占据了该领域的主导地位.尽管取得了商业上的 ...

  9. 从DDPM到GLIDE:基于扩散模型的图像生成算法进展

    前几天,OpenAI在Arxiv上挂出来了他们最新最强的文本-图像生成GLIDE [1],如头图所示,GLIDE能生成非常真实的结果.GLIDE并非基于对抗生成网络或是VQ-VAE类模型所设计,而是采 ...

最新文章

  1. 《预训练周刊》第14期:World-GAN:Minecraft 世界的生成模型、CMU博士论文探究可控文本生成...
  2. MySQL主从同步失败
  3. PendingIntent与Intent区别
  4. leetcode-9-回文数
  5. 公平锁的lock()方法走读
  6. 成功驱动5150用HT68F30
  7. IDEA 入门:安装使用详解(创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等)
  8. linux上python3的安装
  9. 大一软件工程C语言推荐书籍,大一软件工程学生,看完了谭浩强的书,越看越迷茫,感觉并没什么用,什么大程序都不会编,求指点?...
  10. EXT2.0 多选下拉框
  11. JAVA根据word模板动态生成word(SpringBoot项目)
  12. JavaScript高级程序
  13. anylogic中编写java代码_anylogic 使用
  14. java扫描条形码的两种方式
  15. 使用js获取证券交易实时数据
  16. [转] prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  17. ArcGIS系列(一):DEM数字高程模型数据的生成
  18. 轮换对称性实质 和差化积公式之sinθ+cosθ推导 rd原理,二重积分坐标系转化为什么多了个r; 二重积分几何意义: 二重积分物理意义: 二重积分求导:
  19. nuc9vxqnx_Intel NUC 9 Pro / Extreme(幽灵峡谷 / 石英峡谷)即将发售
  20. 托管调试助手“LoaderLock”在XXX中检测到故障。其他信息:正尝试在OS加载程序锁内执行托管代码。不要尝试在DllMain或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

热门文章

  1. kubernetes dashboard 安装
  2. 2008中国手机客户端软件TOP50评选
  3. Jcreator pro3.5:Configuration: Default 错误: 无效的标记: C:\HelloWorld.java:到底错在哪?
  4. 【mud】object增加颜色的代码以及参考
  5. 【GlobalMapper精品教程】041:从多波段影像中提取单波段方法
  6. 原生js实现拖动滑块验证
  7. 如何快速实现完美身材,告别减肥烦恼?分享这些高效减肥方法,让你事半功倍达成健康目标!
  8. Revit 2016视频教程
  9. 智慧水务之营业收费系统介绍
  10. 机房收费系统(一)——整体思路