跳转至

第 13 章:线性因子模型(Linear Factor Models)

13.1 概率 PCA 与因子分析

本节先对概率 PCA(probabilistic PCA)、因子分析(factor analysis)以及其他线性因子模型做一个统一定位:它们都是同一条生成式公式(13.1、13.2)的特例,差异只在于噪声分布的形式与隐变量 \(h\) 上先验分布的选择。

因子分析(Bartholomew, 1987; Basilevsky, 1994)的设定是:隐变量先验取单位方差的 Gaussian

\[ h \sim N(h; 0, I), \]
观测变量 \(x_i\) 在给定 \(h\) 时条件独立,噪声取对角协方差 Gaussian
\[ p(x \mid h) = N(x;\, W h + b, \psi), \quad \psi = \mathrm{diag}(\sigma^2), \]
其中 \(\sigma^2 = [\sigma_1^2, \sigma_2^2, \ldots, \sigma_n^2]^\top\) 是逐维方差的向量。隐变量在这里扮演的角色是捕捉各观测变量 \(x_i\) 之间的依赖关系。直接积分可证 \(x\) 本身是一个多元正态随机变量
\[ x \sim N(x;\, b,\, W W^\top + \psi). \]

概率 PCA 在因子分析之上做一个小改动:让所有条件方差 \(\sigma_i^2\) 共享同一个标量值 \(\sigma^2\)。于是 \(x\) 的协方差变成 \(W W^\top + \sigma^2 I\),即

\[ x \sim N(x;\, b,\, W W^\top + \sigma^2 I) \]
或等价写成
\[ x = W h + b + \sigma z, \quad z \sim N(z; 0, I). \]
Tipping 和 Bishop(1999)给出了估计 \(W\)\(\sigma^2\) 的迭代 EM 算法。模型的核心思想是:数据中的大多数变异能被 \(h\) 的少数维度抓住,剩下的是 \(\sigma^2\) 这一个标量所代表的残差重构误差。Tipping 和 Bishop 进一步证明:当 \(\sigma \to 0\) 时,概率 PCA 退化为经典 PCA——\(h\) 关于 \(x\) 的条件期望变为 \(x - b\)\(W\)\(d\) 列张成空间上的正交投影。但 \(\sigma \to 0\) 也意味着模型定义的密度会集中于 \(W\) 列张成的那个 \(d\) 维超平面附近,呈现极尖锐的形状;一旦真实数据并不贴着某个低维超平面,模型会对其分配极低的似然。

13.2 独立成分分析(ICA)

独立成分分析(ICA)是表示学习领域最早的算法之一(Herault and Ans, 1984; Jutten and Herault, 1991; Comon, 1994; Hyvärinen, 1999; Hyvärinen et al., 2001a; Hinton et al., 2001; Teh et al., 2003)。它建模线性因子的目标,是把一段观测信号分解成若干底层信号,这些底层信号经过缩放和加和后形成观测数据。ICA 与 PCA 的关键差异在于:底层信号之间被要求完全独立(independent),而不仅仅是去相关(decorrelated)。

实际中存在多种被称为 ICA 的方法。Pham 等人(1992)描述的变体在形式上最接近前几章讨论的生成式模型:用户先固定 \(p(h)\),模型随后以确定性方式生成 \(x = W h\)。通过非线性变量替换(equation 3.47)可以得到 \(p(x)\),再以最大似然为准则训练。动机是:把 \(p(h)\) 选成独立先验,就是希望恢复出尽可能独立的底层因子。ICA 常用的场景不是提取高层抽象因果因子,而是从混合信号中恢复出底层低层信号——例如鸡尾酒会问题:\(n\) 个人同时说话、\(n\) 个不同位置摆放的麦克风同时录音,ICA 通过检测每个说话者被每个麦克风接收到的音量差异,把信号拆开,使每个 \(h_i\) 只含一个说话者清晰的声音。这一思路在神经科学中常用于脑电图(EEG)分析:头皮电极同时记录到大脑信号与来自心脏、眼睛的强干扰信号,ICA 用于把心脏的电特征和脑信号分开,并进一步把不同脑区的信号互相拆开。

