【深度学习】花书第18章——配分函数

直面配分函数

许多概率模型(通常是无向图模型)由一个未归一化的概率分布 p ~ ( x , θ ) \tilde p(\mathbf x,\theta) p~(x,θ)定义。我们必须通过除以配分函数 Z ( θ ) Z(\pmb{ \theta}) Z(θ)来归一化 p ~ \tilde p p~。以获得一个有效的概率分布:
p ( x , θ ) = 1 Z ( θ ) p ~ ( x , θ ) p(\mathbf x,\pmb \theta)=\frac{1}{Z(\pmb \theta)}\tilde p(\mathbf x,\theta) p(x,θ)=Z(θ)1p~(x,θ)配分函数是未归一化概率所有状态的积分(对于连续变量)或求和(对于离散变量): ∫ p ~ ( x ) d x \int \tilde p(\pmb x)d\pmb x p~(x)dx或者 ∑ x p ~ ( x ) \sum_{\pmb x} \tilde p(\pmb x) xp~(x)对于很多有趣的模型而言,以上积分或求和难以计算。有些深度学习模型被设计成具有一个易于处理的归一化常数,或被设计成能够在不涉及计算 p(x) 的情况下使用。然而,其他一些模型会直接面对难以计算的配分函数的挑战。那么用于训练和评估那些具有难以处理的配分函数的模型的技术有哪些呢?

1 对数似然梯度

通过最大似然学习无向模型特别困难的原因在于配分函数依赖于参数。对数似
然相对于参数的梯度具有一项对应于配分函数的梯度: ∇ θ log ⁡ p ( x ; θ ) = ∇ θ log ⁡ p ~ ( x ; θ ) − ∇ θ log ⁡ Z ( θ ) \nabla_{\theta}\log p(x;\theta)=\nabla_{\theta}\log \tilde p(x;\theta)-\nabla_{\theta}\log Z(\theta) θlogp(x;θ)=θlogp~(x;θ)θlogZ(θ)这是机器学习中非常著名的 正相(positive phase)和 负相(negative phase)的分解。没有潜变量或潜变量之间很少相互作用的模型通常会有一个易于计算的正相。然而对于大多数感兴趣的无向模型而言,负相是困难的。例如RBM 的隐藏单元在给定可见单元的情况下彼此条件独立,是一个典型的具有简单正相和困难负相的模型。那么负相计算中究竟有何难点?

让我们进一步分析 logZ 的梯度: ∇ θ log ⁡ Z ( θ ) = ∇ θ Z Z = ∇ θ ∑ x p ~ ( x ) Z = ∑ x ∇ θ p ~ ( x ) Z \begin{aligned}\nabla_{\theta}\log Z(\theta)&=\frac{\nabla_{\theta} Z}{Z}\\&=\frac{\nabla_{\theta}\sum_{\pmb x} \tilde p(\pmb x)}{Z}\\&=\frac{\sum_{\pmb x}\nabla_{\theta} \tilde p(\pmb x)}{Z}\end{aligned} θlogZ(θ)=ZθZ=Zθxp~(x)=Zxθp~(x)对于保证所有的 x 都有 p(x) > 0 的模型,我们可以用 exp ⁡ ( log ⁡ p ~ ( x ) ) \exp(\log \tilde p(\mathbf x)) exp(logp~(x)) 代替 p ~ ( x ) \tilde p(\mathbf x) p~(x) ∑ x ∇ θ exp ⁡ ( log ⁡ p ~ ( x ) ) Z = ∑ x exp ⁡ ( log ⁡ p ~ ( x ) ) ∇ θ log ⁡ p ~ ( x ) Z = ∑ x p ~ ( x ) ∇ θ log ⁡ p ~ ( x ) Z = ∑ x p ( x ) ∇ θ log ⁡ p ~ ( x ) = E x ∼ p ( x ) ∇ θ log ⁡ p ~ ( x ) \begin{aligned}\frac{\sum_{\pmb x}\nabla_{\theta} \exp(\log \tilde p(\mathbf x))}{Z}&=\frac{\sum_{\pmb x} \exp(\log \tilde p(\mathbf x))\nabla_{\theta}\log \tilde p(\mathbf x)}{Z}\\&=\frac{\sum_{\pmb x} \tilde p(\mathbf x)\nabla_{\theta}\log \tilde p(\mathbf x)}{Z}\\&=\sum_{\pmb x} p(\mathbf x)\nabla_{\theta}\log \tilde p(\mathbf x)\\&=\mathbb E_{\mathbf x\sim p(\mathbf x)}\nabla_{\theta}\log \tilde p(\mathbf x)\end{aligned} Zxθexp(logp~(x))=Zxexp(logp~(x))θlogp~(x)=Zxp~(x)θlogp~(x)=xp(x)θlogp~(x)=Exp(x)θlogp~(x)上述推导对离散的 x 进行求和,对连续的 x 进行积分也可以得到类似结果。在连续版本的推导中,使用在积分符号内取微分的莱布尼兹法则可以得到等式 ∇ θ ∫ p ~ ( x ) d x = ∫ ∇ θ p ~ ( x ) d x \nabla_{\theta}\int \tilde p(x)dx=\int \nabla_{\theta}\tilde p(x)dx θp~(x)dx=θp~(x)dx该等式只适用于 p ~ \tilde p p~ ∇ θ p ~ ( x ) \nabla_{\theta}\tilde p(x) θp~(x)上的一些特定规范条件。在测度论术语中,这些条件是:

(1) 对每一个 θ 而言,未归一化分布 p ~ \tilde p p~ 必须是 x 的勒贝格可积函数。
(2) 对于所有的 θ 和几乎所有 x,梯度 ∇ θ p ~ ( x ) \nabla_{\theta}\tilde p(x) θp~(x) 必须存在。
(3) 对于所有的 θ 和几乎所有 x,必须存在一个可积函数 R(x) 使得 max ⁡ i ∣ ∂ ∂ θ i p ~ ( x ) ∣ ≤ R ( x ) \max_i|\frac{\partial}{\partial \theta_i}\tilde p(x)|\leq R(x) maxiθip~(x)R(x)

幸运的是,大多数感兴趣的机器学习模型都具有这些性质。等式 ∇ θ log ⁡ Z = E x ∼ p ( x ) ∇ θ log ⁡ p ~ ( x ) (1) \nabla_{\theta}\log Z=\mathbb E_{\mathbf x\sim p(\mathbf x)}\nabla_{\theta}\log \tilde p(\mathbf x)\tag 1 θlogZ=Exp(x)θlogp~(x)(1)是使用各种蒙特卡罗方法近似(具有难计算配分函数模型的)最大化似然的基础。蒙特卡罗方法为学习无向模型提供了直观的框架,我们能够在其中考虑正相和负相。在正相中,我们增大从数据中采样得到的 log ⁡ p ~ ( x ) \log \tilde p(\mathbf x) logp~(x)。在负相中,我们通过降低从模型分布中采样的 log ⁡ p ~ ( x ) \log \tilde p(\mathbf x) logp~(x) 来降低配分函数。 在深度学习文献中,经常会看到用能量函数来参数化 log ⁡ p ~ \log \tilde p logp~。在这种情况下,正相可以解释为压低训练样本的能量,负相可以解释为提高模型抽出的样本的能量。

2 随机最大似然和对比散度

实现式 (1) 的一个朴素方法是,每次需要计算梯度时,磨合随机初始化的一组马尔可夫链。当使用随机梯度下降进行学习时,这意味着马尔可夫链必须在每次梯度步骤中磨合。这种方法引导下的训练过程如算法 1 所示。内循环中磨合马尔可夫链的计算代价过高,导致这个过程在实际中是不可行的,但是这个过程是其他更加实际的近似算法的基础。

算法 1 一种朴素的 MCMC 算法,使用梯度上升最大化具有难以计算配分函数的对数似然。
设步长 ϵ 为一个小正数。
设吉布斯步数 k 大到足以允许磨合。在小图像集上训练一个 RBM 大致设为 k=100。
while 不收敛 do
- 从训练集中采包含 m 个样本 { x ( 1 ) , . . , x ( m ) } \{x^{(1)},..,x^{(m)}\} {x(1),..,x(m)}
- g ← 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ( i ) ; θ ) \mathbf g\leftarrow \frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(x^{(i)};\theta) gm1i=1mθlogp~(x(i);θ)
- 初始化 m 个样本 { x ~ ( 1 ) , . . , x ~ ( m ) } \{\tilde x^{(1)},..,\tilde x^{(m)}\} {x~(1),..,x~(m)}为随机值(例如,从均匀或正态分布中采,或大致与模型边缘分布匹配的分布)。
- for i = 1 to k do
for j = 1 to m do
x ~ ( j ) ← gibbs update ( x ~ ( j ) ) \tilde x^{(j)}\leftarrow \text{gibbs update}(\tilde x^{(j)}) x~(j)gibbs update(x~(j))
end for
- end for
- g ← g − 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ~ ( i ) ; θ ) \mathbf g\leftarrow \mathbf g-\frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(\tilde x^{(i)};\theta) ggm1i=1mθlogp~(x~(i);θ)
- θ ← θ + ϵ g \theta\leftarrow \theta +\epsilon \mathbf g θθ+ϵg
end while

我们可以将最大化似然的 MCMC 方法视为在两种力之间平衡,一种力拉高数据
出现时的模型分布,一种拉低模型采样出现时的模型分布。图 1 展示了这个过程。当数据分布和模型分布相等时,正相推高数据点和负相压低数据点的机会相等。此时,不再有任何的梯度(期望上说),训练也必须停止。
图 1
这两种力分别对应最大化 log ⁡ p ~ \log \tilde p logp~ 和最小化 logZ。对于负相会有一些近似方法。这些近似都可以被理解为使负相更容易计算,但是也可能将其推向错误的位置,因为负相涉及到从模型分布中抽样,所以我们可以认为它在找模型信任度很高的点。由于负相减少了这些点的概率,被减少的部分一般被认为代表了模型不正确的信念。在文献中,它们经常被称为 ‘‘幻觉’’ 或 ‘‘幻想粒子’’。事实上,负相已经被作为人类和其他动物做梦的一种可能解释 (Crick and Mitchison, 1983)。即,大脑维持着世界的概率模型,并且在醒着经历真实事件时会遵循 log ⁡ p ~ \log \tilde p logp~ 的梯度方向最大化世界似然,在睡觉时会遵循 log ⁡ p ~ \log \tilde p logp~ 的负梯度方向最小化 logZ,其经历的样本采样自当前的模型。这个视角解释了具有正相和负相的大多数算法,但是它还没有被神经科学实验证明是正确的。在机器学习模型中,通常有必要同时使用正相和负相,而不是按不同时间阶段分为清醒和 REM 睡眠时期。

