Word2Vec中的负采样(Negative Sampling)原理与实现
题目描述
负采样是Word2Vec模型中的一种高效训练技术,用于解决传统Skip-gram模型因词汇表过大导致的计算效率问题。Skip-gram需要计算每个中心词与整个词汇表中所有上下文词的概率分布(通过Softmax),但词汇表规模通常达到数万甚至百万级别,导致计算成本极高。负采样通过将多分类问题转化为二分类问题,仅对少量负样本进行更新,从而大幅提升训练速度。
核心原理分步解析
- Skip-gram的原始目标函数
- 目标:给定中心词 \(w_c\),预测其上下文窗口内的词 \(w_o\)。
- 原始Softmax损失:
\[ P(w_o | w_c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_{i=1}^{V} \exp(\mathbf{u}_i^\top \mathbf{v}_c)} \]
其中 $ V $ 是词汇表大小,$ \mathbf{v}_c $ 是中心词向量,$ \mathbf{u}_o $ 是上下文词向量。计算分母的归一化项需遍历整个词汇表,复杂度为 $ O(V) $。
- 负采样的改进思想
- 将问题重构:判断一对词 \((w_c, w_o)\) 是否构成“真实上下文对”(正样本)或“随机噪声对”(负样本)。
- 新目标函数(二分类逻辑损失):
\[ \sigma(\mathbf{u}_o^\top \mathbf{v}_c) + \sum_{k=1}^{K} \mathbb{E}_{w_k \sim P_n(w)} [\log(1 - \sigma(\mathbf{u}_k^\top \mathbf{v}_c))] \]
其中 $ \sigma $ 是Sigmoid函数,第一项最大化正样本概率,第二项最小化 $ K $ 个负样本的概率。负样本从噪声分布 $ P_n(w) $ 中采样,通常取词频的3/4次方($ P_n(w) \propto \text{freq}(w)^{3/4} $)以平衡高频与低频词。
-
负样本采样策略
- 采样数量 \(K\) 通常为5-20,远小于词汇表大小 \(V\)。
- 噪声分布 \(P_n(w)\) 的设计:
- 原始论文采用“一元语法分布”的修正版,降低高频词(如“的”、“是”)的采样概率,避免模型过度学习无意义词。
- 修正公式: \(P_n(w_i) = \frac{\text{freq}(w_i)^{3/4}}{\sum_j \text{freq}(w_j)^{3/4}}\)。
-
梯度计算与参数更新
- 损失函数简化为:
\[ J = -\log \sigma(\mathbf{u}_o^\top \mathbf{v}_c) - \sum_{k=1}^{K} \log \sigma(-\mathbf{u}_k^\top \mathbf{v}_c) \]
- 对中心词向量 \(\mathbf{v}_c\) 的梯度:
\[ \frac{\partial J}{\partial \mathbf{v}_c} = [\sigma(\mathbf{u}_o^\top \mathbf{v}_c) - 1] \mathbf{u}_o + \sum_{k=1}^{K} [\sigma(-\mathbf{u}_k^\top \mathbf{v}_c) - 1] (-\mathbf{u}_k) \]
仅需更新正样本对应的 $ \mathbf{u}_o $ 和 $ K $ 个负样本对应的 $ \mathbf{u}_k $,计算量从 $ O(V) $ 降至 $ O(K) $。
- 实现步骤示例
- 步骤1:构建词汇表,统计词频并计算每个词的采样概率。
- 步骤2:对每个训练样本 \((w_c, w_o)\),采样 \(K\) 个负样本词 \(w_1, \dots, w_K\)。
- 步骤3:计算损失函数,更新参数:
- 正样本:增加 \(\mathbf{v}_c\) 与 \(\mathbf{u}_o\) 的相似度。
- 负样本:降低 \(\mathbf{v}_c\) 与 \(\mathbf{u}_k\) 的相似度。
- 步骤4:重复遍历语料,直到模型收敛。
关键优势
- 计算效率提升:避免全词汇表Softmax,训练速度加快数十倍。
- 语义质量保留:通过权衡正负样本,仍能学习到有意义的词向量分布。