根据我的理解,负采样是从噪声分布K negative samples
中随机采样P(w)
。噪声分布基本上是频率分布+对单词的一些修改。通常,我们选择K = 5 ~ 20
否定样本。
P(w) = Uw(w)^(3/4) / normalization_factor
我已经看到了用两个不同的符号表示的这两个相同的方程:
三个问题:
j
和i
的意义是什么?k
是什么意思?让我们说归一化的噪声分布看起来像下面的字典:
dist = {'apple': 0.0023, 'bee': 0.004, 'desk':0.032', 'chair': 0.032 ...}
如何从K
中“随机抽取” dist
噪声样本?
答案 0 :(得分:0)
我发现了这一点,并写了一个关于负采样的tutorial article。
u_j
来自噪声分布P_n(w)
。 u_j
是噪声分布中的第i
个负样本,同时也是输出权重矩阵中的第j
个词向量。np.random.choice()
在Word2Vec原始论文中给出的原始成本函数实际上在符号方面相当混乱。成本函数的更清晰形式为:
其中c_pos
是正词的词向量,而h
是隐藏层,等效于输入词w
的词向量。 c_neg
是随机抽取的否定词的词向量,而W_neg
是所有K
否定词的词向量。
Noise distribution是提高到α
的幂的单词的归一化频率分布。在数学上,它可以表示为:
基于每个单词在语料库中出现的次数的单词分布称为unigram分布,并表示为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
)之间的不平衡得到缓解。