词向量(Word Vectors)

1.词向量与 Word2Vec

1.1 为什么需要词向量?

传统 one-hot 编码的问题:

"hotel" = [0, 0, 1, 0, ..., 0]  ← V 维,只有一个 1
"motel" = [0, 0, 0, 1, ..., 0]  ← V 维,另一个 1

"hotel" · "motel" = 0   ← 完全无关!

任意两个 one-hot 向量的点积都是 0——学习算法无法从"hotel"推广到"motel"。

解决方案:将词表示为稠密、低维的实数向量(如 300 维),语义相近的词在向量空间中距离近。

1.2 分布语义学 (Distributional Semantics)

“You shall know a word by the company it keeps.” — J.R. Firth (1957)

一个词的意义由它周围频繁出现的词决定。在一个固定大小的上下文窗口内,意义相近的词往往有相似的上下文分布。

1.3 Word2Vec 框架 (Mikolov et al., 2013)

Word2Vec是一种学习词向量的方法

Word2Vec 的核心理念:

  1. 语料库 (Corpus):我们有一个大规模文本语料——就是一长串词的序列。

  2. 向量表示:固定词表中的每个词,用一个稠密向量来表示。

  3. 滑动窗口:遍历文本中每个位置 ttt,在当前位置有:

    • 一个中心词 ccc

    • 窗口内的上下文词 ooo

  4. 用相似度算概率:用中心词向量和上下文词向量的相似度(点积),计算 P(o∣c)P(o \mid c)P(oc),即看到中心词 ccc 时,预测上下文词 ooo 的概率:

    P(o∣c)=exp⁡(uoTvc)∑w∈Vexp⁡(uwTvc)P(o \mid c) = \frac{\exp(u_o^T v_c)}{\sum_{w \in V} \exp(u_w^T v_c)}P(oc)=wVexp(uwTvc)exp(uoTvc)

  5. 最大化概率:不断调整词向量,使整个语料库上所有中心词-上下文对的概率最大:

max⁡∑t∑o∈context(t)log⁡P(o∣ct)\max \sum_t \sum_{o \in \text{context}(t)} \log P(o \mid c_t)maxtocontext(t)logP(oct)

两种架构:

架构 任务 特点
Skip-gram (SG) 给定中心词 ccc,预测上下文词 ooo 对罕见词效果好
CBOW (Continuous Bag of Words) 给定上下文词,预测中心词 训练更快,对常见词更好

每个词有两个 ddd 维向量

  • vw\mathbf{v}_wvw:当 www 作为中心词 (center word)

  • uw\mathbf{u}_wuw:当 www 作为上下文词/外部词 (context/outside word)

参数总量:θ∈R2dV\theta \in \mathbb{R}^{2dV}θR2dVddd 为向量维度,VVV 为词表大小。

1.4 Skip-gram 目标函数

对于文本中的每个位置 t=1,…,Tt=1,\ldots,Tt=1,,T,以 wtw_twt 为中心预测窗口大小 mmm 内的上下文词:

似然函数 (Likelihood)

L(θ)=∏t=1T∏−m≤j≤mj≠0P(wt+j∣wt;θ)L(\theta) = \prod_{t=1}^{T} \prod_{\substack{-m \leq j \leq m \\ j \neq 0}} P(w_{t+j} \mid w_t; \theta)L(θ)=t=1Tmjmj=0P(wt+jwt;θ)

目标函数 — 平均负对数似然:

J(θ)=−1Tlog⁡L(θ)=−1T∑t=1T∑−m≤j≤mj≠0log⁡P(wt+j∣wt;θ)J(\theta) = -\frac{1}{T} \log L(\theta) = -\frac{1}{T} \sum_{t=1}^{T} \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \log P(w_{t+j} \mid w_t; \theta)J(θ)=T1logL(θ)=T1t=1Tmjmj=0logP(wt+jwt;θ)

最小化 J(θ)J(\theta)J(θ)   ⟺  \iff 最大化预测准确率。取平均是为了让不同长度的文本具有可比性。

1.5 Softmax 概率

P(o∣c)=exp⁡(uo⊤vc)∑w∈Vexp⁡(uw⊤vc)P(o \mid c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_{w \in V} \exp(\mathbf{u}_w^\top \mathbf{v}_c)}P(oc)=wVexp(uwvc)exp(uovc)

  • 点积 uo⊤vc\mathbf{u}_o^\top \mathbf{v}_cuovc:衡量中心词和上下文词的相似度

  • 指数 exp⁡\expexp:确保概率为正

  • 分母:在整个词表上归一化,产出合法概率分布