这样理解学习正相和负相的作用之后,我们设计了一个比算法 1 计算代价更低的替代算法。简单的 MCMC 算法的计算成本主要来自每一步的随机初始化磨合马尔可夫链。一个自然的解决方法是初始化马尔可夫链为一个非常接近模型分布的分布,从而大大减少磨合步骤。对比散度算法(CD,或者是具有 k 个 Gibbs 步骤的 CD-k)在每个步骤中初始化马尔可夫链为采样自数据分布中的样本 (Hinton, 2000, 2010),如算法 2 所示。从数据分布中获取样本是计算代价最小的,因为它们已经在数据集中了。初始时,数据分布并不接近模型分布,因此负相不是非常准确。幸运的是,正相仍然可以准确地增加数据的模型概率。进行正相阶段一段时间之后,模型分布会更接近于数据分布,并且负相开始变得准确。当然,CD 仍然是真实负相的一个近似。

算法 2 对比散度算法,使用梯度上升作为优化过程。
设步长 ϵ 为一个小正数。
设吉布斯步数 k 大到足以让从 p data p_{\text{data}} pdata 初始化并从 p ( x ; θ ) p(x;\theta) p(x;θ) 采样的马尔可夫链混合。在小图像集上训练一个 RBM 大致设为 k=1-20。
while 不收敛 do
- 从训练集中采包含 m 个样本 { x ( 1 ) , . . , x ( m ) } \{x^{(1)},..,x^{(m)}\} {x(1),..,x(m)}的小批量。
- g ← 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ( i ) ; θ ) \mathbf g\leftarrow \frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(x^{(i)};\theta) gm1i=1mθlogp~(x(i);θ)
- for i = 1 to m do
x ~ ( i ) ← x ( i ) \tilde x^{(i)}\leftarrow x^{(i)} x~(i)x(i)
- end for
- for i = 1 to k do
for j = 1 to m do
x ~ ( j ) ← gibbs update ( x ~ ( j ) ) \tilde x^{(j)}\leftarrow \text{gibbs update}(\tilde x^{(j)}) x~(j)gibbs update(x~(j))
end for
- end for
- g ← g − 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ~ ( i ) ; θ ) \mathbf g\leftarrow \mathbf g-\frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(\tilde x^{(i)};\theta) ggm1i=1mθlogp~(x~(i);θ)
- θ ← θ + ϵ g \theta\leftarrow \theta +\epsilon \mathbf g θθ+ϵg
end while

CD 未能定性地实现真实负相的主要原因是,它不能抑制远离真实训练样本的高概率区域。这些区域在模型上具有高概率,但是在数据生成区域上具有低概率,被称为 虚假模态(spurious modes)。图 2 解释了这种现象发生的原因。基本上,除非 k 非常大,模型分布中远离数据分布的峰值不会被使用训练数据初始化的马尔可夫链访问到。
图 2
Carreira-Perpiñan and Hinton (2005) 实验上证明 CD 估计偏向于 RBM 和完全可见的玻尔兹曼机,因为它会收敛到与最大似然估计不同的点,即存在系统性偏差。他们认为,由于偏差较小,CD 可以作为一种计算代价低的方式来初始化模型,之后可以通过计算代价高的 MCMC 方法进行精调。Bengio and Delalleau (2009) 表明,CD 可以被理解为去掉了正确 MCMC 梯度更新中的最小项,这解释了偏差的由来。

在训练诸如 RBM 的浅层网络时 CD 是很有用的。反过来,这些可以堆叠起来初始化更深的模型,如DBN 或 DBM。但是CD 并不直接有助于训练更深的模型。这是因为在给定可见单元样本的情况下,很难获得隐藏单元的样本。由于隐藏单元不包括在数据中,所以使用训练点初始化无法解决这个问题。即使我们使用数据初始化可见单元,我们仍然需要磨合在给定这些可见单元的隐藏单元条件分布上采样的马尔可夫链。

CD 算法可以被理解为惩罚某类模型,这类模型的马尔可夫链会快速改变来自数据的输入。这意味着使用CD 训练从某种程度上说类似于训练自编码器。即使CD 估计比一些其他训练方法具有更大偏差,但是它有助于预训练之后会堆叠起来的浅层模型。这是因为堆栈中最早的模型会受激励,从而复制更多的信息到其潜变量,使其可用于随后的模型。但这应该更多地被认为是CD 训练中经常可利用的副产品,而不是主要的设计优势。

Sutskever and Tieleman (2010) 表明,CD 的更新方向不是任何函数的梯度。这使得 CD 可能存在永久循环的情况,但在实践中这并不是一个严重的问题。

另一个解决 CD 中许多问题的不同策略是,在每个梯度步骤中初始化马尔可夫链为先前梯度步骤的状态值。这个方法首先被应用数学和统计学社群发现,命名为随机最大似然(SML)(Younes, 1998),后来又在深度学习社群中以名称持续性对比散度(PCD,或者每个更新中具有 k 个 Gibbs 步骤的 PCD-k)独立地被重新发现 (Tieleman, 2008)。具体可以参考算法 3 。这种方法的基本思想是,只要随机梯度算法得到的步长很小,那么前一步骤的模型将类似于当前步骤的模型。因此,来自先前模型分布的样本将非常接近来自当前模型分布的客观样本,用这些样本初始化的马尔可夫链将不需要花费很多时间来完成混合。

算法 3 随机最大似然 / 持续性对比散度算法,使用梯度上升作为优化过程。
设步长 ϵ 为一个小正数。
设吉布斯步数 k 大到足以让从 p ( x ; θ + ϵ g ) p(\mathbf x;\pmb \theta+\epsilon\mathbf g) p(x;θ+ϵg) 采样的马尔可夫链磨合(从采自 p ( x ; θ ) 的样本开始 p(\mathbf x;\theta)的样本开始 p(x;θ)的样本开始)。在小图像集上训练一个 RBM 大致设为 k=1,对于更复杂的模型如深度玻尔兹曼机可能要设为5到50
初始化 m 个样本 { x ~ ( 1 ) , . . , x ~ ( m ) } \{\tilde x^{(1)},..,\tilde x^{(m)}\} {x~(1),..,x~(m)}为随机值(例如,从均匀或正态分布中采,或大致与模型边缘分布匹配的分布)。
while 不收敛 do
- 从训练集中采包含 m 个样本 { x ( 1 ) , . . , x ( m ) } \{x^{(1)},..,x^{(m)}\} {x(1),..,x(m)}的小批量。
- g ← 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ( i ) ; θ ) \mathbf g\leftarrow \frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(x^{(i)};\theta) gm1i=1mθlogp~(x(i);θ)
- for i = 1 to k do
for j = 1 to m do
x ~ ( j ) ← gibbs update ( x ~ ( j ) ) \tilde x^{(j)}\leftarrow \text{gibbs update}(\tilde x^{(j)}) x~(j)gibbs update(x~(j))
end for
- end for
- g ← g − 1 m ∑ i = 1 m ∇ θ log ⁡ p ~ ( x ~ ( i ) ; θ ) \mathbf g\leftarrow \mathbf g-\frac{1}{m}\sum_{i=1}^m\nabla_{\theta}\log \tilde p(\tilde x^{(i)};\theta) ggm1i=1mθlogp~(x~(i);θ)
- θ ← θ + ϵ g \theta\leftarrow \theta +\epsilon \mathbf g θθ+ϵg
end while

因为每个马尔可夫链在整个学习过程中不断更新,而不是在每个梯度步骤中重新开始,马尔可夫链可以自由探索很远,以找到模型的所有峰值。因此,SML 比 CD 更不容易形成具有虚假模态的模型。此外,因为可以存储所有采样变量的状态,无论是可见的还是潜在的,SML 为隐藏单元和可见单元都提供了初始值。CD 只能为可见单元提供初始化,因此深度模型需要进行磨合步骤。SML 能够高效地训练深度模型。Marlin et al. (2010) 将 SML 与本章中提出的许多其他标准方法进行比较。他们发现,SML 在 RBM 上得到了最佳的测试集对数似然,并且如果RBM 的隐藏单元被用作 SVM 分类器的特征,那么 SML 会得到最好的分类精度。

在 k 太小或 ϵ 太大时,随机梯度算法移动模型的速率比马尔可夫链在迭代步中混合更快,此时 SML 容易变得不准确。不幸的是,这些值的容许范围高度依赖于具体问题。现在还没有方法能够正式地测试马尔可夫链是否能够在迭代步骤之间成功混合。主观地,如果对于 Gibbs 步骤数目而言学习率太大的话,那么梯度步骤中负相采样的方差会比不同马尔可夫链中负相采样的方差更大。例如,一个 MNIST模型在一个步骤中只采样得到了 7。然后学习过程将会极大降低 7 对应的峰值,在下一个步骤中,模型可能会只采样得到 9。

从使用 SML 训练的模型中评估采样必须非常小心。在模型训练完之后,有必要从一个随机起点初始化的新马尔可夫链抽取样本。用于训练的连续负相链中的样本受到了模型最近几个版本的影响,会使模型看起来具有比其实际更大的容量,即模型的实际容量可能并没有我们从这些受影响样本中评估出来的那么大。Berglund and Raiko (2013) 进行了实验来检验由 CD 和 SML 进行梯度估计带来的偏差和方差。结果证明 CD 比基于精确采样的估计具有更低的方差。而 SML 有更高的方差。CD 方差低的原因是,其在正相和负相中使用了相同的训练点。如果从不同的训练点来初始化负相,那么方差会比基于精确采样的估计的方差更大。

