以下内容学习、摘录自《数学之美》

我在大学学习线性代数时,实在想不出这门课除了告诉我们如何解线性方程外,还能有什么别的用途。关于矩阵的许多概念,比如特征值等,更是脱离日常生活。今天大部分大学生多多少少有过类似的经历。但其实,数学家们提出的那些矩阵的概念和算法,是有实际应用的意义的。不应质疑理论知识,学以致用。
在自然语言处理中,最常见的两个分类问题分别是:将文本按主题归类(比如将所有介绍奥运会的新闻归到体育类)和将词汇表中的字词按意思归类(比如将各种运动的项目名称都归成体育一类)。这两个分类问题可以通过矩阵运算来圆满地、一次性地解决。
新闻分类乃至各种分类其实是一个聚类问题。参考第14章 余弦定理和新闻的分类,我们可以做到对所有新闻的两两计算,但这样要进行很多次迭代、耗时会特别长,尤其是当新闻的数量很大且词表也很大的时候。我们希望有一个办法,一次就能把所有新闻相关性计算出来。这个一步到位的办法利用的是矩阵运算中的奇异值分解( Singular Value decomposition,简称SVD)。
现在让我们来看看奇异值分解是怎么回事。首先,需要用一个大矩阵来描述成千上万篇文章和几十上百万个词的关联性。在这个矩阵中,每行对应一篇文章,每一列对应一个词,如果有N个词,M篇文章,则得到一个M×N的矩阵,如下所示。

其中,第i行、第j列的元素a(ij),是字典中第j个词在第i篇文章中出现的加权词频(比如用词的TF-IDF值)。这个矩阵会非常非常大,如果M=1000000,N=500000,100万乘50万,即5000亿个元素,如果以5号字体打印出来,有两个西湖那么大!奇异值分解,就是把上面这样一个大矩阵,分解成三个小矩阵相乘,如下图所示。

把上面例子的矩阵分解成一个100万乘100的矩阵X,个100乘100的矩阵B,和一个100乘50万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿,不到原来的三千分之一。相应的存储量和计算量都会小三个数量级以上。
拆分得到的3个矩阵都有非常清晰的物理含义:
第1个矩阵X是对词进行分类的一个结果;
第2个矩阵Y是对文本的分类结果;
中间的矩阵B则表示词的类和文章的类之间的相关性。
因此,只要对关联矩阵A进行一次奇异值分解,就可以同时完成近义词分类和文章的分类。另外,还能得到每个主题和每个词的语义类之间的相关性。这个结果非常漂亮!
既然好处这么大,那该如何对一个矩阵进行奇异值分解?这时,线性代数中的许多概念,比如矩阵的特征值,以及数值分析的各种算法等等就统统派上用场了。(注:请参考线性代数。)
除此之外,还要解决“大数据量”的问题。对于不大的矩阵,比如几万乘几万的矩阵,用计算机上的数学工具 MATLAB就可以计算。但是更大的矩阵,比如上百万乘上百万,奇异值分解的计算量非常大,就需要很多台计算机并行处理了。虽然 Google早就有了 Mapreduce等并行计算的工具,但是由于奇异值分解很难拆成不相关子运算,即使在 Google内部以前也无法利用并行计算的优势来分解矩阵。直到2007年, Google中国(谷歌)的张智威博士带领几个中国的工程师及实习生实现了奇异值分解的并行算法,这是Google中国对世界的一个贡献。
相比上一章介绍的利用文本特征向量余弦的距离自底向上的分类方法,奇异值分解的优点是能较快地得到结果(在实际应用中),因为它不需要一次次地迭代。但是用这种方法得到的分类结果略显粗糙,因此,它适合处理超大规模文本的粗分类。在实际应用中,可以先进行奇异值分解,得到粗分类结果,再利用计算向量余弦的方法,在粗分类结果的基础上,进行几次迭代,得到比较精确的结果。这样,这两个方法一先一后结合使用,可以充分利用两者的优势,既节省时间,又能获得很好的准确性。
网友评论