Softmax 函数Rn\mathbb{R}^nRn 映射到 (0,1)n(0,1)^n(0,1)n 的概率单纯形:

softmax(x)i=exp⁡(xi)∑j=1nexp⁡(xj)\text{softmax}(\mathbf{x})_i = \frac{\exp(x_i)}{\sum_{j=1}^{n} \exp(x_j)}softmax(x)i=j=1nexp(xj)exp(xi)

  • “max”:放大最大输入的概率

  • “soft”:仍给较小输入分配一定概率(相比 hardmax)

  • 在深度学习中频繁使用


2.优化方法:梯度下降

2.1 基本概念

目标:找到最小化 J(θ)J(\theta)J(θ) 的参数 θ\thetaθ

梯度 ∇θJ(θ)\nabla_\theta J(\theta)θJ(θ) 指向函数值增长最快的方向。参数沿负梯度方向更新:

θnew=θold−α⋅∇θJ(θ)\theta^{\text{new}} = \theta^{\text{old}} - \alpha \cdot \nabla_\theta J(\theta)θnew=θoldαθJ(θ)

其中 α\alphaα学习率 (learning rate)。

2.2 三种梯度下降变体

方法 每次更新用多少数据 优点 缺点
批量梯度下降 (BGD) 整个语料库 梯度准确,收敛稳定 计算代价极大,内存不够
随机梯度下降 (SGD) 单个窗口/样本 极快,可在线学习 梯度噪声大,收敛震荡
Mini-Batch SGD 一小批窗口(如 32/64) 平衡速度和稳定性 需要调 batch size

2.3 SGD 伪代码

while True:
    window = sample_window(corpus)      # 随机采样一个中心词+上下文
    grad = compute_gradient(J, window)  # 只对窗口中出现的词向量求梯度
    theta = theta - alpha * grad        # 更新参数

稀疏更新:每个窗口中只有少数词被更新(中心词 + 上下文词 + 负采样词),不需要更新整个大矩阵。

实际上我们更新的是词向量的完整行(每个更新的词都会更新其全部 ddd 维)。但这些更新是"稀疏的"——只有少数词的向量被修改。实现中用哈希表或 embedding lookup 来高效处理。


3.Word2Vec 深度推导

3.1 符号约定

符号 含义
vc∈Rd\mathbf{v}_c \in \mathbb{R}^dvcRd 中心词 ccc 的向量
uo∈Rd\mathbf{u}_o \in \mathbb{R}^duoRd 外部词 ooo 的向量
U∈Rd×V\mathbf{U} \in \mathbb{R}^{d \times V}URd×V 所有外部词向量组成的矩阵
VVV 词表大小
y^\hat{\mathbf{y}}y^ softmax 预测的概率分布
y\mathbf{y}y one-hot 真实分布

3.2 Naive Softmax 的梯度推导

单对 (c,o)(c, o)(c,o) 的损失

J=−log⁡P(O=o∣C=c)=−log⁡exp⁡(uo⊤vc)∑w=1Vexp⁡(uw⊤vc)J = -\log P(O=o \mid C=c) = -\log \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_{w=1}^{V} \exp(\mathbf{u}_w^\top \mathbf{v}_c)}J=logP(O=oC=c)=logw=1Vexp(uwvc)exp(uovc)

这等价于交叉熵损失:J=−∑w=1Vywlog⁡y^wJ = -\sum_{w=1}^{V} \mathbf{y}_w \log \hat{\mathbf{y}}_wJ=w=1Vywlogy^w

3.2.1 Softmax 函数的 Jacobian

sk=uk⊤vcs_k = \mathbf{u}_k^\top \mathbf{v}_csk=ukvc,则 y^k=exp⁡(sk)∑wexp⁡(sw)\hat{\mathbf{y}}_k = \frac{\exp(s_k)}{\sum_w \exp(s_w)}y^k=wexp(sw)exp(sk)

关键性质 — Softmax 的偏导数:

∂y^k∂sj=y^k(δkj−y^j)\frac{\partial \hat{\mathbf{y}}_k}{\partial s_j} = \hat{\mathbf{y}}_k (\delta_{kj} - \hat{\mathbf{y}}_j)sjy^k=y^k(δkjy^j)

其中 δkj\delta_{kj}δkj 是 Kronecker delta(k=jk=jk=j 时为 1,否则为 0)。

直觉:当 k=jk=jk=j 时导数为正(提高自己分数会提高自己的概率);当 k≠jk \neq jk=j 时导数为负(别的词分高了会挤掉自己的概率)。

3.2.2 对中心词向量 vc\mathbf{v}_cvc 的梯度

链式法则

