深度序列模型与自然语言处理:基于TensorFlow 2实践
上QQ阅读APP看书,第一时间看更新

2.2.2 分布式表示

分布式表示则是用一个低维的、稠密的向量来表达单词的语义。潜在语义分析(Latent Semantic Analysis,亦称潜在语义索引)[56]就是一种非常典型的分布式表示方法。首先,统计语料库中每篇文档(3)中单词的出现情况,构建一个单词-文档共现矩阵A:假设词表大小为n,文档数量为m,结果将是一个nm的矩阵,其(ij)元是单词i在文档j中的权重,例如词频(Term Frequency)(4),或者TF-IDF(Term Frequency-Inverse Document Frequency)(5)值。词表大小的范围通常是几万到百万,文档数量最多也可以达到上百万篇,因此这是一个巨大无比的矩阵。有了单词-文档共现矩阵后,自然而然地就得到了单词或者文档向量:该矩阵的每一行都可以看作一个单词的m维向量,每一列则代表一篇文档的n维向量,这就是向量空间模型(Vector Space Model)[57]。不过向量空间模型主要是为了得到文档的表示,进而完成文本检索等任务;而我们在这里重点关注单词的表示。

容易得知,单词-文档共现矩阵是极其稀疏的,因为一篇文档中往往只会出现几百到几千个单词,而词表的大小往往可以达到数万。此外,文档遣词造句的过程具有一定的随意性:作者使用了某个词却没有使用另一个词,并不意味着这两个词不相似,完全可能是偶然因素导致的。例如,某篇文档里出现了两次“深度学习”而没有出现过“机器学习”;但是,假如原作者重写一次这篇文章,他有可能使用“机器学习”一词。这也正是向量空间模型的缺点:向量空间模型认为每个术语都是独立的。更好的方式是对结果进行平滑,例如认为文章中出现了1.8次“深度学习”和0.2次“机器学习”。这里“机器学习”权重的增加就是隐藏语义挖掘的结果,其原理是其他文章中术语“机器学习”和“深度学习”的共现(Cooccurrence)导致模型学习到了这两个术语的语义相似性。在数学上,这种平滑可以通过对单词-文档共现矩阵进行低秩近似来实现,最常用的工具是奇异值分解(Singular Value Decomposition)(6)

奇异值分解可以将矩阵分解为左奇异矩阵U、奇异值矩阵Σ和右奇异矩阵V的乘积。如果保留原矩阵所有的奇异值(见图2-1白色部分),那么可以从分解后的三个矩阵中精确地恢复出原矩阵;如果只保留前k个奇异值及其对应的左、右奇异向量(见图2-1灰色部分),那么恢复出的就是原矩阵的最佳秩k逼近。通过设置较小的k(人为指定的超参数,一般为几十到几百,远小于文档数m和词表大小n),我们可以得到单词和文档的更紧凑的表示,挖掘到不同单词的语义联系。

图2-1 潜在语义分析算法

更具体地,左奇异矩阵Un×k的每一行对应一个单词的k维词向量,相似的单词有相似的向量表示,因此该矩阵可以被称作词向量矩阵;同时,它的每一列代表一个语义类,相似的单词在同一语义类中拥有相近的权重,也即对应话题(Topic)的概念(7),因此左奇异矩阵也被称作话题空间矩阵,超参数k被称作话题数。类似地,右奇异矩阵的每一行代表一个话题,其中元素的含义是相应文档里该话题的权重;每一列代表一个文档的k维文档向量,相似的文档有相似的向量表示,可以表达文档的语义。而奇异值矩阵Σk×k是一个对角阵,只有对角线上的元素非零,用来表示单词的语义类和文档的语义类的相关性强弱。假如把近似分解后的三个矩阵相乘,就能发现恢复出的单词-文档共现矩阵很多位置不再为零,可以视为经过平滑后的单词在文档里的权重。

上述模型已经足以获得一个不错的稠密的低维词向量了。但是,由于没有严谨的概率基础,很多模型的参数缺乏良好的性质,例如文档中各话题的权重没有归一化等。如果沿着概率图模型的方法走下去,可以对文档的生成过程进行建模,得到一个更加可解释的生成模型(Generative Model),称作PLSA(Probabilistic Latent Semantic Analysis,概率潜在语义分析)[58],不过这已经超出了本章讨论的范畴。