答案 0 :(得分:123)
word2vec
的想法是最大化文本中出现在一起(在彼此的上下文中)的单词的向量之间的相似性(点积),并最小化不相似的单词的相似性。在链接到的论文的等式(3)中,暂时忽略取幂。
v_c * v_w
-------------------
sum(v_c1 * v_w)
分子基本上是单词c
(上下文)和w
(目标)单词之间的相似性。分母计算所有其他上下文c1
和目标词w
的相似度。最大化此比率可确保在文本中看起来更接近的单词具有比不单词的单词更相似的向量。但是,计算这个可能非常慢,因为有许多上下文c1
。负抽样是解决这个问题的方法之一 - 只需随机选择几个上下文c1
。最终结果是,如果在cat
的上下文中显示food
,则food
的向量更类似于cat
的向量(作为其点积的度量) )而不是其他几个随机选择的单词的向量(例如democracy
,greed
,Freddy
),而不是语言中的所有其他单词。这使word2vec
更快地训练。
答案 1 :(得分:26)
计算 Softmax (用于确定哪些单词与当前目标单词相似的功能)非常昂贵,因为需要对 V 中的所有单词进行求和(分母),通常非常大。
可以做些什么?
已经提出了不同的策略来近似 softmax。这些方法可以分为基于softmax的和基于采样的方法。 基于Softmax的 方法是保持softmax层完整的方法,但修改其架构以提高其效率(例如,分层softmax)。另一方面, 基于采样的 方法完全取消了softmax图层,而是优化了一些近似softmax的其他损失函数(他们通过近似标准化来实现这一点) softmax的分母与其他一些损失一样便宜,如负采样一样计算。)
Word2vec中的丢失功能类似于:
哪个对数可以分解为:
使用一些数学和梯度公式(查看3的详细信息),它转换为:
如您所见,它转换为二元分类任务(y = 1正类,y = 0负类)。由于我们需要标签来执行我们的二进制分类任务,因此我们将所有上下文单词 c 指定为真实标签(y = 1,正样本),并从语料库中随机选择 k 假标签(y = 0,负样本)。
请看以下段落。假设我们的目标词是“ Word2vec ”。使用3的窗口,我们的上下文字词为:The
,widely
,popular
,algorithm
,was
,developed
。这些上下文单词被视为积极标签。我们还需要一些负面标签。我们从语料库(produce
,software
,Collobert
,margin-based
,probabilistic
)中随机选择一些单词并将其视为负样本。我们从语料库中随机选取一些示例的技术称为负抽样。
参考:
答案 2 :(得分:1)
我写了一篇有关负采样here的教程文章。
为什么要使用负采样?->以减少计算成本
香草Skip-Gram(SG)和Skip-Gram负采样(SGNS)的成本函数如下所示:
对于语料库中的所有p(w_t+j|w_t)
词汇,SG的概率分布V
的计算如下:
V
可以轻松超过数万。该概率需要计算V
次,从而使其计算量大。此外,分母中的归一化因子需要额外的V
计算。
另一方面,SGNS中的概率分布计算如下:
c_pos
是肯定词的词向量,而W_neg
是输出权重矩阵中所有K
否定样本的词向量。使用SGNS,仅需要计算K + 1
次的概率,其中K
通常在5到20之间。此外,不需要额外的迭代来计算分母中的归一化因子。
对于SGNS,每个训练样本仅更新一小部分权重,而SG为每个训练样本更新所有数百万的权重。
SGNS如何实现这一目标?->通过将多分类任务转换为二进制分类任务。
使用SGNS,不再可以通过预测中心单词的上下文单词来学习单词向量。它可以从噪声分布中区分出实际的上下文单词(正)和随机绘制的单词(负)。
在现实生活中,您通常不会像regression
或Gangnam-Style
这样的随机词来观察pimples
。想法是,如果模型可以区分可能的(正)对和不太可能的(负)对,那么将学习好的单词向量。
在上图中,当前的正词-语境对为(drilling
,engineer
)。 K=5
个负样本来自randomly drawn的noise distribution:minimized
,primary
,concerns
,led
,page
。当模型遍历训练样本时,权重得到优化,以使正对的概率输出p(D=1|w,c_pos)≈1
,而负对的概率输出p(D=1|w,c_neg)≈0
。