word2vec:负采样(外行术语)?
Posted
技术标签:
【中文标题】word2vec:负采样(外行术语)?【英文标题】:word2vec: negative sampling (in layman term)? 【发布时间】:2015-03-07 18:42:13 【问题描述】:我正在阅读下面的论文,但在理解负采样的概念方面遇到了一些麻烦。
http://arxiv.org/pdf/1402.3722v1.pdf
有人可以帮忙吗?
【问题讨论】:
相关:stats.stackexchange.com/questions/282425/… 【参考方案1】: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
的训练速度大大提高。
【讨论】:
感谢或很好的解释。我认为这只是采样。但你知道它为什么叫“负面”吗? 该术语是从分类中借用的,分类是神经网络的常见应用。那里有一堆正面和负面的例子。使用word2vec
,对于任何给定的单词,您都有一个需要与其相似的单词列表(肯定类),但否定类(与目标词不相似的单词)是通过抽样编译的。【参考方案2】:
计算 Softmax(确定哪些词与当前目标词相似的函数)代价高昂,因为需要对 V 中的所有词求和(分母),通常很大。
可以做什么?
已经提出了不同的策略来逼近 softmax。这些方法可以分为基于softmax和基于采样的方法。 Softmax-based 方法是保持 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
)并将它们视为负样本。我们从语料库中随机选择一些示例的这种技术称为负采样。
参考:
(1) C. Dyer,“关于噪声对比估计和负采样的说明”,2014 年 (2)http://sebastianruder.com/word-embeddings-softmax/【讨论】:
嗨@amir,我最初的问题是我有一些麻烦,理解负采样的概念...... 解释得很好,比公认的答案更具技术性。所以一个完美的 SO 情况:阅读接受的答案以了解想法,然后阅读此答案以详细了解它。【参考方案3】:我写了一篇关于负采样的教程文章here。
我们为什么要使用负采样? -> 降低计算成本
vanilla Skip-Gram (SG) 和 Skip-Gram 负采样 (SGNS) 的成本函数如下所示:
请注意,T
是所有词汇的数量。相当于V
。换句话说,T
= V
。
SG 中p(w_t+j|w_t)
的概率分布是针对语料库中的所有V
词汇计算的:
V
在训练Skip-Gram模型时很容易超过几万。概率需要计算V
次,这使得计算成本很高。此外,分母中的归一化因子需要额外的V
计算。
另一方面,SGNS 中的概率分布计算如下:
c_pos
是正词的词向量,W_neg
是输出权重矩阵中所有K
负样本的词向量。使用 SGNS,概率只需要计算K + 1
次,其中K
通常在 5 ~ 20 之间。此外,不需要额外的迭代来计算分母中的归一化因子。
使用 SGNS,每个训练样本只更新一小部分权重,而 SG 为每个训练样本更新数百万个权重。
SGNS 是如何做到这一点的? -> 通过将多分类任务转化为二分类任务。
使用 SGNS,不再通过预测中心词的上下文词来学习词向量。它学习从噪声分布中区分实际上下文词(正面)和随机抽取的词(负面)。
在现实生活中,您通常不会用Gangnam-Style
或pimples
之类的随机词观察regression
。这个想法是,如果模型可以区分可能的(正面)对和不太可能的(负面)对,就会学习到好的词向量。
在上图中,当前正向词上下文对是(drilling
, engineer
)。 K=5
负样本是来自noise distribution 的randomly drawn:minimized
、primary
、concerns
、led
、page
。随着模型对训练样本的迭代,权重被优化,使得正对的概率将输出p(D=1|w,c_pos)≈1
,负对的概率将输出p(D=1|w,c_neg)≈0
。
【讨论】:
T 表示标记的数量(文本中出现的单词)。 V 表示我想说的词汇(独特的词)。 如果我们将K
设置为V -1
,那么负采样与普通的skip-gram 模型相同。我的理解正确吗?
@Shashwat 每个训练样本更新的词向量个数是一样的,但是训练目标函数还是会有根本的不同以上是关于word2vec:负采样(外行术语)?的主要内容,如果未能解决你的问题,请参考以下文章