我正在阅读下面的论文,但在理解负采样的概念时遇到了一些麻烦。
http://arxiv.org/pdf/1402.3722v1.pdf
有人可以帮忙吗?
的想法word2vec
是最大化文本中出现靠近(在彼此的上下文中)的单词的向量之间的相似性(点积),并最小化不靠近的单词的相似性。在您链接到的论文的等式(3)中,暂时忽略取幂。你有
v_c . v_w
-------------------
sum_i(v_ci . v_w)
分子基本上是单词c
(上下文)和w
(目标)单词之间的相似度。分母计算所有其他上下文ci
和目标词的相似度w
。最大化这个比率可以确保在文本中出现得更近的单词比没有的单词具有更多相似的向量。但是,计算它可能会非常慢,因为有很多上下文ci
。负抽样是解决这个问题的方法之一——只需ci
随机选择几个上下文。最终结果是,如果cat
出现在 的上下文中food
,那么 的向量比其他几个随机选择的词food
的向量更类似于 的向量cat
(通过它们的点积来衡量)(例如democracy
, greed
, Freddy
),而不是语言中的所有其他词。这使得word2vec
训练速度快得多。
计算Softmax(确定哪些词与当前目标词相似的函数)成本很高,因为需要对V(分母)中的所有词求和,这通常非常大。
可以做什么?
已经提出了不同的策略来逼近softmax。这些方法可以分为基于 softmax 和基于采样的方法。基于 Softmax 的方法是保持 softmax 层完整的方法,但会修改其架构以提高其效率(例如分层 softmax)。另一方面,基于采样的方法完全取消了 softmax 层,而是优化了一些近似于 softmax 的其他损失函数(他们通过将 softmax 分母中的归一化与一些其他计算成本低廉的损失近似来做到这一点负采样)。
Word2vec 中的损失函数类似于:
哪个对数可以分解为:
使用一些数学和梯度公式(参见6中的更多详细信息),它转换为:
如您所见,它转换为二进制分类任务(y=1 正类,y=0 负类)。由于我们需要标签来执行我们的二元分类任务,我们将所有上下文词c指定为真标签(y=1,正样本),并从语料库中随机选择k作为假标签(y=0,负样本)。
请看以下段落。假设我们的目标词是“ Word2vec ”。窗口为 3,我们的上下文词是:The
, widely
, popular
, algorithm
, was
, developed
. 这些上下文词被视为正面标签。我们还需要一些负面标签。我们从语料库中随机挑选一些词(produce
, software
, Collobert
, margin-based
, probabilistic
)并将它们视为负样本。我们从语料库中随机选择一些示例的这种技术称为负采样。
参考:
我在这里写了一篇关于负采样的教程文章。
为什么我们使用负采样?-> 降低计算成本
vanilla Skip-Gram (SG) 和 Skip-Gram 负采样 (SGNS) 的成本函数如下所示:
请注意,这T
是所有词汇的数量。它相当于V
。换句话说,T
= V
。
p(w_t+j|w_t)
SG 中的概率分布是针对V
语料库中的所有词汇计算的:
V
训练 Skip-Gram 模型时很容易超过数万。概率需要计算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
负样本是从噪声分布中随机抽取的:, , , , . 随着模型对训练样本的迭代,权重被优化,从而输出正对的概率,输出负对的概率。minimized
primary
concerns
led
page
p(D=1|w,c_pos)≈1
p(D=1|w,c_neg)≈0