2557 字
13 分钟
矩阵降维:从特征冗余到低秩表示

前言#

本文是本站 Math 系列的第一篇文章。这个系列会从人工智能中反复出现的问题出发,补齐解决问题所需的数学基础。我们先从一个很实际的疑问开始:一份数据有很多特征,就一定包含同样多份独立的信息吗?

假设我们记录一个物体的长度、宽度,以及用长度和宽度计算出的周长。现在有三个特征,但周长并没有提供一个完全独立的新方向。如果直接把所有特征送进模型,数据要占更多空间,后续计算也要处理更多输入。矩阵降维要做的,就是找到少数能够代表原始数据的方向,再用这些方向上的坐标表示样本。

看完之后,我们至少应该能判断:哪些特征可能是重复的,压缩后丢掉了什么,以及何时不该只凭“特征多”就贸然降维。

为什么需要降维#

特征不等于信息#

先看两个特征。假设每条数据同时记录温度的摄氏度和华氏度,二者满足 f=1.8c+32f=1.8c+32。虽然数据表里有两列,但知道摄氏度就能算出华氏度;第二列没有增加独立变化的自由度。如果我们把每个样本画成平面上的一个点,点会落在一条直线上。

真实数据往往没有这么整齐。例如身高与腿长通常相关,却不能由彼此精确算出。散点更像是围绕一条斜线形成的窄带:用沿窄带的一个坐标描述大致位置,能保留主要变化,但会丢失垂直于窄带的细节。把三种情况并排画出,就能看到区别:

从分散到近似共线、精确共线的二维数据

左边的点需要两个方向描述;中间虽然接近一条线,但通常仍有两个独立方向;只有右边精确共线时,中心化数据的秩才真正降为 11。这就是近似降维与简单删掉一列的区别——我们可以保留两个原始特征的组合,而不必只选其中一个。

维度增加不一定是坏事。如果各个方向都有独立而重要的变化,强行压缩就会丢信息。在一些依赖距离或邻域的任务中,高维空间还可能让有限样本显得稀疏,但具体影响取决于数据分布,不能单凭特征数下结论。判断是否值得降维,第一步应是观察冗余在哪里。

从特征冗余到矩阵的秩#

把 nn 个样本放在一起,每个样本有 dd 个特征。本文用列向量表示一个样本,并把样本按列组成矩阵 X∈Rd×nX\in\mathbb{R}^{d\times n}。这样,每一行对应一个特征,每一列对应一个样本。

摄氏度与华氏度的例子还有一个细节:f=1.8c+32f=1.8c+32 是一条不经过原点的直线。如果直接把两行原始数据排成 XX,常数 3232 可能使矩阵的秩仍为 22。要讨论数据围绕哪些方向变化,先对每个特征减去它在所有样本上的均值。记均值向量为 μ∈Rd\mu\in\mathbb{R}^{d},中心化后的样本为 xi−μx_i-\mu,下文的 XX 均指由这些中心化样本组成的矩阵。

现在华氏度的中心化结果恰好是摄氏度中心化结果的 1.81.8 倍。只要样本温度确实发生变化,矩阵中两行就只有一个独立方向,其秩为 11。秩可以理解为矩阵的行或列中最多能找到多少个线性无关的方向:第二行既然能由第一行算出,就没有贡献新的方向。

但只要测量存在微小误差,两行通常就不再精确成比例,矩阵可能恢复满秩。此时说“秩为 11”就不准确了;更有用的说法是:数据接近一个秩为 11 的矩阵。降维不是凭空消除误差,而是用少数方向表示主体,再接受一部分重构误差。

用少数方向表示数据#

投影与重构#

设想二维散点主要沿一条斜线分布。取沿这条线的单位向量 ww,把样本 xx 投到它上面,得到一个数 z=w⊤xz=w^\top x。这个数是样本沿 ww 方向的坐标;用 x^=wz\hat x=wz 将它映射回二维坐标系,得到的只是落在这条直线上的重构点,一般不等于原来的 xx。差值 x−x^x-\hat x 是没有被这个方向表示出来的部分。

样本沿一个方向投影、重构并留下垂直残差

图中从原点到投影点的距离由坐标 zz 决定,黄色虚线是与所选方向垂直的残差。灰色虚线通向同一条直线上的另一个点 pp,比黄色虚线更长:给定这条线,正交投影就是离 xx 最近的重构。重构只能落在那条线上,所以保留坐标并不能找回垂直方向的细节。

