题外话
最近在做句向量任务,使用BERT池化得到句向量,那么句向量能不能降维,这样计算速度会明显提升。于是看到苏剑林等人的工作 Whitening Sentence Representations for Better Semantics and Faster Retrieval,以及中文博客无监督语义相似度哪家强?我们做了个比较全面的评测。提出了对池化结果进行白化操作,效果提升很好。作者认为BERT抽取的句向量,在计算余弦相似度以后,效果不好可能的原因是,句向量的基并不是正交的。具体的可以去看原文,佩服作者的数学功底,对基本概念理解非常深刻。于是我顺便在看PCA,不看不知道,在动手推到时,发现并没有完全理解实质,于是本文算是整理PCA的笔记了。
为什么要做PCA
梳理清楚问题比解决问题往往更重要。首先要弄清楚为什么要做PCA。在数据挖掘过程中,我们收集了大量数据,每个数据的特征维度非常多,这些特征可能存在共线的情况。比如性别、年龄、身高、体重、体重身高指数。这几个指标很明显存在一定的贡献情况,成年人的身高体重,往往大于小朋友,也就是说年龄特征中包含了一部分身高和体重的信息。仅仅只是部分共线,而不是完全共线,直接去掉这个特征,又不太合适。这个时候可以考虑使用PCA降维,对数据重新计算成分,按照主成分将原来的N维特征降到M(M)维.
实现原理
现实的问题是特征存在共线,我们的目标是要降维。如果将样本看成是向量空间的元素,每个特征就是对应坐标的分量,解决特征共线的问题就转化为,重新选择向量空间的基底,如果这组基底是正交的,那么将样本空间做映射,得到的新样本不就没有共线的问题了,顺便丢掉一些“不重要”的特征不就实现了降维。
PCA正是基于上面的原理,“不重要”的特征就是基于观测值方差比较小的那一部分。接下来计算特征的“方差”了,由于这是多个随机变量的问题,变量之间的方差称为协方差。
假设有n个样本,每个样本有m个特征,这些样本已经做去中心化处理\sum_i ^n x_i=0, 组成的样本为
x_i = (x_1^{(i)}, x_2^{(i)}, \cdots,x_m^{(i)})^T,i=1,2,\cdots,n
样本用矩阵表示为X=(x_1, x_2, \cdots,x_n),计算协方差为\Sigma=X X^T,这里矩阵\Sigma为m\times m的实对称矩阵,于是存在一个正交矩阵W,将\Sigma对角化,也就是:
\Sigma = W\Lambda W^{-1}
这里的矩阵W=(w_1, w_2, \cdots,w_m)是一个m\times m的矩阵。对上面的等式右乘W
\Sigma W = \Lambda W
对于矩阵W的每个分量w_j,下面的等式成立
\Sigma w_j = \lambda_j w_j
显然w_j是矩阵\Sigma的特征值\lambda_j对应的特征向量。由于W是正交的,所以(w_1, w_2, \cdots , w_m)是一组正交基,将这组正交基进行单位化,单位化以后符号仍然不变,于是(w_1, w_2, \cdots , w_m)就是一组标准正交基,也就是:
w^T_i w_j=0(i\neq j), ||w_i||_2 =1
得到一组特征值和特征向量记为\lambda_1\ge \lambda_2 \ge ,\cdots, \ge \lambda_m,(w_1, w_2, \cdots , w_m).
特征映射
上面已经得到了一组标准正交基和一组特征值,对角线上的元素就是样本的方差,根据方差大小排序,样本x_i在w_j上的投影为样本在新空间的第j个分量,也就是第j个主成分。现在将样本空间重新映射到新空间就可以了,映射的过程就是依次向新的基底做投影,得到对应的分量,这里详细写出对第一个样本的映射,方便理解,其余样本类似。
z_1^{(1)} = w^T_1 x_1=\sum_{i=1}^m w_{1i}x_i^{(1)}\\ z_2^{(1)} = w^T_2 x_1=\sum_{i=1}^m w_{2i}x_i^{(1)} \\ z_k^{(1)}= w^T_k x_1=\sum_{i=1}^m w_{ki}x_i^{(1)} \\ z_m^{(1)} = w^T_m x_1=\sum_{i=1}^m w_{mi}x_i^{(1)} \\
对于任意样本x_i,投影以后的坐标为z_i=W^T x_i.
降维
上面已经对每个样本在标准正交基下表示出来了,在新的向量空间中每个特征都是正交的,意味着特征之间不存在共线的情况。现在可以考虑降维了。方差最大方向上的投影作为第一主成分,依次类推。其中第k主成分为z_k^{(i)} = w_k^T x_k。
坐标系为 (w_1, w_2, \cdots,w_m) ,现在取前d(d \lt m)个基,于是新的坐标系为(w_1, w_2, \cdots , w_d)。样本x_i在新的坐标系表示为z_i=(z_1^{(i)},z_1^{(i)}, \cdots,z_d^{(i)}),其中第j个分量z_j^{(i)} = w^T_j x_i,由最初的m个特征降维d个特征了。
坐标系W^d = (w_1, w_2, \cdots ,w_d)是一个m\times d的矩阵,样本X^T是一个n\times m的矩阵,于是降维后的样本Z=X^T W^d最终得到样本是n\times d的矩阵。矩阵W^d就是我们需要的变换。
通常用特征值的占比表示样本映射以后保留的信息量
\frac{\sum_i ^d \lambda_i}{\sum_k ^m \lambda_k}
总结
本文介绍了PCA的一些基本概念,算是比较直观,涉及的公式也比较少的介绍PCA,当然这并不十分严密,但笔者认为从这样的角度来看PCA会更清晰简单。严格的推导应该从最小投影距离和最大投影方差这两个角度,并且这两个角度是等价的,前者认为映射的像z_i,“恢复”到\hat x_i与原始的x_i的距离应该最小化;后者认为投影以后的像的方差要尽可能的大,也就是正交矩阵W的取值使得方差Z^T Z最大化。