Word2Vec Skip-gram 目标函数与梯度推导

分类: 词向量与表示学习 · 难度: 中级 · 关联讲座: L02

Word2Vec Skip-gram 目标函数与梯度推导

本文整理 Word2Vec Skip-gram 模型从分布假说到目标函数、再到完整梯度推导的全过程。内容涵盖分布假说的数学形式化、Softmax 预测函数的构造,以及对中心词向量 vcv_c 和上下文词向量 uou_o 的梯度推导。


1. 分布假说的数学表达

📐 分布假说的数学表达

核心思想:“一个词的含义由其上下文决定”——这如何转化为可计算的目标?

步骤 1:定义”上下文”为以目标词为中心、半径 mm 的窗口: context(wt)={wtm,,wt1,wt+1,,wt+m}\text{context}(w_t) = \{w_{t-m}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+m}\}

步骤 2:如果词向量能够预测上下文词,说明向量已经编码了”上下文分布”(即词的含义): 好的词向量给定中心词,能准确预测上下文词\text{好的词向量} \Leftrightarrow \text{给定中心词,能准确预测上下文词}

步骤 3:将”预测能力”定义为目标函数——最大化在所有位置 tt 上,给定中心词预测上下文词的联合概率: maximizet=1Tmjmj0P(wt+jwt;θ)\text{maximize} \quad \prod_{t=1}^{T} \prod_{\substack{-m \le j \le m \\ j \neq 0}} P(w_{t+j} | w_t; \theta)

取负对数(最小化形式): minimizeJ(θ)=1Tt=1Tmjmj0logP(wt+jwt;θ)\text{minimize} \quad J(\theta) = -\frac{1}{T} \sum_{t=1}^{T} \sum_{\substack{-m \le j \le m \\ j \neq 0}} \log P(w_{t+j} | w_t; \theta)

这就是 Word2Vec 的目标函数!分布假说 → 可微分的损失函数,一步完成。

🔢 点积相似度的计算

设定:两个 3 维词向量:

  • vcat=[0.8,0.3,0.1]v_{\text{cat}} = [0.8, 0.3, -0.1]
  • vdog=[0.7,0.4,0.2]v_{\text{dog}} = [0.7, 0.4, -0.2]
  • vcar=[0.2,0.1,0.9]v_{\text{car}} = [-0.2, 0.1, 0.9]

余弦相似度(归一化点积):

cos(cat,dog)=vcatTvdogvcatvdog\cos(\text{cat}, \text{dog}) = \frac{v_{\text{cat}}^T v_{\text{dog}}}{\|v_{\text{cat}}\| \cdot \|v_{\text{dog}}\|}

计算:

  1. vcatTvdog=0.8×0.7+0.3×0.4+(0.1)×(0.2)=0.56+0.12+0.02=0.70v_{\text{cat}}^T v_{\text{dog}} = 0.8 \times 0.7 + 0.3 \times 0.4 + (-0.1) \times (-0.2) = 0.56 + 0.12 + 0.02 = 0.70
  2. vcat=0.64+0.09+0.01=0.740.860\|v_{\text{cat}}\| = \sqrt{0.64 + 0.09 + 0.01} = \sqrt{0.74} \approx 0.860
  3. vdog=0.49+0.16+0.04=0.690.831\|v_{\text{dog}}\| = \sqrt{0.49 + 0.16 + 0.04} = \sqrt{0.69} \approx 0.831
  4. cos(cat,dog)=0.70/(0.860×0.831)0.977\cos(\text{cat}, \text{dog}) = 0.70 / (0.860 \times 0.831) \approx \mathbf{0.977}(高相似度)

cos(cat,car)=(0.16+0.030.09)/()0.26\cos(\text{cat}, \text{car}) = (-0.16 + 0.03 - 0.09) / (\ldots) \approx \mathbf{-0.26}(低/负相似度)

结论:cat 和 dog 向量相近,cat 和 car 向量方向相反。

2. Softmax 预测函数的由来

📐 Softmax 预测函数的由来

目标:给定中心词 cc,如何建模上下文词 oo 出现的概率 P(oc)P(o|c)第 1 步:相似度度量 用点积衡量中心词向量 vcv_c 和上下文词向量 uou_o 的相似度: score(o,c)=uoTvc=i=1duo,ivc,i\text{score}(o, c) = u_o^T v_c = \sum_{i=1}^{d} u_{o,i} \cdot v_{c,i} 点积越大,两个词在向量空间中越”接近”,越可能共现。