所有基于 MCMC 从模型中抽取样本的方法在原则上几乎可以与 MCMC 的任何变体一起使用。这意味着诸如 SML 这样的技术可以使用任何增强 MCMC 的技术(例如并行回火)来加以改进 (Desjardins et al., 2010; Cho et al.,2010b)。

一种在学习期间加速混合的方法是,不改变蒙特卡罗采样技术,而是改变模型的参数化和代价函数。 快速持续性对比散度(fast persistent contrastive divergence),或者 FPCD (Tieleman and Hinton, 2009) 使用如下表达式去替换传统模型的参数 θ θ = θ ( slow ) + θ ( fast ) \theta =\theta^{(\text{slow})}+\theta^{(\text{fast})} θ=θ(slow)+θ(fast)现在的参数是以前的两倍多,将其逐个相加以定义原始模型的参数。快速复制参数可以使用更大的学习率来训练,从而使其快速响应学习的负相,并促使马尔可夫链探索新的区域。这能够使马尔可夫链快速混合,尽管这种效应只会发生在学习期间快速权重可以自由改变的时候。通常,在短时间地将快速权重设为大值并保持足够长时间,使马尔可夫链改变峰值之后,我们会对快速权重使用显著的权重衰减,促使它们收敛到较小的值。

本节介绍的基于 MCMC 的方法的一个关键优点是它们提供了 logZ 梯度的估计,因此我们可以从本质上将问题分解为 log ⁡ p ~ \log \tilde p logp~ 和 logZ 两块。然后我们可以使用任何其他的方法来处理 log ⁡ p ~ ( x ) \log \tilde p(x) logp~(x),只需将我们的负相梯度加到其他方法的梯度中。特别地,这意味着正相可以使用那些仅提供 log ⁡ p ~ \log \tilde p logp~ 下限的方法。然而,本章介绍处理 logZ 的大多数其他方法都和基于边界的正相方法是不兼容的。

3 伪似然

蒙特卡罗近似配分函数及其梯度需要直接处理配分函数。有些其他方法通过训练不需要计算配分函数的模型来绕开这个问题。这些方法大多数都基于以下观察:无向概率模型中很容易计算概率的比率。这是因为配分函数同时出现在比率的分子和分母中,互相抵消: p ( x ) p ( y ) = 1 Z p ~ ( x ) 1 Z p ~ ( y ) = p ~ ( x ) p ~ ( y ) \frac{p(x)}{p(y)}=\frac{\frac{1}{Z}\tilde p(x)}{\frac{1}{Z}\tilde p(y)}=\frac{\tilde p(x)}{\tilde p(y)} p(y)p(x)=Z1p~(y)Z1p~(x)=p~(y)p~(x)伪似然正是基于条件概率可以采用这种基于比率的形式,因此可以在没有配分函数的情况下进行计算。假设我们将 x 分为 a,b 和 c,其中 a 包含我们想要的条件分布的变量,b 包含我们想要条件化的变量,c 包含除此之外的变量: p ( a ∣ b ) = p ( a , b ) p ( b ) = p ( a , b ) ∑ a , c p ( a , b , c ) = p ~ ( a , b ) ∑ a , c p ~ ( a , b , c ) p(a|b)=\frac{p(a,b)}{p(b)}=\frac{p(a,b)}{\sum_{a,c}p(a,b,c)}=\frac{\tilde p(a,b)}{\sum_{a,c} \tilde p(a,b,c)} p(ab)=p(b)p(a,b)=a,cp(a,b,c)p(a,b)=a,cp~(a,b,c)p~(a,b)以上计算需要边缘化 a,假设 a 和 c 包含的变量并不多,那么这将是非常高效的操作。在极端情况下,a 可以是单个变量,c 可以为空,那么该计算仅需要估计与单个随机变量值一样多的 p ~ \tilde p p~。不幸的是,为了计算对数似然,我们需要边缘化很多变量。如果总共有 n 个变量,那么我们必须边缘化 n − 1 个变量。根据概率的链式法则,我们有 log ⁡ p ( x ) = log ⁡ p ( x 1 ) + log ⁡ p ( x 2 ∣ x 1 ) + ⋅ ⋅ ⋅ + log ⁡ p ( x n ∣ x 1 : n − 1 ) \log p(\mathbf x)=\log p(x_1)+\log p(x_2|x_1)+···+\log p(x_n|\mathbf x_{1:n-1}) logp(x)=logp(x1)+logp(x2x1)+⋅⋅⋅+logp(xnx1:n1)在这种情况下,我们已经使 a 尽可能小,但是 c 可以大到 x 2 : n \mathbf x_{2:n} x2:n。如果我们简单地将 c 移到 b 中以减少计算代价,那么会发生什么呢?这便产生了 伪似然(pseudolikelihood)(Besag, 1975)目标函数,给定所有其他特征 x − i x_{−i} xi,预测特征 x i x_i xi 的值: ∑ i = 1 n log ⁡ p ( x i ∣ x − i ) \sum_{i=1}^n \log p(x_i|\mathbf x_{-i}) i=1nlogp(xixi)如果每个随机变量有 k 个不同的值,那么计算 p ~ \tilde p p~ 需要 k × n 次估计,而计算配分函数需要 k n k^n kn 次估计(联合概率分布在离散情况下是组合数)。这看起来似乎是一个没有道理的策略,但可以证明最大化伪似然的估计是渐近一致的 (Mase, 1995)。当然,在数据集不趋近于大采样极限的情况下,伪似然可能表现出与最大似然估计不同的结果。

我们可以使用 广义伪似然估计(generalized pseudolikelihood estimator)来权
衡计算复杂度和最大似然表现的偏差 (Huang and Ogata, 2002)。广义伪似然估计使
用 m 个不同的集合 S ( i ) , i = 1 , . . . , m \mathbb S^{(i)}, i=1,...,m S(i),i=1,...,m 作为变量的指标出现在条件棒的左侧。在 m=1 和 S ( 1 ) = { 1 , . . . , n } \mathbb S^{(1)}=\{1,...,n\} S(1)={1,...,n} 的极端情况下,广义伪似然估计会变为对数似然。在 m = n 和 S ( i ) = { i } \mathbb S^{(i)}=\{i\} S(i)={i} 的极端情况下,广义伪似然会恢复为伪似然。广义伪似然估计目标函数如下所示 ∑ i = 1 m log ⁡ p ( x S ( i ) ∣ x − S ( i ) ) \sum_{i=1}^m\log p(\mathbf x_{\mathbb S^{(i)}}|\mathbf x_{-\mathbb S^{(i)}}) i=1mlogp(xS(i)xS(i))基于伪似然的方法的性能在很大程度上取决于模型是如何使用的。对于完全联合分布 p(x) 模型的任务(例如密度估计和采样),伪似然通常效果不好。对于在训练期间只需要使用条件分布的任务而言,它的效果比最大似然更好,例如填充少量的缺失值。如果数据具有规则结构,使得 S \mathbb S S 索引集可以被设计为表现最重要的相关性质,同时略去相关性可忽略的变量,那么广义伪似然策略将会非常有效。例如,在自然图像中,空间中相隔很远的像素也具有弱相关性,因此广义伪似然可以应用于每个 S \mathbb S S 集是小的局部空间窗口的情况。

伪似然估计的一个弱点是它不能与仅在 p ~ ( x ) \tilde p(x) p~(x) 上提供下界的其他近似一起使用,例如变分推断。这是因为 p ~ \tilde p p~ 出现在了分母中。分母的下界仅提供了整个表达式的上界,然而最大化上界没有什么意义。这使得我们难以将伪似然方法应用于诸如深度玻尔兹曼机的深度模型,因为变分方法是近似边缘化互相作用的多层隐藏变量的主要方法之一。尽管如此,伪似然仍然可以用在深度学习中,它可以用于单层模型,或使用不基于下界的近似推断方法的深度模型中。

伪似然比 SML 在每个梯度步骤中的计算代价要大得多,这是由于其对所有条件进行显式计算。但是,如果每个样本只计算一个随机选择的条件,那么广义伪似然和类似标准仍然可以很好地运行,从而使计算代价降低到和 SML 差不多的程度 (Goodfellow et al., 2013d)。虽然伪似然估计没有显式地最小化 logZ,但是我们仍然认为它具有类似负相的效果。每个条件分布的分母会使得学习算法降低所有仅具有一个变量不同于训练样本的状态的概率。读者可以参考 Marlin and de Freitas (2011) 了解伪似然渐近效率的理论分析。

4 得分匹配和比率匹配

得分匹配 (Hyvärinen, 2005b) 提供了另一种训练模型而不需要估计 Z 或其导数的一致性方法。对数密度关于参数的导数 ∇ x log ⁡ p ( x ) ∇_x \log p(x) xlogp(x),被称为其 得分(score),得分匹配这个名称正是来自这样的术语。得分匹配采用的策略是,最小化模型对数密度和数据对数密度关于输入的导数之间的平方差期望: L ( x , θ ) = 1 2 ∥ ∇ x log ⁡ p model ( x ; θ ) − ∇ x log ⁡ p data ( x ) ∥ 2 2 L(x,\theta)=\frac{1}{2}\|\nabla_x\log p_{\text{model}}(x;\theta)-\nabla_x\log p_{\text{data}}(x)\|_2^2 L(x,θ)=21xlogpmodel(x;θ)xlogpdata(x)22 J ( θ ) = 1 2 E p data ( x ) L ( x , θ ) J(\theta)=\frac{1}{2}\mathbb E_{p_{\text{data}}(x)}L(x,\theta) J(θ)=21Epdata(x)L(x,θ) θ ∗ = min ⁡ θ J ( θ ) \theta^*=\min_{\theta}J(\theta) θ=θminJ(θ)该目标函数避免了微分配分函数 Z 带来的难题,因为 Z 不是 x 的函数,所以 ∇ x Z = 0 \nabla_x Z=0 xZ=0 最初,得分匹配似乎有一个新的困难:计算数据分布的得分需要知道生成训练数据的真实分布 p d a t a p_{data} pdata。幸运的是,最小化 L(x, θ) 的期望等价于最小化下式的期望 L ~ ( x , θ ) = ∑ j = 1 n ( ∂ 2 ∂ x j 2 log ⁡ p m o d e l ( x ; θ ) + 1 2 ( ∂ ∂ x j log ⁡ p m o d e l ( x ; θ ) ) 2 ) \tilde L(x,\theta)=\sum_{j=1}^n\left(\frac{\partial^2}{\partial x_j^2}\log p_{model}(x;\theta)+\frac{1}{2}\left(\frac{\partial}{\partial x_j}\log p_{model}(x;\theta)\right)^2\right) L~(x,θ)=j=1n(xj22logpmodel(x;θ)+21(xjlogpmodel(x;θ))2)其中 n 是 x 的维度。因为得分匹配需要关于 x 的导数,所以它不适用于具有离散数据的模型,但是模型中的潜变量可以是离散的。

