基于负例采样的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模型在大词汇表下的计算瓶颈。其核心在于用少量负例近似全局分布,使模型高效学习词向量的分布式表示。