ICA 存在大量变体。有的在生成 \(x\) 时加入噪声而不用确定性解码器;有的不用最大似然而直接以 \(h = W^{-1} x\) 的各元素之间相互独立为目标(这一目标有多种准则实现)。公式 3.47 中要求解 \(W\) 的行列式,计算代价高且数值不稳定,因此部分变体把 \(W\) 约束为正交以避免这一运算。ICA 的所有变体都要求 \(p(h)\) 是非 Gaussian 的——因为当 \(p(h)\) 是各分量独立的 Gaussian 时,\(W\) 不可识别(identifiable),不同的 \(W\) 可以给出相同的 \(p(x)\);这与概率 PCA、因子分析的要求正相反:后者通常需要 \(p(h)\) 是 Gaussian 才能让各种运算得到闭式解。在显式指定 \(p(h)\) 的最大似然方法中,一个典型选择是

\[ p(h_i) = \frac{d}{dh_i} \sigma(h_i), \]
其中 \(\sigma\) 是 logistic sigmoid。该分布在 0 附近比 Gaussian 有更尖锐的峰,因而大多数 ICA 实现也可以被理解为稀疏特征学习。

书中的"生成式模型"概念要求模型能表示 \(p(x)\) 或从中采样。许多 ICA 变体并非这种意义上的生成式模型——它们只在 \(x\)\(h\) 之间做变换,但没有 \(p(h)\) 的表示,因而不对 \(p(x)\) 强加任何分布。例如很多 ICA 变体通过提高 \(h = W^{-1} x\) 的样本峰度(kurtosis)来推动 \(p(h)\) 非 Gaussian 化,但这一过程并不显式建模 \(p(h)\)。本书的定位是:ICA 更常被当作信号分离的分析工具,而非数据生成或密度估计工具。

和 PCA 可被推广到第 14 章的非线性自编码器一样,ICA 也能推广到非线性生成式模型:用非线性函数 \(f\) 生成观测数据。Hyvärinen 和 Pajunen(1999)最早研究非线性 ICA,Roberts 和 Everson(2001)、Lappalainen 等人(2000)将其与集成学习结合取得成功。另一类非线性推广是非线性独立成分估计(NICE, Dinh et al., 2014),它把一系列可逆变换(编码器阶段)级联起来,并保证每个变换的 Jacobian 行列式都可被高效计算。这使得可以精确计算似然并(在 \(p(h)\) 上采样后用解码器逆变换)从模型直接采样,且非线性编码器比线性 ICA 更容易把数据变换到边缘分布因式分解的空间。ICA 还有一类推广是在学到的特征组之间允许组内统计依赖、抑制组间统计依赖(Hyvärinen and Hoyer, 1999; Hyvärinen et al., 2001b)。当组之间互不重叠时,这称为独立子空间分析(independent subspace analysis);当给每个隐单元分配空间坐标并让空间相邻的单元形成重叠组时,则称为拓扑 ICA(topographic ICA),它鼓励相邻单元学到相似特征——应用到自然图像上时,拓扑 ICA 学会的是 Gabor 滤波器,相邻特征具有相似的朝向、位置或频率;小区域内多个相似 Gabor 函数的相位偏移后做池化,可以得到平移不变性。

13.3 慢特征分析

慢特征分析(SFA, Wiskott and Sejnowski, 2002)是一种利用时序信号来学习不变特征的线性因子模型。它的动机来自一个被称作"慢度原则"(slowness principle)的一般性想法:场景中那些重要特征的变化速度远慢于描述场景的单个测量值的变化速度。书中给的例子:在计算机视觉中,单个像素值可以极快地变化;如果一只斑马从图像左侧走到右侧,某一个像素会随着斑马条纹的经过而从黑到白反复快速切换;与之相对,"图像中是否有斑马"这个特征根本不会变化,"斑马的位置"这个特征则缓慢变化。作者希望用一条正则化项鼓励模型学到随时间变化慢的特征。