类似于伪似然,得分匹配只有在我们能够直接估计 log ⁡ p ~ ( x ) \log \tilde p(x) logp~(x) 及其导数的时候才有效。它与对 log ⁡ p ~ ( x ) \log \tilde p(x) logp~(x) 仅提供下界的方法不兼容,因为得分匹配需要 log ⁡ p ~ ( x ) \log \tilde p(x) logp~(x) 的导数和二阶导数,而下限不能传达关于导数的任何信息。这意味着得分匹配不能应用于隐藏单元之间具有复杂相互作用的模型估计,例如稀疏编码模型或深度玻尔兹曼机。虽然得分匹配可以用于预训练较大模型的第一个隐藏层,但是它没有被用于预训练较大模型的较深层网络。这可能是因为这些模型的隐藏层通常包含一些离散变量。

虽然得分匹配没有明确显示具有负相信息,但是它可以被视为使用特定类型马尔可夫链的对比散度的变种 (Hyvärinen, 2007a)。在这种情况下,马尔可夫链并没有采用 Gibbs 采样,而是采用一种由梯度引导局部更新的不同方法。当局部更新的大小接近于零时,得分匹配等价于具有这种马尔可夫链的对比散度。

Lyu (2009) 将得分匹配推广到离散的情况(但是推导有误,后由 Marlin et al.(2010) 修正)。Marlin et al. (2010) 发现,广义得分匹配(generalized score matching,GSM)在许多样本观测概率为 0 的高维离散空间中不起作用。

一种更成功地将得分匹配的基本想法扩展到离散数据的方法是 比率匹配(ratiomatching) (Hyvärinen, 2007b)。比率匹配特别适用于二值数据。比率匹配最小化以下目标函数在样本上的均值: L ( R M ) ( x , θ ) = ∑ j = 1 n ( 1 1 + p model ( x ; θ ) p model ( f ( x , j ) ; θ ) ) L^{(RM)}(x,\theta)=\sum_{j=1}^n\left(\frac{1}{1+\frac{p_{\text{model}}(x;\theta)}{p_{\text{model}}(f(x,j);\theta)}}\right) L(RM)(x,θ)=j=1n 1+pmodel(f(x,j);θ)pmodel(x;θ)1 其中 f(x, j) 返回 j 处位值取反的 x。比率匹配使用了与伪似然估计相同的策略来绕开配分函数:配分函数会在两个概率的比率中抵消掉。Marlin et al. (2010) 发现,训练模型给测试集图像去噪时,比率匹配的效果要优于 SML、伪似然和 GSM。

类似于伪似然估计,比率匹配对每个数据点都需要 n 个 p ~ \tilde p p~ 的估计,因此每次更新的计算代价大约比 SML 的计算代价高出 n 倍。

与伪似然估计一样,我们可以认为比率匹配减小了所有只有一个变量不同于训练样本的状态的概率。由于比率匹配特别适用于二值数据,这意味着在与数据的汉明距离为 1 内的所有状态上,比率匹配都是有效的。

比率匹配还可以作为处理高维稀疏数据(例如词计数向量)的基础。这类稀疏数据对基于 MCMC 的方法提出了挑战,因为以密集格式表示数据是非常消耗计算资源的,而只有在模型学会表示数据分布的稀疏性之后,MCMC 采样才会产生稀疏值。Dauphin and Bengio (2013) 设计了比率匹配的无偏随机近似来解决这个问题。该近似只估计随机选择的目标子集,不需要模型生成完整的样本。读者可以参考 Marlin and de Freitas (2011) 了解比率匹配渐近效率的理论分析。

5 去噪得分匹配

某些情况下,我们希望拟合以下分布来正则化得分匹配 p smoothed ( x ) = ∫ p data ( y ) q ( x ∣ y ) d y p_{\text{smoothed}}(x)=\int p_{\text{data}}(y)q(x|y)dy psmoothed(x)=pdata(y)q(xy)dy而不是拟合真实分布 p data p_{\text{data}} pdata。分布 q(x | y) 是一个损坏过程,通常在形成 x 的过程中会向 y 中添加少量噪声。

去噪得分匹配非常有用,因为在实践中,通常我们不能获取真实的 p data p_{\text{data}} pdata,而只能得到其样本确定的经验分布。给定足够容量,任何一致估计都会使 pmodel 成为一组以训练点为中心的 Dirac 分布。考虑在第 5.4.5 节介绍的渐近一致性上的损失,通过 q 来平滑有助于缓解这个问题。Kingma and LeCun (2010b) 介绍了平滑分布 q 为正态分布噪声的正则化得分匹配。

有一些自编码器训练算法等价于得分匹配或去噪得分匹配。因此,这些自编码器训练算法也是解决配分函数问题的一种方式。

6 噪声对比估计

具有难求解的配分函数的大多数模型估计都没有估计配分函数。SML 和 CD 只估计对数配分函数的梯度,而不是估计配分函数本身。得分匹配和伪似然避免了和配分函数相关的计算。

噪声对比估计(noise-contrastive estimation,NCE)(Gutmann and Hyvari-nen, 2010) 采取了一种不同的策略。在这种方法中,模型估计的概率分布被明确表示为 log ⁡ p model ( x ) = log ⁡ p ~ model ( x ; θ ) + c \log p_{\text{model}}(x)=\log \tilde p_{\text {model}}(x;\theta)+c logpmodel(x)=logp~model(x;θ)+c其中 c 是 − logZ(θ) 的近似。噪声对比估计过程将 c 视为另一参数,使用相同的算法同时估计 θ 和 c,而不是仅仅估计 θ。因此,所得到的 log ⁡ p model ( x ) \log p_{\text{model}}(x) logpmodel(x) 可能并不完全对应有效的概率分布,但随着 c 估计的改进,它将变得越来越接近有效值。

NCE 也适用于具有易于处理的,不需要引入额外参数 c 的配分函数的问题。它已经是最令人感兴趣的,估计具有复杂配分函数模型的方法。

这种方法不可能使用最大似然作为估计的标准。最大似然标准可以设置 c 为任意大的值,而不是设置 c 以创建一个有效的概率分布。

NCE 将估计 p(x) 的无监督学习问题转化为学习一个概率二元分类器,其中一个类别对应模型生成的数据。该监督学习问题中的最大似然估计定义了原始问题的渐近一致估计。

具体地说,我们引入第二个分布, 噪声分布(noise distribution) p noise ( x ) p_{\text{noise}}(x) pnoise(x)。噪声分布应该易于估计和从中采样。我们现在可以构造一个联合 x 和新二值变量 y 的模型。在新的联合模型中,我们指定 p joint ( y = 1 ) = 1 2 p_{\text{joint}}(y=1)=\frac{1}{2} pjoint(y=1)=21 p joint ( x ∣ y = 1 ) = p model ( x ) p_{\text{joint}}(\mathbf x|y=1)=p_{\text{model}}(\mathbf x) pjoint(xy=1)=pmodel(x) p joint ( x ∣ y = 0 ) = p noise ( x ) p_{\text{joint}}(\mathbf x|y=0)=p_{\text{noise}}(\mathbf x) pjoint(xy=0)=pnoise(x)换言之,y 是一个决定我们从模型还是从噪声分布中生成 x 的开关变量。

我们可以在训练数据上构造一个类似的联合模型。在这种情况下,开关变量决定是从 数据 还是从噪声分布中抽取 x。正式地, p train ( y = 1 ) = 1 2 p_{\text{train}}(y=1)=\frac{1}{2} ptrain(y=1)=21 p train ( x ∣ y = 1 ) = p data ( x ) p_{\text{train}}(x|y=1)=p_{\text{data}}(x) ptrain(xy=1)=pdata(x) p train ( x ∣ y = 0 ) = p noise ( x ) p_{\text{train}}(x|y=0)=p_{\text{noise}}(x) ptrain(xy=0)=pnoise(x)

