NLP-负采样-如何从噪声分布中提取负采样?

时间:2019-04-24 18:37:37

标签: python nlp

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

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

我已经看到了用两个不同的符号表示的这两个相同的方程:

enter image description here

三个问题:

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

让我们说归一化的噪声分布看起来像下面的字典:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

enter image description here

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

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

enter image description here

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

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

enter image description here

它试图通过降低绘制普通单词的概率并增加绘制稀有单词的概率来消除普通单词和稀有单词之间的不平衡。

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

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)之间的不平衡得到缓解。