【问题标题】:NLP - negative sampling - how to draw negative samples from noise distribution?NLP - 负采样 - 如何从噪声分布中提取负样本?
【发布时间】:2019-04-24 18:37:37
【问题描述】:

据我了解,负采样从噪声分布P(w) 中随机采样K negative samples。噪声分布基本上是频率分布+对单词的一些修改。通常我们选择K = 5 ~ 20负样本。

P(w) = Uw(w)^(3/4) / normalization_factor

我已经看到了这两个相同的方程式,它们以两种不同的符号表示:

三个问题:

  1. 蓝色框是什么意思? ji有什么意义?
  2. 第二个等式似乎没有显示任何从噪声分布中“随机抽取”单词的内容。红框中的k是什么意思?
  3. 如何从噪声分布中选择噪声样本?

假设归一化的噪声分布如下字典所示:

dist = {'apple': 0.0023, 'bee': 0.004, 'desk':0.032', 'chair': 0.032 ...}

你如何从dist“随机抽取”K噪声样本?

【问题讨论】:

  • 虽然这个问题肯定与 Stack Overflow 相关,但我认为您可能会在 Cross ValidatedMathematics 中找到更多成功。只是我的两分钱。

标签: python nlp


【解决方案1】:

我发现了这一点,并写了一封关于负采样的tutorial article

  1. 蓝色框表示u_j来自噪声分布P_n(w)
  2. 蓝色框包含负采样的“随机抽取”方面。 u_j是噪声分布中的第i个负样本,同时也是输出权重矩阵中的第j个词向量。
  3. 你使用类似np.random.choice()

最初的 Word2Vec 论文中给出的原始成本函数实际上在符号方面相当混乱。更清晰的成本函数形式是:

其中c_pos是正词的词向量,h是隐藏层,相当于输入词w的词向量。 c_neg是随机抽取的否定词的词向量,W_neg是所有K否定词的词向量。

Noise distribution 是提升到α 幂的单词的归一化频率分布。数学上可以表示为:

基于每个单词在语料库中出现次数的单词分布称为一元分布,表示为U(w)Z 是一个归一化因子,α 是一个超参数,通常是 α=3/4

将分布提高到α 的幂具有平滑分布的效果:

它试图通过降低抽取常用词的概率,增加抽取稀有词的概率来对抗常用词和稀有词之间的不平衡。

从噪声分布中随机抽取负样本:

import numpy as np

unig_dist  = {'apple': 0.023, 'bee': 0.12, 'desk': 0.34, 'chair': 0.517}

sum(unig_dist.values())
>>> 1.0

alpha      = 3 / 4

noise_dist = {key: val ** alpha for key, val in unig_dist.items()}
Z = sum(noise_dist.values())
noise_dist_normalized = {key: val / Z for key, val in noise_dist.items()}
noise_dist_normalized
>>> {'apple': 0.044813853132981724,
 'bee': 0.15470428538870049,
 'desk': 0.33785130228003507,
 'chair': 0.4626305591982827}

最初,chair 是最常见的词,并且有可能被抽到 0.517。一元分布U(w)提升到3/4的幂后,其概率为0.463

另一方面,apple 是概率0.023 中最不常见的词,但经过转换后,它的概率为0.045。最常用词 (chair) 和最不常用词 (apple) 之间的不平衡得到缓解。

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多