Word2Vec中的负采样(Negative Sampling)原理与实现
字数 1933 2025-11-06 12:41:12

Word2Vec中的负采样(Negative Sampling)原理与实现

题目描述
负采样是Word2Vec模型中的一种高效训练技术,用于解决传统Skip-gram模型因词汇表过大导致的计算效率问题。Skip-gram需要计算每个中心词与整个词汇表中所有上下文词的概率分布(通过Softmax),但词汇表规模通常达到数万甚至百万级别,导致计算成本极高。负采样通过将多分类问题转化为二分类问题,仅对少量负样本进行更新,从而大幅提升训练速度。

核心原理分步解析

  1. 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) $。
  1. 负采样的改进思想
    • 将问题重构:判断一对词 \((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} $)以平衡高频与低频词。
  1. 负样本采样策略

    • 采样数量 \(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}}\)
  2. 梯度计算与参数更新

    • 损失函数简化为:

\[ 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. 实现步骤示例
    • 步骤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,训练速度加快数十倍。
  • 语义质量保留:通过权衡正负样本,仍能学习到有意义的词向量分布。
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,训练速度加快数十倍。 语义质量保留:通过权衡正负样本,仍能学习到有意义的词向量分布。