现在我们可以应用标准的最大似然学习拟合 p joint p_{\text{joint}} pjoint p train p_{\text{train}} ptrain 的 监督学习问题: θ , c = arg max ⁡ θ , c E x , y ∼ p train log ⁡ p joint ( y ∣ x ) \theta,c=\argmax_{\theta,c}\mathbb E_{\mathbf x,y\sim p_{\text{train}}}\log p_{\text{joint}}(y|\mathbf x) θ,c=θ,cargmaxEx,yptrainlogpjoint(yx)分布 p joint p_{\text{joint}} pjoint 本质上是将逻辑回归模型应用于模型和噪声分布之间的对数概率之差: p joint ( y = 1 ∣ x ) = p model ( x ) p model ( x ) + p noise ( x ) = 1 1 + p noise ( x ) p model ( x ) = 1 1 + exp ⁡ ( log ⁡ p noise ( x ) p model ( x ) ) = σ ( − log ⁡ p noise ( x ) p model ( x ) ) = σ ( log ⁡ p model ( x ) − log ⁡ p noise ( x ) ) \begin{align*} p_{\text{joint}}(y = 1|\mathbf{x})&=\frac{p_{\text{model}}(\mathbf{x})}{p_{\text{model}}(\mathbf{x}) + p_{\text{noise}}(\mathbf{x})}\\ &=\frac{1}{1 + \frac{p_{\text{noise}}(\mathbf{x})}{p_{\text{model}}(\mathbf{x})}}\\ &=\frac{1}{1 + \exp\left(\log\frac{p_{\text{noise}}(\mathbf{x})}{p_{\text{model}}(\mathbf{x})}\right)}\\ &=\sigma\left(-\log\frac{p_{\text{noise}}(\mathbf{x})}{p_{\text{model}}(\mathbf{x})}\right)\\ &=\sigma\left(\log p_{\text{model}}(\mathbf{x}) - \log p_{\text{noise}}(\mathbf{x})\right) \end{align*} pjoint(y=1∣x)=pmodel(x)+pnoise(x)pmodel(x)=1+pmodel(x)pnoise(x)1=1+exp(logpmodel(x)pnoise(x))1=σ(logpmodel(x)pnoise(x))=σ(logpmodel(x)logpnoise(x))因此,只要 log ⁡ p ~ model \log \tilde p_{\text{model}} logp~model 易于反向传播,并且如上所述, p noise p_{\text{noise}} pnoise 应易于估计(以便评估 p joint p_{\text{joint}} pjoint)和采样(以生成训练数据),那么NCE 就易于使用。

NCE 能够非常成功地应用于随机变量较少的问题,但即使随机变量有很多可以取的值时,它也很有效。例如,它已经成功地应用于给定单词上下文建模单词的条件分布 (Mnih and Kavukcuoglu, 2013)。虽然单词可以采样自一个很大的词汇表,但是只能采样一个单词。

当 NCE 应用于具有许多随机变量的问题时,其效率会变得较低。当逻辑回归分类器发现某个变量的取值不大可能时,它会拒绝这个噪声样本。这意味着在 p model p_{\text{model}} pmodel 学习了基本的边缘统计之后,学习进程会大大减慢。想象一个使用非结构化高斯噪声作为 pnoise 来学习面部图像的模型。如果 pmodel 学会了眼睛,就算没有学习任何其他面部特征,比如嘴,它也会拒绝几乎所有的非结构化噪声样本。

噪声分布 p noise p_{\text{noise}} pnoise 必须是易于估计和采样的约束可能是过于严格的限制。当 p noise p_{\text{noise}} pnoise 比较简单时,大多数采样可能与数据有着明显不同,而不会迫使 p model p_{\text{model}} pmodel 进行显著改进。

类似于得分匹配和伪似然,如果 p ~ \tilde p p~ 只有下界,那么NCE 不会有效。这样的下界能够用于构建 p joint ( y = 1 ∣ x ) p_{\text{joint}}(y = 1 | x) pjoint(y=1∣x) 的下界,但是它只能用于构建 p joint ( y = 0 ∣ x ) p_{\text{joint}}(y = 0 | x) pjoint(y=0∣x)(出现在一半的 NCE 对象中)的上界。同样地, p noise p_{\text{noise}} pnoise 的下界也没有用,因为它只提供了
p joint ( y = 1 ∣ x ) p_{\text{joint}}(y = 1 | x) pjoint(y=1∣x) 的上界。

在每个梯度步骤之前,模型分布被复制来定义新的噪声分布时,NCE 定义了一个被称为 自对比估计(self-contrastive estimation)的过程,其梯度期望等价于最大似然的梯度期望 (Goodfellow, 2014)。特殊情况的 NCE(噪声采样由模型生成)表明最大似然可以被解释为使模型不断学习以将现实与自身发展的信念区分的过程,而噪声对比估计通过让模型区分现实和固定的基准(噪声模型),我们降低了计算成本。

在训练样本和生成样本(使用模型能量函数定义分类器)之间进行分类以得到模型的梯度的方法,已经在更早的时候以各种形式提出来 (Welling et al., 2003b;Bengio, 2009)。

噪声对比估计是基于良好生成模型应该能够区分数据和噪声的想法。一个密切相关的想法是,良好的生成模型能够生成分类器无法将其与数据区分的样本。这个想法诞生了生成式对抗网络。

7 估计配分函数

尽管本章中的大部分内容都在避免计算与无向图模型相关的难以计算的配分函数 Z(θ),但在本节中我们将会讨论几种直接估计配分函数的方法。

估计配分函数可能会很重要,当我们希望计算数据的归一化似然时,我们会需要它。在评估模型,监控训练性能,和比较模型时,这通常是很重要的。

例如,假设我们有两个模型:概率分布为 p A ( x ; θ A ) = 1 Z A p ~ A ( x ; θ A ) p_{A}(\mathbf x;\theta_A)=\frac{1}{Z_A}\tilde p_A(\mathbf x;\theta_A) pA(x;θA)=ZA1p~A(x;θA) 的模型 M A \mathcal M_A MA 和概率分布为 p B ( x ; θ B ) = 1 Z B p ~ B ( x ; θ B ) p_{B}(\mathbf x;\theta_B)=\frac{1}{Z_B}\tilde p_B(\mathbf x;\theta_B) pB(x;θB)=ZB1p~B(x;θB) 的模型 M B \mathcal M_B MB。 比较模型的常用方法是评估和比较两个模型分配给独立同分布测试数据集的似然。假设测试集含 m 个样本 { x ( 1 ) , . . . , x ( m ) } \{x^{(1)},...,x^{(m)}\} {x(1),...,x(m)}。如果 ∏ i p A ( x ( i ) ; θ A ) > ∏ i p B ( x ( i ) ; θ B ) \prod_{i}p_A(x^{(i)};\theta_A)>\prod_i p_B(x^{(i)};\theta_B) ipA(x(i);θA)>ipB(x(i);θB),或等价地,如果 ∑ i log ⁡ p A ( x ( i ) ; θ A ) − ∑ i log ⁡ p B ( x ( i ) ; θ B ) > 0 (18.38) \sum_{i}\log p_A(x^{(i)};\theta_A)-\sum_i \log p_B(x^{(i)};\theta_B)>0\tag{18.38} ilogpA(x(i);θA)ilogpB(x(i);θB)>0(18.38)那么我们说 M A \mathcal M_A MA 是一个比 M B \mathcal M_B MB 更好的模型(或者,至少可以说,它在测试集上是一个更好的模型),这是指它有一个更好的测试对数似然。不幸的是,测试这个条件是否成立需要知道配分函数。式(18.38) 看起来需要估计模型分配给每个点的对数概率,因而需要估计配分函数。我们可以通过将式 (18.38) 重新转化为另一种形式来简化情况,在该形式中我们只需要知道两个模型的配分函数的比率: ∑ i log ⁡ p A ( x ( i ) ; θ A ) − ∑ i log ⁡ p B ( x ( i ) ; θ B ) = ∑ i ( log ⁡ p ~ A ( x ( i ) ; θ A ) p ~ B ( x ( i ) ; θ B ) ) − m log ⁡ Z ( θ A ) Z ( θ B ) \sum_i\log p_A(\mathbf x^{(i)};\theta_A)-\sum_i\log p_B(\mathbf x^{(i)};\theta_B)=\sum_i\left(\log\frac{\tilde p_A(\mathbf x^{(i)};\theta_A)}{\tilde p_B(\mathbf x^{(i)};\theta_B)}\right)-m\log\frac{Z(\theta_A)}{Z(\theta_B)} ilogpA(x(i);θA)ilogpB(x(i);θB)=i(logp~B(x(i);θB)p~A(x(i);θA))mlogZ(θB)Z(θA)因此,我们可以在不知道任一模型的配分函数,而只知道它们比率的情况下,判断模型 M A \mathcal M_A MA M B \mathcal M_B MB 更优。正如我们将很快看到的,在两个模型相似的情况下,我们可以使用重要采样来估计比率。

然而,如果我们想要计算测试数据在 M A \mathcal M_A MA M B \mathcal M_B MB上的真实概率,我们需要计算配分函数的真实值。如果我们知道两个配分函数的比率, r = Z ( θ B ) Z ( θ A ) r=\frac{Z(\theta_B)}{Z(\theta_A)} r=Z(θA)Z(θB),并且我们知道两者中一个的实际值,比如说 Z ( θ A ) Z(\theta_A) Z(θA),那么我们可以计算另一个的值: Z ( θ B ) = r Z ( θ A ) = Z ( θ B ) Z ( θ A ) Z ( θ A ) Z(\theta_B)=rZ(\theta_A)=\frac{Z(\theta_B)}{Z(\theta_A)}Z(\theta_A) Z(θB)=rZ(θA)=Z(θA)Z(θB)Z(θA)一种估计配分函数的简单方法是使用蒙特卡罗方法,例如简单重要采样。以下用连续变量积分来表示该方法,也可以替换积分为求和,很容易将其应用到离散变量的情况。我们使用提议分布 p 0 ( x ) = 1 Z 0 p ~ 0 ( x ) p_0(\mathbf x)=\frac{1}{Z_0}\tilde p_0(x) p0(x)=Z01p~0(x),其在配分函数 Z 0 Z_0 Z0和未归一化分布 p ~ 0 ( x ) \tilde p_0(\mathbf x) p~0(x)上易于采样和估计。 Z 1 = ∫ p ~ 1 ( x ) d x = ∫ p 0 ( x ) p 0 ( x ) p ~ 1 ( x ) d x = Z 0 ∫ p 0 ( x ) p ~ 1 ( x ) p ~ 0 ( x ) d x Z ^ 1 = Z 0 K ∑ k = 1 K p ~ 1 ( x ( k ) ) p ~ 0 ( x ( k ) ) s.t. : x ( k ) ∼ p 0 \begin{align*} Z_1&=\int \tilde{p}_1(\mathbf{x}) d\mathbf{x}\\ &=\int \frac{p_0(\mathbf{x})}{p_0(\mathbf{x})} \tilde{p}_1(\mathbf{x}) d\mathbf{x}\\ &=Z_0 \int p_0(\mathbf{x}) \frac{\tilde{p}_1(\mathbf{x})}{\tilde{p}_0(\mathbf{x})} d\mathbf{x}\\ \hat{Z}_1&=\frac{Z_0}{K} \sum_{k = 1}^{K} \frac{\tilde{p}_1(\mathbf{x}^{(k)})}{\tilde{p}_0(\mathbf{x}^{(k)})} \quad \text{s.t.}: \mathbf{x}^{(k)} \sim p_0\tag{18.44} \end{align*} Z1Z^1=p~1(x)dx=p0(x)p0(x)p~1(x)dx=Z0p0(x)p~0(x)p~1(x)dx=KZ0k=1Kp~0(x(k))p~1(x(k))s.t.:x(k)p0(18.44)然后该值可以直接比较式 (18.39) 中的两个模型。如果分布 p 0 p_0 p0 接近 p 1 p_1 p1,那么式 (18.44) 能够有效地估计配分函数 (Minka, 2005)。不幸的是,大多数时候 p 1 p_1 p1都很复杂(通常是多峰值的),并且定义在高维空间中。很难找到一个易求解的 p 0 p_0 p0,既能易于评估,又能充分接近 p 1 p_1 p1 以保持高质量的近似。如果 p 0 p_0 p0 p 1 p_1 p1 不接近,那么 p 0 p_0 p0 的大多数采样将在 p 1 p_1 p1 中具有较低的概率,从而在式 (18.44) 的求和中产生(相对的)可忽略的贡献。

