跳转至

第 19 章:近似推断(Approximate Inference)

19.1 推断作为优化(Inference as Optimization)

许多概率模型难以训练,根源在于其上的推断难以执行。在深度学习语境下,我们通常有一组可见变量 v 和一组潜变量 h,而"推断的困难"通常指计算 p(h | v) 或对其求期望这类操作——而这正是最大似然学习所必需的。许多仅含单隐层的简单图模型(受限玻尔兹曼机、概率 PCA)被设计成使 p(h | v) 的计算与期望易于处理;但绝大多数含多层潜变量的图模型都拥有不可处理的(intractable)后验分布,精确推断需要指数量级时间,某些单层模型(如稀疏编码)同样存在这一问题。

本章将介绍若干应对这些不可处理推断问题的技术。第 20 章会进一步说明如何用这些技术去训练那些原本不可处理的概率模型(如深度信念网络、深度玻尔兹曼机)。深度学习中的不可处理推断问题通常源于结构化图模型中潜变量之间的相互作用——既可能源于无向模型中潜变量之间的直接连边,也可能源于有向模型中"解释消除"(explaining away)效应,即同一可见单元的多个共同父辈在被观测后形成的相互作用路径(图 19.1 给出若干示例:半受限玻尔兹曼机中隐单元之间的直接连接、深度玻尔兹曼机中层与层之间的连接、有向模型中两个潜变量作为同一可见变量共同父辈的情况)。即便图结构如此,某些模型(例如概率 PCA)仍能给出可处理的推断,这是因为其条件分布的具体形式(线性-高斯条件分布且基向量正交)在图所描述的独立性之外引入了额外独立性。

应对困难推断的许多方法都基于一个观察:精确推断可以被描述为一个优化问题,近似推断算法则可由近似化该底层优化问题导出。设有观察变量 v、潜变量 h 的概率模型,我们希望计算 log p(v; θ),但当边缘化 h 代价过高时,直接计算 log p(v; θ) 过于困难。此时我们可以计算它的一个下界 L(v, θ, q),即证据下界(evidence lower bound, ELBO),亦称负变分自由能。ELBO 的定义是

\[ L(v, \theta, q) = \log p(v; \theta) - D_{\mathrm{KL}}\bigl(q(h \mid v) \,\|\, p(h \mid v; \theta)\bigr) \]

其中 q 是 h 上的任意概率分布。由于 log p(v) 与 L(v, θ, q) 的差等于一个 KL 散度,而 KL 散度非负,故 L 总是 log p(v) 的下界,二者相等当且仅当 q 与 p(h | v) 相同。对某些 q,L 的计算反而简单得多;对 L 作代数恒等变形可得更易处理的形式

\[ L(v, \theta, q) = \mathbb{E}_{h \sim q}\bigl[\log p(h, v)\bigr] + H(q) \]

该形式是 ELBO 更"标准"的定义。只要 q 取得合适,L 可被高效计算;对任意 q,L 都给出似然的一个下界;q 越接近 p(h | v),L 越紧(越接近 log p(v));当 q(h | v) = p(h | v) 时 L(v, θ, q) = log p(v; θ)。于是我们可以把推断理解为寻找使 L 最大的 q 的过程:精确推断通过在包含 p(h | v) 的函数族上搜索,完美地最大化 L;本章中各种近似推断形式都通过限制 q 的搜索族、或用不完美的优化过程来近似的最大化 L。无论 q 如何选取,L 始终是下界,我们可以根据优化方式在计算代价和界紧度之间折中:用不完美的优化或对受限 q 族做完美优化,都可获得廉价但粗糙匹配的 q。

19.2 期望最大化(Expectation Maximization)

我们要介绍的第一个基于最大化下界 L 的算法是期望最大化(EM)算法,它是含潜变量模型的流行训练算法。本节按 Neal and Hinton (1999) 的视角来描述 EM;与本章中其他算法不同,EM 不是一种近似推断方法,而是一种"使用近似后验进行学习"的方法。EM 交替进行以下两步直至收敛:

  • E 步(Expectation):记 θ^(0) 为本步开始时的参数值,设 q(h^(i) | v) = p(h^(i) | v^(i); θ^(0)),即 q 用当前参数值 θ^(0) 来定义,若 θ 变化则 p(h | v; θ) 变化,但 q(h | v) 保持等于 p(h | v; θ^(0))。
  • M 步(Maximization):用任选优化算法,完全地或部分地关于 θ 最大化 ∑_i L(v^(i), θ, q)。

上述两步可视为关于 L 的坐标上升:一步关于 q 最大化 L,另一步关于 θ 最大化 L。对潜变量模型的随机梯度上升可视为 EM 的特例,其 M 步仅取单个梯度步;其他变体的 M 步可走得更远——对某些模型族,甚至可以解析地完成 M 步,一步跳到给定当前 q 时的 θ 最优解。尽管 E 步涉及精确推断,我们仍可在某种意义上把 EM 看作在使用近似推断:具体而言,M 步假设对所有 θ 都用同一个 q,随着 M 步的 θ 偏离 E 步所用的 θ^(0) 越来越远,L 与真实 log p(v) 之间会出现差距;幸运的是,进入下一轮循环的 E 步会把这一差距重新缩到零。

