pymc.ADVI#
- class pymc.ADVI(*args, **kwargs)[源代码]#
自动微分变分推断 (ADVI)
此类实现了均值场 ADVI,其中假设变分后验分布为无参数相关性的球形高斯分布,并拟合到真实后验分布。变分后验的均值和标准差被称为变分参数。
为了解释,我们将概率模型中的随机变量分为三种类型。观测随机变量 \({\cal Y}=\{\mathbf{y}_{i}\}_{i=1}^{N}\) 是 \(N\) 个观测值。每个 \(\mathbf{y}_{i}\) 可以是一组观测随机变量,即 \(\mathbf{y}_{i}=\{\mathbf{y}_{i}^{k}\}_{k=1}^{V_{o}}\),其中 \(V_{k}\) 是模型中观测随机变量的类型数量。
接下来的这些是全局随机变量 \(\Theta=\{\theta^{k}\}_{k=1}^{V_{g}}\),它们用于计算所有观测样本的概率。
最后一个是局部随机变量 \({\cal Z}=\{\mathbf{z}_{i}\}_{i=1}^{N}\),其中 \(\mathbf{z}_{i}=\{\mathbf{z}_{i}^{k}\}_{k=1}^{V_{l}}\)。这些随机变量仅在AEVB中使用(在PyMC中未实现)。
ADVI 的目标是通过变分后验 \(q(\Theta)\prod_{i=1}^{N}q(\mathbf{z}_{i})\) 来近似后验分布 \(p(\Theta,{\cal Z}|{\cal Y})\)。这些项均为正态分布(均值场近似)。
\(q(\Theta)\) 使用其均值和标准差进行参数化。这些参数表示为 \(\gamma\)。虽然 \(\gamma\) 是一个常数,但 \(q(\mathbf{z}_{i})\) 的参数依赖于每个观测值。因此这些参数表示为 \(\xi(\mathbf{y}_{i}; \nu)\),其中 \(\nu\) 是 \(\xi(\cdot)\) 的参数。例如,\(\xi(\cdot)\) 可以是一个多层感知器或卷积神经网络。
除了 \(\xi(\cdot)\),我们还可以包括用于观测似然的确定性映射。我们将确定性映射的参数表示为 \(\eta\)。这种映射的一个例子是卷积变分自编码器示例中使用的反卷积神经网络,该示例位于PyMC笔记本目录中。
此函数最大化证据下界(ELBO):math:{cal L}(gamma, nu, eta),定义如下:
\[\begin{split}{\cal L}(\gamma,\nu,\eta) & = \mathbf{c}_{o}\mathbb{E}_{q(\Theta)}\left[ \sum_{i=1}^{N}\mathbb{E}_{q(\mathbf{z}_{i})}\left[ \log p(\mathbf{y}_{i}|\mathbf{z}_{i},\Theta,\eta) \right]\right] \\ & - \mathbf{c}_{g}KL\left[q(\Theta)||p(\Theta)\right] - \mathbf{c}_{l}\sum_{i=1}^{N} KL\left[q(\mathbf{z}_{i})||p(\mathbf{z}_{i})\right],\end{split}\]其中 \(KL[q(v)||p(v)]\) 是 Kullback-Leibler 散度
\[KL[q(v)||p(v)] = \int q(v)\log\frac{q(v)}{p(v)}dv,\]\(\mathbf{c}_{o/g/l}\) 是用于加权ELBO中每个项的向量。更准确地说,我们可以将ELBO中的每个项写成如下形式:
\[\begin{split}\mathbf{c}_{o}\log p(\mathbf{y}_{i}|\mathbf{z}_{i},\Theta,\eta) & = & \sum_{k=1}^{V_{o}}c_{o}^{k} \log p(\mathbf{y}_{i}^{k}| {\rm pa}(\mathbf{y}_{i}^{k},\Theta,\eta)) \\ \mathbf{c}_{g}KL\left[q(\Theta)||p(\Theta)\right] & = & \sum_{k=1}^{V_{g}}c_{g}^{k}KL\left[ q(\theta^{k})||p(\theta^{k}|{\rm pa(\theta^{k})})\right] \\ \mathbf{c}_{l}KL\left[q(\mathbf{z}_{i}||p(\mathbf{z}_{i})\right] & = & \sum_{k=1}^{V_{l}}c_{l}^{k}KL\left[ q(\mathbf{z}_{i}^{k})|| p(\mathbf{z}_{i}^{k}|{\rm pa}(\mathbf{z}_{i}^{k}))\right],\end{split}\]其中 \({\rm pa}(v)\) 表示在模型的有向无环图中 \(v\) 的父变量集合。
在使用小批量时,\(c_{o}^{k}\) 和 \(c_{l}^{k}\) 应设置为 \(N/M\),其中 \(M\) 是每个小批量中的观测数量。这是通过向观测节点提供 total_size 参数来完成的(例如
Normal('x', 0, 1, observed=data, total_size=10000)
)。在这种情况下,可以自动确定观测节点的 \(logp\) 的适当缩放。值得注意的是,可以有两个具有不同 total_size 的独立观测变量,并在推理过程中独立迭代它们。在使用 ADVI 时,我们需要提供
概率模型
model 包含两种类型的随机变量(observed_RVs,global_RVs)。
(可选) 小批量
提供给小批量样本的张量通过在
Inference.fit()
方法中使用回调来单独处理,这些回调会改变共享 PyTensor 变量的存储,或者通过pymc.generator()
自动迭代小批量并在之前定义。(可选)确定性映射的参数
它们必须与其他参数一起传递给
Inference.fit()
方法作为 more_obj_params 参数。
有关训练阶段的更多信息,请参考
pymc.variational.opvi.ObjectiveFunction.step_function()
- 参数:
- 模型: :class:`pymc.Model`
用于推理的 PyMC 模型
- random_seed: None 或 int
- start: `dict[str, np.ndarray]` 或 `StartDict`
推理的起点
- start_sigma: `dict[str, np.ndarray]`
推理的起始标准差,仅适用于方法 ‘advi’
参考文献
Kucukelbir, A., Tran, D., Ranganath, R., Gelman, A., 和 Blei, D. M. (2016). 自动微分变分推断. arXiv 预印本 arXiv:1603.00788.
Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 粘住着陆:一种简单的减少方差的梯度方法用于ADVI近似推理 approximateinference.org/accepted/RoederEtAl2016.pdf
Kingma, D. P., & Welling, M. (2014). 自动编码变分贝叶斯. stat, 1050, 1.
方法
ADVI.__init__
(*args, **kwargs)ADVI.fit
([n, score, callbacks, progressbar])执行算子变分推断
ADVI.refine
(n[, progressbar])使用最后编译的步骤函数优化解决方案
ADVI.run_profiling
([n, score])属性
approx