GGML PCA
主成分分析 主成分分析(principal components analysis)是一类非常常见的算法,广泛应用于各种需要信息压缩的场景。虽然《深度学习》一书称之为“简单的机器学习算法”,但是PCA通常可以通过确定的数值算法实现。 概略来说,PCA是找到一个映射算法,将高维空间的样本集合在尽量不损失信息的前提下,映射到更低的维度,从N维空间映射到M维空间,可以表示为一个 $M*N$的矩阵。PCA的目的就是通过分析样本集合,解出这个映射矩阵。 这个求解过程主要有这样几个步骤: 将样本集合表达为$样本数特征数$($AF$)的矩阵 将这个矩阵规范化,使后续步骤中我们可以得到一个对角线为1的协方差矩阵,这需要先得到无偏的标准差: 我们先求得样本集的均值向量,均值向量的每个维度都是所有样本在该特征维度的值的平均 用样本集减去这个均值向量,得到一组中心化的数据$B$ 对这个集合求平方,然后求和,再除以$A-1$得到无偏方差 开方得到无偏标准差(Unbiased standard deviation)即样本标准差(Samples standard deviation) 。 为了避免样本标准差的某个维度为0,导致后续计算出错,可以给它加上一个极小的正数作为补偿。 用B矩阵除以标准差 得到规范化的矩阵X之后,我们计算 $X^TX$ 将得到的矩阵除以$A-1$,得到$F*F$的协方差矩阵 求解协方差矩阵的奇异值矩阵$S$和右奇异值$VT$向量矩阵,按从奇异值大到小,取对应的前M个向量,组成PCA转换矩阵 使用这个矩阵,对样本做矩阵乘法时,得到的就是降维后的结果向量。 实现 我最初做PCA算法的动机,来自于将 4096 维度的 ollama 嵌入向量降维到 2000 维以下——我的目标是256,那么在这个计算过程中,如果假设样本集数量为一万,计算过程中就会涉及好几次千万级的浮点数乘法。为了加速计算过程,使之可以优化到足以放到 PostgreSQL 内部使用,我使用AI框架 ggml 实现了一个 PCA 方法。 GGML 是一个 C 库,它支持 CUDA、MPX 等硬件加速方案,可以快速处理大规模的矩阵算法。 GGML 的tensor类型支持最多4个张量维度,PCA仅涉及矩阵和向量计算,只需要用到最多两位维度。所以这里仅使用GGML TENSOR的前两个维度。 在前述步骤中,基础的矩阵算法如乘法,加法等都有对应的 GGML...
[Read More]