EM 算法蕴含若干洞见。第一个是基本的学习过程结构:更新模型参数以提升"被补全数据集"(所有缺失变量都由后验分布估计给出)的似然,这一洞见并不独有,例如用梯度下降最大化对数似然也具备这一性质(对数似然梯度需要关于隐单元后验的期望)。另一个关键洞见是:在 θ 移到不同值之后,我们可以继续沿用同一个 q——这一洞见被经典机器学习广泛用于推导出大步长的 M 步更新;但在深度学习中,大多数模型过于复杂,无法允许一个可处理的"最优大步长 M 步"解析解,因此这一更 EM 独有的洞见很少被使用。

19.3 MAP 推断与稀疏编码(MAP Inference and Sparse Coding)

"推断"一词通常指在给定另一组变量时计算某一组变量的概率分布;在含潜变量模型的训练中,我们一般关心 p(h | v)。一种替代形式是只计算缺失变量的"最可能单值",而不是其完整分布——这在潜变量模型中意味着计算

\[ h^{*} = \arg\max_{h} p(h \mid v) \]

即最大后验(maximum a posteriori, MAP)推断。MAP 推断一般不被视为近似推断——它确实计算了 h* 的精确最可能值;然而,若我们要把基于 L(v, h, q) 最大化的学习过程开发出来,把 MAP 推断视为给出一个 q 的过程是有益的。如此,MAP 推断可被视为一种近似推断,因为它并未提供最优 q。

精确推断是在不受限的概率分布族上,用精确优化算法关于 q 最大化 L(v, θ, q) = E_{h ∼ q}[log p(h, v)] + H(q)。将 q 限制为 Dirac 分布

\[ q(h \mid v) = \delta(h - \mu) \]

即可将 MAP 推断作为近似推断的一种形式导出,即 q 完全由 μ 控制。丢掉 L 中不随 μ 变化的部分,得到优化问题

\[ \mu^{*} = \arg\max_{\mu} \log p(h = \mu, v) \]

它等价于 MAP 推断问题 h = arg max_h p(h | v)。于是我们可以给出一个类 EM 的学习过程:交替进行 MAP 推断(推断 h)与更新 θ(以增大 log p(h*, v))。这同样是对 L 的坐标上升:用推断关于 q 最大化 L,用参数更新关于 θ 最大化 L;其整体可由 L 是 log p(v) 的下界这一事实来辩护。在 MAP 推断情形下,这一辩护相当空洞,因为该下界是无限宽松的——Dirac 分布的微分熵为负无穷;不过,给 μ 加上噪声后下界又会变得有意义。

MAP 推断在深度学习中常被同时用作特征提取器与学习机制,主要被用于稀疏编码模型。回顾第 13.4 节,稀疏编码是一种对其隐单元施加稀疏诱导先验的线性因子模型,常用一种可分解的 Laplace 先验

\[ p(h_i) = \frac{\lambda}{2} e^{-\lambda |h_i|} \]

可见单元通过线性变换加噪声生成

\[ p(x \mid h) = \mathcal{N}(v; W h + b, \beta^{-1} I) \]

计算甚至表示 p(h | v) 都很困难——h 中每对变量 h_i、h_j 都是 v 的父辈,因此当 v 被观测时,图模型中存在连接 h_i 与 h_j 的活跃路径,所有隐单元在 p(h | v) 中参与一个巨大的团;若模型是高斯的,这些相互作用可通过协方差矩阵高效建模,但稀疏先验使这些相互作用变成非高斯。因为 p(h | v) 不可处理,对数似然及其梯度的计算也同样不可处理,无法用精确最大似然学习,转而用 MAP 推断并通过最大化以 MAP 估计点为中心的 Dirac 分布所定义的 ELBO 来学习参数。

若把训练集中所有 h 向量拼成矩阵 H,把所有 v 向量拼成矩阵 V,则稀疏编码的学习过程即最小化

\[ J(H, W) = \sum_{i,j} |H_{i,j}| + \sum_{i,j} \bigl[V - HW^{\top}\bigr]_{i,j}^{2} \]

大多数稀疏编码应用还会加入权重衰减或对 W 列的范数约束,以避免出现 H 极小而 W 极大的病态解。可用关于 H 与关于 W 的交替最小化求解 J,两个子问题都是凸的,关于 W 的子问题就是线性回归;但同时关于两个变量最小化 J 一般不是凸的。关于 H 的最小化需要 feature-sign search 等专门算法(Lee et al., 2007)。

19.4 离散潜变量(Discrete Latent Variables)

19.4 节概述变分推断与学习的整体框架:证据下界 L(v, θ, q) 是 log p(v; θ) 的下界,推断可视为关于 q 最大化 L,学习可视为关于 θ 最大化 L;EM 算法允许在固定 q 下做大的学习步,基于 MAP 推断的学习算法则使用 p(h | v) 的点估计。变分学习的核心思想是:在受限分布族上最大化 L,这一分布族的选择应使 E_q log p(h, v) 易于计算,典型做法是对 q 的分解方式施加假设。常见做法是施加"q 是可分解分布"的限制

\[ q(h \mid v) = \prod_i q(h_i \mid v) \]

这就是平均场(mean field)方法。更一般地,我们可以对 q 施加任何我们选择的图模型结构,以灵活决定要捕获多少相互作用——这种完全一般的图模型方法称为结构化变分推断(Saul and Jordan, 1996)。变分方法的妙处在于我们不必为 q 指定具体的参数形式,只需指定它如何分解,优化问题会在分解约束下自动确定最优概率分布:对离散潜变量,这意味着用传统优化方法去优化描述 q 分布的有限个变量;对连续潜变量,这意味着用"变分法"(calculus of variations)这一数学分支在函数空间上做优化,实际决定用哪个函数来代表 q——变分法是"变分学习"与"变分推断"名称的来源,即便潜变量是离散的不需要变分法时,这些名字仍然适用。在连续潜变量情形下,变分法是一种强大的工具,模型设计者只需指定 q 的分解方式,而不必再猜测如何设计一个能精确近似后验的具体 q。