慢度原则早于 SFA 出现,并被广泛施加于多种模型(Hinton, 1989; Földiák, 1989; Mobahi et al., 2009; Bergstra and Bengio, 2009)。一般地,可以把它施加到任何用梯度下降训练的微分模型上,做法是往损失函数中加一项

\[ \lambda \sum_t L\!\left(f(x^{(t+1)}),\, f(x^{(t)})\right), \]
其中 \(\lambda\) 是控制正则化强度的超参数,\(t\) 是样本时间序列的索引,\(f\) 是要被正则化的特征提取器,\(L\) 是衡量 \(f(x^{(t)})\)\(f(x^{(t+1)})\) 距离的损失函数,常见选择是均方差。SFA 是慢度原则的一种"特别高效"的应用版本:高效来自它作用于线性特征提取器、并因此可以闭式求解。SFA 也不是本书意义上严格的生成式模型——它只定义了输入空间到特征空间的一个线性映射,没有特征空间上的先验,也不对输入空间强加 \(p(x)\)

SFA 算法(Wiskott and Sejnowski, 2002)取 \(f(x;\theta)\) 为线性变换,求解如下优化问题

\[ \min_\theta\, \mathbb{E}_t \left(f(x^{(t+1)})_i - f(x^{(t)})_i\right)^2 \]
并附带两条约束
\[ \mathbb{E}_t f(x^{(t)})_i = 0, \qquad \mathbb{E}_t \left[ f(x^{(t)})_i^2 \right] = 1. \]
零均值约束使问题有唯一解(否则可以给所有特征值加常数而保持目标值不变);单位方差约束防止所有特征都坍缩到零这一病态解。和 PCA 一样,SFA 学到的特征是有顺序的,第一特征最慢。要学到多个特征还需附加约束
\[ \forall\, i < j,\ \mathbb{E}_t \left[ f(x^{(t)})_i\, f(x^{(t)})_j \right] = 0, \]
即让学到的特征两两线性去相关。不加这一约束,所有学到的特征都只会去抓住那同一个最慢的信号;也可以用其他机制(如最小化重构误差)让特征多样化,但这种去相关机制在线性 SFA 下能得到简单解。SFA 整体问题可由线性代数包闭式求解。

SFA 通常通过对 \(x\) 先做非线性基展开再跑线性 SFA 来学习非线性特征。例如常见的做法是把 \(x\) 替换为二次基展开(即包含所有 \(x_i x_j\) 元素的向量)。线性 SFA 模块可以堆叠成深度非线性慢特征提取器:学一个线性 SFA、对其输出做非线性基展开、再学一个线性 SFA。在自然场景视频的小空间块上训练时,二次基展开下的 SFA 学会的特征与 V1 皮层复杂细胞的特征有许多共性(Berkes and Wiskott, 2005);在 3D 渲染环境的随机运动视频上训练时,深度 SFA 学会的特征与大鼠用于导航的神经元的特征有许多共性(Franzius et al., 2007)。SFA 因此看起来是一个生物学上比较合理的模型。

SFA 的一大优势是——即使在深度、非线性的设定下——理论上可以预测它会学到什么特征。要做这种预测,需要知道环境的配置空间动力学(例如,对 3D 渲染环境中的随机运动,理论分析从相机位置和速度的概率分布出发);在已知底层因子实际如何变化的条件下,最优表达这些因子的函数可以解析求解。在实践中,深度 SFA 在仿真数据上的实验确实恢复了理论上预测的函数。相比之下,其他学习算法的代价函数强烈依赖于具体像素值,要确定模型将学到什么特征要困难得多。深度 SFA 已被用于目标识别和姿态估计的特征学习(Franzius et al., 2008)。但到目前为止,慢度原则还没成为任何最先进应用的基石;究竟是什么因素限制了它的性能尚不清楚。作者推测,慢度先验也许过强——与其强加"特征应该近似常数"这种先验,不如强加"特征应该容易从一个时间步预测到下一个时间步"这种先验。物体位置是有用的特征,无论物体速度是高还是低;而慢度原则会鼓励模型去忽略高速运动物体的位置。

