约 35 分钟 · 需要矩阵乘法、特征向量与条件概率

读完你能: 核对矩阵维度;区分 LSA、pLSA、LDA 和 NMF;手算一次主题分配概率;解释 PCA 为什么要先中心化,以及稀疏文本为什么常用不中心化的截断 SVD。

1. 先把矩阵方向定下来

本章统一用 X∈RD×VX\in\mathbb R^{D\times V}:行是文档,列是词。格子里填原始计数还是 TF-IDF,取决于用哪种方法,每次都要说明。

方法 输入 输出怎么理解
LSA 计数或 TF-IDF 矩阵 低维的潜在方向,坐标可正可负
pLSA 词频(每次词出现看作一个事件) 每篇文档的主题混合、每个主题的词分布
LDA 通常是词频计数 同上,但给主题混合加了 Dirichlet 先验
NMF 非负矩阵 只能相加、不能相减的非负“部件”
PCA 中心化后的数值特征 方差最大的一组正交方向

“主题”是我们对结果的解读,不是模型自动找回来的真实标签。模型完全可能学到文体、模板或高频噪声,所以要逐个查看主题词、代表文档,并检查多次运行是否稳定。

2. SVD 与 LSA

任何矩阵都可以做奇异值分解:

X=UΣVT.X=U\Sigma V^{T}.

只保留最大的 kk 个奇异值,得到近似

X≈UkΣkVkT,Uk:D×k,Σk:k×k,VkT:k×V.X\approx U_k\Sigma_kV_k^{T},\qquad U_k:D\times k,\quad\Sigma_k:k\times k,\quad V_k^{T}:k\times V.

文档的低维坐标通常取 UkΣkU_k\Sigma_k,它等于 XVkXV_k;词的载荷在 VkV_k 里。有些教材把词放在行上,这些角色就整个对调。所以读矩阵之前,先确认方向。

截断 SVD 是所有秩为 kk 的矩阵中,平方重建误差最小的那个近似。看一个最简单的例子:

X=(3001),X1=(3000).X=\begin{pmatrix}3&0\\0&1\end{pmatrix},\qquad X_1=\begin{pmatrix}3&0\\0&0\end{pmatrix}.

只保留奇异值 3,Frobenius 误差为 ∥X−X1∥F=1\lVert X-X_1\rVert_F=1,保留下来的平方奇异值占总量的 9/(9+1)=90%9/(9+1)=90\%。注意这是未中心化矩阵的“能量”占比,不能随手叫做 PCA 的方差解释率——两者只有在先中心化的情况下才是一回事。

LSA 就是用这种低秩结构给文档和词建立潜在表示。它的坐标可以是负数,不是主题概率。

3. NMF:只允许非负部件相加

X≈WH,W∈R+D×k,H∈R+k×V.X\approx WH,\qquad W\in\mathbb R_+^{D\times k},\quad H\in\mathbb R_+^{k\times V}.

常用的目标是 min⁡W,H≥0∥X−WH∥F2\min_{W,H\ge0}\lVert X-WH\rVert_F^2。HH 的每一行是一个主题在各个词上的权重,WW 的每一行说明一篇文档由哪些主题、按多大分量组合而成。

例1:

W=(100111),H=(20100201),WH=(201002012211).W=\begin{pmatrix}1&0\\0&1\\1&1\end{pmatrix},\qquad H=\begin{pmatrix}2&0&1&0\\0&2&0&1\end{pmatrix},\qquad WH=\begin{pmatrix}2&0&1&0\\0&2&0&1\\2&2&1&1\end{pmatrix}.

第一篇只用了第一个部件,第二篇只用了第二个,第三篇两者兼有。因为不能出现负数,部件之间只能叠加、不能抵消,这正是 NMF 的结果往往比 LSA 更好解释的原因。

两点要注意。第一,非负不等于全为正,矩阵里可以有 0。第二,NMF 的权重并不天然加起来等于 1;展示时可以另外归一化,但这样并不会把它变成概率生成模型。

NMF 的解也不唯一:把 WW 的某一列乘以常数 cc,再把 HH 对应的行除以 cc,乘积不变;主题的先后顺序也可以任意调换。所以比较两次运行的结果时,不能按坐标逐个硬比。

4. pLSA:每个词都出自某个主题

记 θdk=P(z=k∣d)\theta_{dk}=P(z=k\mid d) 为文档 dd 中主题 kk 的比例,ϕkw=P(w∣z=k)\phi_{kw}=P(w\mid z=k) 为主题 kk 生成词 ww 的概率,则

P(w∣d)=∑k=1Kθdkϕkw,∑kθdk=1,∑wϕkw=1.P(w\mid d)=\sum_{k=1}^{K}\theta_{dk}\phi_{kw},\qquad \sum_k\theta_{dk}=1,\quad\sum_w\phi_{kw}=1.

每个词具体来自哪个主题是看不见的,所以用 EM 算法反复估计。E 步计算“文档 dd 里的词 ww 来自主题 kk”的后验概率,也叫责任度:

rdwk=θdkϕkw∑jθdjϕjw.r_{dwk}=\frac{\theta_{dk}\phi_{kw}}{\sum_j\theta_{dj}\phi_{jw}}.

例2: 某文档的主题混合为 (0.75,0.25)(0.75,0.25),词 cat 在两个主题下的概率分别为 0.40.4 和 0.10.1。两个主题的贡献分别是 0.75×0.4=0.30.75\times0.4=0.3 和 0.25×0.1=0.0250.25\times0.1=0.025,归一化后责任度为 (0.3,0.025)/0.325=(12/13,1/13)(0.3,0.025)/0.325=(12/13,1/13)。