因为 L(v, θ, q) = log p(v; θ) - D_{KL}(q(h | v) ‖ p(h | v; θ)), 关于 q 最大化 L 可视为最小化 D_{KL}(q(h | v) ‖ p(h | v))。在这一意义上,我们在拟合 q 拟合 p,只是使用的 KL 散度方向与我们拟合近似时常用的方向相反。用最大似然学习把模型拟合数据时,我们最小化 D_{KL}(p_data ‖ p_model),即最大似然鼓励模型在数据概率高的各处也具有高概率;而我们基于优化的推断过程则鼓励 q 在真实后验概率低的各处也具有低概率。两种 KL 方向都各有所长所短,选择哪一种取决于应用最看重哪些性质。在推断优化问题中,我们选择 D_{KL}(q(h | v) ‖ p(h | v)) 是出于计算考虑:具体而言,计算 D_{KL}(q(h | v) ‖ p(h | v)) 涉及对 q 求期望,故通过把 q 设计得简单就能化简所需期望;反方向 KL 散度需要对真实后验求期望,而真实后验的具体形式由模型选择决定,我们无法设计一个低代价的方法来精确计算 D_{KL}(p(h | v) ‖ q(h | v))。

本节(19.4.1)讨论离散潜变量情形。离散潜变量的变分推断相对直接。我们定义一个分布 q,通常其每个因子只是离散状态上的查找表。最简单情形下,h 是二值的,并作平均场假设——q 在每个 h_i 上独立分解;此时我们可用一个向量 ĥ 来参数化 q,各分量为概率,即 q(h_i = 1 | v) = ĥ_i。确定 q 的表示方式后,只需优化其参数;对离散潜变量,这就是一个标准优化问题,原则上可用任何优化算法(如梯度下降)进行选取。

由于这一优化必须发生在学习算法的内循环中,故必须非常快。为达到这一速度,我们通常使用专为"在很少迭代中求解相对小而简单问题"设计的特殊优化算法。一个流行选择是迭代不动点方程,即对方程

\[ \frac{\partial L}{\partial \hat{h}_i} = 0 \]

求解 ĥ_i。我们反复更新 ĥ 的不同元素直至满足收敛判据。

为使讨论具体,我们将变分推断应用到二值稀疏编码模型上(此处展示 Henniges et al. (2010) 提出的模型,但演示的是应用于该模型的传统、通用平均场方法,而他们提出的是一种专门算法)。这一推导包含大量数学细节,面向希望彻底澄清前述变分推断与学习高层概念描述中任何含糊之处的读者;不打算推导或实现变分学习算法的读者可放心跳到下一节,不会遗漏任何新的高层概念。继续阅读二值稀疏编码例子的读者,建议复习第 3.10 节列出的概率模型中常见函数的有用性质;后续推导中我们会自由使用这些性质而不特别指出每一处的使用。

在二值稀疏编码模型中,输入 v ∈ R^n 由模型按以下方式生成:对 m 个可分别"在场/不在场"的成分求和,再加上高斯噪声;各成分由 h ∈ {0, 1}^m 中相应的隐单元控制开关

\[ p(h_i = 1) = \sigma(b_i) \]
\[ p(v \mid h) = \mathcal{N}(v; Wh, \beta^{-1}) \]

其中 b 是可学习的偏置集合,W 是可学习的权重矩阵,β 是可学习的对角精度矩阵。以最大似然训练该模型需要关于参数求导;考虑关于某一偏置的导数:经一连串代数化简后,可得

\[ \frac{\partial \log p(v)}{\partial b_i} = \mathbb{E}_{h \sim p(h \mid v)} \frac{\partial \log p(h)}{\partial b_i} \]

这要求对 p(h | v) 求期望;遗憾的是 p(h | v) 是一个复杂的分布(图 19.2 给出 p(h, v) 与 p(h | v) 的图结构:后验分布对应于隐单元上的完全图,故变量消除算法并不能让我们比暴力枚举更快地计算所需期望)。

我们可以改用变分推断与变分学习来化解这一困难。我们可以采用平均场近似

\[ q(h \mid v) = \prod_i q(h_i \mid v) \]

二值稀疏编码模型的潜变量是二值的,故要表示一个可分解的 q,只需对 m 个 Bernoulli 分布 q(h_i | v) 建模。一种自然的方式是用一个概率向量 ĥ 表示各 Bernoulli 分布的均值,令 q(h_i = 1 | v) = ĥ_i;为避免计算 log ĥ_i 等时出错,我们施加限制使 ĥ_i 永不为 0 或 1。我们将看到,变分推断方程在解析上不会把 ĥ_i 赋为 0 或 1;然而在软件实现中,机器舍入误差可能产生 0 或 1 值,因而实际中我们可以用一个无约束的变分参数向量 z,通过 ĥ = σ(z) 得到 ĥ,这样可以借助恒等式 log σ(z_i) = -ζ(-z_i)(把 sigmoid 与 softplus 联系起来)安全地计算 log ĥ_i。

为开始对二值稀疏编码模型的变分学习推导,我们说明使用平均场近似使学习变得可处理。证据下界为

\[ L(v, \theta, q) = \mathbb{E}_{h \sim q}\bigl[\log p(h, v)\bigr] + H(q) \]

