NLP经典论文:Word2vec、CBOW、Skip-gram 笔记
论文
原论文:《Efficient Estimation of Word Representations in Vector Space》
分层softmax和负采样Negative Sampling的介绍:《Distributed Representations of Words and Phrases and their Compositionality》
介绍
2013-01发表的文章,使用低纬连续向量表示代替传统的one-hot高维稀疏表示。
模型结构
CBOW模型
CBOW为Continuous Bag-of-Words,将传统的稀疏空间表示的词向量转化成稠密空间表示的词向量。
有一个大家说过:一个词,可以有其上下文文本来表示。
CBOW的思想就是如果一个词经过投影降维,和上下文文本经过投影降维,在低维空间是一样的向量,那么这个降维矩阵就是我想要的转换矩阵,即look up table,embedding vector matrix。
但它有一个缺点,就是上下文词的表示,只是简单地将词向量进行叠加,即在低维的embedding空间进行合成,而没有考虑真正地考虑词的上下文关系的空间上的关系,比如(我/爱/国/共),作为上下文去预测中心词(中),和(共/国/爱/我),作为上下文去预测中心词(中),是没有区别的,预测结果是一样的。
整体模型
输入
w t − 2 , w t − 1 , w t − 1 , w t − 2 w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2} wt−2,wt−1,wt−1,wt−2输入为 w t w_{t} wt的上下文,文本通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} w∈RV×1,V为字典大小,包含词的总数。
输出
f ( w t − 2 , w t − 1 , w t + 1 , w t + 2 ) = w t ^ f(w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=\hat{w_t} f(wt−2,wt−1,wt+1,wt+2)=wt^, w ^ \hat{w} w^为预测词,为 m a x { p } max\{\boldsymbol{p}\} max{p}所对应的词,其中
p = { p ( w 1 ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , p ( w 2 ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , . . . , p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , . . . } , i = 1 , 2 , 3 , . . . , V \boldsymbol{p}=\{p(w_1|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}), p(w_2|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}), ..., p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}),...\}, i=1, 2, 3, ..., V p={p(w1∣wt−2,wt−1,wt+1,wt+2),p(w2∣wt−2,wt−1,wt+1,wt+2),...,p(wi∣wt−2,wt−1,wt+1,wt+2),...},i=1,2,3,...,V
意思就是给定 w t w_{t} wt的上下文输入词( w t − 2 , w t − 1 , w t + 1 , w t + 2 w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2} wt−2,wt−1,wt+1,wt+2),预测词 w t w_{t} wt时, { p } \{\boldsymbol{p}\} {p}中概率最大的那个 p ( w i ∣ w t − n + 1 , w t − n + 2 , . . . , w t − 1 ) p(w_i|w_{t-n+1}, w_{t-n+2}, ..., w_{t-1}) p(wi∣wt−n+1,wt−n+2,...,wt−1)所对应的那个词 w i w_i wi,就是预测输出的词。
整体流程
整体维度
输入层与投影层
输入
w t − 2 , w t − 1 , w t − 1 , w t − 2 w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2} wt−2,wt−1,wt−1,wt−2输入为 w t w_{t} wt的上下文,文本通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} w∈RV×1,V为字典大小,包含词的总数。
输出
x = C t − 2 + C t − 1 + C t + 1 + C t + 2 , x ∈ R m × 1 \boldsymbol{x}=C_{t-2}+C_{t-1}+C_{t+1}+C_{t+2}, \boldsymbol{x}\in R^{m\times 1} x=Ct−2+Ct−1+Ct+1+Ct+2,x∈Rm×1
其中, C i = C w i C_{i}=\boldsymbol{C}w_{i} Ci=Cwi, C i ∈ R m × 1 C_i \in R^{m\times 1} Ci∈Rm×1, C \boldsymbol{C} C为变换矩阵,投影矩阵, C ∈ R m × V \boldsymbol{C} \in R^{m \times V} C∈Rm×V,把one-hot表示的稀疏向量从稀疏的V维空间投影到稠密的m维空间。然后再将 C i C_i Ci进行求和起来,形成上下文信息,传递给下一层。
输出层
输入
x = C t − 2 + C t − 1 + C t + 1 + C t + 2 , x ∈ R m × 1 \boldsymbol{x}=C_{t-2}+C_{t-1}+C_{t+1}+C_{t+2}, \boldsymbol{x}\in R^{m\times 1} x=Ct−2+Ct−1+Ct+1+Ct+2,x∈Rm×1
输出
w t ^ \hat{w_t} wt^
原本方式:传统softmax
将输入
x
\boldsymbol{x}
x传入线性层对预测目标类别进行打分,再通过softmax层求得字典中每个词
w
i
w_i
wi的预测概率为:
p
(
w
i
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
=
e
θ
i
x
∑
i
=
1
V
e
θ
i
x
p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=\frac{e^{\boldsymbol{\theta_i} \boldsymbol{x}}}{\sum\limits_{i=1}^Ve^{\boldsymbol{\theta_i} \boldsymbol{x}}}
p(wi∣wt−2,wt−1,wt+1,wt+2)=i=1∑Veθixeθix
其中
θ
i
∈
R
1
×
m
,
i
=
1
,
2
,
.
.
.
,
V
\boldsymbol{\theta_i} \in R^{1\times m}, i=1, 2, ..., V
θi∈R1×m,i=1,2,...,V。
作者在《Distributed Representations of Words and Phrases and their Compositionality》文章中写到了2种优化方式:分层softmax和负采样Negative Sampling
优化方式1:分层softmax
传统的softmax,在计算概率
p
(
w
i
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})
p(wi∣wt−2,wt−1,wt+1,wt+2)的时候,分母需要计算所有词的
e
得
分
e^{得分}
e得分,即
e
θ
i
x
e^{\boldsymbol{\theta_i} \boldsymbol{x}}
eθix,会带来巨大的花费,于是提出了分层softmax,基于Huffman Tree:
σ
(
⋅
)
\sigma(\centerdot)
σ(⋅)为sigmoid函数。
优点:将预先定义好的类别,即词,按照词频排序,词频高的词,靠近树的根节点,词频低的词,远离根节点,每一个非叶子节点处都形成一个二分类问题,每一个节点都代表了0或1的分类标签。基于本节点,预测左右子节点的概率时,预测为左子节点的概率为
σ
(
θ
x
)
\sigma(\boldsymbol{\theta x})
σ(θx),预测为右子节点的概率为
1
−
σ
(
θ
x
)
1-\sigma(\boldsymbol{\theta x})
1−σ(θx)。从根节点到label所在的叶节点的路径为
l
l
l,其中第j层节点由其上一级父节点j-1节点进行二分类得到,其概率为:
p
(
d
j
∣
x
,
θ
j
−
1
)
=
[
σ
(
x
θ
j
−
1
)
]
d
j
⋅
[
1
−
σ
(
x
θ
j
−
1
)
]
1
−
d
j
p(d_j|\boldsymbol{x},\boldsymbol{\theta_{j-1}}) = [\sigma(\boldsymbol{x}\boldsymbol{\theta_{j-1}})]^{d_j} \cdot [1-\sigma(\boldsymbol{x}\boldsymbol{\theta_{j-1}})]^{1-d_j}
p(dj∣x,θj−1)=[σ(xθj−1)]dj⋅[1−σ(xθj−1)]1−dj
d
j
d_j
dj为0或1的分类标签。
每一个叶节点,即预测词所在节点的概率为:
p
(
w
i
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
=
p
(
w
i
∣
x
)
=
∏
j
l
p
(
d
j
∣
x
,
θ
j
−
1
)
p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=p(w_i|\boldsymbol{x}) = \prod_j^lp(d_j|\boldsymbol{x},\boldsymbol{\theta_{j-1}})
p(wi∣wt−2,wt−1,wt+1,wt+2)=p(wi∣x)=j∏lp(dj∣x,θj−1)
例如在计算
w
4
w_4
w4的概率的时候:
p
(
w
4
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
=
(
1
−
σ
(
θ
1
x
)
)
(
1
−
σ
(
θ
2
x
)
)
(
1
−
σ
(
θ
3
x
)
)
p(w_4|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=(1-\sigma(\boldsymbol{\theta_1x}))(1-\sigma(\boldsymbol{\theta_2x}))(1-\sigma(\boldsymbol{\theta_3x}))
p(w4∣wt−2,wt−1,wt+1,wt+2)=(1−σ(θ1x))(1−σ(θ2x))(1−σ(θ3x))
在求交叉熵损失
l
o
s
s
=
−
log
p
(
w
t
∣
w
t
−
n
+
1
,
w
t
−
n
+
2
,
.
.
.
,
w
t
−
1
)
loss=-\log p(w_t|w_{t-n+1}, w_{t-n+2}, ..., w_{t-1})
loss=−logp(wt∣wt−n+1,wt−n+2,...,wt−1)的时候,这么做就能避免原本softmax分母
∑
i
=
1
V
e
θ
i
x
\sum\limits_{i=1}^Ve^{\boldsymbol{\theta_i} \boldsymbol{x}}
i=1∑Veθix的V次得分计算,改为
∏
j
l
p
(
θ
j
−
1
x
)
\prod\limits_j^lp(\boldsymbol{\theta_{j-1}x})
j∏lp(θj−1x)至多logV次的计算,减小运算量。
优化方式2:负采样Negative Sampling
如果我们的训练样本里的中心词 w t w_t wt是一个很生僻的词,那么就得在Huffman Tree中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢?
Negative Sampling就是这么一种求解word2vec模型的方法,它摒弃了霍夫曼树,采用了Negative Sampling(负采样)的方法来求解:
σ
(
⋅
)
\sigma(\centerdot)
σ(⋅)为sigmoid函数。与前面的方法不一样,这里每个预测词的概率之和
∑
i
V
p
(
w
i
∣
w
t
−
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
)
≠
1
\sum\limits_i^Vp(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})\neq1
i∑Vp(wi∣wt−2,wt−1,wt+1,wt+2)=1。
c o n t e x t ( w t ) = ( w t − 2 , w t − 1 , w t + 1 , w t + 2 ) context(w_t)=(w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}) context(wt)=(wt−2,wt−1,wt+1,wt+2),对于一个样本 ( c o n t e x t ( w t ) , w t ) (context(w_t),w_t) (context(wt),wt)来说,其他样本都是他的反例 n e g ( w t ) neg(w_t) neg(wt)。
交叉熵损失
前面的方法:
l
o
s
s
=
−
log
p
(
w
t
∣
θ
x
)
loss= - \log p(w_t|\boldsymbol{\theta x})
loss=−logp(wt∣θx)
Negative Sampling:
l
o
s
s
=
−
log
p
(
w
t
∣
θ
w
t
x
)
−
∑
w
u
∈
n
e
g
(
w
t
)
log
[
1
−
p
(
w
u
∣
θ
w
u
x
)
]
loss= - \log p(w_t|\boldsymbol{\theta_{w_t}x}) - \sum\limits_{w_u\in neg(w_t)} \log [1-p(w_u|\boldsymbol{\theta_{w_u}x})]
loss=−logp(wt∣θwtx)−wu∈neg(wt)∑log[1−p(wu∣θwux)]
从而达到反向传播在训练正例词对应的参数的时候,反例的参数也得到更新,降低复杂度,增加训练速度。
Skip-gram模型
Skip-gram的思想就是,通过中心词,去预测上下文的词。
整体模型
输入
w t w_{t} wt,文本 w t w_{t} wt通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} w∈RV×1,V为字典大小,包含词的总数。
输出
f ( w t ) = ( w ^ t − 2 , w ^ t − 1 , w ^ t + 1 , w ^ t + 2 ) f(w_t)=(\hat{w}_{t-2}, \hat{w}_{t-1}, \hat{w}_{t+1}, \hat{w}_{t+2}) f(wt)=(w^t−2,w^t−1,w^t+1,w^t+2), w ^ \hat{w} w^为预测的上下文词,为预测概率 { p } \{\boldsymbol{p}\} {p}所对应的前4个最大概率的词,其中
p = { p ( w 1 ∣ w t ) , p ( w 2 ∣ w t ) , . . . , p ( w i ∣ w t ) , . . . , p ( w V ∣ w t ) } , i = 1 , 2 , 3 , . . . , V \boldsymbol{p}=\{p(w_1|w_t), p(w_2|w_t), ..., p(w_i|w_t), ..., p(w_V|w_t)\}, i=1, 2, 3, ..., V p={p(w1∣wt),p(w2∣wt),...,p(wi∣wt),...,p(wV∣wt)},i=1,2,3,...,V
意思就是给定输入词 w t w_{t} wt,预测 w t w_{t} wt的上下文 c o n t e x t ( w t ) context(w_t) context(wt)时,这里 c o n t e x t ( w t ) context(w_t) context(wt)为 ( w t − 2 , w t − 1 , w t − 1 , w t − 2 ) (w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2}) (wt−2,wt−1,wt−1,wt−2), { p } \{\boldsymbol{p}\} {p}中概率最大的前四个 p ( w i ∣ w t ) p(w_i|w_t) p(wi∣wt)所对应的词 w i w_i wi,就是预测的上下文输出词。
整体流程
流程维度
输入层与投影层
输入
w t w_{t} wt,文本 w t w_{t} wt通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} w∈RV×1,V为字典大小,包含词的总数。
输出
x = W w t \boldsymbol{x}=\boldsymbol{W}w_t x=Wwt
可以理解为经过投影层从稀疏的高维空间映射到稠密的低维空间,也可以理解为从中心词字典look up table中查表得到改词在低维空间中的值。
输出层
输入
x = W w t \boldsymbol{x}=\boldsymbol{W}w_t x=Wwt
输出
( w ^ t − 2 , w ^ t − 1 , w ^ t + 1 , w ^ t + 2 ) (\hat{w}_{t-2}, \hat{w}_{t-1}, \hat{w}_{t+1}, \hat{w}_{t+2}) (w^t−2,w^t−1,w^t+1,w^t+2), w ^ \hat{w} w^为预测的上下文词
理解1
每个词在低维向量中都有2种表示,一种是在中心词字典中,表示为 v ∈ W , W ∈ R d × V \boldsymbol{v} \in \boldsymbol{W},\boldsymbol{W} \in R^{d \times V} v∈W,W∈Rd×V,这里的 v \boldsymbol{v} v也就是这一层的输入 x \boldsymbol{x} x,一种是在背景词字典中,表示为 u ∈ W ′ , W ′ ∈ R V × d \boldsymbol{u} \in \boldsymbol{W}^{\prime},\boldsymbol{W}^{\prime} \in R^{V \times d} u∈W′,W′∈RV×d
在投影层到输出层之间,通过点积计算2个词之间的相似度得分,在通过softmax预测每个词
w
i
w_i
wi的概率,结合到一起就是:
p
(
w
i
∣
w
t
)
=
e
x
p
(
u
i
v
w
t
)
∑
j
V
e
x
p
(
u
j
v
w
t
)
p(w_i|w_t)=\frac{exp(\boldsymbol{u_i v_{w_t}})}{\sum\limits_j^V exp(\boldsymbol{u_j v_{w_t}})}
p(wi∣wt)=j∑Vexp(ujvwt)exp(uivwt)
前四个概率最大的
p
(
w
o
∣
w
t
)
p(w_o|w_t)
p(wo∣wt)所对应的词就是输出的上下文词。
理解2
可以忽略背景词字典的理解,把
u
\boldsymbol{u}
u当成线性层的参数
θ
\boldsymbol{\theta}
θ,对
x
\boldsymbol{x}
x进行特征提取,得到的是改词的分值,再经过softmax层预测每个词
w
o
w_o
wo的概率。
p
(
w
i
∣
w
t
)
=
e
x
p
(
θ
i
x
)
∑
j
V
e
x
p
(
θ
j
x
)
p(w_i|w_t)=\frac{exp(\boldsymbol{\theta_i x})}{\sum\limits_j^V exp(\boldsymbol{\theta_j x})}
p(wi∣wt)=j∑Vexp(θjx)exp(θix)
优化目标
l
o
s
s
=
∑
t
T
∑
−
m
≤
j
≤
m
,
j
≠
0
log
p
(
w
j
∣
w
t
)
loss=\sum_t^T\sum_{-m \leq j \leq m, j \neq 0 } \log p(w_j|w_t)
loss=t∑T−m≤j≤m,j=0∑logp(wj∣wt)
T是所有时刻,即文本长度,m是一个滑动窗口,表示距离中心词
w
t
w_t
wt的最大距离。
优化方式
- 分层softmax
- 负采样Negetive Sampling
与上文中CBOW的优化方式一样。
文章部分翻译
3 New Log-linear Models
在本节中,我们提出了两种新的模型架构,用于学习单词的分布式表示,以尽量减少计算复杂性。上一节的主要观察结果是,大多数复杂性是由模型中的非线性隐藏层引起的。虽然这正是神经网络如此吸引人的原因,但我们决定探索更简单的模型,这些模型可能无法像神经网络那样精确地表示数据,但可能可以更有效地在数据上进行训练。
新的体系结构直接遵循了我们早期工作[13,14]中提出的体系结构,我们发现神经网络语言模型可以通过两个步骤成功训练:首先,使用简单模型学习词的连续词向量,然后基于这些词的分布式表示来训练N-gram NNLM。虽然后来有大量的工作集中于学习词向量,但我们认为在[13 ]中提出的方法是最简单的。请注意,相关模型的提出也早得多[26,8]。
3.1 CBOW
第一个提出的架构类似于前馈NNLM,其中非线性隐藏层被移除,投影层被所有词共享(不仅仅是投影矩阵);因此,所有单词都被投影到相同的位置(它们的向量被平均)。我们称这种结构为词袋模型,因为句子中的文字顺序不影响投影。此外,我们还使用来自下文的词语;在下一节介绍的任务中,我们通过构建一个log-linear分类器,输入四个下文单词和四个上文单词,从而获得了最佳性能,其中训练标准是正确分类当前(中间)单词。训练的复杂性也随之增加
我们将该模型进一步表示为CBOW,因为与标准词袋模型不同,它使用上下文的连续分布式表示。模型架构如图1所示。请注意,输入层和投影层之间的权重矩阵对于所有单词位置是共享的,方式与NNLM中相同。
3.2 Continuous Skip-gram Model
第二种架构类似于CBOW,但它不是根据上下文预测当前词,而是尝试基于同一句子中的另一个单词来最大限度地对当前词进行分类。更准确地说,我们使用每个当前单词作为具有连续投影层的log-linear分类器的输入,并在当前词的前后范围内预测一定量的词。我们发现,增加范围可以提高输出的词向量的质量,但也会增加计算复杂度。由于距离较远的单词与当前单词的相关性通常小于距离较近的单词与当前单词的相关性,因此我们通过在训练示例中从这些单词中取样较少,从而减少了距离较远单词的权重。
此体系结构的训练复杂性与
其中C是单词的最大距离。因此,如果我们选择C=5,对于每个训练词,我们将随机选择<1;C>范围内的数字R,然后使用上文的R个词和当前词下文的R个词作为正确的标签。这将要求我们进行R×2单词分类,以当前单词作为输入,每R+R个单词作为输出。在下面的实验中,我们使用C=10。
相关视频
有的需要科学上网才能看
Lecture 2 | Word Vector Representations: word2vec
Understanding Word2Vec
相关的笔记
语言模型与Log-Linear Models
【Deep Learning学习笔记】Efficient Estimation of Word Representations in Vector Space_google2013
Efficient Estimation of Word Representations in Vector Space
word2vec原理(三) 基于Negative Sampling的模型
(三)通俗易懂理解——Skip-gram的负采样
word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型
Word2Vec源码解析
Naive Softmax&Negative Sampling
NLP之—word2vec算法skip-gram原理详解
相关代码
pytorch
tensorflow
keras
API:
word2vec训练中文词向量
word2vec词向量训练及gensim的使用
自然语言处理库——Gensim之Word2vec
官方文档