03 CS224n 学习笔记(一):词向量与语言模型
1. 独热向量
计算机不能直接理解词语,因此需要先把词转换成数值。最简单的方法之一是独热编码(One-hot Encoding)。假设词表中只有“我”“爱”“你”三个词,可以把它们分别表示为:
1 | 我 → [1, 0, 0] |
独热向量中只有一个位置为 1,其余位置都为 0。这里的下标表示词在词表中的编号,而不是词在句子中的位置。
这种表示方法简单直接,也方便计算机处理,但它有一个明显的问题:任意两个不同词的独热向量彼此正交,无法直接体现词语之间的语义关系。例如,从这些向量本身看不出“我”和“你”比“我”和“苹果”更接近。
为了让词语之间能够建立语义联系,可以把每个词映射成一个低维、稠密并且可学习的向量,这就是词嵌入(Word Embedding)。Word2Vec 是学习词嵌入的一类经典方法。
2. Word2Vec 与 Skip-gram
Word2Vec 的基本想法来自分布假说:经常出现在相似上下文中的词,往往具有相近的含义。
Word2Vec 主要包含 CBOW 和 Skip-gram 两种训练方式。本文讨论 CS224n 课程中介绍的 Skip-gram:给定一个中心词(Center Word),预测它周围窗口内的上下文词(Outside Word)。

如图所示,当窗口大小为 $m=2$ 时,模型会根据位置 $t$ 的中心词 $w_t$,分别预测 $w_{t-2}$、$w_{t-1}$、$w_{t+1}$ 和 $w_{t+2}$。
2.1 训练目标
假设语料共有 $T$ 个词,窗口大小为 $m$。Skip-gram 希望最大化每个中心词预测其上下文词的条件概率。整个语料的似然可以写为:
$$
L(\theta)
=\prod_{t=1}^{T}
\prod_{\substack{-m\le j\le m\j\ne 0}}
P(w_{t+j}\mid w_t;\theta)
$$
其中,只计算 $t+j$ 没有超出语料边界的上下文词。第一个连乘遍历语料中的每个中心词,第二个连乘遍历该中心词窗口内的位置。$\theta$ 表示模型中所有需要学习的参数,也就是中心词向量和上下文词向量。
直接计算大量概率的乘积不仅不方便,而且数值可能非常小。因此对似然取对数,把连乘转换成求和。为了使用梯度下降最小化目标函数,再加上负号,并除以 $T$ 取平均:
$$
J(\theta)
=-\frac{1}{T}\log L(\theta)
=-\frac{1}{T}
\sum_{t=1}^{T}
\sum_{\substack{-m\le j\le m\j\ne 0}}
\log P(w_{t+j}\mid w_t;\theta)
$$
所以,最大化似然 $L(\theta)$,等价于最小化平均负对数似然 $J(\theta)$。
2.2 条件概率与 softmax
给定中心词 $c$,预测上下文词 $o$ 的概率为:
$$
P(o\mid c)
=\frac{\exp(u_o^\top v_c)}
{\sum_{w\in V}\exp(u_w^\top v_c)}
$$
其中:
- $c$:中心词(Center Word);
- $o$:真实的上下文词(Outside Word);
- $v_c$:词 $c$ 作为中心词时使用的向量;
- $u_o$:词 $o$ 作为上下文词时使用的向量;
- $u_w$:词表中候选词 $w$ 作为上下文词时使用的向量;
- $V$:整个词表;
- $u_o^\top v_c$:中心词 $c$ 与候选上下文词 $o$ 的匹配分数。
这里需要注意:同一个词在 Skip-gram 中通常有两套向量,一套用作中心词向量 $v$,另一套用作上下文词向量 $u$。
点积 $u_o^\top v_c$ 是一个没有范围限制的实数。对它取指数后可以得到正数,再对词表中所有候选词的分数进行归一化,就得到了一个概率分布。这个归一化函数就是 softmax:
$$
\operatorname{softmax}(x)_i
=\frac{\exp(x_i)}{\sum_j\exp(x_j)}
$$
在 Word2Vec 中,每个 $x_i$ 就是某个候选上下文词与中心词的点积。真实上下文词的得分越高,它经过 softmax 后得到的概率通常也越大。
2.3 梯度如何理解
对于一组中心词 $c$ 和真实上下文词 $o$,其负对数似然为:
$$
\ell(c,o)=-\log P(o\mid c)
$$
它对中心词向量 $v_c$ 的梯度为:
$$
\frac{\partial\ell(c,o)}{\partial v_c}
=\sum_{w\in V}P(w\mid c)u_w-u_o
$$
这个结果可以理解为:
$$
\text{梯度}
=\text{模型预测分布下的上下文向量加权平均}
-\text{真实上下文词向量}
$$

梯度下降会沿着负梯度方向更新参数,提高中心词与真实上下文词的相对匹配程度,并压低被模型高估的错误候选词的相对概率。经过语料中的大量样本训练后,出现在相似上下文中的词会逐渐得到相近的向量表示。
最后还要注意:梯度为 0 表示参数到达了一个驻点,并不代表损失一定为 0,也不能仅凭这一点断定找到了全局最优解。
2.4 梯度下降算法
$$ \theta^{\text{new}} = \theta^{\text{old}} - \alpha \nabla_{\theta} J(\theta) $$ 其中: $$ \alpha = \text{learning rate} $$
是学习率,不能太大,这样会导致错过最小值点。
缺点:每一次进行更新都需要计算输出梯度,非常慢,因此采用随机梯度