第 2 步:指数化(使所有分数为正)

原始点积可以是负数,不能直接当概率。用指数函数 exp()\exp(\cdot) 映射到正数域:

exp(uoTvc)>0uo,vc\exp(u_o^T v_c) > 0 \quad \forall\, u_o, v_c

这保证了大的相似度 → 大的正数,小的(负的)相似度 → 接近 0 的正数。

第 3 步:归一化(使概率和为 1)

Slide 14
Slide 14

除以所有词的指数和,得到合法的概率分布: P(oc)=exp(uoTvc)wVexp(uwTvc)P(o|c) = \frac{\exp(u_o^T v_c)}{\sum_{w \in V} \exp(u_w^T v_c)} 为什么用指数而不是其他函数? 指数函数有特殊性质:exp(a+b)=exp(a)exp(b)\exp(a+b) = \exp(a)\exp(b),使得 softmax 的梯度形式特别简洁(见推导块 2)。此外,softmax 是最大熵原理下的唯一解——在所有满足均值约束的分布中,softmax 分布的信息熵最大。

🔢 数值计算:3 个词的 Skip-gram

设定:词表 V={cat,dog,fish}V = \{\text{cat}, \text{dog}, \text{fish}\},嵌入维度 d=2d = 2

中心词向量 vv上下文向量 uu
cat[0.5,0.3][0.5, 0.3][0.2,0.8][0.2, 0.8]
dog[0.4,0.6][0.4, 0.6][0.7,0.1][0.7, 0.1]
fish[0.1,0.9][0.1, 0.9][0.3,0.5][0.3, 0.5]

任务:计算 P(dogcat)P(\text{dog} \mid \text{cat})(中心词是 cat,预测上下文词 dog)

Step 1:计算点积 uwTvcatu_w^T v_\text{cat} 对所有词:

ucatTvcat=0.2×0.5+0.8×0.3=0.34u_\text{cat}^T v_\text{cat} = 0.2 \times 0.5 + 0.8 \times 0.3 = 0.34

Slide 16
Slide 16

udogTvcat=0.7×0.5+0.1×0.3=0.38u_\text{dog}^T v_\text{cat} = 0.7 \times 0.5 + 0.1 \times 0.3 = 0.38

Slide 17
Slide 17

ufishTvcat=0.3×0.5+0.5×0.3=0.30u_\text{fish}^T v_\text{cat} = 0.3 \times 0.5 + 0.5 \times 0.3 = 0.30 Step 2:指数化: exp(0.34)=1.405,exp(0.38)=1.462,exp(0.30)=1.350\exp(0.34) = 1.405, \quad \exp(0.38) = 1.462, \quad \exp(0.30) = 1.350 Step 3:归一化: sum=1.405+1.462+1.350=4.217\text{sum} = 1.405 + 1.462 + 1.350 = 4.217 P(dogcat)=1.4624.217=0.347P(\text{dog}|\text{cat}) = \frac{1.462}{4.217} = 0.347 验证P(catcat)+P(dogcat)+P(fishcat)=0.333+0.347+0.320=1.000P(\text{cat}|\text{cat}) + P(\text{dog}|\text{cat}) + P(\text{fish}|\text{cat}) = 0.333 + 0.347 + 0.320 = 1.000观察:dog 的概率最高(0.347),因为 udogu_\text{dog}vcatv_\text{cat} 的点积最大。训练的目标就是让共现频率高的词对有更大的点积。

💡 Skip-gram 为什么能学到词义?

Slide 18
Slide 18

把 Skip-gram 的训练想象成一个预测游戏

  1. 给你一个中心词 “bank”
  2. 你要猜它周围会出现什么词
  3. 如果 “bank” 经常和 “money”, “deposit”, “account” 一起出现
  4. 模型就会让 vbankv_\text{bank}umoneyu_\text{money}, udepositu_\text{deposit} 的点积变大 关键洞察:如果 “bank” 和 “financial” 周围出现的词很相似(都跟钱有关),那么它们的 vv 向量也会被推到相近的位置——因为它们需要对相同的上下文词产生高概率。 这就是 “You shall know a word by the company it keeps” 的数学实现。

3. 对 vcv_c 求梯度的完整推导

📐 对 vcv_c 求梯度的完整推导

目标:计算 vclogP(oc)\frac{\partial}{\partial v_c} \log P(o|c)

