我发现了这一点,并写了一封关于负采样的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 是提升到α 幂的单词的归一化频率分布。数学上可以表示为:
基于每个单词在语料库中出现次数的单词分布称为一元分布,表示为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) 之间的不平衡得到缓解。