如果求和中只有少数几个具有显著权重的样本,那么将会由于高方差而导致估计的效果很差。这可以通过估计 Z ^ 1 \hat Z _1 Z^1 的方差来定量地理解: Var ^ ( Z ^ 1 ) = Z 0 K 2 ∑ k = 1 K ( p ~ 1 ( x ( k ) ) p ~ 0 ( x ( k ) ) − Z ^ 1 ) 2 \hat {\text{Var}}(\hat Z_1)=\frac{Z_0}{K^2}\sum_{k=1}^K\left(\frac{\tilde{p}_1(\mathbf{x}^{(k)})}{\tilde{p}_0(\mathbf{x}^{(k)})} -\hat Z_1\right)^2 Var^(Z^1)=K2Z0k=1K(p~0(x(k))p~1(x(k))Z^1)2当重要性权重 p ~ 1 ( x ( k ) ) p ~ 0 ( x ( k ) ) \frac{\tilde{p}_1(\mathbf{x}^{(k)})}{\tilde{p}_0(\mathbf{x}^{(k)})} p~0(x(k))p~1(x(k))存在显著偏差时,上式的值是最大的。

我们现在关注两个解决高维空间复杂分布上估计配分函数的方法:退火重要采样和桥式采样。两者都始于上面介绍的简单重要采样方法,并且都试图通过引入缩小 p 0 p_0 p0 p 1 p_1 p1 之间差距的中间分布,来解决 p 0 p_0 p0 远离 p 1 p_1 p1 的问题。

7.1 退火重要采样

D K L ( p 0 ∥ p 1 ) D_{KL}(p_0∥p_1) DKL(p0p1) 很大的情况下(即 p0 和 p1 之间几乎没有重叠),一种称为退火重要采样(annealed importance sampling,AIS)的方法试图通过引入中间分布来缩小这种差距 (Jarzynski, 1997; Neal, 2001)。考虑分布序列 p η 0 , . . . , p η n p_{\eta_0},...,p_{\eta_n} pη0,...,pηn,其中 0 = η 0 < η 1 < ⋅ ⋅ ⋅ < η n − 1 < η n = 1 0=\eta_0<\eta_1<···<\eta_{n-1}<\eta_n=1 0=η0<η1<⋅⋅⋅<ηn1<ηn=1,分布序列中的第一个和最后一个分别是 p 0 p_0 p0 p 1 p_1 p1 这种方法使我们能够估计定义在高维空间多峰分布(例如训练 RBM 时定义的分布)上的配分函数。我们从一个已知配分函数的简单模型(例如,权重为零的 RBM)开始,估计两个模型配分函数之间的比率。该比率的估计基于许多个相似分布的比率估计,例如在零和学习到的权重之间插值一组权重不同的 RBM。现在我们可以将比率 Z 1 Z 0 \frac{Z_1}{Z_0} Z0Z1写作 Z 1 Z 0 = Z 1 Z 0 Z η 1 Z η 1 ⋅ ⋅ ⋅ Z η n − 1 Z η n − 1 = Z η 1 Z 0 Z η 2 Z η 1 ⋅ ⋅ ⋅ Z η n − 1 Z η n − 2 Z 1 Z η n − 1 = ∏ j = 0 n − 1 Z η j + 1 Z η j \begin{align*}\frac{Z_1}{Z_0}&=\frac{Z_1}{Z_0}\frac{Z_{\eta_1}}{Z_{\eta_1}}···\frac{Z_{\eta_{n-1}}}{Z_{\eta_{n-1}}}\\&=\frac{Z_{\eta_1}}{Z_0}\frac{Z_{\eta_2}}{Z_{\eta_1}}···\frac{Z_{\eta_{n-1}}}{Z_{\eta_{n-2}}}\frac{Z_1}{Z_{\eta_{n-1}}}\\&=\prod_{j=0}^{n-1}\frac{Z_{\eta_{j+1}}}{Z_{\eta_{j}}}\tag{18.49}\end{align*} Z0Z1=Z0Z1Zη1Zη1⋅⋅⋅Zηn1Zηn1=Z0Zη1Zη1Zη2⋅⋅⋅Zηn2Zηn1Zηn1Z1=j=0n1ZηjZηj+1(18.49)如果对于所有的 0 ≤ j ≤ n − 1 0\leq j\leq n-1 0jn1,分布 p η j p_{\eta_j} pηj p η j + 1 p_{\eta_{j+1}} pηj+1足够接近,那么我们能够使用简单的重要采样来估计每个因子 Z η j + 1 Z η j \frac{Z_{\eta_{j+1}}}{Z_{\eta_{j}}} ZηjZηj+1,然后使用这些得到 Z 1 Z 0 \frac{Z_1}{Z_0} Z0Z1的估计。

这些中间分布是从哪里来的呢?正如最先的提议分布 p 0 p_0 p0 是一种设计选择,分布序列 p η 0 , . . . , p η n p_{\eta_0},...,p_{\eta_n} pη0,...,pηn也是如此。也就是说,它们可以被特别设计为特定的问题领域。中间分布的一个通用和流行选择是使用目标分布 p 1 p_1 p1 的加权几何平均,起始分布(其配分函数是已知的)为 p 0 p_0 p0 p η j ∝ p 1 η j p 0 1 − η j p_{\eta_j}\propto p_1^{\eta_j}p_0^{1-\eta_j} pηjp1ηjp01ηj为了从这些中间分布中采样,我们定义了一组马尔可夫链转移函数 T η j ( x ′ ∣ x ) T_{\eta_j}(x'|x) Tηj(xx)定义了给定 x 转移到 x’ 的条件概率分布。转移算子 T η j ( x ′ ∣ x ) T_{\eta_j}(x'|x) Tηj(xx)定义如下,保持 p η j ( x ) p_{\eta_j}(x) pηj(x)不变: p n j ( x ) = ∫ p n j ( x ′ ) T η j ( x ′ ∣ x ) d x ′ p_{n_j}(x)=\int p_{n_j}(x')T_{\eta_j}(x'|x)dx' pnj(x)=pnj(x)Tηj(xx)dx这些转移可以被构造为任何马尔可夫链蒙特卡罗方法(例如,Metropolis-Hastings,Gibbs),包括涉及多次遍历所有随机变量或其他迭代的方法。然后,AIS 采样方法从 p 0 p_0 p0 开始生成样本,并使用转移算子从中间分布顺序地生成采样,直到我们得到目标分布 p 1 p_1 p1 的采样:

  • 对于 k = 1... K k=1...K k=1...K
    采样 x η 1 ( k ) ∼ p 0 ( x ) x_{\eta_1}^{(k)}\sim p_0(\mathbf x) xη1(k)p0(x)
    采样 x η 2 ( k ) ∼ T η 1 ( x η 2 ( k ) ∣ x η 1 ( k ) ) x_{\eta_2}^{(k)}\sim T_{\eta_1}(x^{(k)}_{\eta_{2}}|x^{(k)}_{\eta_{1}}) xη2(k)Tη1(xη2(k)xη1(k))
    ···
    采样 x η n − 1 ( k ) ∼ T η n − 2 ( x η n − 1 ( k ) ∣ x η n − 2 ( k ) ) x_{\eta_{n-1}}^{(k)}\sim T_{\eta_{n-2}}(x^{(k)}_{\eta_{n-1}}|x^{(k)}_{\eta_{n-2}}) xηn1(k)Tηn2(xηn1(k)xηn2(k))
    采样 x η n ( k ) ∼ T η n − 1 ( x η n ( k ) ∣ x η n − 1 ( k ) ) x_{\eta_{n}}^{(k)}\sim T_{\eta_{n-1}}(x^{(k)}_{\eta_{n}}|x^{(k)}_{\eta_{n-1}}) xηn(k)Tηn1(xηn(k)xηn1(k))
  • 结束

