隐空间模型(如 Word2Vec)中的负采样(Negative Sampling)算法
题目描述
Word2Vec 是一种广泛应用于自然语言处理的词嵌入模型,它通过学习将词汇映射到低维连续向量空间,使得语义相似的词在向量空间中距离相近。Word2Vec 包含两种主要架构:Skip-gram 和 CBOW。然而,在训练过程中,如果直接使用标准的 softmax 函数计算每个词的条件概率,将面临巨大的计算开销,因为 softmax 需要对词汇表中的所有词求和。为了高效地训练大规模语料,Word2Vec 采用了负采样(Negative Sampling)技术。负采样通过将多分类问题转化为二分类问题,显著降低了计算复杂度。本次讲解将详细介绍负采样的动机、原理、采样策略以及如何在 Skip-gram 模型中应用负采样进行优化求解。
解题过程
1. 问题背景与动机
在 Skip-gram 模型中,目标是根据中心词 \(c\) 预测其上下文窗口内的目标词 \(t\)。理想情况下,模型应最大化给定中心词时目标词的条件概率 \(P(t|c)\)。使用 softmax 函数表示如下:
\[P(t|c) = \frac{\exp(\mathbf{v}_t \cdot \mathbf{v}_c)}{\sum_{w \in V} \exp(\mathbf{v}_w \cdot \mathbf{v}_c)} \]
其中 \(V\) 是词汇表,\(\mathbf{v}_c\) 和 \(\mathbf{v}_t\) 分别是中心词和目标词的向量表示。分母需要对词汇表中的所有词 \(w\) 计算指数内积,当词汇表规模达到数十万时,计算代价极高,成为训练瓶颈。
负采样的核心思想是:不再直接计算完整的 softmax,而是通过区分“真实目标词”(正样本)和随机采样的“噪声词”(负样本)来学习词向量。这样,每次更新只需处理少量样本(例如,一个正样本和 \(k\) 个负样本),计算复杂度从 \(O(|V|)\) 降低到 \(O(k+1)\),其中 \(k\) 通常远小于 \(|V|\)(例如 \(k=5\))。
2. 负采样的基本原理
负采样将问题重构为一个二分类任务:给定一对词 \((c, t)\),判断它们是否来自真实的上下文关系(即 \(t\) 确实出现在 \(c\) 的上下文窗口中)。
- 正样本:从语料中实际共现的 \((c, t)\) 对。
- 负样本:随机从词汇表中采样 \(k\) 个词 \(n_i\),与 \(c\) 组成 \((c, n_i)\) 对,这些词通常不在 \(c\) 的上下文中。
对于每个样本对 \((c, w)\),模型输出一个概率,表示 \(w\) 是 \(c\) 的真实上下文词的概率:
\[P(D=1|c,w) = \sigma(\mathbf{v}_w \cdot \mathbf{v}_c) = \frac{1}{1 + \exp(-\mathbf{v}_w \cdot \mathbf{v}_c)} \]
其中 \(\sigma\) 是 sigmoid 函数,\(D=1\) 表示正样本,\(D=0\) 表示负样本。
3. 目标函数构建
对于每个正样本 \((c, t)\) 和对应的 \(k\) 个负样本 \((c, n_1), \dots, (c, n_k)\),目标函数定义为最大化正样本的对数概率,同时最小化负样本的对数概率(即最大化负样本被分类为负的概率):
\[J = \log \sigma(\mathbf{v}_t \cdot \mathbf{v}_c) + \sum_{i=1}^k \log \sigma(-\mathbf{v}_{n_i} \cdot \mathbf{v}_c) \]
直观上,第一项使中心词与真实上下文词的向量内积增大,第二项使中心词与噪声词的向量内积减小(通过负号实现)。整体目标等价于最小化以下损失函数:
\[\mathcal{L} = -\log \sigma(\mathbf{v}_t \cdot \mathbf{v}_c) - \sum_{i=1}^k \log \sigma(-\mathbf{v}_{n_i} \cdot \mathbf{v}_c) \]
4. 负样本采样策略
为了提升效果,负样本并非均匀随机采样,而是采用基于词频的分布进行加权采样。Word2Vec 使用以下分布:
\[P(w) = \frac{f(w)^{3/4}}{\sum_{w' \in V} f(w')^{3/4}} \]
其中 \(f(w)\) 是词 \(w\) 在语料中的频率。
- 为什么使用 \(3/4\) 次幂?:
- 降低高频词的采样概率(如“the”、“a”),避免负样本中充斥常见词。
- 增加低频词的采样机会,使模型能更好地学习稀有词的表示。
- 经验表明,\(3/4\) 次幂在效果和效率间取得了良好平衡。
5. 训练过程与梯度更新
采用随机梯度下降(SGD)优化目标函数。以 Skip-gram with Negative Sampling(SGNS)为例,步骤如下:
- 输入:语料库,上下文窗口大小 \(m\),负样本数 \(k\),词向量维度 \(d\)。
- 初始化:为每个词随机初始化两个向量:作为中心词时的向量 \(\mathbf{v}_c\) 和作为上下文词时的向量 \(\mathbf{u}_w\)(实际应用中,有时使用统一向量)。
- 迭代每个中心词:
- 遍历语料中的每个中心词 \(c\)。
- 获取其上下文窗口内的所有目标词 \(t\)。
- 对于每个 \((c, t)\) 正样本:
a. 采样 \(k\) 个负样本词 \(n_i\) 按分布 \(P(w)\) 采样。
b. 计算损失函数 \(\mathcal{L}\)。
c. 计算梯度并更新向量:
对于正样本 \(t\):
\[ \frac{\partial \mathcal{L}}{\partial \mathbf{v}_c} = (\sigma(\mathbf{v}_t \cdot \mathbf{v}_c) - 1) \mathbf{u}_t, \quad \frac{\partial \mathcal{L}}{\partial \mathbf{u}_t} = (\sigma(\mathbf{v}_t \cdot \mathbf{v}_c) - 1) \mathbf{v}_c \]
对于每个负样本 $ n_i $:
\[ \frac{\partial \mathcal{L}}{\partial \mathbf{v}_c} = \sigma(\mathbf{v}_{n_i} \cdot \mathbf{v}_c) \mathbf{u}_{n_i}, \quad \frac{\partial \mathcal{L}}{\partial \mathbf{u}_{n_i}} = \sigma(\mathbf{v}_{n_i} \cdot \mathbf{v}_c) \mathbf{v}_c \]
d. 更新参数:$ \mathbf{v}_c \leftarrow \mathbf{v}_c - \eta \frac{\partial \mathcal{L}}{\partial \mathbf{v}_c} $,类似地更新 $ \mathbf{u}_t $ 和 $ \mathbf{u}_{n_i} $。
- 输出:训练得到的词向量(通常使用中心词向量 \(\mathbf{v}_c\) 或上下文向量 \(\mathbf{u}_w\) 的平均)。
6. 负采样的优势与局限性
- 优势:
- 计算效率高:避免了全词汇 softmax 的求和操作。
- 易于实现:只需采样少量负样本。
- 效果优秀:在实践中能学习到高质量的语义和语法关系。
- 局限性:
- 采样分布和负样本数 \(k\) 需调优。
- 与原始 softmax 相比,理论上的概率模型有所简化。
总结
负采样通过将复杂的多分类问题转化为简单的二分类问题,并基于词频分布采样负样本,使得 Word2Vec 能够高效地训练大规模语料。其核心在于目标函数的设计和采样策略的优化,这已成为词嵌入训练中的标准技术之一。