word2vec:负采样(外行术语)?
word2vec: negative sampling (in layman term)?
我正在阅读下面的论文,但在理解负采样的概念时遇到了一些问题。
http://arxiv.org/pdf/1402.3722v1.pdf
有人可以帮忙吗?
word2vec
的想法是最大化文本中出现在一起(在彼此的上下文中)的词的向量之间的相似性(点积),并最小化出现在一起的词的相似性不是。在您 link 的论文的等式 (3) 中,暂时忽略求幂。你有
v_c . v_w
-------------------
sum_i(v_ci . v_w)
分子基本上是单词 c
(上下文)和 w
(目标)单词之间的相似度。分母计算所有其他上下文 ci
和目标词 w
的相似度。最大化此比率可确保在文本中出现得更近的词比不出现的词具有更多相似向量。然而,计算这个可能非常慢,因为有很多上下文 ci
。负采样是解决这个问题的方法之一——只是 select 几个上下文 ci
随机。最终结果是,如果 cat
出现在 food
的上下文中,则 food
的向量与 cat
的向量更相似(通过它们的点积度量) 比其他几个随机选择的词(例如democracy
、greed
、Freddy
)的向量,而不是所有其他语言中的单词。这使得 word2vec
训练速度快得多。
计算 Softmax(确定哪些词与当前目标词相似的函数)是昂贵的,因为需要对所有词求和V(分母),一般都很大。
可以做什么?
已经提出了不同的策略来近似 softmax。这些方法可以分为 softmax-based 和 sampling-based 方法。 基于 Softmax 方法是保持 softmax 层完整,但修改其架构以提高其效率的方法(例如分层 softmax)。另一方面,基于采样的 方法完全取消了 softmax 层,而是优化了一些其他近似于 softmax 的损失函数(他们这样做通过用一些其他的损失来近似 softmax 的分母中的归一化,这些损失计算起来很便宜,比如负采样)。
Word2vec 中的损失函数是这样的:
对数可以分解成:
使用一些数学和梯度公式(在 6 上查看更多详细信息)它转换为:
如您所见,它已转换为二进制 class化任务(y=1 正 class,y=0 负 class)。由于我们需要标签来执行我们的二进制 classification 任务,我们将所有上下文词 c 指定为真实标签(y=1,正样本),并且 k 从语料中随机抽取作为假标签(y=0,负样本)。
请看下面的段落。假设我们的目标词是“Word2vec”。 window 为 3,我们的上下文词是:The
、widely
、popular
、algorithm
、was
、developed
。这些上下文词被视为正面标签。我们还需要一些负面标签。我们从语料库(produce
、software
、Collobert
、margin-based
、probabilistic
)中随机挑选一些词,并将它们视为负样本。我们从语料库中随机选择一些示例的这种技术称为负采样。
参考:
- (1) C.戴尔,"Notes on Noise Contrastive Estimation and Negative Sampling",2014
- (2) http://sebastianruder.com/word-embeddings-softmax/
我写了一篇关于负采样的教程文章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 是如何实现的? -> 通过将 multi-classification 任务转换为二进制分类任务。
使用 SGNS,不再通过预测中心词的上下文词来学习词向量。它学会从噪声分布中区分实际上下文词(正)和随机抽取的词(负)。
在现实生活中,您通常不会用 Gangnam-Style
或 pimples
等随机词来观察 regression
。这个想法是,如果模型可以区分可能的(正)对和不太可能的(负)对,就会学习到好的词向量。
上图中,当前正word-context对为(drilling
,engineer
)。 K=5
负样本为 randomly drawn from the noise distribution:minimized
、primary
、concerns
、led
、page
。当模型遍历训练样本时,权重被优化,因此正对的概率将输出 p(D=1|w,c_pos)≈1
,而负对的概率将输出 p(D=1|w,c_neg)≈0
。
我正在阅读下面的论文,但在理解负采样的概念时遇到了一些问题。
http://arxiv.org/pdf/1402.3722v1.pdf
有人可以帮忙吗?
word2vec
的想法是最大化文本中出现在一起(在彼此的上下文中)的词的向量之间的相似性(点积),并最小化出现在一起的词的相似性不是。在您 link 的论文的等式 (3) 中,暂时忽略求幂。你有
v_c . v_w
-------------------
sum_i(v_ci . v_w)
分子基本上是单词 c
(上下文)和 w
(目标)单词之间的相似度。分母计算所有其他上下文 ci
和目标词 w
的相似度。最大化此比率可确保在文本中出现得更近的词比不出现的词具有更多相似向量。然而,计算这个可能非常慢,因为有很多上下文 ci
。负采样是解决这个问题的方法之一——只是 select 几个上下文 ci
随机。最终结果是,如果 cat
出现在 food
的上下文中,则 food
的向量与 cat
的向量更相似(通过它们的点积度量) 比其他几个随机选择的词(例如democracy
、greed
、Freddy
)的向量,而不是所有其他语言中的单词。这使得 word2vec
训练速度快得多。
计算 Softmax(确定哪些词与当前目标词相似的函数)是昂贵的,因为需要对所有词求和V(分母),一般都很大。
可以做什么?
已经提出了不同的策略来近似 softmax。这些方法可以分为 softmax-based 和 sampling-based 方法。 基于 Softmax 方法是保持 softmax 层完整,但修改其架构以提高其效率的方法(例如分层 softmax)。另一方面,基于采样的 方法完全取消了 softmax 层,而是优化了一些其他近似于 softmax 的损失函数(他们这样做通过用一些其他的损失来近似 softmax 的分母中的归一化,这些损失计算起来很便宜,比如负采样)。
Word2vec 中的损失函数是这样的:
对数可以分解成:
使用一些数学和梯度公式(在 6 上查看更多详细信息)它转换为:
如您所见,它已转换为二进制 class化任务(y=1 正 class,y=0 负 class)。由于我们需要标签来执行我们的二进制 classification 任务,我们将所有上下文词 c 指定为真实标签(y=1,正样本),并且 k 从语料中随机抽取作为假标签(y=0,负样本)。
请看下面的段落。假设我们的目标词是“Word2vec”。 window 为 3,我们的上下文词是:The
、widely
、popular
、algorithm
、was
、developed
。这些上下文词被视为正面标签。我们还需要一些负面标签。我们从语料库(produce
、software
、Collobert
、margin-based
、probabilistic
)中随机挑选一些词,并将它们视为负样本。我们从语料库中随机选择一些示例的这种技术称为负采样。
参考:
- (1) C.戴尔,"Notes on Noise Contrastive Estimation and Negative Sampling",2014
- (2) http://sebastianruder.com/word-embeddings-softmax/
我写了一篇关于负采样的教程文章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 是如何实现的? -> 通过将 multi-classification 任务转换为二进制分类任务。
使用 SGNS,不再通过预测中心词的上下文词来学习词向量。它学会从噪声分布中区分实际上下文词(正)和随机抽取的词(负)。
在现实生活中,您通常不会用 Gangnam-Style
或 pimples
等随机词来观察 regression
。这个想法是,如果模型可以区分可能的(正)对和不太可能的(负)对,就会学习到好的词向量。
上图中,当前正word-context对为(drilling
,engineer
)。 K=5
负样本为 randomly drawn from the noise distribution:minimized
、primary
、concerns
、led
、page
。当模型遍历训练样本时,权重被优化,因此正对的概率将输出 p(D=1|w,c_pos)≈1
,而负对的概率将输出 p(D=1|w,c_neg)≈0
。