经展开整理可得

\[ L = \sum_{i=1}^{m} \Bigl[\hat{h}_i (\log \sigma(b_i) - \log \hat{h}_i) + (1 - \hat{h}_i)(\log \sigma(-b_i) - \log(1 - \hat{h}_i))\Bigr] + \mathbb{E}_{h \sim q}\!\left[\sum_{i=1}^{n} \log \sqrt{\frac{\beta_i}{2\pi}} \exp\!\left(-\frac{\beta_i}{2}\bigl(v_i - W_{i,:}h\bigr)^2\right)\right] \]

再化简后可得

\[ L = \sum_{i=1}^{m} \hat{h}_i (\log \sigma(b_i) - \log \hat{h}_i) + (1 - \hat{h}_i)(\log \sigma(-b_i) - \log(1 - \hat{h}_i)) + \frac{1}{2} \sum_{i=1}^{n} \left[\log \frac{\beta_i}{2\pi} - \beta_i \!\left(v_i^2 - 2 v_i W_{i,:} \hat{h} + \sum_{j} W_{i,j}^2 \hat{h}_j + \sum_{j \neq k} W_{i,j} W_{i,k} \hat{h}_j \hat{h}_k\right)\right] \]

虽然这些等式在美学上稍欠雅观,但它们显示 L 可被表达为少量简单算术运算的组合,因此 L 是可处理的——我们可以用 L 替代不可处理的对数似然。

原则上我们可以同时关于 v 和 h 做梯度上升,这已经是一个完全可接受的、统一的推断与训练算法。但通常我们并不这样做,理由有二:其一,这需要为每个 v 存储 ĥ,但我们一般偏好不需要"每样本内存"的算法——若要为每个样本记住一个动态更新的向量,学习算法将难以扩展到十亿样本规模;其二,我们希望能够极快地提取特征 ĥ,用以识别 v 的内容,在真实部署场景中需要实时计算 ĥ。基于以上两个原因,我们通常不用梯度下降来计算平均场参数 ĥ,而是用不动点方程快速估计它们。

不动点方程的思路是:我们寻求关于 ĥ 的局部最大,即 ∇_ĥ L(v, θ, ĥ) = 0。我们无法同时高效地关于全部 ĥ 解出此方程,但可以关于单个变量求解

\[ \frac{\partial L(v, \theta, \hat{h})}{\partial \hat{h}_i} = 0 \]

然后对 i = 1, …, m 反复应用该单变量解,循环往复直至满足收敛判据;常见收敛判据包括"整轮更新后 L 提升不超过某容差"或"整轮更新后 ĥ 变化不超过某量"。迭代平均场不动点方程是一种通用技术,可在多种模型中提供快速变分推断。为使讨论具体,我们说明如何针对二值稀疏编码模型具体推导其更新。

首先,必须写出关于 ĥ_i 的导数表达式;将上式代入,化简得

\[ \frac{\partial L}{\partial \hat{h}_i} = b_i - \log \hat{h}_i + \log(1 - \hat{h}_i) + v^{\top} \beta W_{:,i} - \frac{1}{2} W_{:,i}^{\top} \beta W_{:,i} - \sum_{j \neq i} W_{:,j}^{\top} \beta W_{:,i} \hat{h}_j \]

为应用不动点更新推断规则,解出使上式为 0 的 ĥ_i:

\[ \hat{h}_i = \sigma\!\left(b_i + v^{\top} \beta W_{:,i} - \frac{1}{2} W_{:,i}^{\top} \beta W_{:,i} - \sum_{j \neq i} W_{:,j}^{\top} \beta W_{:,i} \hat{h}_j\right) \]

此时可以清楚看到循环神经网络与图模型推断之间的紧密联系:具体而言,平均场不动点方程定义了一个循环神经网络,其任务就是执行推断;这里描述的是如何由模型描述推导出这一网络,但也可以直接训练该推断网络本身。第 20 章将描述基于这一主题的若干想法。

在二值稀疏编码情形下,可以看到上式定义的循环网络连接由"基于相邻隐单元的当前取值反复更新隐单元"构成;输入始终向隐单元发送固定消息 v^⊤ β W,而隐单元则不断更新彼此间发送的消息。具体而言,两个单元 ĥ_i、ĥ_j 在其权向量对齐时互相抑制——这是一类竞争:对同时解释输入的两个隐单元,只有解释得最好的那个才能保持激活;该竞争是平均场近似试图捕捉二值稀疏编码后验中"解释消除"相互作用的尝试。"解释消除"效应本应使后验呈多模,即从后验中采样时,有些样本中一个单元激活、另一些样本中另一个单元激活,而很少出现两者都激活的样本;遗憾的是,平均场使用的可分解 q 不足以建模"解释消除"相互作用,因此平均场近似被迫只建模其中一个模;这正是图 3.6 所展示行为的一个实例。

我们可以把上式改写成揭示更多洞见的等价形式:

\[ \hat{h}_i = \sigma\!\left(b_i + \left(v - \sum_{j \neq i} W_{:,j} \hat{h}_j\right)^{\top} \beta W_{:,i} - \frac{1}{2} W_{:,i}^{\top} \beta W_{:,i}\right) \]

在这一重写形式下,我们看到每一步的输入为 v - ∑{j≠i} W ĥ_j,而不是 v;故可把单元 i 视为试图编码给定其他单元编码后 v 中的残差误差。从这一角度看,稀疏编码就是一个迭代自编码器——它反复对输入做编码与解码,试图在每次迭代后修正重建中的错误。