对于采样 k,通过连接式 (18.49) 给出的中间分布之间的重要性权重,我们可以导出目标重要性权重: w ( k ) = p ~ η 1 ( x η 1 ( k ) ) p ~ 0 ( x η 1 ( k ) ) p ~ η 2 ( x η 2 ( k ) ) p ~ η 1 ( x η 2 ( k ) ) ⋅ ⋅ ⋅ p ~ 1 ( x 1 ( k ) ) p ~ η n − 1 ( x η n ( k ) ) (18.52) w^{(k)}=\frac{\tilde p_{\eta_1}(x_{\eta_1}^{(k)})}{\tilde p_{0}(x_{\eta_1}^{(k)})}\frac{\tilde p_{\eta_2}(x_{\eta_2}^{(k)})}{\tilde p_{\eta_1}(x_{\eta_2}^{(k)})}···\frac{\tilde p_{1}(x_{1}^{(k)})}{\tilde p_{\eta_{n-1}}(x_{\eta_n}^{(k)})}\tag{18.52} w(k)=p~0(xη1(k))p~η1(xη1(k))p~η1(xη2(k))p~η2(xη2(k))⋅⋅⋅p~ηn1(xηn(k))p~1(x1(k))(18.52)为了避免诸如上溢的数值问题,最佳方法可能是通过加法或减法计算 log ⁡ w ( k ) \log w^{(k)} logw(k),而不是通过概率乘法和除法计算 w ( k ) w^{(k)} w(k)。利用由此定义的采样过程和式 (18.52) 中给出的重要性权重,配分函数的比率估计如下所示: Z 1 Z 0 ≈ 1 K ∑ k = 1 K w ( k ) \frac{Z_1}{Z_0}\approx \frac{1}{K}\sum_{k=1}^K w^{(k)} Z0Z1K1k=1Kw(k)为了验证该过程定义的重要采样方案是否有效, 我们可以展示 (Neal,2001) AIS 过程对应着扩展状态空间上的简单重要采样,其中数据点采样自乘积空间 [ x η 1 , . . . , x η n − 1 , x 1 ] [x_{\eta_1},...,x_{\eta_{n-1}},x_1] [xη1,...,xηn1,x1]。为此,我们将扩展空间上的分布定义为 p ~ ( x η 1 , . . . , x η n − 1 , x 1 ) = p ~ ( x 1 ) T ~ η n − 1 ( x η n − 1 ∣ x 1 ) T ~ η n − 2 ( x η n − 2 ∣ x η n − 1 ) ⋅ ⋅ ⋅ T ~ η 1 ( x η 1 ∣ x η 2 ) \begin{align*}&\tilde p(x_{\eta_1},...,x_{\eta_{n-1}},x_1)\\=&\tilde p(x_1)\tilde T_{\eta_{n-1}}(x_{\eta_{n-1}}|x_1)\tilde T_{\eta_{n-2}}(x_{\eta_{n-2}}|x_{\eta_{n-1}})···\tilde T_{\eta_{1}}(x_{\eta_{1}}|x_{\eta_{2}})\tag{18.55}\end{align*} =p~(xη1,...,xηn1,x1)p~(x1)T~ηn1(xηn1x1)T~ηn2(xηn2xηn1)⋅⋅⋅T~η1(xη1xη2)(18.55)其中 T ~ a \tilde T_a T~a 是由 T a T_a Ta 定义的转移算子的逆(应用贝叶斯规则): T ~ a ( x ′ ∣ x ) = p a ( x ′ ) p a ( x ) T a ( x ∣ x ′ ) = p ~ a ( x ′ ) p ~ a ( x ) T a ( x ∣ x ′ ) \tilde T_a(x'|x)=\frac{p_a(x')}{p_a(x)} T_a(x|x')=\frac{\tilde p_a(x')}{\tilde p_a(x)}T_a(x|x') T~a(xx)=pa(x)pa(x)Ta(xx)=p~a(x)p~a(x)Ta(xx)将以上代入到式 (18.55) 给出的扩展状态空间上的联合分布中,我们得到: p ~ ( x η 1 , … , x η n − 1 , x 1 ) = p ~ 1 ( x 1 ) p ~ η n − 1 ( x η n − 1 ) p ~ η n − 1 ( x 1 ) T η n − 1 ( x 1 ∣ x η n − 1 ) ∏ i = 1 n − 2 p ~ η i ( x η i ) p ~ η i ( x η i + 1 ) T η i ( x η i + 1 ∣ x η i ) = p ~ 1 ( x 1 ) p ~ η n − 1 ( x 1 ) T η n − 1 ( x 1 ∣ x η n − 1 ) p ~ η 1 ( x η 1 ) ∏ i = 1 n − 2 p ~ η i + 1 ( x η i + 1 ) p ~ η i ( x η i + 1 ) T η i ( x η i + 1 ∣ x η i ) \begin{align*} &\tilde{p}(x_{\eta_1}, \ldots, x_{\eta_{n - 1}}, x_1)\\ =&\tilde{p}_1(x_1) \frac{\tilde{p}_{\eta_{n - 1}}(x_{\eta_{n - 1}})}{\tilde{p}_{\eta_{n - 1}}(x_1)} T_{\eta_{n - 1}}(x_1 \mid x_{\eta_{n - 1}}) \prod_{i = 1}^{n - 2} \frac{\tilde{p}_{\eta_i}(x_{\eta_i})}{\tilde{p}_{\eta_i}(x_{\eta_{i + 1}})} T_{\eta_i}(x_{\eta_{i + 1}} \mid x_{\eta_i})\\ =&\frac{\tilde{p}_1(x_1)}{\tilde{p}_{\eta_{n - 1}}(x_1)} T_{\eta_{n - 1}}(x_1 \mid x_{\eta_{n - 1}}) \tilde{p}_{\eta_1}(x_{\eta_1}) \prod_{i = 1}^{n - 2} \frac{\tilde{p}_{\eta_{i + 1}}(x_{\eta_{i + 1}})}{\tilde{p}_{\eta_i}(x_{\eta_{i + 1}})} T_{\eta_i}(x_{\eta_{i + 1}} \mid x_{\eta_i})\\ \ \tag{18.59} \end{align*} == p~(xη1,,xηn1,x1)p~1(x1)p~ηn1(x1)p~ηn1(xηn1)Tηn1(x1xηn1)i=1n2p~ηi(xηi+1)p~ηi(xηi)Tηi(xηi+1xηi)p~ηn1(x1)p~1(x1)Tηn1(x1xηn1)p~η1(xη1)i=1n2p~ηi(xηi+1)p~ηi+1(xηi+1)Tηi(xηi+1xηi)(18.59)通过上面给定的采样方案,现在我们可以从扩展样本上的联合提议分布 q 上生成采样,联合分布如下 q ( x η 1 , … , x η n − 1 , x 1 ) = p 0 ( x η 1 ) T η 1 ( x η 2 ∣ x η 1 ) … T η n − 1 ( x 1 ∣ x η n − 1 ) q(x_{\eta_1}, \ldots, x_{\eta_{n - 1}}, x_1)=p_0(x_{\eta_1})T_{\eta_{1}}(x_{\eta_{2}}|x_{\eta_{1}})\ldots T_{\eta_{n-1}}(x_{1}|x_{\eta_{n-1}}) q(xη1,,xηn1,x1)=p0(xη1)Tη1(xη2xη1)Tηn1(x1xηn1)式 (18.59) 给出了扩展空间上的联合分布。将 q ( x η 1 , … , x η n − 1 , x 1 ) q(x_{\eta_1}, \ldots, x_{\eta_{n - 1}}, x_1) q(xη1,,xηn1,x1)作为扩展状态空间上的提议分布(我们会从中抽样),重要性权重如下 w ( k ) = p ~ ( x η 1 , … , x η n − 1 , x 1 ) q ( x η 1 , … , x η n − 1 , x 1 ) = p ~ 1 ( x 1 ( k ) ) p ~ η n − 1 ( x η n − 1 ( k ) ) ⋯ p ~ η 2 ( x η 2 ( k ) ) p ~ η 1 ( x η 1 ( k ) ) p ~ η 1 ( x η 1 ( k ) ) p ~ 0 ( x 0 ( k ) ) w^{(k)} = \frac{\tilde{p}(x_{\eta_1}, \ldots, x_{\eta_{n - 1}}, x_1)}{q(x_{\eta_1}, \ldots, x_{\eta_{n - 1}}, x_1)} = \frac{\tilde{p}_1(x_1^{(k)})}{\tilde{p}_{\eta_{n - 1}}(x_{\eta_{n - 1}}^{(k)})} \cdots \frac{\tilde{p}_{\eta_2}(x_{\eta_2}^{(k)})}{\tilde{p}_{\eta_1}(x_{\eta_1}^{(k)})} \frac{\tilde{p}_{\eta_1}(x_{\eta_1}^{(k)})}{\tilde{p}_0(x_0^{(k)})} w(k)=q(xη1,,xηn1,x1)p~(xη1,,xηn1,x1)=p~ηn1(xηn1(k))p~1(x1(k))p~η1(xη1(k))p~η2(xη2(k))p~0(x0(k))p~η1(xη1(k))这些权重和 AIS 上的权重相同。因此,我们可以将 AIS 解释为应用于扩展状态上的简单重要采样,其有效性直接来源于重要采样的有效性。退火重要采样首先由 Jarzynski (1997) 发现,然后由 Neal (2001) 再次独立发现。目前它是估计无向概率模型的配分函数的最常用方法。其原因可能与一篇有影响力的论文 (Salakhutdinov and Murray, 2008) 有关,该论文并没有讨论该方法相对于其他方法的优点,而是介绍了将其应用于估计受限玻尔兹曼机和深度信念网络的配分函数。关于 AIS 估计性质(例如,方差和效率)的讨论,请参看 Neal (2001)。

7.2 桥式采样

类似于 AIS,桥式采样 (Bennett, 1976) 是另一种处理重要采样缺点的方法。并非将一系列中间分布连接在一起,桥式采样依赖于单个分布 p∗(被称为桥),在已知配分函数的分布 p 0 p_0 p0 和分布 p 1 p_1 p1(我们试图估计其配分函数 Z1)之间插值。

桥式采样估计比率 Z 1 / Z 0 : p ~ 0 Z_1/Z_0:\tilde p_0 Z1/Z0:p~0 p ~ ∗ \tilde p_* p~之间重要性权重期望与 p ~ 1 \tilde p_1 p~1 p ~ ∗ \tilde p_* p~之间重要性权重的比率, Z 1 Z 0 ≈ ∑ k = 1 K p ~ ∗ ( x 0 ( k ) ) p ~ 0 ( x 0 ( k ) ) / ∑ k = 1 K p ~ ∗ ( x 1 ( k ) ) p ~ 1 ( x 1 ( k ) ) \frac{Z_1}{Z_0} \approx \sum_{k = 1}^{K} \frac{\tilde{p}_*(x_0^{(k)})}{\tilde{p}_0(x_0^{(k)})}\bigg/ {\sum_{k = 1}^{K} \frac{\tilde{p}_*(x_1^{(k)})}{\tilde{p}_1(x_1^{(k)})}} Z0Z1k=1Kp~0(x0(k))p~(x0(k))/k=1Kp~1(x1(k))p~(x1(k))如果仔细选择桥式采样 p ∗ p_* p,使其与 p 0 p_0 p0 p 1 p_1 p1都有很大重合的话,那么桥式采样能够允许两个分布(或更正式地, D K L ( p 0 ∥ p 1 ) D_{KL}(p_0\|p_1) DKL(p0p1))之间有较大差距(相对标准重要采样而言)。

可以表明,最优的桥式采样是 p ∗ ( o p t ) ( x ) ∝ p ~ 0 ( x ) p ~ 1 ( x ) r p ~ 0 ( x ) + p ~ 1 ( x ) p_*^{(opt)}(\mathbf x)\propto \frac{\tilde p_0(x)\tilde p_1(x)}{r\tilde p_0(x)+\tilde p_1(x)} p(opt)(x)rp~0(x)+p~1(x)p~0(x)p~1(x),其中 r = Z 1 / Z 0 r=Z_1/Z_0 r=Z1/Z0。这似乎是一个不可行的解决方案,因为它似乎需要我们估计数值 Z 1 / Z 0 Z_1/Z_0 Z1/Z0。然而,可以从粗糙的 r 开始估计,然后使用得到的桥式采样逐步迭代以改进估计 (Neal, 2005)。也就是说,我们会迭代地重新估计比率,并使用每次迭代更新 r 的值。

链接重要采样 AIS和桥式采样各有优点。如果 D K L ( p 0 ∥ p 1 ) D_{KL}(p_0\|p_1) DKL(p0p1) 不太大(由于 p 0 p_0 p0 p 1 p_1 p1足够接近)的话,那么桥式采样能比AIS更高效地估计配分函数比率。然而,如果对于单个分布 p 而言,两个分布相距太远难以桥接差距,那么 AIS 至少可以使用许多潜在中间分布来跨越 p 0 p_0 p0 p 1 p_1 p1 之间的差距。Neal(2005)展示链接重要采样方法如何利用桥式采样的优点,桥接AIS中使用的中间分布,并且显著改进了整个配分函数的估计。

在训练期间估计配分函数 虽然AIS已经被认为是用于估计许多无向模型配分函数的标准方法,但是它在计算上代价很高,以致其在训练期间仍然不很实用。研究者探索了一些在训练过程中估计配分函数的替代方法。

使用桥式采样、短链 AIS和并行回火的组合,Desjardins et al.(2011)设计了一种在训练过程中追踪 RBM配分函数的方法。该策略的基础是,在并行回火方法操作的每个温度下,RBM配分函数的独立估计会一直保持。作者将相邻链(来自并行回火)的配分函数比率的桥式采样估计和跨越时间的AIS估计组合起来,提出一个在每次迭代学习时估计配分函数的(且方差较小的)方法。

本章中描述的工具提供了许多不同的方法,以解决难处理的配分函数问题,但是在训练和使用生成模型时,可能会存在一些其他问题。其中最重要的是我们接下来会遇到的难以推断的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作记录1

日常总结、灵感记录、学习要点。持续记录 学海无涯,再好的记性也比不过烂笔头,记录一下学习日常、灵感、要点。 前言:最近看见一个博文,很有感触,是某个大佬自己运营的网站,分享了他的各种经验文章和自身的一些笔记。本人还没有他这么屌,所以还是先在CSDN上小试牛刀吧…

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

RedisTemplate和StringRedisTemplate的系列文章详见&#xff1a; Spring Boot&#xff08;十七&#xff09;&#xff1a;集成和使用Redis Spring Boot&#xff08;十八&#xff09;&#xff1a;RedisTemplate和StringRedisTemplate Spring Boot&#xff08;十九&#xff09;…

智能指针之设计模式1

本文探讨一下智能指针和GOF设计模式的关系&#xff0c;如果按照设计模式的背后思想来分析&#xff0c;可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然&#xff0c;它们也不是严格意义上面向对象的设计模式&#xff0c;毕竟它们没有那么分明的类层次体系&…

中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)

