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\) 的内积(得分):

\[x = v^T \cdot h \]

然后用 Sigmoid 函数 \(\sigma(x)\) 将得分转化为 \(0\)\(1\) 之间的概率 \(y\)

\[y = \sigma(x) = \frac{1}{1 + e^{-x}} \]

Sigmoid 函数的奇妙性质:它的导数可以直接用它自己表示,这极大简化了计算:

\[\frac{\partial \sigma(x)}{\partial x} = \sigma(x)(1 - \sigma(x)) = y(1 - y) \]

第二步:计算损失 (误差有多大?)

我们使用交叉熵损失函数(Cross-Entropy Loss),在二分类下形式如下:

\[E = - \big[ t \log(y) + (1-t) \log(1-y) \big] \]

  • 如果真实情况 \(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}\)

根据链式法则,偏导数是一环扣一环传回去的:

\[\frac{\partial E}{\partial v} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial x} \cdot \frac{\partial x}{\partial v} \]

我们来逐个击破:

1. 误差对概率的偏导 (\(\frac{\partial E}{\partial y}\))
对损失函数求导:

\[\frac{\partial E}{\partial y} = -\frac{t}{y} + \frac{1-t}{1-y} = \frac{y-t}{y(1-y)} \]

2. 概率对得分的偏导 (\(\frac{\partial y}{\partial x}\))
这就是 Sigmoid 的导数:

\[\frac{\partial y}{\partial x} = y(1-y) \]

3. 奇迹发生:前两项相乘
把上面两项乘起来,复杂的分母被完美抵消了!

\[\frac{\partial E}{\partial x} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{y-t}{y(1-y)} \cdot y(1-y) = y - t \]

(这在神经网络中是一个极其经典的优雅结论:误差信号就是预测值减去真实值。)

4. 最终求导(得到梯度)
因为 \(x = v^T \cdot h\)

  • 得分对输出向量 \(v\) 的偏导:\(\frac{\partial x}{\partial v} = h\)
  • 得分对输入向量 \(h\) 的偏导:\(\frac{\partial x}{\partial h} = v\)

最终,我们得到了 \(E\)\(v\)\(h\) 的梯度方程:

\[\frac{\partial E}{\partial v} = (y - t) \cdot h \]

\[\frac{\partial E}{\partial h} = (y - t) \cdot v \]

这就是 Word2Vec 负采样反向传播最核心的两个公式!


第四步:随机梯度下降 (SGD) 更新权重

有了梯度,我们就可以用 SGD 来更新向量了。更新规则是:当前值减去(学习率 \(\times\) 梯度)。假设学习率 \(\eta = 0.1\)

\[v_{new} = v_{old} - \eta \frac{\partial E}{\partial v} = v_{old} - \eta (y - t) h \]

\[h_{new} = h_{old} - \eta \frac{\partial E}{\partial h} = h_{old} - \eta (y - t) v \]

具体数字案例推导

假设我们有两个非常简单的二维向量:

  • 中心词 "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. 前向传播:

\[x = v^T \cdot h = (0.8 \times 0.5) + (0.6 \times 0.2) = 0.4 + 0.12 = 0.52 \]

\[y = \sigma(0.52) = \frac{1}{1 + e^{-0.52}} \approx 0.627 \]

网络预测这两个词相关的概率是 \(62.7\%\)。因为真实标签是 1(100%),所以存在误差。

2. 计算误差项 \((y - t)\)
误差项 = \(0.627 - 1 = -0.373\)

3. 反向传播更新 \(v\) (快速词的向量):

\[v_{new} = v_{old} - \eta (y - t) h \]

\[v_{new} = \begin{bmatrix} 0.8 \\ 0.6 \end{bmatrix} - 0.5 \times (-0.373) \times \begin{bmatrix} 0.5 \\ 0.2 \end{bmatrix} \]

\[v_{new} = \begin{bmatrix} 0.8 \\ 0.6 \end{bmatrix} + \begin{bmatrix} 0.09325 \\ 0.0373 \end{bmatrix} = \begin{bmatrix} 0.89325 \\ 0.6373 \end{bmatrix} \]

数学直觉解读
因为误差是负的(预测值偏低),公式里的减号变成了加号。\(v\) 吸收了一部分 \(h\) 的特征(在 \(h\) 的方向上移动了一点)。这导致下一次计算内积 \(v^T \cdot h\) 时,结果会变大,Sigmoid 输出的概率也会更接近 1。它们在向量空间里被“拉近”了。

反之,如果这是一个负样本(瞎编的词对,标签 \(t=0\)):
误差项 \((y - t)\) 就会变成正数 (\(0.627 - 0 = 0.627\))。
更新公式中的减号保留:\(v\) 会减去一部分 \(h\) 的特征(背离 \(h\) 的方向移动)。它们在空间中会被相互“推远”。

这就是 Word2Vec 能够把意思相近的词聚在一起,把无关的词推开的底层数学逻辑。

posted @ 2026-08-31 21:52  立体风  阅读(6)  评论(0)    收藏  举报