在本例中我们推导的是"一次更新一个单元"的更新规则。若能同时更新多个单元会更有利;有些图模型(如深度玻尔兹曼机)的结构允许我们同时解出 ĥ 的多个分量;但二值稀疏编码不允许这样的"块更新"。取而代之,我们可以使用一种称为阻尼(damping)的启发式技巧来做块更新:在阻尼方法中,我们对 ĥ 的每个元素分别解出其最优值,再将所有值朝该方向迈出一小步;该方法不再保证每一步都增大 L,但在实践中对许多模型效果良好。Koller and Friedman (2009) 给出了关于消息传递算法中同步度与阻尼策略选择的更多信息。

19.5 变分法(Calculus of Variations)

在继续介绍变分学习之前,我们必须简要介绍变分学习中所用的一组重要数学工具:变分法。

许多机器学习技术都基于"在 θ ∈ R^n 上寻找使函数 J(θ) 最小的输入向量"——这可借助多元微积分与线性代数,通过求解 ∇_θ J(θ) = 0 的临界点完成。但有时我们实际想要求解的是一个函数 f(x),例如我们想要找到某随机变量上的概率密度函数,这正是变分法使我们能做到的事。函数的函数称为泛函 J[f];正如我们可以对"以向量为参数的函数"关于其向量参数各元素求偏导,我们也可以对泛函 J[f] 关于函数 f 在某特定点 x 处的值 f(x) 求"泛函导数"(也称"变分导数"),记作 δJ/δf(x)。本书不给出泛函导数的完整形式化推导;对我们的目的而言,只需指出:对可微函数 f(x) 与具有连续导数的可微函数 g(y, x),

\[ \frac{\delta}{\delta f(x)} \int g(f(x), x)\, dx = \frac{\partial}{\partial y} g(f(x), x) \]

要直观理解此恒等式,可把 f(x) 视为一个含有不可数多个元素的向量,以实向量 x 为索引;在这一(略不完全的)视角下,该泛函导数恒等式与"对以正整数为索引的向量 θ ∈ R^n 求导"得到的恒等式是一样的:

\[ \frac{\partial}{\partial \theta_i} \sum_j g(\theta_j, j) = \frac{\partial}{\partial \theta_i} g(\theta_i, i) \]

其他机器学习文献中的许多结果是用更一般的 Euler-Lagrange 方程给出的,后者允许 g 依赖于 f 的导数与 f 的值;但本书给出的结果不需要这种完全一般形式。要关于向量优化函数,我们对函数关于向量求梯度,再令梯度各分量为零;类似地,要优化泛函,我们要求泛函导数在每一点处为零。

为示例这一过程如何进行,考虑在 x ∈ R 上找具有最大微分熵的概率分布函数的问题。回忆概率分布 p(x) 的熵定义为

\[ H[p] = -\mathbb{E}_x \log p(x) \]

对连续值,期望是一个积分

\[ H[p] = - \int p(x) \log p(x)\, dx \]

我们不能简单地关于函数 p(x) 最大化 H[p],因为结果可能不再是概率分布。需要用拉格朗日乘子添加约束 p(x) 积分等于 1;而且,随着方差增大,熵会无界增长,这使"哪种分布有最大熵"这一问题变得无趣。我们改为问"在固定方差 σ^2 下哪种分布具有最大熵";最后,问题仍是欠定的,因为分布可以任意平移而不改变熵。为得到唯一解,我们再加一个约束:分布的均值为 μ。该优化问题的拉格朗日泛函为

\[ \mathcal{L}[p] = \lambda_1 \!\left(\int p(x)\, dx - 1\right) + \lambda_2 (\mathbb{E}[x] - \mu) + \lambda_3 \bigl(\mathbb{E}[(x - \mu)^2] - \sigma^2\bigr) + H[p] \]

化简为

\[ \mathcal{L}[p] = \int \!\left[\lambda_1 p(x) + \lambda_2 p(x) x + \lambda_3 p(x) (x - \mu)^2 - p(x) \log p(x)\right] dx - \lambda_1 - \mu \lambda_2 - \sigma^2 \lambda_3 \]

要关于 p 最小化拉格朗日量,我们令泛函导数为零:

\[ \forall x,\quad \frac{\delta \mathcal{L}}{\delta p(x)} = \lambda_1 + \lambda_2 x + \lambda_3 (x - \mu)^2 - 1 - \log p(x) = 0 \]

由此条件告诉我们 p(x) 的函数形式;经代数整理得

\[ p(x) = \exp\!\left(\lambda_1 + \lambda_2 x + \lambda_3 (x - \mu)^2 - 1\right) \]

我们从未直接假设 p(x) 取这种函数形式;该表达式本身是由解析地最小化一个泛函而得到。要完成最小化问题,我们还须选择 λ 值以保证所有约束得到满足;因为只要约束满足,拉格朗日量关于 λ 变量的梯度即为零,所以我们可以自由选择任何 λ 值。为满足所有约束,可令 λ_1 = 1 - log σ√(2π),λ_2 = 0,λ_3 = -1/(2σ^2),得到

\[ p(x) = \mathcal{N}(x; \mu, \sigma^2) \]

这是我们在不知道真实分布时使用正态分布的一个原因——因为正态分布具有最大熵,使用正态分布假设就给真实分布施加了尽可能少的结构。

