word2vec:负采样是什么意思?(通俗易懂解释)

117

3
好的,我将尽力为您进行翻译。以下是需要翻译的内容:相关链接:https://stats.stackexchange.com/questions/282425/what-is-the-relation-of-the-negative-sampling-objective-function-to-the-original这个链接讨论了负采样目标函数与原始目标函数之间的关系。具体而言,它解释了如何使用类似于sigmoid函数的技巧来近似原始目标函数,并将其转换为更容易计算的形式。 - Charlie Parker
3个回答

195

word2vec的思想是最大化文本中彼此接近(上下文中)出现的单词向量之间的相似度(点积),并最小化不相关单词的相似度。在你提供的论文中的方程式(3)中,暂时忽略指数运算符。你有:

      v_c . v_w
 -------------------
   sum_i(v_ci . v_w)
分子基本上是单词“c”(上下文)和目标单词“w”的相似度。分母计算所有其他上下文“ci”与目标单词“w”的相似性。最大化这个比率确保在文本中更接近出现的单词比不接近的单词具有更相似的向量。然而,计算这可能非常慢,因为有许多上下文“ci”。负采样是解决这个问题的办法之一-只随机选择几个上下文“ci”。最终结果是,如果“cat”出现在“food”的上下文中,则“food”的向量比几个其他随机选择的单词的向量(例如“democracy”,“greed”,“Freddy”)更类似于“cat”的向量(通过它们的点积测量),而不是语言中的所有其他单词。这使得word2vec快得多。

21
谢谢您的详细解释。我认为这只是抽样。但是,您知道为什么它被称为“负采样”吗? - HappyCoding
58
这个术语是从分类中借鉴过来的,分类是神经网络的一种常见应用。在分类中,你有一堆正面和负面的例子。而对于word2vec,对于任何给定的单词,你都有一个单词列表,这些单词需要与它相似(即正类),但不相似的单词列表(即负类)是通过采样生成的。 - mbatchkarov
答案中解释的动机是正确的。但是有点误导,因为听起来好像我们只是用一个较小的总和替换了分母中的总和。实际上,负采样是问题的不同统计公式。请参阅word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method - chicxulub

49

计算 Softmax(用于确定哪些单词与当前目标单词相似)的代价很高,因为需要对V中所有单词求和(分母),而V通常非常大。

enter image description here

怎么办呢?

提出了不同的策略来近似Softmax。这些方法可以分为基于softmax和基于采样的方法。 基于softmax 的方法保持softmax层不变,但修改其结构以提高效率(如层次softmax)。 另一方面,基于采样 的方法完全放弃了softmax层,并优化某些其他逼近softmax的损失函数(它们通过用一些便宜的损失(如负采样)逼近softmax中分母的归一化来实现)。

Word2vec中的损失函数类似于:

enter image description here

可以分解为对数函数:

enter image description here

通过一些数学和梯度公式(详见6),可以将其转换为:

enter image description here

当我们将其转化为二元分类任务时(y=1代表正例,y=0代表负例),需要标签来执行这个二元分类任务。因此,我们将所有的上下文词 c 指定为真实标签(y=1,正例样本),并且从语料库中随机选择k作为假标签(y=0,负例样本)。


看下面的段落。假设我们的目标单词是“Word2vec”。在窗口大小为3的情况下,我们的上下文单词是:Thewidelypopularalgorithmwasdeveloped。这些上下文单词被认为是正标签。我们还需要一些负标签。我们从语料库中随机挑选一些单词(producesoftwareCollobertmargin-basedprobabilistic)并将它们视为负样本。我们采用从语料库中随机选择一些例子的技术称为负采样。

enter image description here

参考资料


1
嗨@amir,我的初始问题是我在理解负采样的概念方面遇到了一些困难... - Andy K
2
非常清晰易懂,比被采纳的答案更加技术性。这是一个完美的 Stack Overflow 情境:先阅读被采纳的答案以了解大致思路,然后再阅读本答案以深入理解细节。 - Ursin Brunner
最后两个关于 $j(\Theta)$ 的方程不相等。它是目标的完全不同表达。参见 word2vec解析:推导Mikolov等人的负采样词嵌入方法 - chicxulub

33
我写了一篇关于负采样的教程文章在这里为什么我们要使用负采样? -> 为了降低计算成本
香草Skip-Gram(SG)和Skip-Gram负采样(SGNS)的成本函数如下:

enter image description here

请注意,T代表所有词汇数。它等同于V。换句话说,T = V
在SG中,针对语料库中的所有V个词汇,使用以下公式计算概率分布p(w_t+j|w_t)

enter image description here

V 在训练 Skip-Gram 模型时很容易超过数万。需要计算 V 次概率,使其在计算上变得昂贵。此外,分母中的归一化因子需要额外的 V 次计算。

另一方面,在 SGNS 中计算概率分布的方法是:

enter image description here

c_pos 是表示正面词的词向量,W_neg 是表示输出权重矩阵中所有 K 个负样本的词向量。使用 SGNS 算法时,只需要计算概率 K + 1 次,其中 K 通常在 5 ~ 20 之间。此外,在分母中计算归一化因子时不需要额外的迭代。

使用 SGNS 算法时,每个训练样本只更新一小部分权重,而 SG 算法会为每个训练样本更新数百万个权重。

enter image description here

{{SGNS}}是如何实现这一点的?通过将多分类任务转化为二分类任务。
使用{{SGNS}},词向量不再是通过预测中心词的上下文词来学习。它学习区分实际上下文词(正样本)和从噪声分布中随机抽取的词(负样本)。

enter image description here

在现实生活中,你通常不会观察到像“江南style”或“痘痘”这样的随机词语的回归。思路是,如果模型能够区分可能(正面)对与不可能(负面)对之间的差异,那么将学习到好的词向量。

enter image description here

在上图中,当前正向词-上下文对为(drilling, engineer)。从噪声分布随机抽取K=5个负样本: minimized, primary, concerns, led, page。随着模型遍历训练样本,权重被优化,以便于正样本的概率输出p(D=1|w,c_pos)≈1,并且负样本的概率输出p(D=1|w,c_neg)≈0

1
T代表文本中单词出现的次数。V则代表词汇量(独特单词)我想说。 - Adam
如果我们将 K 设置为 V-1,那么负采样就与普通的skip-gram模型相同。我的理解正确吗? - Shashwat
@Shashwat 每个训练样本更新的词向量数量相同,但训练目标函数仍然会有根本性的不同。 - Eric Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接