13.4 稀疏编码

稀疏编码(Olshausen and Field, 1996)是一种被广泛研究为无监督特征学习和特征提取机制的线性因子模型。严格地说,"稀疏编码"指在该模型下推断 \(h\) 值的过程,"稀疏建模"指设计和学习该模型的过程;但"稀疏编码"也常被用来笼统指两者。和大多数其他线性因子模型一样,稀疏编码也用线性解码器加噪声来重构 \(x\)(equation 13.2),并通常假设线性因子带各向同性精度 \(\beta\) 的 Gaussian 噪声

\[ p(x \mid h) = N\!\left(x;\, W h + b,\, \frac{1}{\beta} I\right). \]
\(p(h)\) 被选成在 0 附近有尖峰的分布(Olshausen and Field, 1996),常见选择包括分解 Laplace、Cauchy 或分解 Student-t。例如以稀疏惩罚系数 \(\lambda\) 参数化的 Laplace 先验为
\[ p(h_i) = \mathrm{Laplace}\!\left(h_i;\, 0,\, \frac{2}{\lambda}\right) = \frac{\lambda}{4} \exp\!\left(-\frac{1}{2} \lambda |h_i|\right), \]
Student-t 先验为
\[ p(h_i) \propto \left(1 + \frac{1}{\nu} h_i^2\right)^{-(\nu+1)/2}. \]

用最大似然直接训练稀疏编码是不可处理的(intractable)。实际做法是在编码数据与训练解码器之间交替进行;这种做法在 19.3 节会被进一步证明为最大似然的一种有原则的近似。PCA 等模型用参数化编码器(即一个权重矩阵乘法)预测 \(h\);稀疏编码使用的不是参数化编码器,而是一个优化算法——它解一个以单点最可能 code 值为目标的优化问题

\[ h^* = f(x) = \arg\max_h\, p(h \mid x). \]
把 equation 13.13 与 equation 13.12 代入,得到
\[ \arg\max_h\, p(h \mid x) = \arg\max_h\, \log p(h \mid x) = \arg\min_h\, \lambda \|h\|_1 + \beta \|x - W h\|_2^2, \]
其中已经把不依赖 \(h\) 的项丢掉并除以正的缩放因子以简化式子。由于对 \(h\) 施加 \(L^1\) 范数,这个过程会得到稀疏的 \(h^*\)(参见 7.1.2 节)。

要训练模型而非仅做推断,要在关于 \(h\) 的最小化和关于 \(W\) 的最小化之间交替进行。这里的 \(\beta\) 被当作超参数处理;通常取 \(\beta = 1\),因为 \(\beta\)\(\lambda\) 在该优化问题中作用重叠,没必要同时调两个超参数。原则上 \(\beta\) 也可以作为模型参数学出来;为简化展示,作者略去了依赖 \(\beta\) 但不依赖 \(h\) 的项——要把 \(\beta\) 也学出来就必须保留这些项,否则 \(\beta\) 会坍缩到 0。并不是所有稀疏编码方法都显式构造 \(p(h)\)\(p(x \mid h)\),实际中更常见的是只学一个特征字典,使按上述推断过程抽取的激活值常常为零。如果 \(h\) 真的从 Laplace 先验中采样,\(h\) 的某个元素恰好等于零其实是零概率事件;生成模型本身并不特别稀疏,只有特征提取器是稀疏的。Goodfellow 等人(2013d)描述了另一种模型族 spike and slab 稀疏编码的近似推断,那一族模型下先验样本常常真的包含零。