在检查熵的拉格朗日泛函临界点时,我们只找到了一个临界点,对应于固定方差下熵的最大化。那么使熵最小的概率分布函数在哪里?为什么没有找到对应于最小熵的第二个临界点?原因在于并不存在达成最小熵的具体函数——当函数把更多概率密度放在 x = μ + σ 与 x = μ - σ 两点,并在所有其他 x 值上放置更少概率密度时,它能在保持所需方差的同时损失熵;然而,任何在除了这两点以外的所有点上概率密度都精确为零的函数并不积分为 1,故不是合法的概率分布。因此并不存在一个最小熵概率分布函数,正如不存在一个最小正实数一样;取而代之,我们可以说存在一个概率分布序列收敛到"把全部质量都放到这两点"上。这一退化情形可描述为 Dirac 分布的混合;由于 Dirac 分布不能用单个概率分布函数描述,故单个 Dirac 或 Dirac 混合分布不对应于函数空间中一个具体点;这些分布对"求解泛函导数为零的某具体点"这一方法是不可见的——这是该方法的一个局限。像 Dirac 这样的分布必须用其他方法找到,例如先猜出解再证明它是对的。

19.6 连续潜变量(Continuous Latent Variables)

当图模型含有连续潜变量时,我们仍可通过最大化 L 来做变分推断与学习;然而,关于 q(h | v) 最大化 L 时必须使用变分法。

在大多数情形下,从业者无需自己求解变分法问题;相反,有一个关于平均场不动点更新的一般方程。若我们采用平均场近似

\[ q(h \mid v) = \prod_i q(h_i \mid v) \]

并对所有 j ≠ i 固定 q(h_j | v),则最优的 q(h_i | v) 可由未归一化分布

\[ \tilde{q}(h_i \mid v) = \exp\!\left(\mathbb{E}_{h_{-i} \sim q(h_{-i} \mid v)} \log \tilde{p}(v, h)\right) \]

归一化得到,只要 p 不为任何变量联合配置赋 0 概率。把期望代入方程内部,即可得到 q(h_i | v) 的正确函数形式;只有当希望发展一种新形式的变分学习时,才需要用变分法直接推导 q 的函数形式;上式对任何概率模型都给出平均场近似。

上式是一个不动点方程,设计上对每个 i 反复迭代直至收敛;但它告诉我们的不止于此——它告诉了我们最优解将取的函数形式,无论我们是否经由不动点方程到达那里。这意味着我们可以从该式取函数形式,但把其中出现的某些值视为参数,用任何我们喜欢的优化算法去优化。

作为示例,考虑一个非常简单的概率模型:潜变量 h ∈ R^2,只有一个可见变量 v,设 p(h) = N(h; 0, I) 且 p(v | h) = N(v; w^⊤ h; 1)。我们其实可以积分掉 h,得到的就是 v 上的一个高斯分布,模型本身并不有趣,我们构造它只是为了给出"如何在概率建模中应用变分法"的简单示例。真实后验(忽略归一化常数)为

\[ p(h \mid v) \propto p(h, v) = p(h_1) p(h_2) p(v \mid h) \propto \exp\!\left[-\frac{1}{2} h_1^2 - \frac{1}{2} h_2^2 - (v - h_1 w_1 - h_2 w_2)^2\right] \]
\[ = \exp\!\left[-\frac{1}{2} h_1^2 - \frac{1}{2} h_2^2 - \frac{1}{2} v^2 - \frac{1}{2} h_1^2 w_1^2 - \frac{1}{2} h_2^2 w_2^2 + v h_1 w_1 + v h_2 w_2 - h_1 w_1 h_2 w_2\right] \]

由于存在把 h_1 与 h_2 相乘的项,真实后验不在 h_1 与 h_2 上分解。

应用上式可得

\[ \tilde{q}(h_1 \mid v) = \exp\!\left(\mathbb{E}_{h_2 \sim q(h_2 \mid v)} \log \tilde{p}(v, h)\right) = \exp\!\left[-\frac{1}{2} \mathbb{E}_{h_2 \sim q(h_2 \mid v)} \bigl(h_1^2 + h_2^2 + v^2 + h_1^2 w_1^2 + h_2^2 w_2^2 - 2 v h_1 w_1 - 2 v h_2 w_2 + 2 h_1 w_1 h_2 w_2\bigr)\right] \]

由此可以看到,我们从 q(h_2 | v) 实际只需要两个值:E_{h_2 ∼ q(h_2 | v)}[h_2] 与 E_{h_2 ∼ q(h_2 | v)}[h_2^2],分别记作 ⟨h_2⟩、⟨h_2^2⟩,则

\[ \tilde{q}(h_1 \mid v) = \exp\!\left[-\frac{1}{2} h_1^2 - \frac{1}{2} \langle h_2^2 \rangle - \frac{1}{2} v^2 - \frac{1}{2} h_1^2 w_1^2 - \frac{1}{2} \langle h_2^2 \rangle w_2^2 + v h_1 w_1 + v \langle h_2 \rangle w_2 - h_1 w_1 \langle h_2 \rangle w_2\right] \]

由此可看到 q̃ 具有高斯函数形式;故可断定 q(h | v) = N(h; μ, β^{-1}),其中 μ 与对角 β 是变分参数,我们可用任何技术来优化。重要的一点是,我们从未假设 q 会是高斯的,它的函数形式是用变分法最大化 L 时自动推导出来的;在另一个模型上用同样方法,可能得到 q 的另一种函数形式。

这当然只是为演示而构造的小型例子;在深度学习语境中,关于连续变量变分学习的真实应用例子,见 Goodfellow et al. (2013d)。

19.7 学习与推断的相互作用(Interactions between Learning and Inference)

