上一篇 MF/FM 桥接文章展示了如何将矩阵分解应用于推荐系统的评分预测。本篇揭示一个更深层的联系:词嵌入(word embedding)——看起来和矩阵分解毫无关系的神经网络方法——本质上也是在分解一个矩阵。
2013 年,Mikolov 等人提出 Word2Vec,通过简单的神经网络在大规模语料上训练出的词向量展现出惊人的语义算术能力:king−man+woman≈queen。这个结果轰动了 NLP 领域,但也留下了一个根本问题:Word2Vec 到底在做什么?为什么一个简单的浅层网络能学到如此丰富的语义关系?
2014 年,Levy 和 Goldberg 在 NeurIPS 论文中给出了一个优雅的回答:Word2Vec 的 skip-gram with negative sampling(SGNS)模型,本质上在隐式分解一个偏移 PMI 矩阵。 词向量 wi 和上下文向量 cj 的内积,趋向于逼近这两个词的逐点互信息(Pointwise Mutual Information, PMI)减去一个常数(见 Levy & Goldberg, 2014)。
同年,Pennington 等人提出 GloVe,走的是显式的路:直接构造共现矩阵,然后分解它的对数。两条路——一条隐式、一条显式——殊途同归,指向同一个数学真相:词嵌入 = 某种共现统计矩阵的低秩分解。
这篇文章属于 Part 1 “拆” 的应用阶段,展示矩阵分解如何以意想不到的方式出现在 NLP 的核心方法中。与 Art. 3 SVD 和 Art. 6 PCA 建立的工具直接相关。
背景:从共现计数到词向量
分布式假说
词嵌入的理论基础是分布式假说(distributional hypothesis, Firth 1957):
“You shall know a word by the company it keeps.”
一个词的含义由它的上下文决定。
如果两个词经常出现在相似的上下文中,它们的含义相近。这个假说把语义相似性转化为共现统计的相似性——一个可以用矩阵精确表达的概念。
共现矩阵
给定一个词汇表 V(大小 ∣V∣=V)和一个上下文窗口大小 L,我们可以构造词-上下文共现矩阵 X∈RV×V:
Xij=#(wi,cj)
其中 #(wi,cj) 是词 wi 和上下文词 cj 在窗口内共同出现的次数。
关键观察:这个矩阵是巨大的(V 通常在 105 到 106 量级),但它的有效秩远小于 V——因为语义空间的维度远低于词汇量。这正是低秩矩阵分解的用武之地。
传统方法:显式矩阵 → SVD
在 Word2Vec 之前,NLP 中的词向量方法遵循一条清晰的路线:
- 构造共现矩阵 X
- 做某种变换(TF-IDF、PPMI 等)
- 对变换后的矩阵做 SVD(Art. 3),截断到 k 维
- 用 UkΣk1/2 或 UkΣk 作为词向量
这就是经典的 LSA(Latent Semantic Analysis) 路线。它的问题是:V×V 的矩阵太大,SVD 的 O(V2k) 复杂度难以承受。
Word2Vec 的贡献在于:绕过了显式矩阵构造和 SVD,直接通过 SGD 学到了等效的分解结果。
Word2Vec:Skip-Gram with Negative Sampling
Skip-Gram 模型
Skip-gram 模型的目标是:给定一个中心词 wi,预测它在上下文窗口内出现的上下文词 cj。
模型为每个词分配两个向量:
- 词向量 wi∈Rd(作为中心词时使用)
- 上下文向量 cj∈Rd(作为上下文词时使用)
预测概率用 softmax 定义:
P(cj∣wi)=∑c∈Vexp(wiTc)exp(wiTcj)
逐项理解:
- wiTcj:中心词向量与上下文向量的内积,衡量词对的”亲密程度”
- 分母 ∑c∈Vexp(wiTc):在整个词汇表上归一化,计算代价 O(V)
训练目标是最大化语料库中所有观测到的词-上下文对的对数似然:
L=∑(wi,cj)∈DlogP(cj∣wi)
负采样(Negative Sampling, NEG)
Softmax 的分母需要遍历整个词汇表,这在 V∼105 时极其昂贵。Mikolov 等人在 第二篇论文 中提出负采样(Negative Sampling)来近似这个目标。
核心思想:不再计算完整的 softmax,而是将问题转化为二分类——区分真正的词-上下文对(正样本)和随机采样的噪声对(负样本)。
对于一个真实的词-上下文对 (wi,cj),SGNS 的目标函数是:
ℓ(wi,cj)=logσ(wiTcj)+k⋅EcN∼PD[logσ(−wiTcN)]
逐项理解:
- σ(x)=1+e−x1:sigmoid 函数
- logσ(wiTcj):正样本项——鼓励真实词-上下文对的内积变大(σ 值趋向 1)
- k⋅EcN∼PD[logσ(−wiTcN)]:负样本项——从噪声分布 PD 中采样 k 个负上下文,鼓励噪声对的内积变小(σ(−x) 趋向 1 意味着 x 趋向 −∞)
- k:负样本数(通常 k=5 到 20)
- PD(c)=∑c′#(c′)3/4#(c)3/4:噪声分布,按词频的 3/4 次方采样(比均匀分布更偏向高频词,但比纯频率分布更平滑)
整个语料的训练目标是对所有观测到的词-上下文对求和:
LSGNS=∑(wi,cj)∈D#(wi,cj)⋅ℓ(wi,cj)
训练通过 SGD(随机梯度下降)在语料上滑动窗口在线完成——从不需要构造任何矩阵。
SGNS 的隐式矩阵分解路径
从语料到词向量:SGD 训练隐式地分解了偏移 PMI 矩阵
Levy & Goldberg 的核心定理:SGNS = 隐式矩阵分解
定理陈述
Levy 和 Goldberg (2014) 的核心结果是以下定理(见 Levy & Goldberg, 2014, Section 3):
定理:当 skip-gram with negative sampling(SGNS)的向量维度 d 足够大(即 d≥rank(M))时,SGNS 的全局最优解满足:
wiTcj=PMI(wi,cj)−logk
其中 PMI 是逐点互信息(Pointwise Mutual Information),k 是负采样数。
用矩阵语言表述:定义矩阵 M∈RV×V,其元素为:
Mij=PMI(wi,cj)−logk
则 SGNS 的训练目标等价于将 M 分解为两个低秩矩阵的乘积:
M≈WCT
其中 W∈RV×d 是词向量矩阵(第 i 行是 wiT),C∈RV×d 是上下文向量矩阵(第 j 行是 cjT)。
PMI 的定义与直觉
逐点互信息(Pointwise Mutual Information, PMI)衡量两个事件的共现是否超出随机预期:
PMI(wi,cj)=logP(wi)⋅P(cj)P(wi,cj)
逐项理解:
- P(wi,cj)=∣D∣#(wi,cj):词 wi 和上下文 cj 的共现概率(∣D∣ 是总词-上下文对数)
- P(wi)=∣D∣#(wi):词 wi 的边缘概率
- P(cj)=∣D∣#(cj):上下文 cj 的边缘概率
- 分数 P(wi)P(cj)P(wi,cj):实际共现概率与独立假设下期望共现概率的比值
PMI 的值有三种情况:
- PMI>0:共现超出随机预期——这两个词有正相关(如 “king” 和 “throne”)
- PMI=0:共现等于随机预期——两个词统计独立
- PMI<0:共现低于随机预期——两个词有负相关(如 “king” 和 “meow”)
因此,PMI 矩阵编码了词汇表中所有词对之间的统计关联强度。偏移 −logk 将矩阵整体下移,相当于更严格的关联阈值。
完整推导
下面给出 Levy & Goldberg 定理的完整推导。这个推导的关键步骤是:将 SGNS 的目标函数从”对语料中每个词-上下文对求和”转化为”对矩阵中每个格子的独立优化”。
第一步:重写目标函数为矩阵元素级别。
SGNS 在整个语料上的目标函数可以写为:
L=∑(wi,cj)∈D[#(wi,cj)⋅logσ(wiTcj)+k⋅#(wi)⋅PD(cj)⋅logσ(−wiTcj)]
其中第二项来自负采样的期望:对于中心词 wi 出现的每一次(共 #(wi) 次),我们从 PD 中采样 k 个负上下文。当语料足够大时,采样的期望等价于:
k⋅#(wi)⋅PD(cj)=k⋅#(wi)⋅∣D∣#(cj)
注意:这里为了推导简洁,我们假设 PD(cj)=∣D∣#(cj)(即 unigram 分布),而非实际使用的 3/4 次方平滑。Levy & Goldberg 在论文中指出,3/4 次方平滑不影响定理的形式,只改变 PMI 中边缘概率的估计。
现在,关键的观察是:L 可以按词-上下文对 (i,j) 拆分为独立项:
L=∑i=1V∑j=1Vℓij
其中:
ℓij=#(wi,cj)⋅logσ(xij)+k⋅∣D∣#(wi)⋅#(cj)⋅logσ(−xij)
这里 xij=wiTcj 是我们要优化的变量。
第二步:对单个矩阵元素 xij 求最优。
固定 (i,j),ℓij 是 xij 的函数。为简洁起见,令 a=#(wi,cj),b=k⋅∣D∣#(wi)⋅#(cj),则:
ℓij(x)=a⋅logσ(x)+b⋅logσ(−x)
对 x 求导。利用 σ′(x)=σ(x)(1−σ(x)) 和 σ(−x)=1−σ(x):
dxdℓij=a⋅σ(x)σ′(x)+b⋅σ(−x)−σ′(x)
=a⋅(1−σ(x))−b⋅σ(x)
=a−aσ(x)−bσ(x)
=a−(a+b)σ(x)
令导数为零:
a−(a+b)σ(x∗)=0
σ(x∗)=a+ba
由于 σ(x)=1+e−x1,所以 σ(x)=p 意味着 x=log1−pp(logit 函数)。因此:
x∗=logb/(a+b)a/(a+b)=logba
第三步:代入 a 和 b 的定义。
xij∗=logba=logk⋅∣D∣#(wi)⋅#(cj)#(wi,cj)
=log#(wi)⋅#(cj)#(wi,cj)⋅∣D∣−logk
=logP(wi)⋅P(cj)P(wi,cj)−logk
xij∗=wiTcj=PMI(wi,cj)−logk
推导完毕。 SGNS 的最优解使得词向量和上下文向量的内积恰好等于偏移 PMI。
推导的含义
这个推导揭示了几个深刻的事实:
-
Word2Vec 不是在”学习语义”——它是在分解一个统计矩阵。 词向量的语义性质(如类比关系)是 PMI 矩阵结构的反映,不是神经网络的”智慧”。
-
Mij=PMI(wi,cj)−logk 是一个 V×V 的矩阵,但它从未被显式构造。 这就是”隐式分解”的含义——SGD 在语料上滑动窗口,每次只更新涉及到的词对,最终逼近了对这个巨大矩阵的低秩分解。
-
维度 d 的选择决定了近似的秩。 当 d<rank(M) 时,SGNS 实际上在做 M 的秩-d 近似——类似于截断 SVD(Art. 3 SVD),但不保证是 Frobenius 范数下的最优近似(因为 SGD 优化的不是 Frobenius 范数)。
-
负采样数 k 的角色是偏移量。 增大 k 相当于整体下移 PMI 矩阵,使更多”弱正相关”的词对变成负值——这增加了模型对真正强相关词对的辨别力。
SPPMI:实践中的显式版本
Levy 和 Goldberg 在 后续工作 中提出了 SGNS 的显式矩阵对应物——SPPMI(Shifted Positive PMI)矩阵:
SPPMIk(wi,cj)=max(PMI(wi,cj)−logk,0)
将 PMI 中的负值截断为零(因为负 PMI 表示”比随机还不常共现”,信息量有限)。然后对 SPPMI 矩阵做 SVD:
SPPMI≈UdΣdVdT
Levy 等人在 2015 年的对比实验中发现:当超参数仔细对齐时,SPPMI + SVD 的效果与 Word2Vec 相当甚至更好(见 Levy, Goldberg & Dagan, 2015)。这进一步证实了”词嵌入 = 矩阵分解”的核心论点。
PMI 矩阵可视化
下面的交互组件展示一个 8 词 × 8 上下文的 PMI 矩阵。正值(蓝色)表示词和上下文的共现超出随机预期,负值(红色)表示低于预期。可以切换到秩-2 近似(模拟词向量的低秩分解)和近似误差视图。
PMI 矩阵热力图
8 个词 × 8 个上下文的逐点互信息矩阵
观察几个关键特征:
-
块结构:语义相关的词形成高 PMI 的”块”——“king/queen” 与 “royal/throne” 的交叉区域为深蓝色,“paris/berlin” 与 “capital/city” 的交叉区域也是。这就是词向量能捕获语义聚类的原因。
-
低秩可近似性:切换到秩-2 近似后,主要的块结构被保留——两个二维向量就能大致编码”皇室-性别”和”城市-国家”两条语义轴。这就是为什么词向量维度远小于词汇量就够用。
-
误差分布:近似误差集中在块的边缘和跨块区域——这些是需要更多维度才能精确编码的细微语义关系。
GloVe:显式矩阵分解路线
动机:从共现矩阵出发
GloVe(Global Vectors)由 Pennington, Socher 和 Manning 于 2014 年提出(见 Pennington et al., 2014)。与 Word2Vec 从神经网络出发不同,GloVe 直接从全局共现统计出发设计目标函数。
GloVe 的出发点是一个观察:词义的区分信息隐含在共现概率的比值中,而非绝对共现概率中。
考虑两个词 “ice”(冰)和 “steam”(蒸汽),以及几个探测上下文词(probe words):
| 探测词 ck | P(ck∣ice) | P(ck∣steam) | 比值 |
|---|
| solid | 高 | 低 | ≫1 |
| gas | 低 | 高 | ≪1 |
| water | 高 | 高 | ≈1 |
| fashion | 低 | 低 | ≈1 |
共现概率的比值 P(ck∣steam)P(ck∣ice) 比绝对概率更具区分力:与 “ice” 特别相关的词(solid)比值 ≫1,与 “steam” 特别相关的词(gas)比值 ≪1,与两者都相关或都无关的词比值 ≈1。
GloVe 目标函数
GloVe 的目标是让词向量的内积直接拟合共现计数的对数。对于共现矩阵 X,其中 Xij=#(wi,cj),GloVe 最小化:
LGloVe=∑i,j=1Vf(Xij)(wiTw~j+bi+b~j−logXij)2
逐项理解:
- wi∈Rd:词 wi 的词向量
- w~j∈Rd:词 cj 的上下文向量(GloVe 论文用 w~ 表示)
- bi,b~j∈R:词和上下文的偏置项(bias),吸收边缘频率的影响
- logXij:共现计数的对数——这就是 GloVe 要分解的”矩阵”
- f(Xij):加权函数,降低低频共现(噪声大)和极高频共现(如停用词)的影响
加权函数 f 的具体形式为:
f(x)={(x/xmax)α1if x<xmaxotherwise
通常 xmax=100,α=3/4。
GloVe 的矩阵分解视角
将 GloVe 的目标用矩阵语言重写。定义:
- 目标矩阵 Y∈RV×V,Yij=logXij
- 词向量矩阵 W∈RV×d
- 上下文向量矩阵 W~∈RV×d
- 偏置向量 b,b~∈RV
- 权重矩阵 F∈RV×V,Fij=f(Xij)
则 GloVe 的目标是:
minW,W~,b,b~∑i,jFij([WW~T]ij+bi+b~j−Yij)2
这就是一个加权的低秩矩阵分解问题——分解对象是 logX 矩阵,允许偏置项(吸收行列效应),权重 F 处理异方差噪声。
和标准的矩阵分解(Art. 10 MF)对比:
r^ui=μ+bu+bi+puTqi(MF)
wiTw~j+bi+b~j≈logXij(GloVe)
结构完全相同:低秩内积 + 偏置。区别仅在于分解的对象不同(评分矩阵 vs 共现对数矩阵)和权重方案不同。
GloVe 与 PMI 的关系
GloVe 拟合 logXij,Word2Vec 隐式分解的是 PMI−logk。两者是什么关系?
将 PMI 展开:
PMI(wi,cj)=logP(wi)P(cj)P(wi,cj)=logP(wi,cj)−logP(wi)−logP(cj)
=logXij−logXi−logXj+log∣D∣
其中 Xi=#(wi)=∑jXij,Xj=#(cj)=∑iXij,∣D∣=∑ijXij。
因此:
PMI(wi,cj)=logXij−可被偏置项 bi+b~j 吸收(logXi+logXj−log∣D∣)
如果 GloVe 的偏置项 bi 学到了 −logXi+21log∣D∣,b~j 学到了 −logXj+21log∣D∣,那么:
wiTw~j≈logXij−bi−b~j=PMI(wi,cj)
因此:GloVe 的偏置项吸收了边缘频率,词向量内积逼近的实际上也是 PMI。 两种方法最终分解的是同一个矩阵。
隐式 vs 显式:对比与统一
下图对比 Word2Vec(隐式)和 GloVe(显式)的两条路径——它们从不同方向出发,最终分解的是同一个共现统计矩阵。
核心对比
| 维度 | Word2Vec (SGNS) | GloVe |
|---|
| 分解的矩阵 | Mij=PMI(wi,cj)−logk | Yij=logXij(加偏置后等效 PMI) |
| 矩阵是否显式构造 | 否(隐式,从不存储完整矩阵) | 是(需要构造 X 矩阵) |
| 优化方式 | SGD,在线学习(每次处理一个词-上下文对) | 全局优化(需要完整共现统计) |
| 时间复杂度 | 与语料大小、k、d 成正比 | 与非零共现数、d、迭代次数成正比 |
| 空间复杂度 | O(V⋅d)(只存词向量) | 需额外存共现矩阵 |
| 加权方式 | 自然加权(高频词对出现在更多训练样本中) | 显式加权函数 f(Xij) |
| 偏置项 | 无显式偏置(偏移 −logk 整体均匀) | 显式偏置 bi+b~j |
数学本质的统一
尽管实现路径不同,两者的数学本质相同:
Word2Vec: wiTcj≈PMI(wi,cj)−logk
GloVe: wiTw~j+bi+b~j≈logXij⟺wiTw~j≈PMI(wi,cj)
两种方法都在做共现统计矩阵的低秩分解。Levy, Goldberg 和 Dagan (2015) 的对比实验表明,当超参数(窗口大小、向量维度、负采样数等)仔细对齐时,两者的下游任务表现非常接近。
殊途同归的启示
这个统一揭示了一个更普遍的模式:很多 ML 方法的本质是矩阵分解,即使它们的表面形式看起来完全不同。
在 Part 1 的方法谱系中:
SVD+非负NMF+偏置MF+隐式Word2Vec
Word2Vec 可以被放在这条谱系的最远端——它不仅引入了特殊的矩阵(PMI),还完全隐藏了矩阵分解的过程。但核心数学不变:将一个大矩阵分解为两个低秩因子的乘积。
数值例子:从共现到 PMI 到分解
用一个微型语料来完整展示从原始文本到 PMI 矩阵到低秩分解的全过程。
微型语料(4 个句子,窗口大小 L=1,即只看相邻词):
- “the cat sat”
- “the dog sat”
- “the cat ran”
- “a dog ran”
词汇表:V={the, a, cat, dog, sat, ran},V=6。
第一步:构造共现矩阵 X
统计相邻词对(L=1,对称计数):
| the | a | cat | dog | sat | ran |
|---|
| the | 0 | 0 | 2 | 1 | 0 | 0 |
| a | 0 | 0 | 0 | 1 | 0 | 0 |
| cat | 2 | 0 | 0 | 0 | 1 | 1 |
| dog | 1 | 1 | 0 | 0 | 1 | 1 |
| sat | 0 | 0 | 1 | 1 | 0 | 0 |
| ran | 0 | 0 | 1 | 1 | 0 | 0 |
总共现对数 ∣D∣=∑ijXij=14。
第二步:计算 PMI
以 PMI(cat,the) 为例:
P(cat,the)=142≈0.143
P(cat)=14∑jXcat,j=142+0+0+0+1+1=144≈0.286
P(the)=14∑jXthe,j=140+0+2+1+0+0=143≈0.214
PMI(cat,the)=log0.286×0.2140.143=log0.06120.143=log2.333≈0.847
用 k=1(负采样数 = 1),偏移 PMI:Mij=PMI(wi,cj)−log1=PMI(wi,cj)。
第三步:低秩分解
如果我们对这个 6×6 的 PMI 矩阵做秩-2 SVD 截断,得到的词向量 wi∈R2 会将语义相似的词映射到相近的位置:“cat” 和 “dog” 的向量相近(它们共享相似的上下文 “sat”, “ran”),“sat” 和 “ran” 的向量相近(它们共享相似的上下文 “cat”, “dog”)。
这就是词向量捕获语义关系的数学机制:PMI 矩阵中的统计模式,通过低秩分解被压缩到稠密向量中。
方法谱系中的位置
在 Part 1 建立的方法谱系中,Word2Vec 和 GloVe 占据一个独特的位置——它们是从 NLP 任务倒推出来的矩阵分解:
| 方法 | 分解的矩阵 | 约束 | 优化方式 |
|---|
| SVD(Art. 3 SVD) | 任意 A | 正交因子 | 封闭解 |
| PCA(Art. 6 PCA) | 协方差 n1XTX | 正交、方差最大化 | 封闭解 |
| NMF(Art. 9 NMF) | 非负 A | W,H≥0 | 乘法更新 |
| MF(Art. 10 MF/FM) | 评分矩阵 | 偏置项 | SGD |
| Word2Vec | PMI−logk | 低秩 | SGD(隐式) |
| GloVe | logX | 加权 + 偏置 | SGD(显式) |
每种方法分解的矩阵不同、约束不同、优化方式不同——但核心操作相同:将一个大矩阵分解为两个低秩因子的乘积。
Word2Vec 的”隐式矩阵分解”范式深远地影响了后续的表示学习方法。
图嵌入
Part 2 Art. 19(随机游走与图嵌入) 将展示:DeepWalk 和 Node2Vec 本质上是图转移矩阵的隐式分解——它们在图上做随机游走,产生”节点-上下文”序列,然后用 Word2Vec 训练节点向量。这与本文的 Word2Vec 分析直接对应。
文本表示路径
Word2Vec 和 GloVe 是静态词向量的代表方法。它们的局限在于:每个词只有一个向量,无法处理一词多义。后来的 ELMo → BERT → GPT 系列引入了上下文相关的动态表示(contextual embeddings),但底层的矩阵运算——乘法、低秩结构、注意力矩阵——仍然与本路径 Part 3 的分析直接相关。
总结与展望
本文揭示了词嵌入方法的矩阵分解本质——这是 Part 1 “拆” 的一个精彩应用:矩阵分解以意想不到的方式出现在 NLP 的核心方法中。
关键要点:
- Levy & Goldberg 定理:Word2Vec (SGNS) 的全局最优解满足 wiTcj=PMI(wi,cj)−logk,即隐式分解了偏移 PMI 矩阵
- 推导的核心步骤:将 SGNS 的目标函数按词-上下文对拆分为独立优化 → 每个元素的最优解 → 代入统计量 → 得到 PMI
- GloVe 显式分解 logXij:加偏置后等效于分解 PMI 矩阵
- 殊途同归:隐式(SGD 在线)和显式(全局矩阵分解)指向同一个数学真相——词嵌入 = 共现统计矩阵的低秩分解
- SPPMI + SVD ≈ Word2Vec:超参数对齐后,传统矩阵分解方法与神经网络方法效果相当
方法谱系中的位置:
SVD(无约束)+偏置MF+隐式Word2Vec/GloVe
Word2Vec 是矩阵分解谱系中离 SVD 最远的一员——它完全隐藏了矩阵的存在。但 Levy & Goldberg 的分析让矩阵重新浮出水面,证明矩阵分解是理解词嵌入的正确框架。
下一篇我们转向 Robust PCA——当数据矩阵不仅有低秩结构,还混入了稀疏的大幅度异常时,如何将两者干净地分离。