word2vec 反向传播 解读1
在 Word2Vec(特别是 Skip-gram 模型)中,反向传播与随机梯度下降(SGD)是训练的核心引擎。虽然现代实现通常使用“负采样”来加速,但理解原始 Softmax + 交叉熵损失的反向传播是掌握其数学原理的基石。
以下是对这一过程的详细拆解、数学推导及直观示例。
1. 简要模型架构回顾
假设我们有一个中心词 \(w_c\)(输入)和一个上下文词 \(w_o\)(目标输出)。
- 输入向量:\(v_c \in \mathbb{R}^d\) (对应矩阵 \(W\) 的第 \(c\) 行)
- 输出向量:\(u_o \in \mathbb{R}^d\) (对应矩阵 \(W'\) 的第 \(o\) 列)
- 词汇表大小:\(V\),嵌入维度:\(d\)
前向传播 (Forward Pass)
- 打分:计算中心词与所有词汇表中词的相似度分数:\[z_j = u_j^\top v_c \quad (\text{对所有 } j \in V) \]
- Softmax:将分数转化为概率分布:\[p(w_j | w_c) = \hat{y}_j = \frac{\exp(z_j)}{\sum_{k=1}^{V} \exp(z_k)} \]
- 损失函数:使用交叉熵衡量预测 \(\hat{y}\) 与真实标签 \(y\)(One-hot 向量,仅第 \(o\) 位为1)的差距:\[J = -\log p(w_o | w_c) = -z_o + \log \sum_{k=1}^{V} \exp(z_k) \]
2. 反向传播:链式法则求偏导
我们的目标是求出损失 \(J\) 对两个权重矩阵参数的梯度:\(\frac{\partial J}{\partial W'}\) 和 \(\frac{\partial J}{\partial W}\)。
关键中间变量:预测误差
定义预测概率与真实标签的差值向量 \(\delta \in \mathbb{R}^V\):
直觉:当 \(j=o\)(目标词)时,\(\delta_o = \hat{y}_o - 1\)(预测多了多少);当 \(j \neq o\) 时,\(\delta_j = \hat{y}_j - 0\)(不该预测却预测了多少)。这个 \(\delta\) 就是反向传播的“误差信号”。
A. 对输出矩阵 \(W'\) 求导 (\(\frac{\partial J}{\partial u_w}\))
利用链式法则 \(\frac{\partial J}{\partial u_w} = \frac{\partial J}{\partial z_w} \cdot \frac{\partial z_w}{\partial u_w}\):
- 矩阵形式:\(\frac{\partial J}{\partial W'} = \delta \cdot v_c^\top\) (外积,结果维度 \(V \times d\))
B. 对输入矩阵 \(W\) 求导 (\(\frac{\partial J}{\partial v_c}\))
注意 \(v_c\) 参与了所有 \(z_j\) 的计算,因此需要对所有词求和:
核心洞察:\(v_c\) 的梯度是所有输出向量 \(u_j\) 的加权平均,权重恰好是预测误差 \(\delta_j\)。这意味着:预测错的词对应的输出向量会“拉扯”输入向量,使其远离或靠近。
3. SGD 更新规则
有了梯度后,使用学习率 \(\eta\) 进行更新:
⚠️ 实际工程注记:由于 \(\sum_{j=1}^{V}\) 计算量太大(\(V\) 通常百万级),实际 Word2Vec 使用 Negative Sampling 或 Hierarchical Softmax 替代全量 Softmax,此时求和仅涉及 1 个正样本 + K 个负样本(如 K=5~20),使训练成为可能。但上述数学原理完全一致。
4. 简单数值例子说明数学原理
📐 例1:一维极简情况(直觉验证)
设 \(d=1, V=2\),词汇={猫, 狗}。当前参数:
- \(v_{\text{猫}} = 0.5\), \(u_{\text{猫}} = 0.8\), \(u_{\text{狗}} = -0.3\)
- 目标:给定"猫",预测"猫"(即 \(y = [1, 0]\))
前向:
- \(z_{\text{猫}} = 0.8 \times 0.5 = 0.4\), \(z_{\text{狗}} = -0.3 \times 0.5 = -0.15\)
- \(\hat{y}_{\text{猫}} = \frac{e^{0.4}}{e^{0.4}+e^{-0.15}} \approx 0.634\)
- \(\hat{y}_{\text{狗}} \approx 0.366\)
- 损失 \(J = -\log(0.634) \approx 0.456\)
反向传播:
- \(\delta_{\text{猫}} = 0.634 - 1 = -0.366\) (预测不足,需要增大)
- \(\delta_{\text{狗}} = 0.366 - 0 = +0.366\) (预测过多,需要减小)
梯度:
- \(\frac{\partial J}{\partial u_{\text{猫}}} = -0.366 \times 0.5 = -0.183\) → 更新后 \(u_{\text{猫}}\) 增大 ✓
- \(\frac{\partial J}{\partial u_{\text{狗}}} = +0.366 \times 0.5 = +0.183\) → 更新后 \(u_{\text{狗}}\) 减小 ✓
- \(\frac{\partial J}{\partial v_{\text{猫}}} = (-0.366)(0.8) + (0.366)(-0.3) = -0.403\) → 更新后 \(v_{\text{猫}}\) 增大 ✓
解读:三个参数都在朝着让 \(z_{\text{猫}}\) 变大、\(z_{\text{狗}}\) 变小的方向调整,下次 \(\hat{y}_{\text{猫}}\) 会更接近 1。
📐 例2:为什么 \(v_c\) 的梯度是所有 \(u_j\) 的加权和?
假设 \(d=2\),当前 \(v_c = [1, 0]\),有三个词的输出向量:
- \(u_A = [1, 0]\)(与 \(v_c\) 同向)
- \(u_B = [-1, 0]\)(与 \(v_c\) 反向)
- \(u_C = [0, 1]\)(与 \(v_c\) 正交)
若模型过度预测了 B(\(\delta_B > 0\)),而对 A 预测不足(\(\delta_A < 0\)),C 预测准确(\(\delta_C \approx 0\)):
两项都产生负的第一分量,SGD 减去负梯度 = 增加第一分量。同时第二分量几乎不变。
几何直觉:\(v_c\) 被“推离”被过度预测的词(B),同时被“拉向”预测不足的词(A)。正交的词(C)不影响移动方向。这就是 Word2Vec 能在向量空间中自动组织语义关系的根本机制。
📐 例3:完美预测时梯度为零
若 \(\hat{y}_o = 1.0\),则 \(\delta_o = 0\),且对所有 \(j \neq o\),\(\hat{y}_j = 0 \Rightarrow \delta_j = 0\)。
网络已经学会了这个 pair,不再更新——这正是收敛的标志。
5. 总结:反向传播在 Word2Vec 中的本质
| 组件 | 数学表达 | 语义解释 |
|---|---|---|
| 误差信号 \(\delta\) | \(\hat{y} - y\) | “哪些词被多/少预测了” |
| \(W'\) 的梯度 | \(\delta_w \cdot v_c\) | 按误差比例缩放输入向量 |
| \(W\) 的梯度 | \({W'}^\top \delta\) | 所有输出向量的误差加权组合 |
| SGD 更新 | \(\theta \leftarrow \theta - \eta \nabla J\) | 沿损失下降最快方向微调 |
一句话总结:Word2Vec 的反向传播本质上是一个 “推拉系统” ——预测误差 \(\delta\) 作为力的大小,输出向量 \(u\) 作为力的方向,共同作用于输入向量 \(v_c\),使其在嵌入空间中不断移动到能正确反映共现关系的位置。每一次 SGD 更新都是一次微小的语义校准。

浙公网安备 33010602011771号