在学习算法中使用近似推断会影响学习过程,而后者又会影响推断算法的准确性。

具体而言,训练算法倾向于把模型调整成"使近似推断算法所基于的近似假设更接近真实"的样子。训练参数时,变分学习会增大 E_{h ∼ q} log p(v, h);对特定的 v,这会增大 q(h | v) 下概率较高的那些 h 的 p(h | v),减小 q(h | v) 下概率较低的 h 的 p(h | v)。这种行为使我们的近似假设成为自我应验的预言:若用单模近似后验来训练模型,我们将得到一个真实后验比"用精确推断训练所能得到的"更接近单模的模型。

因此,要计算变分近似施加在模型上的真实损害非常困难。存在若干估计 log p(v) 的方法;我们常常在训练完模型后再估计 log p(v; θ),发现它与 L(v, θ, q) 的差距很小;由此可以得出"对训练过程所得的特定 θ 值,我们的变分近似是准确的"。但我们不应由此断定变分近似一般情况下也是准确的,或变分近似对学习过程只造成了很小损害。要度量变分近似造成的真实损害,我们需要知道 θ = max_θ log p(v; θ)。有可能 L(v, θ, q) ≈ log p(v; θ) 与 log p(v; θ) ≪ log p(v; θ) 同时成立;若 max_q L(v, θ, q) ≪ log p(v; θ),因为 θ 引起的后验分布太复杂,我们的 q 族无法捕捉,则学习过程永远无法逼近 θ。这一问题极难发现,因为只有当我们拥有一个能找到 θ* 的更优学习算法来作比较时,才能确定它是否发生。

19.8 学到的近似推断(Learned Approximate Inference)

我们已经看到,推断可视为一个增大函数 L 的优化过程;通过迭代不动点方程或基于梯度的优化来显式执行优化,常常非常昂贵耗时。许多推断方法通过学习来执行近似推断,以避免这一开销。具体而言,我们可以把优化过程视为一个把输入 v 映射到近似分布 q* = arg max_q L(v, q) 的函数 f;一旦把多步迭代优化过程视为只是一个函数,就可以用一个实现近似 f̂(v; θ) 的神经网络来逼近它。

19.9 醒-睡算法(Wake-Sleep)

训练一个"由 v 推断 h"的模型的主要困难之一是:我们没有可用的有监督训练集;给定一个 v,我们不知道合适的 h;由 v 到 h 的映射依赖于所选模型族,并在整个学习过程中随 θ 变化而演化。醒-睡算法(Hinton et al., 1995b; Frey et al., 1996)通过从模型分布同时采样 h 与 v 解决了这一问题。例如,在有向模型中,可以通过从 h 开始到 v 结束的祖先采样廉价地完成;然后训练推断网络执行反向映射——预测是哪个 h 导致了当前 v。该方法的主要缺点是:我们只能在模型下具有高概率的那些 v 值上训练推断网络。在学习早期,模型分布与数据分布并不相似,故推断网络没有机会在类似数据的样本上学习。

在第 18.2 节我们看到,关于人(和动物)做梦的作用,有一种可能的解释是:梦为蒙特卡洛训练算法提供负相样本,用以近似无向模型对数配分函数负梯度。生物做梦的另一种可能解释是:它提供 p(h, v) 的样本,可用于训练推断网络以预测给定 v 的 h。从某些方面看,这一解释比配分函数解释更令人满意——蒙特卡洛算法若"连续几步只用正相、再连续几步只用负相"通常效果不佳;而人和动物一般连续醒着几个小时、再连续睡几个小时,这种作息时间如何支持无向模型的蒙特卡洛训练并不明显。基于最大化 L 的学习算法则可以长时间地改善 q、长时间地改善 θ。若生物做梦的作用是训练用于预测 q 的网络,这就解释了动物为何能保持醒着几个小时(醒得越久,L 与 log p(v) 的差距越大,但 L 仍然是下界),也能保持睡着几个小时(睡眠期间生成模型本身不被修改)而不损害其内部模型。当然,这些想法纯属推测,目前并无硬证据表明做梦达成了上述任一目标;做梦也可能是为强化学习服务的——通过从动物的转移模型中采样合成经验,用以训练动物的策略;或睡眠可能服务于机器学习界尚未预料到的其他目的。

19.10 学到的推断的其他形式(Other Forms of Learned Inference)

学到的近似推断策略也已应用到其他模型上。Salakhutdinov and Larochelle (2010) 表明,在深度玻尔兹曼机中,学到的推断网络单次前向就可获得比迭代平均场不动点方程更快的推断。其训练流程是:先运行推断网络,再施加一步平均场以改善其估计,然后训练推断网络输出该精化估计而非其原始估计。

我们已在第 14.8 节看到,预测稀疏分解模型训练一个浅层编码网络来预测输入的稀疏编码;这可视为自编码器与稀疏编码的混合体。可以为该模型设计概率语义,在该语义下,编码器可被视为执行学到的近似 MAP 推断。由于其编码器很浅,PSD 无法实现前述平均场推断中见到的那种单元间竞争;不过,通过训练一个深度编码器来执行学到的近似推断——如 ISTA 技术(Gregor and LeCun, 2010b)——即可弥补这一问题。

学到的近似推断近来已成为生成建模的主导方法之一,体现为变分自编码器(Kingma, 2013; Rezende et al., 2014)。在这一优雅的方法中,无需为推断网络构造显式目标;相反,推断网络仅被用来定义 L,然后通过增大 L 来调整推断网络的参数。该模型将在第 20.10.3 节深入介绍。