∂J∂vc=∑k∂J∂y^k⏟−yk/y^k⋅∑j∂y^k∂sj⏟y^k(δkj−y^j)⋅∂sj∂vc⏟uj\frac{\partial J}{\partial \mathbf{v}_c} = \sum_{k} \underbrace{\frac{\partial J}{\partial \hat{\mathbf{y}}_k}}_{-\mathbf{y}_k/\hat{\mathbf{y}}_k} \cdot \sum_{j} \underbrace{\frac{\partial \hat{\mathbf{y}}_k}{\partial s_j}}_{\hat{\mathbf{y}}_k(\delta_{kj} - \hat{\mathbf{y}}_j)} \cdot \underbrace{\frac{\partial s_j}{\partial \mathbf{v}_c}}_{\mathbf{u}_j}vcJ=kyk/y^k y^kJjy^k(δkjy^j) sjy^kuj vcsj

关键推导步骤

∂J∂vc=∑k(−yky^k)∑jy^k(δkj−y^j)uj=−∑kyk∑j(δkj−y^j)uj=−∑j(∑kykδkj⏟yj−∑kyk⏟=1y^j)uj=−∑j(yj−y^j)uj=∑j=1V(y^j−yj)uj\begin{aligned} \frac{\partial J}{\partial \mathbf{v}_c} &= \sum_k \left(-\frac{\mathbf{y}_k}{\hat{\mathbf{y}}_k}\right) \sum_j \hat{\mathbf{y}}_k(\delta_{kj} - \hat{\mathbf{y}}_j) \mathbf{u}_j \\ &= -\sum_k \mathbf{y}_k \sum_j (\delta_{kj} - \hat{\mathbf{y}}_j) \mathbf{u}_j \\ &= -\sum_j \Big(\underbrace{\sum_k \mathbf{y}_k \delta_{kj}}_{\mathbf{y}_j} - \underbrace{\sum_k \mathbf{y}_k}_{=1} \hat{\mathbf{y}}_j\Big) \mathbf{u}_j \\ &= -\sum_j (\mathbf{y}_j - \hat{\mathbf{y}}_j) \mathbf{u}_j \\ &= \sum_{j=1}^{V} (\hat{\mathbf{y}}_j - \mathbf{y}_j) \mathbf{u}_j \end{aligned}vcJ=k(y^kyk)jy^k(δkjy^j)uj=kykj(δkjy^j)uj=j(yj kykδkj=1 kyky^j)uj=j(yjy^j)uj=j=1V(y^jyj)uj

向量化形式

∂J∂vc=U(y^−y)\boxed{\frac{\partial J}{\partial \mathbf{v}_c} = \mathbf{U}(\hat{\mathbf{y}} - \mathbf{y})}vcJ=U(y^y)

直觉:梯度 = 观测到的 uo\mathbf{u}_ouo 减去 期望的(所有 uw\mathbf{u}_wuw 的加权平均,权重为预测概率 y^w\hat{\mathbf{y}}_wy^w)。

