词向量(Word Vectors)
词向量(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 的核心理念:
-
语料库 (Corpus):我们有一个大规模文本语料——就是一长串词的序列。
-
向量表示:固定词表中的每个词,用一个稠密向量来表示。
-
滑动窗口:遍历文本中每个位置 ttt,在当前位置有:
-
一个中心词 ccc
-
窗口内的上下文词 ooo
-
-
用相似度算概率:用中心词向量和上下文词向量的相似度(点积),计算 P(o∣c)P(o \mid c)P(o∣c),即看到中心词 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(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
-
最大化概率:不断调整词向量,使整个语料库上所有中心词-上下文对的概率最大:
max∑t∑o∈context(t)logP(o∣ct)\max \sum_t \sum_{o \in \text{context}(t)} \log P(o \mid c_t)max∑t∑o∈context(t)logP(o∣ct)
两种架构:
| 架构 | 任务 | 特点 |
|---|---|---|
| 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}θ∈R2dV,ddd 为向量维度,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=1T∏−m≤j≤mj=0P(wt+j∣wt;θ)
目标函数 — 平均负对数似然:
J(θ)=−1TlogL(θ)=−1T∑t=1T∑−m≤j≤mj≠0logP(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(θ)=−T1∑t=1T∑−m≤j≤mj=0logP(wt+j∣wt;θ)
最小化 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(o∣c)=∑w∈Vexp(uw⊤vc)exp(uo⊤vc)
-
点积 uo⊤vc\mathbf{u}_o^\top \mathbf{v}_cuo⊤vc:衡量中心词和上下文词的相似度
-
指数 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}^dvc∈Rd | 中心词 ccc 的向量 |
| uo∈Rd\mathbf{u}_o \in \mathbb{R}^duo∈Rd | 外部词 ooo 的向量 |
| U∈Rd×V\mathbf{U} \in \mathbb{R}^{d \times V}U∈Rd×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=−logP(O=o∣C=c)=−logexp(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=o∣C=c)=−log∑w=1Vexp(uw⊤vc)exp(uo⊤vc)
这等价于交叉熵损失:J=−∑w=1Vywlogy^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=uk⊤vc,则 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)∂sj∂y^k=y^k(δkj−y^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}∂vc∂J=∑k−yk/y^k ∂y^k∂J⋅∑jy^k(δkj−y^j) ∂sj∂y^k⋅uj ∂vc∂sj
关键推导步骤:
∂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}∂vc∂J=k∑(−y^kyk)j∑y^k(δkj−y^j)uj=−k∑ykj∑(δkj−y^j)uj=−j∑(yj k∑ykδkj−=1 k∑yky^j)uj=−j∑(yj−y^j)uj=j=1∑V(y^j−yj)uj
向量化形式:
∂J∂vc=U(y^−y)\boxed{\frac{\partial J}{\partial \mathbf{v}_c} = \mathbf{U}(\hat{\mathbf{y}} - \mathbf{y})}∂vc∂J=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}∂uo∂J=∑k∂y^k∂J⋅∂so∂y^k⋅∂uo∂so
代入 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}∂uo∂J=−k∑y^kyk⋅y^k(δko−y^o)⋅vc=−k∑yk(δko−y^o)vc=−(yo−y^o⋅1)vc=−(1−y^o)vc
∂J∂uo=(y^o−1)vc\boxed{\frac{\partial J}{\partial \mathbf{u}_o} = (\hat{\mathbf{y}}_o - 1) \mathbf{v}_c}∂uo∂J=(y^o−1)vc
当预测概率 y^o<1\hat{y}_o < 1y^o<1(永远如此),梯度使 uo\mathbf{u}_ouo 向 vc\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}_c∂uw∂J=−∑kyk(δkw−y^w)vc
由于 w≠ow \neq ow=o,yw=0\mathbf{y}_w = 0yw=0,且 ∑kyk=1\sum_k \mathbf{y}_k = 1∑kyk=1:
∂J∂uw=−(0−y^w⋅1)vc\frac{\partial J}{\partial \mathbf{u}_w} = -(0 - \hat{\mathbf{y}}_w \cdot 1) \mathbf{v}_c∂uw∂J=−(0−y^w⋅1)vc
∂J∂uw=y^wvc\boxed{\frac{\partial J}{\partial \mathbf{u}_w} = \hat{\mathbf{y}}_w \mathbf{v}_c}∂uw∂J=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}∂U∂J=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 20K≈5∼20)
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σ(uo⊤vc)−∑s=1Klogσ(−uws⊤vc)
其中 σ(x)=11+e−x\sigma(x) = \frac{1}{1+e^{-x}}σ(x)=1+e−x1 是 sigmoid 函数。
| 项 | 含义 | 目标 |
|---|---|---|
| −logσ(uo⊤vc)-\log \sigma(\mathbf{u}_o^\top \mathbf{v}_c)−logσ(uo⊤vc) | 正样本损失 | 让 uo⊤vc\mathbf{u}_o^\top \mathbf{v}_cuo⊤vc 大(σ→1\sigma \to 1σ→1) |
| −logσ(−uws⊤vc)-\log \sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)−logσ(−uws⊤vc) | 负样本损失 | 让 uws⊤vc\mathbf{u}_{w_s}^\top \mathbf{v}_cuws⊤vc 小(σ→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=σ(uo⊤vc),zs=σ(−uws⊤vc)z_s = \sigma(-\mathbf{u}_{w_s}^\top \mathbf{v}_c)zs=σ(−uws⊤vc)。
则 J=−logzo−∑s=1KlogzsJ = -\log z_o - \sum_{s=1}^{K} \log z_sJ=−logzo−∑s=1Klogzs。
对中心词向量 vc\mathbf{v}_cvc 的梯度:
第一项(正样本):
∂(−logzo)∂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)=−zo1⋅zo(1−zo)⋅uo=−(1−zo)uo=(σ(uo⊤vc)−1)uo
第二项(每个负样本):
∂(−logzs)∂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)=−zs1⋅zs(1−zs)⋅(−uws)=(1−zs)uws=σ(uws⊤vc)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}}∂vc∂J=(σ(uo⊤vc)−1)uo+s=1∑Kσ(uws⊤vc)uws
对外部词向量的梯度汇总:
注意:如果一个词在同一次更新中被采样为负样本多次,其梯度需要求和。
3.3.4 效率对比
| Naive Softmax | Negative Sampling | |
|---|---|---|
| 每次更新的词数 | VVV(整个词表) | K+1K+1K+1(K≈5∼20K \approx 5 \sim 20K≈5∼20) |
| 计算复杂度 | O(V⋅d)O(V \cdot d)O(V⋅d) | O(K⋅d)O(K \cdot d)O(K⋅d) |
| 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}][wt−m,…,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=∑−m≤j≤mj=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}}∂U∂Jskip-gram=∑−m≤j≤mj=0∂U∂J
∂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}∂vc∂Jskip-gram=∑−m≤j≤mj=0∂vc∂J
∂Jskip-gram∂vw=0(w≠c)\frac{\partial J_{\text{skip-gram}}}{\partial \mathbf{v}_w} = 0 \quad (w \neq c)∂vw∂Jskip-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}wt−m,…,wt−1,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^=2m1∑−m≤j≤mj=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(wt∣wt−m,…,wt+m)=∑w∈Vexp(uw⊤v^)exp(uwt⊤v^)
与 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=UΣ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(wk∣ice) | P(wk∣steam)P(w_k \mid \text{steam})P(wk∣steam) | 比值 | 语义信号 |
|---|---|---|---|---|
| solid | 1.9×10−41.9 \times 10^{-4}1.9×10−4 | 2.2×10−52.2 \times 10^{-5}2.2×10−5 | 8.9 | 与 ice 更相关 |
| gas | 6.6×10−56.6 \times 10^{-5}6.6×10−5 | 7.8×10−47.8 \times 10^{-4}7.8×10−4 | 0.085 | 与 steam 更相关 |
| water | 3.0×10−33.0 \times 10^{-3}3.0×10−3 | 2.2×10−32.2 \times 10^{-3}2.2×10−3 | 1.36 | 与两者都相关 |
| fashion | 1.7×10−51.7 \times 10^{-5}1.7×10−5 | 1.8×10−51.8 \times 10^{-5}1.8×10−5 | 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=logXij\boxed{\mathbf{w}_i^\top \tilde{\mathbf{w}}_j + b_i + \tilde{b}_j = \log X_{ij}}wi⊤w~j+bi+b~j=logXij
5.3 损失函数
J=∑i,j=1Vf(Xij)(wi⊤w~j+bi+b~j−logXij)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)(wi⊤w~j+bi+b~j−logXij)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<xmax1otherwisef(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 | limx→0f(x)=0\lim_{x \to 0} f(x) = 0limx→0f(x)=0 | 从不共现的词对不应参与训练 |
| f(x)f(x)f(x) 不减 | 幂函数单调递增 | 频繁共现的词对应有更大影响 |
| f(x)f(x)f(x) 不无限增长 | x≥xmaxx \geq x_{\max}x≥xmax 时截断为 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.75≈0.03 | 极低频,影响很小 |
| 50 | (50/100)0.75≈0.62(50/100)^{0.75} \approx 0.62(50/100)0.75≈0.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}}vking−vman+vwoman≈vqueen
argmaxi(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\|}argmaxi∥vb−va+vc∥⋅∥vi∥(vb−va+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αs⋅vs
一个词的向量被建模为其多个义项向量的加权和,权重 α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+cb−a+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(o∣c)=∑wexp(uw⊤vc)exp(uo⊤vc) | Skip-gram softmax 概率 |
| J=−1T∑∑logP(wt+j∣wt)J = -\frac{1}{T}\sum \sum \log P(w_{t+j} \mid w_t)J=−T1∑∑logP(wt+j∣wt) | 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}_c∇uo=(y^o−1)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σ(uo⊤vc)−∑s=1Klogσ(−uws⊤vc) | Negative Sampling 损失 |
| JGloVe=∑f(Xij)(wi⊤w~j+bi+b~j−logXij)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)(wi⊤w~j+bi+b~j−logXij)2 | GloVe 损失函数 |
| f(x)={(x/xmax)αx<xmax1otherwisef(x) = \begin{cases} (x/x_{\max})^\alpha & x < x_{\max} \\ 1 & \text{otherwise} \end{cases}f(x)={(x/xmax)α1x<xmaxotherwise | GloVe 权重函数 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)