基于负例采样的Skip-gram模型(Negative Sampling for Skip-gram)
字数 2334 2025-10-30 11:52:21

基于负例采样的Skip-gram模型(Negative Sampling for Skip-gram)

题目描述
Skip-gram模型是Word2Vec的一种实现,旨在通过中心词预测上下文词来学习词向量。然而,当词汇表规模极大时,传统的Softmax计算会非常昂贵。负例采样(Negative Sampling)通过简化训练目标,显著提升了Skip-gram的训练效率。本题目要求详解如何通过负例采样优化Skip-gram模型,包括其动机、数学原理及训练步骤。


解题过程

1. 问题背景:Skip-gram的原始缺陷

  • 目标函数:原始Skip-gram使用Softmax计算中心词 \(w_c\) 生成上下文词 \(w_o\) 的概率:

\[ P(w_o \mid w_c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_{i=1}^{V} \exp(\mathbf{u}_i^\top \mathbf{v}_c)} \]

其中 \(\mathbf{v}_c\) 是中心词向量,\(\mathbf{u}_o\) 是上下文词向量,\(V\) 是词汇表大小。

  • 计算瓶颈:Softmax的分母需遍历整个词汇表,当 \(V\) 达到百万级时,计算成本过高。

2. 负例采样的核心思想

  • 简化目标:将多分类问题转化为二分类问题。对于每个训练样本(中心词 \(w_c\) 和真实上下文词 \(w_o\)),同时采样 \(K\) 个负例词(即与 \(w_c\) 无关的噪声词),训练模型区分正例和负例。
  • 正例\((w_c, w_o)\) 对,标签为1。
  • 负例:从噪声分布中采样 \(K\) 个词 \(w_{k}\)(如基于词频的分布),生成 \(K\) 个负样本 \((w_c, w_k)\),标签为0。

3. 数学建模

  • 新目标函数:用sigmoid函数替代Softmax,定义正例概率:

\[ \sigma(\mathbf{u}_o^\top \mathbf{v}_c) = \frac{1}{1 + \exp(-\mathbf{u}_o^\top \mathbf{v}_c)} \]

  • 损失函数:最大化正例概率,最小化负例概率。对于单个样本,目标函数为:

\[ J = \log \sigma(\mathbf{u}_o^\top \mathbf{v}_c) + \sum_{k=1}^K \mathbb{E}_{w_k \sim P_n(w)} \left[ \log \sigma(-\mathbf{u}_k^\top \mathbf{v}_c) \right] \]

其中 \(P_n(w)\) 是噪声分布(如Unigram分布的3/4次方,以平衡高频词和低频词)。

4. 负例采样步骤

  1. 构建噪声分布:根据词汇表中每个词的频率 \(f(w_i)\) 计算采样概率 \(P_n(w_i) = \frac{f(w_i)^{3/4}}{\sum_j f(w_j)^{3/4}}\)
  2. 生成负样本:对每个正样本 \((w_c, w_o)\),从 \(P_n(w)\) 中独立采样 \(K\) 个词(通常 \(K=5 \sim 20\)),避免采样到 \(w_o\) 本身。
  3. 更新向量
    • 正例更新:增大 \(\mathbf{v}_c\)\(\mathbf{u}_o\) 的内积。
    • 负例更新:减小 \(\mathbf{v}_c\) 与每个负例词向量 \(\mathbf{u}_k\) 的内积。

5. 梯度计算与参数更新

  • 正例梯度

\[ \frac{\partial J}{\partial \mathbf{v}_c} = \left[1 - \sigma(\mathbf{u}_o^\top \mathbf{v}_c)\right] \mathbf{u}_o, \quad \frac{\partial J}{\partial \mathbf{u}_o} = \left[1 - \sigma(\mathbf{u}_o^\top \mathbf{v}_c)\right] \mathbf{v}_c \]

  • 负例梯度(对于每个 \(\mathbf{u}_k\)):

\[ \frac{\partial J}{\partial \mathbf{u}_k} = -\sigma(\mathbf{u}_k^\top \mathbf{v}_c) \mathbf{v}_c, \quad \frac{\partial J}{\partial \mathbf{v}_c} = -\sum_{k=1}^K \sigma(\mathbf{u}_k^\top \mathbf{v}_c) \mathbf{u}_k \]

  • 参数更新:通过随机梯度下降(SGD)调整词向量。

6. 算法优势

  • 效率提升:每次更新仅计算 \(K+1\) 个词(而非整个 \(V\)),复杂度从 \(O(V)\) 降至 \(O(K)\)
  • 效果保障:负例采样模拟了噪声对比估计(NCE),在保证词向量质量的同时加速训练。

总结
负例采样通过简化概率计算和引入二分类任务,解决了Skip-gram模型在大词汇表下的计算瓶颈。其核心在于用少量负例近似全局分布,使模型高效学习词向量的分布式表示。