借助近似推断,我们可以训练并使用各种各样的模型;其中许多模型将在下一章中介绍。

本章个人批注

本章把"推断"重新框定为对 ELBO 的优化,是后面很多章的语法基础。19.1 给出 ELBO 的两种等价形式——KL 散度差与"期望联合对数似然 + 熵"——这一恒等变形本身是不起眼的几行代数,但它的解释力是巨大的:它让我们在说"做推断"时,实际上是在说"找一个让 L 大的 q",这是后面 EM、MAP、平均场、学到的推断各节共同的隐含前提。我尤其想记下 19.1 末尾那一句"无论 q 如何选取,L 始终是下界"——它的工程意义是:即便我用的 q 很差,优化 L 也仍然在"间接"优化 log p(v),只是梯度信号被一层 KL 散度的差距稀释了;这也是为什么后面"学习与推断的相互作用"一节反复警告"ELBO 紧不代表学到的模型就好"。

19.2 的 EM 一节,作者明确说它不是"近似推断",而是"用近似后验来学习"——这一区分对理解后面平均场为什么也算"近似推断"很关键:EM 的 E 步是精确推断,M 步假设 q 固定,所以本质上是"用上一次推断的 q 来更新参数"。19.3 的 MAP 推断我读得尤其仔细,作者花了不少笔墨说明为什么把 Dirac 分布作为 q 引入"无限宽松"的界——这其实是从信息论角度指出,MAP 牺牲了 H(q) 项(-∞ 熵)换来了优化上的便利,所以"L 是下界"这件事在 MAP 框架下基本是"空头支票";反过来说,如果给 μ 一点噪声,L 又变得有意义——这是 MAP 推断与随机 MAP、概率稀疏编码之间的桥梁。

二值稀疏编码的变分推导,占了大半篇幅,符号密集,但核心思想其实就两个:第一,平均场假设 q 可分解后,L 变成 ĥ_i 的多项式与高斯二次型的组合,从而可解析写出 ∂L/∂ĥ_i;第二,把 ∂L/∂ĥ_i = 0 翻过来,就得到一个 σ 形式的更新,它本身就是一个循环神经网络的隐层更新规则。我尤其注意到作者在 19.4.1 末尾特别强调"两个 ĥ 之间在权向量对齐时互相抑制"——这是把图模型里的"解释消除"翻译成"竞争"的一种直观说法;同节还指出,平均场本质上只能用单模去近似多模后验(图 3.6 的反 KL 行为),这是平均场方法的一个内在局限。

变分法一节以"最大熵分布是正态分布"作为示例,推导本身并不难,关键在于把泛函求导 δ/δf(x) 与普通偏导做类比——把 f(x) 想成"以实数 x 为索引的不可数维向量",再把 ∂/∂θ_i ∑_j g(θ_j, j) = ∂/∂θ_i g(θ_i, i) 拿过来即可。这一节还附了一个有趣的边注:Dirac 分布不在函数空间内,故泛函求导的"求临界点"方法天然看不到它——这等于说,只要我们用"在某个函数族里求最大熵"的方式思考,我们得到的"最稀疏解"就只能是高斯或指数族,想得到 Dirac 这样的退化解必须用别的方法。

连续潜变量一节里,我特别欣赏"q 的高斯形式是用变分法自动推出的,而不是我们假设的"这一点——它把"为什么变分推断经常给 Gaussian q"这件事,从一个工程经验变成了一个数学必然。"学习与推断的相互作用"一节是本章中最值得做工程笔记的一节:它说,如果我用单模近似 q 去训练,我实际上把模型"改造"成单模后验,故训练后 ELBO 很紧并不意味着训练前 ELBO 也紧,也不意味着我得到的就是全局最优 θ*;这个"自我应验的预言"是变分方法最难诊断的失败模式。

"学到的推断"一节实际上把"用神经网络直接预测 h"这一现代生成建模主流做法(VAE、扩散模型里的 ε-prediction 网络、normalizing flows 里的编码器等)的早期思想讲清楚了。醒-睡算法的"反做梦"思路我以前没仔细想过——在有向模型里,我们可以从 h 祖先采样到 v,再用 (v, h) 对训练推断网络做反向映射,代价是早期模型分布与数据分布不重合,推断网络见不到真实数据样本。第 18 章里讨论的"梦提供负相样本"是另一个机制,本章再补一个"梦提供 (v, h) 监督对"的解释,作者也说这个解释"在某些意义上更令人满意",因为它能解释"连续醒几小时、连续睡几小时"这种作息。

与上下章的衔接(一段话)

第 18 章(直面配分函数)关注的是另一类困难——对数配分函数 log Z 不可处理,处理它的工具是 AIS、对比散度、分数匹配等;本章与第 18 章合起来构成"对数似然的两大不可处理来源"的处理工具箱:第 18 章处理"配分函数",本章处理"潜变量后验"。第 20 章(深度生成模型)会把本章与第 18 章的几乎所有工具汇聚在一起——深度信念网络、深度玻尔兹曼机、变分自编码器等具体模型,正是这些工具的合成。本章与第 13 章(线性因子模型)也有直接联系:稀疏编码在 13.4 引入、在 19.3 用 MAP 训练、二值稀疏编码在 19.4 用平均场训练;PSD 在 14.8 引入、在 19.10 重新以"学到的近似 MAP 推断"的角度加以解释。19.10 末尾预告的 VAE(20.10.3)是本章"学到的近似推断"在生成建模里最直接的现代化身。