3.2.3 对外部词向量 uo\mathbf{u}_ouo 的梯度(真实上下文词,w=ow=ow=o

∂J∂uo=∑k∂J∂y^k⋅∂y^k∂so⋅∂so∂uo\frac{\partial J}{\partial \mathbf{u}_o} = \sum_k \frac{\partial J}{\partial \hat{\mathbf{y}}_k} \cdot \frac{\partial \hat{\mathbf{y}}_k}{\partial s_o} \cdot \frac{\partial s_o}{\partial \mathbf{u}_o}uoJ=ky^kJsoy^kuoso

代入 softmax Jacobian:

∂J∂uo=−∑kyky^k⋅y^k(δko−y^o)⋅vc=−∑kyk(δko−y^o)vc=−(yo−y^o⋅1)vc=−(1−y^o)vc\begin{aligned} \frac{\partial J}{\partial \mathbf{u}_o} &= -\sum_k \frac{\mathbf{y}_k}{\hat{\mathbf{y}}_k} \cdot \hat{\mathbf{y}}_k(\delta_{ko} - \hat{\mathbf{y}}_o) \cdot \mathbf{v}_c \\ &= -\sum_k \mathbf{y}_k(\delta_{ko} - \hat{\mathbf{y}}_o) \mathbf{v}_c \\ &= -(\mathbf{y}_o - \hat{\mathbf{y}}_o \cdot 1) \mathbf{v}_c \\ &= -(1 - \hat{\mathbf{y}}_o) \mathbf{v}_c \end{aligned}uoJ=ky^kyky^k(δkoy^o)vc=kyk(δkoy^o)vc=(yoy^o1)vc=(1y^o)vc

∂J∂uo=(y^o−1)vc\boxed{\frac{\partial J}{\partial \mathbf{u}_o} = (\hat{\mathbf{y}}_o - 1) \mathbf{v}_c}uoJ=(y^o1)vc

当预测概率 y^o<1\hat{y}_o < 1y^o<1(永远如此),梯度使 uo\mathbf{u}_ouovc\mathbf{v}_cvc 靠近,增加其相似度。

3.2.4 对外部词向量 uw\mathbf{u}_wuw 的梯度(非真实词,w≠ow \neq ow=o

∂J∂uw=−∑kyk(δkw−y^w)vc\frac{\partial J}{\partial \mathbf{u}_w} = -\sum_k \mathbf{y}_k(\delta_{kw} - \hat{\mathbf{y}}_w) \mathbf{v}_cuwJ=kyk(δkwy^w)vc

由于 w≠ow \neq ow=oyw=0\mathbf{y}_w = 0yw=0,且 ∑kyk=1\sum_k \mathbf{y}_k = 1kyk=1

∂J∂uw=−(0−y^w⋅1)vc\frac{\partial J}{\partial \mathbf{u}_w} = -(0 - \hat{\mathbf{y}}_w \cdot 1) \mathbf{v}_cuwJ=(0y^w1)vc

∂J∂uw=y^wvc\boxed{\frac{\partial J}{\partial \mathbf{u}_w} = \hat{\mathbf{y}}_w \mathbf{v}_c}uwJ=y^wvc

梯度使 uw\mathbf{u}_wuw 远离 vc\mathbf{v}_cvc(因为导数为正),"惩罚"错误预测。

3.2.5 统一向量化形式

∂J∂U=vc(y^−y)⊤\boxed{\frac{\partial J}{\partial \mathbf{U}} = \mathbf{v}_c (\hat{\mathbf{y}} - \mathbf{y})^\top}UJ=vc(y^y)

这是一个 d×Vd \times Vd×V 的外积矩阵。VVV 可能达到数百万——这就是 naive softmax 昂贵的原因


3.3 Negative Sampling

Naive softmax 需要对整个词表(百万级)求和——太慢了。Negative Sampling 是一种高效的近似方法。

3.3.1 核心思想

将 “在所有 VVV 个词中选出正确上下文词” 的多分类问题转化为 K+1K+1K+1二分类问题

  • 1 个正样本(真实的上下文词 ooo

  • KKK 个负样本(随机采样的"噪声"词,K≈5∼20K \approx 5 \sim 20K520

3.3.2 损失函数

Jneg(vc,o,U)=−log⁡σ(uo⊤vc)−∑s=1Klog⁡σ(−uws⊤vc)J_{\text{neg}}(\mathbf{v}_c, o, \mathbf{U}) = -\log \sigma(\mathbf{u}_o^\top \mathbf{v}_c) - \sum_{s=1}^{K} \log \sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)Jneg(vc,o,U)=logσ(uovc)s=1Klogσ(uwsvc)

其中 σ(x)=11+e−x\sigma(x) = \frac{1}{1+e^{-x}}σ(x)=1+ex1 是 sigmoid 函数。

含义 目标
−log⁡σ(uo⊤vc)-\log \sigma(\mathbf{u}_o^\top \mathbf{v}_c)logσ(uovc) 正样本损失 uo⊤vc\mathbf{u}_o^\top \mathbf{v}_cuovc σ→1\sigma \to 1σ1
−log⁡σ(−uws⊤vc)-\log \sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)logσ(uwsvc) 负样本损失 uws⊤vc\mathbf{u}_{w_s}^\top \mathbf{v}_cuwsvc σ→0\sigma \to 0σ0

Sigmoid 导数(常用性质):

σ′(x)=σ(x)(1−σ(x))=σ(x)σ(−x)\sigma'(x) = \sigma(x)(1-\sigma(x)) = \sigma(x)\sigma(-x)σ(x)=σ(x)(1σ(x))=σ(x)σ(x)

3.3.3 Negative Sampling 的梯度推导

zo=σ(uo⊤vc)z_o = \sigma(\mathbf{u}_o^\top \mathbf{v}_c)zo=σ(uovc)zs=σ(−uws⊤vc)z_s = \sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)zs=σ(uwsvc)

J=−log⁡zo−∑s=1Klog⁡zsJ = -\log z_o - \sum_{s=1}^{K} \log z_sJ=logzos=1Klogzs

对中心词向量 vc\mathbf{v}_cvc 的梯度:

第一项(正样本)

∂(−log⁡zo)∂vc=−1zo⋅zo(1−zo)⋅uo=−(1−zo)uo=(σ(uo⊤vc)−1)uo\begin{aligned} \frac{\partial (-\log z_o)}{\partial \mathbf{v}_c} &= -\frac{1}{z_o} \cdot z_o(1-z_o) \cdot \mathbf{u}_o \\ &= -(1-z_o)\mathbf{u}_o \\ &= (\sigma(\mathbf{u}_o^\top \mathbf{v}_c) - 1)\mathbf{u}_o \end{aligned}vc(logzo)=zo1zo(1zo)uo=(1zo)uo=(σ(uovc)1)uo

第二项(每个负样本)

∂(−log⁡zs)∂vc=−1zs⋅zs(1−zs)⋅(−uws)=(1−zs)uws=σ(uws⊤vc)uws\begin{aligned} \frac{\partial (-\log z_s)}{\partial \mathbf{v}_c} &= -\frac{1}{z_s} \cdot z_s(1-z_s) \cdot (-\mathbf{u}_{w_s}) \\ &= (1-z_s)\mathbf{u}_{w_s} \\ &= \sigma(\mathbf{u}_{w_s}^\top \mathbf{v}_c)\mathbf{u}_{w_s} \end{aligned}vc(logzs)=zs1zs(1zs)(uws)=(1zs)uws=σ(uwsvc)uws

技巧:ddx[−log⁡σ(−x)]=σ′(−x)σ(−x)=σ(−x)(1−σ(−x))σ(−x)=1−σ(−x)=σ(x)\frac{d}{dx}[-\log \sigma(-x)] = \frac{\sigma'(-x)}{\sigma(-x)} = \frac{\sigma(-x)(1-\sigma(-x))}{\sigma(-x)} = 1 - \sigma(-x) = \sigma(x)dxd[logσ(x)]=σ(x)σ(x)=σ(x)σ(x)(1σ(x))=1σ(x)=σ(x)

组合结果

∂J∂vc=(σ(uo⊤vc)−1)uo+∑s=1Kσ(uws⊤vc)uws\boxed{\frac{\partial J}{\partial \mathbf{v}_c} = (\sigma(\mathbf{u}_o^\top \mathbf{v}_c) - 1)\mathbf{u}_o + \sum_{s=1}^{K} \sigma(\mathbf{u}_{w_s}^\top \mathbf{v}_c)\mathbf{u}_{w_s}}vcJ=(σ(uovc)1)uo+s=1Kσ(uwsvc)uws

对外部词向量的梯度汇总:

注意:如果一个词在同一次更新中被采样为负样本多次,其梯度需要求和

3.3.4 效率对比
Naive Softmax Negative Sampling
每次更新的词数 VVV(整个词表) K+1K+1K+1K≈5∼20K \approx 5 \sim 20K520
计算复杂度 O(V⋅d)O(V \cdot d)O(Vd) O(K⋅d)O(K \cdot d)O(Kd)
V=106,K=10V = 10^6, K = 10V=106,K=10 ~1,000,000 次点积 ~11 次点积

Negative Sampling 将每次更新快了约 10 万倍

3.3.5 负采样的概率分布

www 被采样为负样本的概率:

P(w)=U(w)3/4ZP(w) = \frac{U(w)^{3/4}}{Z}P(w)=ZU(w)3/4

其中 U(w)U(w)U(w) 是词 www 在语料中的频率(unigram 分布),ZZZ 是归一化常数。

为什么取 3/43/43/4 次幂? 纯粹取频率会让高频词(如 the, a)被过度采样;取 3/43/43/4 次幂提高了罕见词的采样概率,效果更好。


3.4 Skip-gram 完整损失聚合

对中心词 c=wtc = w_tc=wt,上下文窗口 [wt−m,…,wt+m][w_{t-m}, \ldots, w_{t+m}][wtm,,wt+m]

Jskip-gram=∑−m≤j≤mj≠0J(vc,wt+j,U)J_{\text{skip-gram}} = \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} J(\mathbf{v}_c, w_{t+j}, \mathbf{U})Jskip-gram=mjmj=0J(vc,wt+j,U)

由微分的线性性质:

∂Jskip-gram∂U=∑−m≤j≤mj≠0∂J∂U\frac{\partial J_{\text{skip-gram}}}{\partial \mathbf{U}} = \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \frac{\partial J}{\partial \mathbf{U}}UJskip-gram=mjmj=0UJ

∂Jskip-gram∂vc=∑−m≤j≤mj≠0∂J∂vc\frac{\partial J_{\text{skip-gram}}}{\partial \mathbf{v}_c} = \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \frac{\partial J}{\partial \mathbf{v}_c}vcJskip-gram=mjmj=0vcJ

∂Jskip-gram∂vw=0(w≠c)\frac{\partial J_{\text{skip-gram}}}{\partial \mathbf{v}_w} = 0 \quad (w \neq c)vwJskip-gram=0(w=c)

只有中心词的中心向量 vc\mathbf{v}_cvc 被更新;所有窗口内的上下文词负采样词的外部向量被更新。


3.5 CBOW (Continuous Bag of Words)

思想:给定上下文词,预测中心词。

设上下文词为 wt−m,…,wt−1,wt+1,…,wt+mw_{t-m}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+m}wtm,,wt1,wt+1,,wt+m,用上下文的平均向量来预测中心词:

v^=12m∑−m≤j≤mj≠0vwt+j\hat{\mathbf{v}} = \frac{1}{2m} \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \mathbf{v}_{w_{t+j}}v^=2m1mjmj=0vwt+j

P(wt∣wt−m,…,wt+m)=exp⁡(uwt⊤v^)∑w∈Vexp⁡(uw⊤v^)P(w_t \mid w_{t-m}, \ldots, w_{t+m}) = \frac{\exp(\mathbf{u}_{w_t}^\top \hat{\mathbf{v}})}{\sum_{w \in V} \exp(\mathbf{u}_w^\top \hat{\mathbf{v}})}P(wtwtm,,wt+m)=wVexp(uwv^)exp(uwtv^)

与 Skip-gram 的区别

  • Skip-gram:一个中心词 → 多个上下文词(每个词对单独计算)

  • CBOW:多个上下文词取平均 → 一个中心词(一次计算)

CBOW 训练更快,对常见词更好;Skip-gram 对罕见词更好。


4.基于统计的词向量

4.1 共现矩阵 (Co-occurrence Matrix)

基于整个语料库统计词对在固定窗口内同时出现的次数。

示例(窗口大小 = 1):

语料: "I like deep learning. I like NLP. I enjoy flying."

统计词在其他词上下文出现次数:

计数 I like enjoy deep learning NLP flying
I 0 2 1 0 0 0 0
like 2 0 0 1 0 1 0
enjoy 1 0 0 0 0 0 1
...

4.2 问题与解决方案

问题 解决
词表增大 → 矩阵维度过大 SVD 降维 → 得到低维稠密向量
矩阵极度稀疏 只存非零元素
高频词主导(the, a) 去除停用词 / 使用倾斜窗口 / Pearson 相关系数

4.3 SVD 降维

对共现矩阵 X\mathbf{X}X 做奇异值分解:

X=UΣV⊤\mathbf{X} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\topX=V

取前 kkk 个奇异值及其对应的奇异向量:

Xk=UkΣkVk⊤\mathbf{X}_k = \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k^\topXk=UkΣkVk

Uk\mathbf{U}_kUk 的行就是词的 kkk 维向量表示。

改进技巧 (Hacks to X)

  • 去除停用词

  • 使用倾斜窗口(距离越远权重越小)

  • 使用 Pearson 相关系数替代原始计数

这些改进产生了 COALS 模型,能同时捕获句法和语义信息。

4.4 计数方法 vs 直接预测方法

计数方法 (Count-Based) 直接预测 (Direct Prediction)
代表 LSA, COALS, HAL Word2Vec (Skip-gram, CBOW)
方式 先统计共现矩阵,再降维 直接在语料上训练神经网络
优点 利用全局统计信息,训练快 在类比任务上表现更好
缺点 高频词主导,罕见词效果差 未有效利用全局统计信息

5.GloVe:全局词向量

Pennington, Socher & Manning (EMNLP 2014): “GloVe: Global Vectors for Word Representation”

5.1 核心动机

结合两者的优势

  • 计数方法的全局统计信息

  • Word2Vec 的线性语义关系

5.2 关键洞察:共现概率之比编码意义

考察目标词 “ice” 和 “steam” 与不同上下文词的共现:

上下文词 wkw_kwk P(wk∣ice)P(w_k \mid \text{ice})P(wkice) P(wk∣steam)P(w_k \mid \text{steam})P(wksteam) 比值 语义信号
solid 1.9×10−41.9 \times 10^{-4}1.9×104 2.2×10−52.2 \times 10^{-5}2.2×105 8.9 与 ice 更相关
gas 6.6×10−56.6 \times 10^{-5}6.6×105 7.8×10−47.8 \times 10^{-4}7.8×104 0.085 与 steam 更相关
water 3.0×10−33.0 \times 10^{-3}3.0×103 2.2×10−32.2 \times 10^{-3}2.2×103 1.36 与两者都相关
fashion 1.7×10−51.7 \times 10^{-5}1.7×105 1.8×10−51.8 \times 10^{-5}1.8×105 0.96 与两者都无关