M 步把“词频 × 责任度”当作软计数累加起来,再分别在每篇文档内对主题归一化、在每个主题内对词归一化,得到新的 θ\theta 和 ϕ\phi。

pLSA 的 θd\theta_d 是每篇训练文档各自的参数,碰到一篇新文档时并没有现成的 θ\theta 可用。通常的做法是固定已学到的主题词分布 ϕ\phi,只为新文档再推断它的主题混合。

5. LDA:给主题混合加上先验

这里的 LDA 是潜在 Dirichlet 分配(Latent Dirichlet Allocation),不要和同样缩写为 LDA 的线性判别分析混淆。

LDA 设想文本是这样生成的:先为每个主题抽一个词分布 ϕk\phi_k;再为每篇文档抽一个主题混合 θd\theta_d;然后对文档里的每个位置,先按 θd\theta_d 抽一个主题 zz,再按 ϕz\phi_z 抽一个词。θ\theta 和 ϕ\phi 都服从 Dirichlet 先验,先验参数控制这些分布是集中还是分散。和 pLSA 相比,先验让新文档的主题混合也有了统一的来源。

用 collapsed Gibbs 采样训练时,每次拿出一个词元,按下式重新给它分配主题:

P(zi=k∣z−i,w)∝(ndk−i+αk)nkw−i+ηwnk−i+∑vηv.P(z_i=k\mid z_{-i},w)\propto (n_{dk}^{-i}+\alpha_k)\frac{n_{kw}^{-i}+\eta_w}{n_k^{-i}+\sum_v\eta_v}.

右上角的 −i-i 表示所有计数都先把当前这个词元排除在外。三个计数依次是:这篇文档里已经分给主题 kk 的词元数;主题 kk 下这个词出现的次数;主题 kk 下所有词的总数。第一个因子说“这篇文档偏爱哪个主题”,第二个因子说“哪个主题偏爱这个词”。

例3: 两个主题。排除当前词元后,该文档分给两个主题的词元数为 (2,1)(2,1);当前这个词在两个主题下的计数为 (1,0)(1,0);两个主题各自的总词元数为 (5,4)(5,4);词表大小 V=4V=4,对称先验 α=η=1\alpha=\eta=1。

s1=(2+1)1+15+4=23,s2=(1+1)0+14+4=14.s_1=(2+1)\frac{1+1}{5+4}=\frac23,\qquad s_2=(1+1)\frac{0+1}{4+4}=\frac14.

两者之和为 11/1211/12,归一化得 (8/11,3/11)(8/11,3/11)。Gibbs 采样要按这个分布随机抽一个主题,而不是每次都选概率最大的那个;后者是另一种优化过程,结果也不同。

主题数 KK 是超参数,需要人来定。较小的文档主题先验 α\alpha 通常鼓励更稀疏的主题混合,词分布先验 η\eta 则控制主题内部的词分布。但“稀疏”和“好解释”不是一回事。

6. PCA:先中心化,再找方差最大的方向

对数值特征,先把每一列减去它的均值,得到 XcX_c。样本协方差矩阵为

C=1D−1XcTXc.C=\frac{1}{D-1}X_c^{T}X_c.

CC 最大特征值对应的单位特征向量就是第一主成分方向,后面的主成分依次取剩下的特征向量,彼此正交。如果各特征的量纲差别很大,还可以再除以各自的标准差。中心化是 PCA 必不可少的一步,是否标准化则看任务。

例4: 三个点 (1,1),(2,2),(3,3)(1,1),(2,2),(3,3),均值为 (2,2)(2,2):

Xc=(−1−10011),C=12(2222)=(1111).X_c=\begin{pmatrix}-1&-1\\0&0\\1&1\end{pmatrix},\quad C=\frac{1}{2}\begin{pmatrix}2&2\\2&2\end{pmatrix}=\begin{pmatrix}1&1\\1&1\end{pmatrix}.

特征值为 2 和 0,第一主成分方向为 (1,1)/2(1,1)/\sqrt2。三个点在这个方向上的投影是 (−2,0,2)(-\sqrt2,0,\sqrt2)。三个点本来就在一条直线上,所以一个方向就保留了全部方差。

主成分之间两两正交,但它们一般是原始特征的线性组合,并不与原来的坐标轴对齐,也不一定和某个原始特征垂直。

用在文本上还有一个现实问题:词矩阵绝大多数元素是 0,中心化后几乎每个元素都变成非零,稀疏性被破坏,内存和计算量都会暴涨。因此文本里通常直接对不中心化的矩阵做截断 SVD(也就是 LSA),而不是套用标准的 PCA。

7. 按需要的输出来选方法

想要紧凑的线性表示,可以先试 LSA;想要非负的、好解释的主题词部件,可以试 NMF;想要每篇文档的主题概率混合,可以考虑 LDA;对一般的数值特征做压缩,用 PCA。比较这些方法时,要把重建误差或似然、下游任务的效果和主题的可解释性放在一起看。

自测

1. D=100、V=5000、k=20,NMF 的两个矩阵各是多大?

WW 是 100×20100\times20,HH 是 20×500020\times5000。如果把矩阵写成“行是词、列是文档”,两个矩阵的尺寸和含义都要跟着转置。

2. LSA 里某篇文档的主题坐标是负数,是不是程序出错了?

不一定。SVD 得到的坐标本来就可以是负数,也不需要加起来等于 1,所以不能把它当作主题概率来读。