Files
2026-05-16 17:16:51 +08:00

19 KiB
Raw Permalink Blame History

title, draft, tags
title draft tags
静态词向量Word2Vec 与 GloVe 的数学体系 false
Word2Vec
GloVe
词嵌入
NLP
静态表示

静态词向量Word2Vec 与 GloVe 的数学体系


一、从独热编码到分布式表示

1.1 独热编码的问题

独热编码One-Hot Encoding

设词表大小为 $|V|$,词 w_i 的独热向量为:

\mathbf{e}_i = [0, 0, \ldots, 1, \ldots, 0] \in \mathbb{R}^{|V|} \tag{1.1}

其中第 i 个位置为 1其余为 0。

问题

  1. 维度灾难:词表通常数万到数十万,维度过高
  2. 语义鸿沟:所有词的正交基表示无法捕捉语义相似性
  3. 分布稀疏:只有一个非零元素,计算效率低

核心问题:独热编码假设所有词都是独立的,丢失了词之间的语义关系。

1.2 分布式表示的核心思想

分布式表示Distributed Representation

每个词的语义不是由单一维度表示,而是分布在多个维度上

关键洞察

语义相似的词应该具有相似的向量表示。

数学表示

设词 w 的嵌入向量为 $\mathbf{v}_w \in \mathbb{R}^d$,其中 $d \ll |V|$。

相似性度量:

\text{sim}(w_i, w_j) = \frac{\mathbf{v}_{w_i}^\top \mathbf{v}_{w_j}}{\|\mathbf{v}_{w_i}\| \cdot \|\mathbf{v}_{w_j}\|} \tag{1.2}

这是余弦相似度,取值在 [-1, 1] 之间。

1.3 分布假说

分布假说Distributional HypothesisHarris, 1954

出现在相似上下文中的词具有相似的语义。

经典表述

  • "You shall know a word by the company it keeps"Firth, 1957

数学化

c(w) 是词 w 的上下文表示。如果两个词 w_iw_j 的上下文分布 P(c|w_i)P(c|w_j) 相似,则 w_iw_j 的语义相似。

这构成了所有词向量学习算法的理论基础


二、Word2Vec跳字模型与连续词袋

2.1 语言模型基础

语言模型

给定词序列 $w_1, w_2, \ldots, w_T$,语言模型学习联合概率分布:

P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t | w_1, \ldots, w_{t-1}) \tag{2.1}

n-gram 模型

近似为:

P(w_t | w_{t-1}, \ldots, w_{t-n+1}) \tag{2.2}

问题n-gram 模型需要存储所有 n-gram 的频率,且无法处理长距离依赖。

2.2 Skip-gram 模型

核心思想Mikolov et al., 2013

使用中心词预测上下文词。如果两个词的上下文相似,它们的向量就相似。

数学定义

设中心词为 $w_t$,上下文(窗口大小为 $c$)为:

\text{context}(w_t) = \{w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c}\} \tag{2.3}

Skip-gram 的目标是最大化:

\mathcal{L} = \sum_{t=1}^T \sum_{-c \leq j \leq c, j \neq 0} \log P(w_{t+j} | w_t) \tag{2.4}

条件概率定义softmax 形式):

P(w_O | w_I) = \frac{\exp(\mathbf{v}_{w_O}^{\top (O)} \mathbf{v}_{w_I}^{(I)})}{\sum_{w=1}^{|V|} \exp(\mathbf{v}_w^{\top (O)} \mathbf{v}_{w_I}^{(I)})} \tag{2.5}

Word2Vec 的双向量机制:每个词 w 有两个向量——输入向量 $\mathbf{v}_w^{(I)}$(用于作为中心词时)和输出向量 $\mathbf{v}_w^{(O)}$(用于作为上下文词时)。这在 Skip-gram 中尤为重要,因为中心词和上下文词的向量在公式中使用的是不同向量。

2.3 Skip-gram 的概率推导

问题:标准 softmax 的分母需要遍历整个词表($|V| \approx 10^5$),计算代价极高。

解决方案负采样Negative Sampling

负采样目标

对于每个正样本 $(w_I, w_O)$(中心词-上下文词对),采样 k 个负样本 ${w_{O_i^-}}_{i=1}^k$。

定义(负采样损失)

\mathcal{L}_{\mathrm{SGNS}} = -\sum_{(w_I, w_O)} \left[ \log \sigma(\mathbf{v}_{w_O}^{\top (O)} \mathbf{v}_{w_I}^{(I)}) + \sum_{i=1}^k \mathbb{E}_{w_i^- \sim P_n} \log \sigma(-\mathbf{v}_{w_i^-}^{\top (O)} \mathbf{v}_{w_I}^{(I)}) \right] \tag{2.6}