关键发现:共现概率的比值(而非原始概率)编码了词义关系!

GloVe 的目标是学习词向量,使得:

F(wi,wj,w~k)=PikPjkF(\mathbf{w}_i, \mathbf{w}_j, \tilde{\mathbf{w}}_k) = \frac{P_{ik}}{P_{jk}}F(wi,wj,w~k)=PjkPik

经数学推导(用指数函数建模,取对数),得到核心关系:

wi⊤w~j+bi+b~j=log⁡Xij\boxed{\mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j = \log X_{ij}}wiw~j+bi+b~j=logXij

5.3 损失函数

J=∑i,j=1Vf(Xij)(wi⊤w~j+bi+b~j−log⁡Xij)2J = \sum_{i,j=1}^{V} f(X_{ij}) \left( \mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j - \log X_{ij} \right)^2J=i,j=1Vf(Xij)(wiw~j+bi+b~jlogXij)2

符号 含义
XijX_{ij}Xij iii 和词 jjj 的共现次数
wi\mathbf{w}_iwi 目标词向量
w~j\tilde{\mathbf{w}}_jw~j 上下文词向量
bi,b~jb_i, \tilde{b}_jbi,b~j 偏置项
f(Xij)f(X_{ij})f(Xij) 权重函数(最关键的设计)

为什么不用交叉熵?因为 softmax 分母需要对整个词表求和,代价太大。GloVe 丢弃归一化,直接拟合对数共现次数。

5.4 权重函数 f(x)f(x)f(x)

