word2vec 反向传播简单模型
要理解 Word2Vec 的反向传播(Backpropagation),我们先要明确它到底在“反向”传播什么。简单来说,它传播的是“误差”(Loss)。网络预测错了,它需要一种机制顺着计算路径往回找,告诉路径上的每一个权重:“你该增大一点,还是减小一点,才能让下次的预测更准?”
这个寻找的过程,靠的就是微积分中的链式法则(Chain Rule);而最终落实的动作,就是随机梯度下降(SGD)。
下面我们将构建一个极简的模型,并用具体的数字一步步推导。
核心目标:缩小误差
为了让数学原理清晰可见,我们不使用复杂的 Softmax,而是使用上一节提到的负采样(Negative Sampling)框架,因为它本质上就是简单的二分类问题,使用的是 Sigmoid 函数。
极简场景设定:
- 输入词(中心词):\(w_I\) (比如 "fox"),其隐藏层向量表示为 \(h\)。
- 目标词(上下文词):\(w_O\) (比如 "quick"),其输出层向量表示为 \(v\)。
- 真实标签:\(t\)。如果是正样本(确实在语料中相邻),则 \(t = 1\);如果是负样本(随机抽取的无关词),则 \(t = 0\)。
第一步:前向传播 (预测得分)
我们首先计算输入词向量 \(h\) 和目标词向量 \(v\) 的内积(得分):
然后用 Sigmoid 函数 \(\sigma(x)\) 将得分转化为 \(0\) 到 \(1\) 之间的概率 \(y\):
Sigmoid 函数的奇妙性质:它的导数可以直接用它自己表示,这极大简化了计算:
第二步:计算损失 (误差有多大?)
我们使用交叉熵损失函数(Cross-Entropy Loss),在二分类下形式如下:
- 如果真实情况 \(t=1\),网络预测概率 \(y\) 越接近 1,损失 \(E\) 越小(趋近 0)。
- 如果真实情况 \(t=0\),网络预测概率 \(y\) 越接近 0,损失 \(E\) 越小(趋近 0)。
第三步:反向传播 (链式法则登场)
现在核心问题来了:误差 \(E\) 产生了,我们想知道输出向量 \(v\) 和隐藏向量 \(h\) 应该怎么调整。也就是要求偏导数:\(\frac{\partial E}{\partial v}\) 和 \(\frac{\partial E}{\partial h}\)。
根据链式法则,偏导数是一环扣一环传回去的:
我们来逐个击破:
1. 误差对概率的偏导 (\(\frac{\partial E}{\partial y}\))
对损失函数求导:
2. 概率对得分的偏导 (\(\frac{\partial y}{\partial x}\))
这就是 Sigmoid 的导数:
3. 奇迹发生:前两项相乘
把上面两项乘起来,复杂的分母被完美抵消了!
(这在神经网络中是一个极其经典的优雅结论:误差信号就是预测值减去真实值。)
4. 最终求导(得到梯度)
因为 \(x = v^T \cdot h\):
- 得分对输出向量 \(v\) 的偏导:\(\frac{\partial x}{\partial v} = h\)
- 得分对输入向量 \(h\) 的偏导:\(\frac{\partial x}{\partial h} = v\)
最终,我们得到了 \(E\) 对 \(v\) 和 \(h\) 的梯度方程:
这就是 Word2Vec 负采样反向传播最核心的两个公式!
第四步:随机梯度下降 (SGD) 更新权重
有了梯度,我们就可以用 SGD 来更新向量了。更新规则是:当前值减去(学习率 \(\times\) 梯度)。假设学习率 \(\eta = 0.1\)。
具体数字案例推导
假设我们有两个非常简单的二维向量:
- 中心词 "fox" 的隐藏向量:\(h = \begin{bmatrix} 0.5 \\ 0.2 \end{bmatrix}\)
- 上下文词 "quick" 的输出向量:\(v = \begin{bmatrix} 0.8 \\ 0.6 \end{bmatrix}\)
- 真实标签:\(t = 1\)(这是一个真实存在的词对,正样本)
- 学习率:\(\eta = 0.5\)
1. 前向传播:
网络预测这两个词相关的概率是 \(62.7\%\)。因为真实标签是 1(100%),所以存在误差。
2. 计算误差项 \((y - t)\):
误差项 = \(0.627 - 1 = -0.373\)
3. 反向传播更新 \(v\) (快速词的向量):
数学直觉解读:
因为误差是负的(预测值偏低),公式里的减号变成了加号。\(v\) 吸收了一部分 \(h\) 的特征(在 \(h\) 的方向上移动了一点)。这导致下一次计算内积 \(v^T \cdot h\) 时,结果会变大,Sigmoid 输出的概率也会更接近 1。它们在向量空间里被“拉近”了。
反之,如果这是一个负样本(瞎编的词对,标签 \(t=0\)):
误差项 \((y - t)\) 就会变成正数 (\(0.627 - 0 = 0.627\))。
更新公式中的减号保留:\(v\) 会减去一部分 \(h\) 的特征(背离 \(h\) 的方向移动)。它们在空间中会被相互“推远”。
这就是 Word2Vec 能够把意思相近的词聚在一起,把无关的词推开的底层数学逻辑。

浙公网安备 33010602011771号