其中 \sigma(x) = \frac{1}{1 + e^{-x}} 是 sigmoid 函数,P_n 是负采样分布(通常为 unigram 分布的 3/4 次幂)。负采样分布设计为 $P_n(w) \propto f(w)^{3/4}$,其中 f(w) 是词 w 的频率。这个 3/4 次幂设计是为了降低高频词的采样概率,同时适度提升低频词的采样机会,比简单使用频率分布效果更好。

2.4 连续词袋CBOW模型

核心思想

使用上下文预测中心词。与 Skip-gram 相反。

数学定义

\mathcal{L} = \sum_{t=1}^T \log P(w_t | w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c}) \tag{2.8}

条件概率

P(w_O | \text{context}) = \frac{\exp(\bar{\mathbf{v}}^\top \mathbf{v}_{w_O})}{\sum_{w=1}^{|V|} \exp(\bar{\mathbf{v}}^\top \mathbf{v}_w)} \tag{2.9}

其中 \bar{\mathbf{v}} 是上下文的平均向量:

\bar{\mathbf{v}} = \frac{1}{2c} \sum_{-c \leq j \leq c, j \neq 0} \mathbf{v}_{w_j} \tag{2.10}

2.5 Skip-gram 与 CBOW 的对比

维度 Skip-gram CBOW
方向 中心词 \rightarrow 上下文 上下文 \rightarrow 中心词
适合场景 稀有词/小数据集 常见词/大数据集
训练速度 较慢(每个中心词对应多个样本) 较快(每个位置只生成一个样本)
对低频词的处理 更好(每个词都是学习目标) 较差(上下文平均会平滑掉稀有词的信号,这使得 CBOW 对低频词的学习效果不如 Skip-gram

2.6 训练目标详解

Skip-gram 的完整目标函数

\mathcal{J}(\theta) = \frac{1}{T} \sum_{t=1}^T \sum_{-c \leq j \leq c, j \neq 0} \log \frac{\exp(\mathbf{v}_{w_{t+j}}^{\top (O)} \mathbf{v}_{w_t}^{(I)})}{\sum_{w=1}^{|V|} \exp(\mathbf{v}_w^{\top (O)} \mathbf{v}_{w_t}^{(I)})} \tag{2.11}

使用负采样近似后

对于每个训练对 $(w_t, w_{t+j})$

  1. 计算正样本分数:\mathbf{v}_{w_{t+j}}^{\top (O)} \mathbf{v}_{w_t}^{(I)}
  2. 采样 k 个负样本 w_i^-
  3. 最小化损失:
\log \sigma(\mathbf{v}_{w_{t+j}}^{\top (O)} \mathbf{v}_{w_t}^{(I)}) + \sum_{i=1}^k \log \sigma(-\mathbf{v}_{w_i^-}^{\top (O)} \mathbf{v}_{w_t}^{(I)}) \tag{2.12}

2.7 Word2Vec 的层级 Softmax

层级 Softmax(另一加速方案):

将词表组织为霍夫曼树(最优二叉树),叶节点是词。霍夫曼树的构建规则:根据词频($f_w$)创建,叶节点的路径长度与词频成反比——高频词路径短,低频词路径长。到达每个词的路径长度约为 $O(\log |V|)$。

定义(层级 Softmax 概率)

w 的概率等于从根节点到叶节点路径上每个节点的 sigmoid 决策概率的乘积。每次决策使用一个辅助向量 $\mathbf{v}_n$。路径长度约为 $O(\log |V|)$,因此复杂度从 O(|V|) 降到 $O(\log |V|)$。


三、GloVe全局共现统计

3.1 GloVe 的核心思想

GloVePennington et al., 2014的全称是 Global Vectors for Word Representation

核心洞察

将词向量的学习建立在全局共现矩阵上,而不是像 Word2Vec 那样只依赖局部上下文。

数学定义

X \in \mathbb{R}^{|V| \times |V|}共现矩阵,其中 X_{ij} 表示词 i 和词 j 在语料库中共同出现的次数。

目标

学习词向量 $\mathbf{v}_i, \mathbf{\hat{v}}_j$,使得:

\mathbf{v}_i^\top \mathbf{\hat{v}}_j \approx \log(X_{ij}) \tag{3.1}

3.2 共现矩阵的构建

定义(窗口共现)

给定窗口大小 $c$,对于语料库中的每个位置 $t$,更新:

X_{w_t, w_{t+j}} += \frac{1}{|j|} \quad \text{for } j \in \{-c, \ldots, -1, 1, \ldots, c\} \tag{3.2}

距离衰减加权

远处的词贡献较小的权重:

\text{weight}(j) = \frac{1}{|j|} \tag{3.3}

定义(全局共现向量)

X_i = \sum_{j} X_{ij} \tag{3.4}

这是词 i 与所有其他词的共现总和。

3.3 GloVe 的损失函数

初步损失函数

\mathcal{L} = \sum_{i,j} f(X_{ij}) \left( \mathbf{v}_i^\top \mathbf{\hat{v}}_j + b_i + \hat{b}_j - \log X_{ij} \right)^2 \tag{3.5}

其中 b_i, \hat{b}_j 是偏置项。

设计 f(X_{ij}) 的动机

  1. 停止过度学习高频词:当 X_{ij} 很大时,不应该让这个共现主导损失
  2. 处理零共现X_{ij} = 0 时,\log X_{ij} 是 $-\infty$,但这不应该有无限大的损失

定义(断点加权函数)

f(x) = \begin{cases} (x / x_{\max})^\alpha & \text{if } x < x_{\max} \\ 1 & \text{otherwise} \end{cases} \tag{3.6}

推荐配置:$x_{\max} = 100$$\alpha = 3/4$。

这个函数确保

  • 对于罕见的共现(x 很小),f(x) 接近 0但不为 0
  • 对于常见的共现,$f(x) = 1$(截断饱和)
  • 中等频率的共现有适当的权重

3.4 GloVe 与 Word2Vec 的对比

维度 Word2Vec GloVe
训练数据 局部窗口 全局共现矩阵
计算复杂度 O(T \cdot c \cdot k) $O(
目标函数 条件对数似然 最小二乘回归(对数共现)
表示 两个矩阵(输入/输出向量) 通常使用 \mathbf{v}_i\mathbf{\hat{v}}_j 的融合向量 \frac{\mathbf{v}_i + \mathbf{\hat{v}}_j}{2}

GloVe 双向对称性:共现矩阵 X 是对称的,即 $X_{ij} = X_{ji}$。这意味着词 i 对词 j 的共现次数与词 j 对词 i 的共现次数相同。在训练完成后,通常使用 (\mathbf{v}_i + \mathbf{\hat{v}}_j)/2 进行推理,以利用双向信息。 | 稀疏性处理 | 负采样隐式处理 | 需要特殊处理零共现 |

3.5 GloVe 的数学推导

从矩阵分解角度

共现矩阵 X 的对数形式可以分解为:

\log X \approx U \Sigma V^\top \tag{3.7}

取前 d 个奇异值:

\log X \approx U_d \Sigma_d V_d^\top \tag{3.8}

这等价于

令 $\mathbf{v}_i = U_d(i,:) \sqrt{\Sigma_d}$$\mathbf{\hat{v}}_j = V_d(j,:)^\top \sqrt{\Sigma_d}$,则:

\mathbf{v}_i^\top \mathbf{\hat{v}}_j \approx (\log X)_{ij} \tag{3.9}

GloVe 的创新:不直接做 SVD计算量 $O(|V|^3)$),而是使用 SGD 直接优化。

3.6 共现概率与语义相似性

定义(共现比率)

P_{ij} = \frac{X_{ik}}{X_jk} = \frac{P(k|i)}{P(k|j)} \quad \text{for any } k \tag{3.10}

语义解释

  • P_{ij} \gg 1 时,词 i 比词 j 更常与 k 共现
  • P_{ij} \ll 1 时,情况相反
  • P_{ij} \approx 1 时,ijk 的共现关系相似

GloVe 捕捉这个比率

通过学习使得:

\mathbf{v}_i^\top \mathbf{\hat{v}}_j + b_i + \hat{b}_j \approx \log X_{ij} \tag{3.11}

可以验证这等价于:

\mathbf{v}_i^\top \mathbf{\hat{v}}_j \approx \log \frac{X_{ik}}{X_{jk}} \quad \text{(for appropriate } k) \tag{3.12}

四、训练过程与实现细节

4.1 Word2Vec 的训练流程

Algorithm: Word2Vec (Skip-gram with Negative Sampling)

输入:语料库 $C$,嵌入维度 $d$,窗口大小 $c$,负样本数 $k$,学习率 \eta

初始化

  1. 随机初始化所有词的输入向量 \mathbf{v}_w \sim \mathcal{N}(0, 0.1)
  2. 初始化输出向量(或共享输入向量,取决于架构)

训练

for each epoch:
    for each sentence (w_1, ..., w_T) in C:
        for each position t = 1 to T:
            # 中心词
            w_I = w_t

            # 正样本
            for each j in [-c, c], j != 0:
                w_O = w_{t+j}

                # 负采样
                for i = 1 to k:
                    w_i^- ~ P_n(w)  # unigram^3/4

                # 更新向量
                g = eta * (sigma(v_O^T v_I) - 1) * v_O  # 正样本梯度
                g_i = eta * sigma(-v_i^-^T v_I) * v_i^-  # 负样本梯度

                v_I = v_I - g - sum(g_i)
                v_O = v_O - g
                v_i^- = v_i^- - g_i

4.2 GloVe 的训练流程

Algorithm: GloVe Training

输入:语料库 $C$,嵌入维度 $d$,窗口大小 $c$,学习率 \eta

步骤 1构建共现矩阵

X = zeros(|V|, |V|)
for each sentence in C:
    for each position t:
        for each offset j in [-c, c], j != 0:
            X[w_t, w_{t+j}] += 1 / |j|

步骤 2最小二乘优化

# 随机初始化
v_i, hat_v_j ~ N(0, 0.1)
b_i, hat_b_j ~ zeros

for each epoch:
    # 采样非零元素
    (i, j) = sample_from_X()

    # 计算预测误差
    pred = v_i^T hat_v_j + b_i + hat_b_j - log(X[i,j])

    # 加权梯度
    weight = f(X[i,j])
    grad = weight * pred

    # 更新
    v_i -= eta * grad * hat_v_j
    hat_v_j -= eta * grad * v_i
    b_i -= eta * weight * pred
    hat_b_j -= eta * weight * pred

4.3 训练中的常见问题

问题 1高频词主导

  • 表现:如 "the", "a", "is" 等词占据了绝大多数共现
  • 影响:学到的向量被这些高频词主导

GloVe 解决方案:断点加权函数 $f(X_{ij})$(式 3.6

Word2Vec 解决方案:对高频词进行下采样,以概率 P(w) = 1 - \sqrt{t / f_w} 跳过,其中 f_w 是词 w 的频率,t 是频率阈值(通常为 $10^{-5}$)。这个公式确保高频词被更频繁地跳过,但不会被完全排除。

问题 2罕见词表示差

  • 表现:低频词的向量没有被充分训练

解决方案

  1. 增加罕见词的采样概率
  2. 使用上下文加权

问题 3训练不收敛

  • 表现:损失不下降或 NaN

解决方案

  1. 降低学习率
  2. 梯度裁剪
  3. 使用 Adagrad/Adam 等自适应学习率优化器

4.4 超参数影响

超参数 典型值 影响
嵌入维度 $d$ 50-300 维度越高表达能力越强,但也容易过拟合
窗口大小 $c$ 5-15 越大考虑更多上下文,但也引入更多噪声
负样本数 $k$ 5-20 Skip-gram 常用 5-15
最小词频 5-50 过滤掉极低频词
学习率 0.001-0.05 过高会导致不收敛

五、词向量的评估与应用

5.1 评估任务

词相似度评估

常用数据集WordSim-353, SimLex-999, MEN, TRUKES

定义(相似度指标)

给定人工标注的相似度分数 s_{ij} 和模型预测的余弦相似度 $\hat{s}_{ij}$

Spearman 相关系数

\rho = 1 - \frac{6 \sum d_i^2}{n(n^2-1)} \tag{5.1}

其中 d_i 是两个排序的差异。

5.2 类比任务Analogy

词类比任务Mikolov et al., 2013

"man is to king as woman is to ?"

数学定义

\text{queen} = \arg\max_{w} \cos(\mathbf{v}_w, \mathbf{v}_{king} - \mathbf{v}_{man} + \mathbf{v}_{woman}) \tag{5.2}

评估指标

\text{Accuracy} = \frac{\# \text{正确预测的类比}}{\# \text{总类比}} \tag{5.3}

5.3 向量空间的几何性质

性质 1语义可加性

\mathbf{v}_{\text{巴黎}} + \mathbf{v}_{\text{德国}} - \mathbf{v}_{\text{法国}} \approx \mathbf{v}_{\text{柏林}} \tag{5.4}

这解释了为什么 Skip-gram 学到的向量具有"语义可加性"。

性质 2聚类结构

相似语义的词在向量空间中聚集形成簇。

性质 3性别/时态等二维子空间

\mathbf{v}_{\text{男人}} - \mathbf{v}_{\text{女人}} \approx \mathbf{v}_{\text{国王}} - \mathbf{v}_{\text{女王}} \tag{5.5}

这表明某些语义维度(如性别)在线性方向上有规律。

5.4 预训练词向量的使用

加载预训练向量

# 使用 GloVe
embeddings = {}
with open('glove.6B.300d.txt') as f:
    for line in f:
        values = line.split()
        word = values[0]
        vector = np.asarray(values[1:], dtype='float32')
        embeddings[word] = vector

处理 OOV

def get_embedding(word, embeddings, dim):
    if word in embeddings:
        return embeddings[word]
    else:
        return np.random.randn(dim) * 0.01  # 随机初始化

六、静态词向量与上下文化表示的对比

6.1 静态词向量的局限

核心问题

同一个词在不同的上下文中,静态词向量是相同的

反例

  • "bank"河岸vs "bank"(银行):应该有不同的表示
  • "run"动词跑步vs "run"(名词溪流):应该有不同的表示

数学表示

对于同一词 w 在不同上下文 c_1c_2 中,静态词向量满足 $\mathbf{v}_w^{(c_1)} = \mathbf{v}_w^{(c_2)} = \mathbf{v}_w$。这忽略了语义的可变性。

6.2 解决方案

方案 1多义词向量(不常用)

让一个词对应多个向量,但这增加了模型复杂度。

方案 2上下文化表示ELMo、BERT

每个词的表示依赖于其上下文:

\mathbf{v}_{w,t}^{\text{ctx}} = f(\text{上下文}) \tag{6.2}

这是下一份笔记的主题。


七、数学公式速查

7.1 Word2Vec 公式

Skip-gram 条件概率

P(w_O | w_I) = \frac{\exp(\mathbf{v}_{w_O}^{\top (O)} \mathbf{v}_{w_I}^{(I)})}{\sum_{w=1}^{|V|} \exp(\mathbf{v}_w^{\top (O)} \mathbf{v}_{w_I}^{(I)})} \tag{7.1}

负采样损失

\mathcal{L} = -\sum_{(w_I, w_O)} \left[ \log \sigma(\mathbf{v}_{w_O}^{\top (O)} \mathbf{v}_{w_I}^{(I)}) + \sum_{i=1}^k \mathbb{E}_{w_i^- \sim P_n} \log \sigma(-\mathbf{v}_{w_i^-}^{\top (O)} \mathbf{v}_{w_I}^{(I)}) \right] \tag{7.2}

7.2 GloVe 公式

共现矩阵

X_{ij} = \sum_{t} \frac{1}{|j|} \cdot \mathbf{1}_{|w_t - w_{t+j}| = |j|} \tag{7.3}

加权损失函数

\mathcal{L} = \sum_{i,j} f(X_{ij}) \left( \mathbf{v}_i^\top \mathbf{\hat{v}}_j + b_i + \hat{b}_j - \log X_{ij} \right)^2 \tag{7.4}

断点加权函数

f(x) = \begin{cases} (x / x_{\max})^{3/4} & \text{if } x < x_{\max} \\ 1 & \text{otherwise} \end{cases} \tag{7.5}

7.3 相似度度量

余弦相似度

\text{sim}(\mathbf{v}_i, \mathbf{v}_j) = \frac{\mathbf{v}_i^\top \mathbf{v}_j}{|\mathbf{v}_i| |\mathbf{v}_j|} \tag{7.6}

Spearman 相关系数

\rho = 1 - \frac{6 \sum d_i^2}{n(n^2-1)} \tag{7.7}

八、总结

Word2Vec 与 GloVe 的核心差异

方面 Word2Vec GloVe
理论基础 局部上下文预测 全局共现统计
优化目标 条件对数似然 加权最小二乘回归
训练方式 随机采样 + SGD 矩阵预计算 + SGD
表示能力 相似词有相似向量 相似词有相似向量

共同点

  1. 都产生静态词向量——同一个词在不同上下文中表示相同
  2. 都利用了分布假说——相似的词有相似的上下文
  3. 都产生线性子空间——词义关系可以在向量加减中体现

局限性

  1. 无法处理一词多义
  2. 无法捕捉长距离依赖
  3. 静态表示无法适应特定任务

这是下一份笔记ELMo 和 BERT的动机


延伸阅读

  1. Mikolov et al., "Efficient Estimation of Word Representations in Vector Space" (2013) — Word2Vec
  2. Mikolov et al., "Distributed Representations of Words and Phrases and their Compositionality" (2013) — Skip-gram
  3. Pennington et al., "GloVe: Global Vectors for Word Representation" (EMNLP 2014)
  4. Levy & Goldberg, "Neural Word Embedding as Implicit Matrix Factorization" (NIPS 2014) — 解释了 Word2Vec 与矩阵分解的联系
  5. Rong, "word2vec Parameter Learning Explained" (2016) — 详细的梯度推导