稀疏编码方法加上非参数编码器,原则上能比任何特定参数化编码器更好地最小化"重构误差 + 对数先验"这一组合。另一个优势是编码器没有泛化误差。参数化编码器必须学会一种把 \(x\) 映射到 \(h\) 的方式,并要求它能泛化;遇到与训练数据不寻常的 \(x\) 时,学到的参数化编码器可能找不到能精确重构或给出稀疏 code 的 \(h\)。对于绝大多数稀疏编码模型(其推断问题是凸的),优化过程总能找到最优 code(除非遇到复制权重向量之类的退化情形)。稀疏性和重构代价在陌生点上也可能上升,但那是解码器权重的泛化误差,而非编码器的泛化误差。稀疏编码优化式编码过程无泛化误差这一特点,使它作为分类器的特征提取器时,可能比用参数化函数预测 code 泛化得更好。Coates 和 Ng(2011)证明,稀疏编码特征在目标识别任务上的泛化能力优于一种基于参数化编码器的相关模型——线性 sigmoid 自编码器。受其启发,Goodfellow 等人(2013d)证明,在每类仅有极少标签(每类 ≤ 20)的场景下,稀疏编码的一个变体比其他特征提取器泛化得更好。

非参数编码器的主要缺点是:给定 \(x\) 计算 \(h\) 所需的时间更长,因为它需要跑一个迭代算法。第 14 章发展的参数化自编码器方法只用固定层数(往往仅一层)。另一个缺点是:对非参数编码器反向传播不直观,这使得"用无监督准则预训练稀疏编码模型、再用有监督准则微调"难以实现。允许近似导数的稀疏编码变体确实存在(Bagnell and Bradley, 2009),但未被广泛使用。和其它线性因子模型一样,稀疏编码往往生成质量较差的样本(figure 13.2),即便它能很好地重构数据并为分类器提供有用特征。原因是:每个单独特征可能学得不错,但隐藏 code 的分解先验会使模型在每个生成样本中随机地挑出全部特征的一个子集做组合——MNIST 训练中,只有少数这样的子集能组成一个可识别的数字。这一观察直接推动了能对最深层 code 强加非分解分布的更深模型的发展,以及更精细的浅层模型的发展。

13.5 PCA 的流形解释

线性因子模型(包括 PCA 和因子分析)可以被解释为在学习一个流形(Hinton et al., 1997)。具体地,可以把概率 PCA 看成定义了一片薄薄的、煎饼形状的高概率区域——一个 Gaussian 分布,在某些轴上非常窄(正如一个煎饼在垂直方向上很扁),在其他轴上又非常长(正如煎饼在水平方向上很宽)。PCA 可以被解释为把这个"煎饼"与高维空间中的一个线性流形对齐。这一解释不仅适用于经典 PCA,也适用于任何为了使 \(x\) 的重构尽量接近 \(x\) 而学 \(W\)\(V\) 矩阵的线性自编码器。

把编码器写成

\[ h = f(x) = W^\top (x - \mu), \]
它给出 \(h\) 的低维表示;从自编码器的角度看,解码器计算重构
\[ \hat{x} = g(h) = b + V h. \]
对线性编码器和解码器、且最小化重构误差
\[ \mathbb{E}\!\left[\|x - \hat{x}\|^2\right] \]
的解是 \(V = W\)\(\mu = b = \mathbb{E}[x]\),且 \(W\) 的列构成协方差矩阵
\[ C = \mathbb{E}\!\left[(x - \mu)(x - \mu)^\top\right] \]
主特征向量所张成的同一个子空间的标准正交基。在 PCA 的情况下,\(W\) 的列就是这些特征向量,并按对应特征值(均为实数且非负)的大小排序。

进一步可知,\(C\) 的特征值 \(\lambda_i\) 对应 \(x\) 沿特征向量 \(v_{(i)}\) 方向的方差。若 \(x \in \mathbb{R}^D\)\(h \in \mathbb{R}^d\)\(d < D\),则按上述 \(\mu, b, V, W\) 选取的最优重构误差为

\[ \min\, \mathbb{E}\!\left[\|x - \hat{x}\|^2\right] = \sum_{i=d+1}^{D} \lambda_i. \]
于是当协方差矩阵的秩为 \(d\) 时,\(\lambda_{d+1}\)\(\lambda_D\) 均为 0,重构误差为 0。进一步地,还能证明:上述解也可以通过在 \(W\) 正交约束下最大化 \(h\) 各元素的方差来获得,而不是通过最小化重构误差。

