第6章 主题与降维:LDA、LSA、NMF、PCA 和 SVD
读完你能: 核对矩阵维度;区分 LSA、pLSA、LDA 和 NMF;手算一次主题分配概率;解释 PCA 为什么要先中心化,以及稀疏文本为什么常用不中心化的截断 SVD。
1. 先把矩阵方向定下来
本章统一用 :行是文档,列是词。格子里填原始计数还是 TF-IDF,取决于用哪种方法,每次都要说明。
| 方法 | 输入 | 输出怎么理解 |
|---|---|---|
| LSA | 计数或 TF-IDF 矩阵 | 低维的潜在方向,坐标可正可负 |
| pLSA | 词频(每次词出现看作一个事件) | 每篇文档的主题混合、每个主题的词分布 |
| LDA | 通常是词频计数 | 同上,但给主题混合加了 Dirichlet 先验 |
| NMF | 非负矩阵 | 只能相加、不能相减的非负“部件” |
| PCA | 中心化后的数值特征 | 方差最大的一组正交方向 |
“主题”是我们对结果的解读,不是模型自动找回来的真实标签。模型完全可能学到文体、模板或高频噪声,所以要逐个查看主题词、代表文档,并检查多次运行是否稳定。
2. SVD 与 LSA
任何矩阵都可以做奇异值分解:
只保留最大的 个奇异值,得到近似
文档的低维坐标通常取 ,它等于 ;词的载荷在 里。有些教材把词放在行上,这些角色就整个对调。所以读矩阵之前,先确认方向。
截断 SVD 是所有秩为 的矩阵中,平方重建误差最小的那个近似。看一个最简单的例子:
只保留奇异值 3,Frobenius 误差为 ,保留下来的平方奇异值占总量的 。注意这是未中心化矩阵的“能量”占比,不能随手叫做 PCA 的方差解释率——两者只有在先中心化的情况下才是一回事。
LSA 就是用这种低秩结构给文档和词建立潜在表示。它的坐标可以是负数,不是主题概率。
3. NMF:只允许非负部件相加
常用的目标是 。 的每一行是一个主题在各个词上的权重, 的每一行说明一篇文档由哪些主题、按多大分量组合而成。
例1:
第一篇只用了第一个部件,第二篇只用了第二个,第三篇两者兼有。因为不能出现负数,部件之间只能叠加、不能抵消,这正是 NMF 的结果往往比 LSA 更好解释的原因。
两点要注意。第一,非负不等于全为正,矩阵里可以有 0。第二,NMF 的权重并不天然加起来等于 1;展示时可以另外归一化,但这样并不会把它变成概率生成模型。
NMF 的解也不唯一:把 的某一列乘以常数 ,再把 对应的行除以 ,乘积不变;主题的先后顺序也可以任意调换。所以比较两次运行的结果时,不能按坐标逐个硬比。
4. pLSA:每个词都出自某个主题
记 为文档 中主题 的比例, 为主题 生成词 的概率,则
每个词具体来自哪个主题是看不见的,所以用 EM 算法反复估计。E 步计算“文档 里的词 来自主题 ”的后验概率,也叫责任度:
例2: 某文档的主题混合为 ,词 cat 在两个主题下的概率分别为 和 。两个主题的贡献分别是 和 ,归一化后责任度为 。
M 步把“词频 × 责任度”当作软计数累加起来,再分别在每篇文档内对主题归一化、在每个主题内对词归一化,得到新的 和 。
pLSA 的 是每篇训练文档各自的参数,碰到一篇新文档时并没有现成的 可用。通常的做法是固定已学到的主题词分布 ,只为新文档再推断它的主题混合。
5. LDA:给主题混合加上先验
这里的 LDA 是潜在 Dirichlet 分配(Latent Dirichlet Allocation),不要和同样缩写为 LDA 的线性判别分析混淆。
LDA 设想文本是这样生成的:先为每个主题抽一个词分布 ;再为每篇文档抽一个主题混合 ;然后对文档里的每个位置,先按 抽一个主题 ,再按 抽一个词。 和 都服从 Dirichlet 先验,先验参数控制这些分布是集中还是分散。和 pLSA 相比,先验让新文档的主题混合也有了统一的来源。
用 collapsed Gibbs 采样训练时,每次拿出一个词元,按下式重新给它分配主题:
右上角的 表示所有计数都先把当前这个词元排除在外。三个计数依次是:这篇文档里已经分给主题 的词元数;主题 下这个词出现的次数;主题 下所有词的总数。第一个因子说“这篇文档偏爱哪个主题”,第二个因子说“哪个主题偏爱这个词”。
例3: 两个主题。排除当前词元后,该文档分给两个主题的词元数为 ;当前这个词在两个主题下的计数为 ;两个主题各自的总词元数为 ;词表大小 ,对称先验 。
两者之和为 ,归一化得 。Gibbs 采样要按这个分布随机抽一个主题,而不是每次都选概率最大的那个;后者是另一种优化过程,结果也不同。
主题数 是超参数,需要人来定。较小的文档主题先验 通常鼓励更稀疏的主题混合,词分布先验 则控制主题内部的词分布。但“稀疏”和“好解释”不是一回事。
6. PCA:先中心化,再找方差最大的方向
对数值特征,先把每一列减去它的均值,得到 。样本协方差矩阵为
最大特征值对应的单位特征向量就是第一主成分方向,后面的主成分依次取剩下的特征向量,彼此正交。如果各特征的量纲差别很大,还可以再除以各自的标准差。中心化是 PCA 必不可少的一步,是否标准化则看任务。
例4: 三个点 ,均值为 :
特征值为 2 和 0,第一主成分方向为 。三个点在这个方向上的投影是 。三个点本来就在一条直线上,所以一个方向就保留了全部方差。
主成分之间两两正交,但它们一般是原始特征的线性组合,并不与原来的坐标轴对齐,也不一定和某个原始特征垂直。
用在文本上还有一个现实问题:词矩阵绝大多数元素是 0,中心化后几乎每个元素都变成非零,稀疏性被破坏,内存和计算量都会暴涨。因此文本里通常直接对不中心化的矩阵做截断 SVD(也就是 LSA),而不是套用标准的 PCA。
7. 按需要的输出来选方法
想要紧凑的线性表示,可以先试 LSA;想要非负的、好解释的主题词部件,可以试 NMF;想要每篇文档的主题概率混合,可以考虑 LDA;对一般的数值特征做压缩,用 PCA。比较这些方法时,要把重建误差或似然、下游任务的效果和主题的可解释性放在一起看。
自测
1. D=100、V=5000、k=20,NMF 的两个矩阵各是多大?
是 , 是 。如果把矩阵写成“行是词、列是文档”,两个矩阵的尺寸和含义都要跟着转置。
2. LSA 里某篇文档的主题坐标是负数,是不是程序出错了?
不一定。SVD 得到的坐标本来就可以是负数,也不需要加起来等于 1,所以不能把它当作主题概率来读。
- 感谢你赐予我前进的力量