基于负例采样的Skip-gram模型(Negative Sampling for Skip-gram) 题目描述 Skip-gram模型是Word2Vec的一种实现,旨在通过中心词预测上下文词来学习词向量。然而,当词汇表规模极大时,传统的Softmax计算会非常昂贵。负例采样(Negative Sampling)通过简化训练目标,显著提升了Skip-gram的训练效率。本题目要求详解如何通过负例采样优化Skip-gram模型,包括其动机、数学原理及训练步骤。 解题过程 1. 问题背景:Skip-gram的原始缺陷 目标函数 :原始Skip-gram使用Softmax计算中心词 \( w_ c \) 生成上下文词 \( w_ o \) 的概率: \[ P(w_ o \mid w_ c) = \frac{\exp(\mathbf{u}_ o^\top \mathbf{v} c)}{\sum {i=1}^{V} \exp(\mathbf{u}_ i^\top \mathbf{v}_ c)} \] 其中 \( \mathbf{v}_ c \) 是中心词向量,\( \mathbf{u}_ o \) 是上下文词向量,\( V \) 是词汇表大小。 计算瓶颈 :Softmax的分母需遍历整个词汇表,当 \( V \) 达到百万级时,计算成本过高。 2. 负例采样的核心思想 简化目标 :将多分类问题转化为二分类问题。对于每个训练样本(中心词 \( w_ c \) 和真实上下文词 \( w_ o \)),同时采样 \( K \) 个负例词(即与 \( w_ c \) 无关的噪声词),训练模型区分正例和负例。 正例 :\( (w_ c, w_ o) \) 对,标签为1。 负例 :从噪声分布中采样 \( K \) 个词 \( w_ {k} \)(如基于词频的分布),生成 \( K \) 个负样本 \( (w_ c, w_ k) \),标签为0。 3. 数学建模 新目标函数 :用sigmoid函数替代Softmax,定义正例概率: \[ \sigma(\mathbf{u}_ o^\top \mathbf{v}_ c) = \frac{1}{1 + \exp(-\mathbf{u}_ o^\top \mathbf{v}_ c)} \] 损失函数 :最大化正例概率,最小化负例概率。对于单个样本,目标函数为: \[ J = \log \sigma(\mathbf{u} o^\top \mathbf{v} c) + \sum {k=1}^K \mathbb{E} {w_ k \sim P_ n(w)} \left[ \log \sigma(-\mathbf{u}_ k^\top \mathbf{v}_ c) \right ] \] 其中 \( P_ n(w) \) 是噪声分布(如Unigram分布的3/4次方,以平衡高频词和低频词)。 4. 负例采样步骤 构建噪声分布 :根据词汇表中每个词的频率 \( f(w_ i) \) 计算采样概率 \( P_ n(w_ i) = \frac{f(w_ i)^{3/4}}{\sum_ j f(w_ j)^{3/4}} \)。 生成负样本 :对每个正样本 \( (w_ c, w_ o) \),从 \( P_ n(w) \) 中独立采样 \( K \) 个词(通常 \( K=5 \sim 20 \)),避免采样到 \( w_ o \) 本身。 更新向量 : 正例更新:增大 \( \mathbf{v}_ c \) 和 \( \mathbf{u}_ o \) 的内积。 负例更新:减小 \( \mathbf{v}_ c \) 与每个负例词向量 \( \mathbf{u}_ k \) 的内积。 5. 梯度计算与参数更新 正例梯度 : \[ \frac{\partial J}{\partial \mathbf{v}_ c} = \left[ 1 - \sigma(\mathbf{u}_ o^\top \mathbf{v}_ c)\right] \mathbf{u}_ o, \quad \frac{\partial J}{\partial \mathbf{u}_ o} = \left[ 1 - \sigma(\mathbf{u}_ o^\top \mathbf{v}_ c)\right] \mathbf{v}_ c \] 负例梯度 (对于每个 \( \mathbf{u}_ k \)): \[ \frac{\partial J}{\partial \mathbf{u}_ k} = -\sigma(\mathbf{u}_ k^\top \mathbf{v}_ c) \mathbf{v}_ c, \quad \frac{\partial J}{\partial \mathbf{v} c} = -\sum {k=1}^K \sigma(\mathbf{u}_ k^\top \mathbf{v}_ c) \mathbf{u}_ k \] 参数更新 :通过随机梯度下降(SGD)调整词向量。 6. 算法优势 效率提升 :每次更新仅计算 \( K+1 \) 个词(而非整个 \( V \)),复杂度从 \( O(V) \) 降至 \( O(K) \)。 效果保障 :负例采样模拟了噪声对比估计(NCE),在保证词向量质量的同时加速训练。 总结 负例采样通过简化概率计算和引入二分类任务,解决了Skip-gram模型在大词汇表下的计算瓶颈。其核心在于用少量负例近似全局分布,使模型高效学习词向量的分布式表示。