作者最后总结:线性因子模型既是最简单的生成式模型,也是最简单的学到数据表示的模型。正如线性分类器和线性回归模型可以扩展成深度前馈网络,这些线性因子模型也可以扩展成自编码器网络与深度概率模型——它们执行同样的任务,但模型族本身更强大、更灵活。

本章个人批注

本章把"线性因子模型"作为一个统一框架:先生成 \(h \sim p(h)\)(分解先验)、再用 \(x = W h + b + \text{noise}\) 把它线性映射回观测空间。这一章各小节之间共享着同一个生成式骨架,差异只在于两点——\(p(h)\) 的形状(Gaussian、非 Gaussian、稀疏、慢),以及噪声项(无、各向异性、各项同性 \(\sigma^2 I\))。把这个骨架作为分析透镜,回头看 13.1–13.5 会很顺:13.1 概率 PCA / 因子分析都把 \(h\) 设为 Gaussian 但改噪声形式;13.2 ICA 把 \(p(h)\) 换成非 Gaussian、\(h\) 之间真正独立;13.3 SFA 不强加 \(p(h)\) 但通过时序正则化在数据分布外加约束;13.4 稀疏编码把 \(p(h)\) 换成 Laplace/Student-t 等尖峰分布以鼓励 \(h\) 稀疏;13.5 则是给整个家族一个几何视角:\(W\) 列张成的子空间就是概率密度"煎饼"贴着的线性流形。

最有意思的一节是 13.4 稀疏编码里"参数化编码器 vs 优化式编码器"那段。书中把"非参数编码器无泛化误差"作为稀疏编码的核心卖点:给定训练好的 \(W\),推断问题本身是凸的,能保证找到最优 \(h^*\),与参数化编码器在 OOD 数据上预测失灵形成对比。这个论点对做下游分类任务的人很有启发——当我以后接一个 scikit-learn 的 estimator 时,特征提取器的稳定性可能比端到端可微更重要。

另一段值得记一下的是 13.3 关于"慢度先验可能过强"的猜测。书中明确说:与其强制特征近似常数,不如强制特征在时间步之间"可预测"。这其实预告了 13.4 稀疏编码里"稀疏 + 重构"的组合思路——也是更后期序列模型(如 RNN 隐状态动力学)一直在用的范式。从这个角度看,本章是后续表示学习章节的过渡铺垫。

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

第 12 章是应用章,强调深度学习在不同模态上的工程化:大规模 GPU 集群、CNN 在视觉上的统治、Sequence-to-Sequence 在 NLP 上的端到端训练。第 13 章回到理论视角,把"用一个低维隐变量 \(h\) 解释高维数据 \(x\)"这一思想形式化为"线性因子模型"——这是本书第一次系统地讨论带隐变量的生成式模型(前面章节的概率推导都是关于判别式或可观测模型)。它把后续章节要用的"先验 + 线性/非线性解码器 + 噪声"这条主线铺平:13.1 把 \(h\) 设为 Gaussian、用线性解码器,给出可闭式求解的概率 PCA;13.2 把 \(p(h)\) 改为非 Gaussian,得到 ICA;13.3 不动 \(p(h)\) 而在时间维度上加入慢度正则,得到 SFA;13.4 用 Laplace/Student-t 让 \(h\) 稀疏,得到稀疏编码;13.5 从几何角度把这一族模型统一为"沿线性流形堆叠的高斯煎饼"。第 14 章要介绍的自编码器则是把这条主线里的"线性解码器"换成"非线性解码器"——线性因子模型与自编码器是一对孪生概念:前者强调概率生成与先验 \(p(h)\),后者强调可学习的非线性编码 \(f\) 与重构 \(\hat{x}\)。第 15 章"表示学习"则把视角再升一层,讨论什么样的表示才是"好表示"——本章的 \(h\) 就是最简版本的那个表示。