若保留 kk 个相互垂直、长度为 11 的方向,就把它们排列成 W∈Rd×kW\in\mathbb{R}^{d\times k},其中 k<dk<d,且 W⊤W=IW^\top W=I。每个方向都提供一个坐标,全部样本可以一起计算:

Z=W⊤X∈Rk×n,X^=WZ=WW⊤X∈Rd×n.Z=W^\top X\in\mathbb{R}^{k\times n},\qquad \hat X=WZ=WW^\top X\in\mathbb{R}^{d\times n}.

ZZ 是真正保存下来的低维数据,X^\hat X 是从它重构出的近似数据。这样可以把编码和解码看成两次矩阵乘法:从 dd 个特征到 kk 个坐标,再回到 dd 个特征。方向矩阵 WW 也需要保存,因此若只为了压缩存储,不能忘记它的开销;样本数很少时,未必划算。

为什么要选相互垂直的单位方向?因为每个坐标都能直接用内积得到,而且一个方向已表示的分量不会在另一个方向里重复计算。更重要的是,给定这些方向之后,正交投影就是在它们张成的空间内离原始样本最近的重构点:残差与该空间垂直,从投影点再沿空间内任意方向挪动,只会让距离平方增加。

如何权衡维度与误差#

重构误差#

我们希望重构结果尽量接近原始数据。若用平方差衡量损失,所有样本的误差可以写成

∥X−X^∥F2=∑i=1n∥xi−x^i∥22.\|X-\hat X\|_F^2 =\sum_{i=1}^{n}\|x_i-\hat x_i\|_2^2.

这里 ∥xi−x^i∥2\|x_i-\hat x_i\|_2 是两个样本向量之间的欧几里得距离,∥⋅∥F2\|\cdot\|_F^2 则表示把矩阵中每个元素的差平方后相加。选哪个方向,就会改变这些距离。看同一组中心化后的二维样本,分别沿数据延伸的方向和只保留第一个特征的方向投影:

同一组散点投影到两个不同方向,比较重构误差

两边都只给每个样本保留一个坐标,但左边的方向更贴近点云,样本到重构点的距离更短;右边虽然保留了第一个特征,却丢掉了第二个特征中的大部分变化。图中的虚线是两个样本的残差,其余样本也遵循同样的差异。降到几维之外,沿什么方向降也决定了信息损失。

保留方向越少,表示越紧凑,但通常更难还原数据。如果从 kk 个方向增加到 k+1k+1 个,并允许重新选择所有方向,能够达到的最小误差不会变大;不过它未必会明显变小。选 kk 因此不是单纯追求最小误差:若 k=dk=d,保留所有方向当然可以无损重构,却失去了降维的意义。实际选择需要对照误差变化、存储与计算成本,以及下游任务效果。用公式表示,就是让所选方向上的重构误差尽可能小:

min⁡W⊤W=I  ∥X−WW⊤X∥F2,W∈Rd×k.\min_{W^\top W=I}\;\|X-WW^\top X\|_F^2, \qquad W\in\mathbb{R}^{d\times k}.

有什么帮助#

如果输入特征中有大量近似重复的信息,先压到 kk 维,可能降低存储量和后续模型的计算量。以一个输出宽度为 hh 的线性层为例,原本有 d×hd\times h 个输入权重,改用 kk 维输入后是 k×hk\times h 个;但如果投影本身也要在线计算,还要付出 d×kd\times k 的方向矩阵和相应计算。是否真的省资源,取决于样本量、复用方式与模型结构。

另一方面,重构误差小,不等于对预测有用的信息都被保留。一个方向虽然变化很小,却可能刚好区分两类样本;只看数据本身的重构效果,就可能把它扔掉。各列特征的量纲如果差异很大,平方误差还容易被数值尺度较大的特征主导,是否先缩放特征需要结合任务判断。做特征工程时,可以先检查特征的冗余、量纲和目标任务,再在验证集上比较降维前后的效果,而不是把“维度越低越好”当作规则。

结语#

矩阵降维的核心不是删除几列数据,而是用少数方向重新表达样本。秩告诉我们精确冗余有多少,近似低秩提示我们数据或许可以压缩;投影给出固定方向下最接近原始数据的表示;重构误差则量化了压缩丢失的内容。对建模而言,这些概念帮助我们决定哪些输入值得保留、压缩值不值得付出代价。

如果特征之间确实存在可利用的冗余,选对方向就有机会用更少的坐标保留主要变化;如果方向选错,压到同样的维度也可能丢掉大量信息。最后仍要用具体任务的效果检验这笔取舍是否值得。

参考资料#

博客桌宠