1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发&#xff0c;并于2016年开源。专为大规模数据分析&#xff0c;实时数据分析和复杂查询设计&#xff0c;具有高性能、实时数据和可扩展性等…

Go之Slice和数组:深入理解底层设计与最佳实践

在Go语言中&#xff0c;数组&#xff08;Array&#xff09;和切片&#xff08;Slice&#xff09;是两种看似相似却本质不同的数据结构。本文将深入剖析它们的底层实现机制&#xff0c;并结合实际代码示例&#xff0c;帮助开发者掌握核心差异和使用场景。 一、基础概念&#xff…

力扣热题100——普通数组(不普通)

普通数组但一点不普通&#xff01; 最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 最大子数组和 这道题是非常经典的适用动态规划解决题目&#xff0c;但同时这里给出两种解法 动态规划、分治法 那么动态规划方法大家可以在我的另外一篇博客总结中看到&am…

矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵

GPU渲染过程 矩阵 什么是矩阵&#xff08;Matrix&#xff09; 向量 &#xff08;3&#xff0c;9&#xff0c;88&#xff09; 点乘&#xff1a;计算向量夹角 叉乘&#xff1a;计算两个向量构成平面的法向量。 矩阵 矩阵有3行&#xff0c;2列&#xff0c;所以表示为M32 获取固…

MySQL之text字段详细分类说明

在 MySQL 中&#xff0c;TEXT 是用来存储大量文本数据的数据类型。TEXT 类型可以存储非常长的字符串&#xff0c;比 VARCHAR 类型更适合存储大块的文本数据。TEXT 数据类型分为以下几个子类型&#xff0c;每个子类型用于存储不同大小范围的文本数据&#xff1a; TINYTEXT: 可以…

超详细!Android 面试题大汇总与深度解析

一、Java 与 Kotlin 基础 1. Java 的多态是如何实现的&#xff1f; 多态是指在 Java 中&#xff0c;同一个行为具有多个不同表现形式或形态的能力。它主要通过方法重载&#xff08;Overloading&#xff09;和方法重写&#xff08;Overriding&#xff09;来实现。 方法重载&a…

如何提高webrtc操作跟手时间,降低延迟

第一次做webrtc项目&#xff0c;操作延迟&#xff0c;一直是个问题&#xff0c;多次调试都不能达到理想效果。偶尔发现提高jitterBuffer时间可以解决此问题。关键代码 const _setJitter (values: number) > { const receives peerConnection.getReceivers();receives.f…

语音合成(TTS)从零搭建一个完整的TTS系统-第一节-效果演示

一、概述 语音合成又叫文字转语音&#xff08;TTS-text to speech &#xff09;&#xff0c;本专题我们记录从零搭建一个完整的语音合成系统&#xff0c;包括文本前端、声学模型和声码器&#xff0c;从模型训练到系统的工程化实现&#xff0c;模型可以部署在手机等嵌入式设备上…

实验三 I/O地址译码

一、实验目的 掌握I/O地址译码电路的工作原理。 二、实验电路 实验电路如图1所示&#xff0c;其中74LS74为D触发器&#xff0c;可直接使用实验台上数字电路实验区的D触发器&#xff0c;74LS138为地址译码器&#xff0c; Y0&#xff1a;280H&#xff5e;287H&…

Linux 使用Nginx搭建简易网站模块

网站需求&#xff1a; 一、基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab ​ 二、给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/stud…

MyBatis 如何使用

1. 环境准备 添加依赖&#xff08;Maven&#xff09; 在 pom.xml 中添加 MyBatis 和数据库驱动依赖&#xff1a; <dependencies><!-- MyBatis 核心库 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId&g…

ArkTS组件的三个通用(通用事件、通用属性、通用手势)

文章目录 通用事件点击事件 onClick触摸事件 onTouch挂载、卸载事件拖拽事件按键事件 onKeyEvent焦点事件鼠标事件悬浮事件组件区域变化事件 onAreaChange组件尺寸变化事件组件可见区域变化事件组件快捷键事件自定义事件分发自定义事件拦截 通用属性尺寸设置位置设置布局约束边…

智慧城市像一张无形大网,如何紧密连接你我他?

智慧城市作为复杂巨系统&#xff0c;其核心在于通过技术创新构建无缝连接的网络&#xff0c;使物理空间与数字空间深度融合。这张"无形大网"由物联网感知层、城市数据中台、人工智能中枢、数字服务入口和安全信任机制五大支柱编织而成&#xff0c;正在重塑城市运行规…

【python】django sqlite版本过低怎么办

方法一&#xff1a;下载最新版本 复制上面的内容的链接 在服务器上进行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…

PyTorch - Tensor 学习笔记

上层链接&#xff1a;PyTorch 学习笔记-CSDN博客 Tensor 初始化Tensor import torch import numpy as np# 1、直接从数据创建张量。数据类型是自动推断的 data [[1, 2],[3, 4]] x_data torch.tensor(data)torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])输出&am…

【技术派后端篇】ElasticSearch 实战指南:环境搭建、API 操作与集成实践

1 ES介绍及基本概念 ElasticSearch是一个基于Lucene 的分布式、高扩展、高实时的基于RESTful 风格API的搜索与数据分析引擎。 RESTful 风格API的特点&#xff1a; 接受HTTP协议的请求&#xff0c;返回HTTP响应&#xff1b;请求的参数是JSON&#xff0c;返回响应的内容也是JSON…

从标准九九表打印解读单行表达式的书写修炼(Python)

解读单行表达式书写&#xff0c;了解修习单行捷径。 笔记模板由python脚本于2025-04-16 23:24:17创建&#xff0c;本篇笔记适合喜欢单行喜好python的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述…