f(x)={(xxmax⁡)αif x<xmax⁡1otherwisef(x) = \begin{cases} \left(\dfrac{x}{x_{\max}}\right)^\alpha & \text{if } x < x_{\max} \\ 1 & \text{otherwise} \end{cases}f(x)= (xmaxx)α1if x<xmaxotherwise

标准参数:xmax⁡=100x_{\max} = 100xmax=100α=0.75\alpha = 0.75α=0.75

三个设计要求

要求 满足方式 原因
f(0)=0f(0) = 0f(0)=0 lim⁡x→0f(x)=0\lim_{x \to 0} f(x) = 0limx0f(x)=0 从不共现的词对不应参与训练
f(x)f(x)f(x) 不减 幂函数单调递增 频繁共现的词对应有更大影响
f(x)f(x)f(x) 不无限增长 x≥xmax⁡x \geq x_{\max}xxmax 时截断为 1 防止 “the” 等功能词主导整个 loss

函数形状

f(x)
1.0 |                    ●━━━━━━━━━━━━ (x ≥ x_max 截断)
    |                 ╱
0.8 |              ╱
    |           ╱
0.6 |        ╱           α = 0.75 控制曲率
    |     ╱
0.4 |  ╱
    |╱
0.0 ●────────────────●─────────────────→ x
    0              x_max=100

直观理解

共现次数 f(x)f(x)f(x) 说明
0 0 跳过,不参与
1 (1/100)0.75≈0.03(1/100)^{0.75} \approx 0.03(1/100)0.750.03 极低频,影响很小
50 (50/100)0.75≈0.62(50/100)^{0.75} \approx 0.62(50/100)0.750.62 中频,有实质影响
100 1.0 达到上限
1,000,000 1.0 被截断,与 100 次无区别

α=0.75\alpha = 0.75α=0.75 压缩了动态范围,让罕见共现也有一定权重。

5.5 GloVe vs Word2Vec 对比

维度 Word2Vec (SGNS) GloVe
信息来源 局部上下文窗口 全局共现矩阵
训练方式 在线 SGD 加权最小二乘
计算关注点 每个窗口单独更新 只迭代非零共现对
类比任务 更好
训练速度 慢(逐个窗口) 快(矩阵一次统计好)

6.词向量评估

6.1 内在评估 vs 外在评估

内在评估 (Intrinsic) 外在评估 (Extrinsic)
定义 直接评估词向量本身的质量 在下游任务中评估词向量的效用
方式 词类比、词相似度打分 将词向量用于 NER、情感分析等
优点 快速、直接 反映实际应用价值
缺点 不一定与下游性能相关 昂贵、耗时

6.2 词类比任务 (Word Analogy)

经典测试:vking−vman+vwoman≈vqueen\mathbf{v}_{\text{king}} - \mathbf{v}_{\text{man}} + \mathbf{v}_{\text{woman}} \approx \mathbf{v}_{\text{queen}}vkingvman+vwomanvqueen

arg⁡max⁡i(vb−va+vc)⊤vi∥vb−va+vc∥⋅∥vi∥\arg\max_i \frac{(\mathbf{v}_b - \mathbf{v}_a + \mathbf{v}_c)^\top \mathbf{v}_i}{\|\mathbf{v}_b - \mathbf{v}_a + \mathbf{v}_c\| \cdot \|\mathbf{v}_i\|}argmaxivbva+vcvi(vbva+vc)vi

类比类型 示例
语义类比 king:queen :: man:woman, Paris:France :: Tokyo:Japan
句法类比 walk:walked :: swim:swam, big:bigger :: fast:faster

6.3 词相似度任务

人工标注的词对相似度分数 vs 词向量余弦相似度,计算 Spearman / Pearson 相关系数。

标准数据集:WordSim-353, SimLex-999, Rare Words (RW)

6.4 超参数对效果的影响

超参数 建议
向量维度 ddd 300 是常用选择;更大不一定更好(收益递减)
窗口大小 mmm Skip-gram 约 10;CBOW 约 5
训练数据量 更多数据 > 更好算法(Wikipedia + Gigaword 效果显著优于仅 Wikipedia)

7.词的多义性 (Word Senses)

7.1 一词多义问题

许多词有多个完全不同的含义:

  • bank”:银行 / 河岸 / 库

  • bat”:球棒 / 蝙蝠

  • run”:跑步 / 经营 / 运行

问题:一个固定的词向量无法同时捕获所有含义。

7.2 解决思路

线性叠加假设 (Arora et al., 2018):

vword=∑每个义项 sαs⋅vs\mathbf{v}_{\text{word}} = \sum_{\text{每个义项 } s} \alpha_s \cdot \mathbf{v}_svword=每个义项 sαsvs

一个词的向量被建模为其多个义项向量的加权和,权重 αs\alpha_sαs 是义项的频率。

窗口级上下文消歧

在上下文中,“bank” 的向量可以动态调整。如果上下文包含 “river”,“bank” 的向量会偏向 “河岸” 的含义。


8.关键术语总结

术语 解释
Skip-gram 用中心词预测上下文词的模型
CBOW 用上下文词预测中心词的模型
Naive Softmax 在整个词表上归一化的 softmax,计算昂贵
Negative Sampling 只对 K+1K+1K+1 个词做二分类的高效近似
SGD 每步随机采样一个窗口更新参数
共现矩阵 统计词对在窗口内同时出现次数的矩阵
SVD 对共现矩阵降维获得词向量
GloVe 结合全局统计和局部上下文的词向量模型
f(Xij)f(X_{ij})f(Xij) GloVe 的权重函数,控制不同频率共现对的影响
词类比 通过向量运算 b−a+cb-a+cba+c 测试语义/句法关系
一词多义 一个词有多个含义,固定向量难以完全捕获

9.关键公式速查

公式 含义
P(o∣c)=exp⁡(uo⊤vc)∑wexp⁡(uw⊤vc)P(o \mid c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_w \exp(\mathbf{u}_w^\top \mathbf{v}_c)}P(oc)=wexp(uwvc)exp(uovc) Skip-gram softmax 概率
J=−1T∑∑log⁡P(wt+j∣wt)J = -\frac{1}{T}\sum \sum \log P(w_{t+j} \mid w_t)J=T1∑∑logP(wt+jwt) Skip-gram 目标函数
∇vc=U(y^−y)\nabla_{\mathbf{v}_c} = \mathbf{U}(\hat{\mathbf{y}} - \mathbf{y})vc=U(y^y) Naive softmax 对中心词的梯度
∇uo=(y^o−1)vc\nabla_{\mathbf{u}_o} = (\hat{y}_o - 1)\mathbf{v}_cuo=(y^o1)vc Naive softmax 对真实外部词的梯度
Jneg=−log⁡σ(uo⊤vc)−∑s=1Klog⁡σ(−uws⊤vc)J_{\text{neg}} = -\log\sigma(\mathbf{u}_o^\top \mathbf{v}_c) - \sum_{s=1}^{K} \log\sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)Jneg=logσ(uovc)s=1Klogσ(uwsvc) Negative Sampling 损失
JGloVe=∑f(Xij)(wi⊤w~j+bi+b~j−log⁡Xij)2J_{\text{GloVe}} = \sum f(X_{ij})(\mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j - \log X_{ij})^2JGloVe=f(Xij)(wiw~j+bi+b~jlogXij)2 GloVe 损失函数
f(x)={(x/xmax⁡)αx<xmax⁡1otherwisef(x) = \begin{cases} (x/x_{\max})^\alpha & x < x_{\max} \\ 1 & \text{otherwise} \end{cases}f(x)={(x/xmax)α1x<xmaxotherwise GloVe 权重函数
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