第 1 步:展开对数

logP(oc)=uoTvclogwVexp(uwTvc)\log P(o|c) = u_o^T v_c - \log \sum_{w \in V} \exp(u_w^T v_c)

第 2 步:分别求导

第一项的导数(直接):

vc(uoTvc)=uo\frac{\partial}{\partial v_c}(u_o^T v_c) = u_o

第二项使用链式法则——令 S=wVexp(uwTvc)S = \sum_{w \in V} \exp(u_w^T v_c)

vclogS=1SSvc=1SxVexp(uxTvc)ux\frac{\partial}{\partial v_c} \log S = \frac{1}{S} \cdot \frac{\partial S}{\partial v_c} = \frac{1}{S} \sum_{x \in V} \exp(u_x^T v_c) \cdot u_x

第 3 步:化简

Slide 15
Slide 15

=xVexp(uxTvc)Sux=xVP(xc)ux= \sum_{x \in V} \frac{\exp(u_x^T v_c)}{S} \cdot u_x = \sum_{x \in V} P(x|c) \cdot u_x 第 4 步:合并结果 vclogP(oc)=uoxVP(xc)ux\frac{\partial}{\partial v_c} \log P(o|c) = u_o - \sum_{x \in V} P(x|c) u_x 直觉:梯度 = 观察到的上下文向量 uou_o期望的上下文向量 E[ux]\mathbb{E}[u_x]。这是在”推动 vcv_c 靠近实际观察到的上下文词,远离平均的上下文词”。

4. 对 uou_o 求梯度的完整推导

📐 对 uou_o 求梯度的完整推导

目标:计算 uologP(oc)\frac{\partial}{\partial u_o} \log P(o|c) 第 1 步:展开对数 logP(oc)=uoTvclogwVexp(uwTvc)\log P(o|c) = u_o^T v_c - \log \sum_{w \in V} \exp(u_w^T v_c) 第 2 步:对 uou_o 求导 第一项:uo(uoTvc)=vc\frac{\partial}{\partial u_o}(u_o^T v_c) = v_c

第二项:在求和 wVexp(uwTvc)\sum_{w \in V} \exp(u_w^T v_c) 中,只有 w=ow = o 这一项包含 uou_o

Slide 20
Slide 20

uologwVexp(uwTvc)=exp(uoTvc)wVexp(uwTvc)vc=P(oc)vc\frac{\partial}{\partial u_o} \log \sum_{w \in V} \exp(u_w^T v_c) = \frac{\exp(u_o^T v_c)}{\sum_{w \in V} \exp(u_w^T v_c)} \cdot v_c = P(o|c) \cdot v_c 第 3 步:合并 uologP(oc)=vcP(oc)vc=(1P(oc))vc\frac{\partial}{\partial u_o} \log P(o|c) = v_c - P(o|c) \cdot v_c = (1 - P(o|c)) \cdot v_c 直觉:如果模型已经给 oo 很高的概率(P(oc)1P(o|c) \approx 1),梯度接近零——不需要更新。如果概率很低,梯度接近 vcv_c——把 uou_o 推向 vcv_c 的方向。

5. 常见误区

⚠️ 常见误区

Slide 19
Slide 19
  1. 误区:每个词只有一个向量正确:每个词有两个向量——vwv_w(作为中心词时)和 uwu_w(作为上下文词时)。参数空间是 θR2dV\theta \in \mathbb{R}^{2dV},不是 RdV\mathbb{R}^{dV}
  2. 误区:Softmax 的分母只是 normalization trick正确:分母 wexp(uwTvc)\sum_w \exp(u_w^T v_c) 实际上是配分函数 ZZ,它使得全概率和为 1。这正是训练代价昂贵的来源——每次计算都要遍历整个词表 VVV|V| 可达 10 万+)。
  3. 误区:梯度 uoP(xc)uxu_o - \sum P(x|c)u_x 只更新 vcv_c正确:还需要计算对 uou_o 的梯度(类似推导),同时更新两组向量。

⚠️ 常见误区

  1. 误区:窗口越大越好 → 正确:大窗口捕捉主题相似性(bank + money),小窗口捕捉句法相似性(run + running)。不同任务最优窗口大小不同。
  2. 误区:点积 = 余弦相似度 → 正确:余弦相似度是归一化的点积。如果词向量的模长不一样,直接比较点积是不公平的。Word2Vec 通常用点积(不归一化),评估时才用余弦相似度。