前言
本文是本站 Math 系列的第一篇文章。这个系列会从人工智能中反复出现的问题出发,补齐解决问题所需的数学基础。我们先从一个很实际的疑问开始:一份数据有很多特征,就一定包含同样多份独立的信息吗?
假设我们记录一个物体的长度、宽度,以及用长度和宽度计算出的周长。现在有三个特征,但周长并没有提供一个完全独立的新方向。如果直接把所有特征送进模型,数据要占更多空间,后续计算也要处理更多输入。矩阵降维要做的,就是找到少数能够代表原始数据的方向,再用这些方向上的坐标表示样本。
看完之后,我们至少应该能判断:哪些特征可能是重复的,压缩后丢掉了什么,以及何时不该只凭“特征多”就贸然降维。
为什么需要降维
特征不等于信息
先看两个特征。假设每条数据同时记录温度的摄氏度和华氏度,二者满足 。虽然数据表里有两列,但知道摄氏度就能算出华氏度;第二列没有增加独立变化的自由度。如果我们把每个样本画成平面上的一个点,点会落在一条直线上。
真实数据往往没有这么整齐。例如身高与腿长通常相关,却不能由彼此精确算出。散点更像是围绕一条斜线形成的窄带:用沿窄带的一个坐标描述大致位置,能保留主要变化,但会丢失垂直于窄带的细节。把三种情况并排画出,就能看到区别:
左边的点需要两个方向描述;中间虽然接近一条线,但通常仍有两个独立方向;只有右边精确共线时,中心化数据的秩才真正降为 。这就是近似降维与简单删掉一列的区别——我们可以保留两个原始特征的组合,而不必只选其中一个。
维度增加不一定是坏事。如果各个方向都有独立而重要的变化,强行压缩就会丢信息。在一些依赖距离或邻域的任务中,高维空间还可能让有限样本显得稀疏,但具体影响取决于数据分布,不能单凭特征数下结论。判断是否值得降维,第一步应是观察冗余在哪里。
从特征冗余到矩阵的秩
把 个样本放在一起,每个样本有 个特征。本文用列向量表示一个样本,并把样本按列组成矩阵 。这样,每一行对应一个特征,每一列对应一个样本。
摄氏度与华氏度的例子还有一个细节: 是一条不经过原点的直线。如果直接把两行原始数据排成 ,常数 可能使矩阵的秩仍为 。要讨论数据围绕哪些方向变化,先对每个特征减去它在所有样本上的均值。记均值向量为 ,中心化后的样本为 ,下文的 均指由这些中心化样本组成的矩阵。
现在华氏度的中心化结果恰好是摄氏度中心化结果的 倍。只要样本温度确实发生变化,矩阵中两行就只有一个独立方向,其秩为 。秩可以理解为矩阵的行或列中最多能找到多少个线性无关的方向:第二行既然能由第一行算出,就没有贡献新的方向。
但只要测量存在微小误差,两行通常就不再精确成比例,矩阵可能恢复满秩。此时说“秩为 ”就不准确了;更有用的说法是:数据接近一个秩为 的矩阵。降维不是凭空消除误差,而是用少数方向表示主体,再接受一部分重构误差。
用少数方向表示数据
投影与重构
设想二维散点主要沿一条斜线分布。取沿这条线的单位向量 ,把样本 投到它上面,得到一个数 。这个数是样本沿 方向的坐标;用 将它映射回二维坐标系,得到的只是落在这条直线上的重构点,一般不等于原来的 。差值 是没有被这个方向表示出来的部分。
图中从原点到投影点的距离由坐标 决定,黄色虚线是与所选方向垂直的残差。灰色虚线通向同一条直线上的另一个点 ,比黄色虚线更长:给定这条线,正交投影就是离 最近的重构。重构只能落在那条线上,所以保留坐标并不能找回垂直方向的细节。
若保留 个相互垂直、长度为 的方向,就把它们排列成 ,其中 ,且 。每个方向都提供一个坐标,全部样本可以一起计算:
是真正保存下来的低维数据, 是从它重构出的近似数据。这样可以把编码和解码看成两次矩阵乘法:从 个特征到 个坐标,再回到 个特征。方向矩阵 也需要保存,因此若只为了压缩存储,不能忘记它的开销;样本数很少时,未必划算。
为什么要选相互垂直的单位方向?因为每个坐标都能直接用内积得到,而且一个方向已表示的分量不会在另一个方向里重复计算。更重要的是,给定这些方向之后,正交投影就是在它们张成的空间内离原始样本最近的重构点:残差与该空间垂直,从投影点再沿空间内任意方向挪动,只会让距离平方增加。
如何权衡维度与误差
重构误差
我们希望重构结果尽量接近原始数据。若用平方差衡量损失,所有样本的误差可以写成
这里 是两个样本向量之间的欧几里得距离, 则表示把矩阵中每个元素的差平方后相加。选哪个方向,就会改变这些距离。看同一组中心化后的二维样本,分别沿数据延伸的方向和只保留第一个特征的方向投影:
两边都只给每个样本保留一个坐标,但左边的方向更贴近点云,样本到重构点的距离更短;右边虽然保留了第一个特征,却丢掉了第二个特征中的大部分变化。图中的虚线是两个样本的残差,其余样本也遵循同样的差异。降到几维之外,沿什么方向降也决定了信息损失。
保留方向越少,表示越紧凑,但通常更难还原数据。如果从 个方向增加到 个,并允许重新选择所有方向,能够达到的最小误差不会变大;不过它未必会明显变小。选 因此不是单纯追求最小误差:若 ,保留所有方向当然可以无损重构,却失去了降维的意义。实际选择需要对照误差变化、存储与计算成本,以及下游任务效果。用公式表示,就是让所选方向上的重构误差尽可能小:
有什么帮助
如果输入特征中有大量近似重复的信息,先压到 维,可能降低存储量和后续模型的计算量。以一个输出宽度为 的线性层为例,原本有 个输入权重,改用 维输入后是 个;但如果投影本身也要在线计算,还要付出 的方向矩阵和相应计算。是否真的省资源,取决于样本量、复用方式与模型结构。
另一方面,重构误差小,不等于对预测有用的信息都被保留。一个方向虽然变化很小,却可能刚好区分两类样本;只看数据本身的重构效果,就可能把它扔掉。各列特征的量纲如果差异很大,平方误差还容易被数值尺度较大的特征主导,是否先缩放特征需要结合任务判断。做特征工程时,可以先检查特征的冗余、量纲和目标任务,再在验证集上比较降维前后的效果,而不是把“维度越低越好”当作规则。
结语
矩阵降维的核心不是删除几列数据,而是用少数方向重新表达样本。秩告诉我们精确冗余有多少,近似低秩提示我们数据或许可以压缩;投影给出固定方向下最接近原始数据的表示;重构误差则量化了压缩丢失的内容。对建模而言,这些概念帮助我们决定哪些输入值得保留、压缩值不值得付出代价。
如果特征之间确实存在可利用的冗余,选对方向就有机会用更少的坐标保留主要变化;如果方向选错,压到同样的维度也可能丢掉大量信息。最后仍要用具体任务的效果检验这笔取舍是否值得。