Word2vec
一、语言模型
1、语言模型的概念
语言模型是计算一个句子是一个句子的概率的模型,一个句子既需要符合语法规则,同时也需要符合语义,只有两方面都满足的情况下,语言模型才会给出一个较高的概率值。语言模型是一个无监督的模型,不需要任何的语料标注。
2、语言模型的发展
(1)基于专家知识的语言模型
所谓的基于专家知识的语言模型就是语言学家企图总结出一套通用的语法规则,例如形容词后接名词,但是这种方法并无法当今网络用语频繁出现的这样一种情况,因此现在不用常用这种方法
(2)统计语言模型
所谓的统计语言模型是指通过概率计算来刻画语言模型
P ( s ) = P ( w 1 , w 2 , … , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 w 2 ) … P ( w n ∣ w 1 w 2 … w n − 1 )
\begin{aligned}
P(s)=& P\left(w_{1}, w_{2}, \dots, w_{n}\right) \\
=&P\left(w_{1}\right) P\left(w_{2} | w_{1}\right) P\left(w_{3} | w_{1} w_{2}\right) \dots P\left(w_{n} | w_{1} w_{2} \dots w_{n-1}\right)
\end{aligned}
P ( s ) = = P ( w 1 , w 2 , … , w n ) P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 w 2 ) … P ( w n ∣ w 1 w 2 … w n − 1 )
p ( w i ∣ w i − 1 ) = p ( w i − 1 , w i ) p ( w i − 1 ) = c o u n t ( w i − 1 , w i ) c o u n t ( w i − 1 )
p\left(w_{i} | w_{i-1}\right)=\frac{p\left(w_{i-1}, w_{i}\right)}{p\left(w_{i-1}\right)} = \frac{count(w_{i-1},w_i)}{count(w_{i-1})}
p ( w i ∣ w i − 1 ) = p ( w i − 1 ) p ( w i − 1 , w i ) = c o u n t ( w i − 1 ) c o u n t ( w i − 1 , w i )
通常概率表达的方式,我们就能构造出一个较好的语言模型,但仍然存在下面两个问题:
由于P ( s ) P(s) P ( s ) 采用的是连乘方式,因此对于某一个词语w i w_i w i ,如果在语料中没有出现过,那么P ( w i ) = 0 P(w_i)=0 P ( w i ) = 0 ,这样会导致P ( s ) = 0 P(s)=0 P ( s ) = 0
如果一句话由非常多的短语构成,同时某些短语在语料中出现的次数较少,那么多个小于1的概率相乘必然会使得P ( s ) P(s) P ( s ) 趋向于零
如何对上面两个问题进行解决呢?⇒ \Rightarrow ⇒ 平滑操作
(3)统计语言模型中的平滑操作
有一些词或词组在语料中没有出现过,但是这不能代表它不可能存在,而平滑操作就是给那些没有出现过的词或者词组一个不为零的较小的概率。最常用的就是 Laplace Smoothing ,也称之为加1平滑 ,具体操作为:每个词在原来出现的次数上加1
例如一个语料库中,A A A 出现的次数为0,B B B 为990,C C C 为10,则A A A 、B B B 、C C C 的概率为0、0.99 0.99 0 . 9 9 、0.01 0.01 0 . 0 1 ;如果通过加1平滑,则相当于A A A 出现的次数为1,B B B 为991,C C C 为11,则A A A 、B B B 、C C C 的概率为0.001、0.988 0.988 0 . 9 8 8 、0.011 0.011 0 . 0 1 1 。从上面的例子就可以看出,进行加1平滑后,出现次数多的词语的概率计算值有所下降,而出现次数少的词语概率计算值有所上升,加1平滑本质上起到了一个“劫富济贫”的作用
加1平滑只要词有显著的作用,对于很长的词组短语并没有很好的效果,这是因为这种长的短语很稀疏,如果要平滑操作,则所有的短语都要平滑,这是因为参数空间太大 ,数据稀疏 严重,如何解决这两个问题呢?需要用到马尔可夫假设
(4)马尔可夫假设
在统计语言模型中的马尔可夫假设主要内容就是:下一个词出现的概率仅依赖于前面的一个词或几个词,如果与前k k k 个词有关,则称为k − g r a m k-gram k − g r a m 模型
u n i g r a m P ( s ) = P ( w 1 ) P ( w 2 ) … P ( w n ) b i g r a m P ( s ) = P ( w 1 ) P ( w 2 ∣ w 1 ) … P ( w n ∣ w n − 1 ) t r i g r a m P ( s ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 w 1 ) … P ( w n ∣ w n − 1 w n − 2 ) k − g r a m P ( s ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 w 1 ) … P ( w n ∣ w n − k + 1 … w n − 1 )
\begin{aligned}
unigram \qquad P(s) = & P(w_1)P(w_2)\ldots P(w_n) \\
bigram \qquad P(s) = & P(w_1)P(w_2 | w_1)\ldots P(w_n | w_{n-1}) \\
trigram \qquad P(s) = & P(w_1)P(w_2 | w_1)P(w_3 | w_2w_1)\ldots P(w_n | w_{n-1}w_{n-2}) \\
k-gram \qquad P(s) = & P(w_1)P(w_2 | w_1)P(w_3 | w_2w_1)\ldots P(w_n | w_{n-k+1}\ldots w_{n-1}) \\
\end{aligned}
u n i g r a m P ( s ) = b i g r a m P ( s ) = t r i g r a m P ( s ) = k − g r a m P ( s ) = P ( w 1 ) P ( w 2 ) … P ( w n ) P ( w 1 ) P ( w 2 ∣ w 1 ) … P ( w n ∣ w n − 1 ) P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 w 1 ) … P ( w n ∣ w n − 1 w n − 2 ) P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 w 1 ) … P ( w n ∣ w n − k + 1 … w n − 1 )
注意:k − g r a m k-gram k − g r a m 模型的参数空间为V + V 2 + … + V k V+V^2+\ldots+V^k V + V 2 + … + V k ,V V V 为语料库词语总数
3、语言模型的评价指标:困惑度(Perplexity)
语言模型本质上是一个多分类问题,这里可以通过困惑度(Perplexity)进行模型的评价:
P P ( s ) = P ( w 1 , w 2 , … , w n ) − 1 n = 1 P ( w 1 , w 2 , … , w n ) n = 1 P ( s ) n
PP(s) = P(w_1, w_2, \ldots, w_n)^{-\frac{1}{n}}=\sqrt[n]{\frac{1}{P\left(w_{1}, w_{2}, \dots, w_{n}\right)}} = \sqrt[n]{\frac{1}{P(s)}}
P P ( s ) = P ( w 1 , w 2 , … , w n ) − n 1 = n P ( w 1 , w 2 , … , w n ) 1 = n P ( s ) 1
因此,句子概率越大,语言模型越好,困惑度越小
二、词的表示方法
1、独热表示(One-hot Representation)
所谓的独热表示,就是一个向量,只有一个地方为1,其他位置都为0。这种表示方法的优点是:表示简单,但是缺点也十分明显,那就是当词非常多的时候,表示向量的维度非常高,需要的空间非常大,同时还有一个问题就是这种表示方法无法表示词与词之间的关系
2、分布式表示方法(Distributed Representation)
分布式表示也称为稠密表示,对于每一个词,仅需要一个D D D 维的向量就能表示,这里的D D D 是远远小于总的词语个数V V V ,对于独热表示,每一个都需要一个V V V 维的向量,而分布式表示相当于是把V V V 维压缩到了D D D 维,但D D D 维向量中某一位置的数值大小需要通过训练得到。同时,分布式表示有一个很大的好处,那就是可以表示词与词之间的相似性(利用余弦相似度)—— Word embedding
三、论文学习
1、论文背景知识
1986年, Hinton 第一次提出了 Distributed Representation ,目的是将离散形式的词输入到神经网络中,由于神经网络需要的是连续的值,因此提出了一种 Distributed Representation 的表示方法,把离散形式的词进行连续的分布式表示;2003年,在文章 A Neural Probabilistic Language Model 首次使用了词向量,而在2003年到2013年间,提出了很多训练词向量的方法,但共同的缺点就是非常慢,无法在大的预料上训练,在2013年提出的 word2vec 模型解决了训练速度慢的问题,能够在大的语料上进行训练,得到更好的词向量,推动了自然语言处理的发展
2、论文的研究成果
提出了一种新的模型结构
提出优化训练的方法,使得训练速度加快
废除训练代码 word2vec ,使得单机训练成为可能
成果:训练的词向量又快又好,并且能够在大规模预料上进行词向量的训练
3、论文的研究意义
(1)衡量词向量之间的相似程度
对于两个词的相似度,可以用公式:
s i m ( w o r d 1 , w o r d 2 ) = cos ( w o r d v e c 1 , w o r d v e c 2 ) sim(word1, word2) = \cos(wordvec1, wordvec2) s i m ( w o r d 1 , w o r d 2 ) = cos ( w o r d v e c 1 , w o r d v e c 2 )
进行计算,计算得到的值越接近于1,则两个词越相似,一种更客观的评价方式是词类比(analogy) ,计算公式为
cos ( w o r d v e c 1 − w o r d v e c 2 + w o r d v e c 3 , w o r d v e c 4 ) \cos(wordvec1-wordvec2+wordvec3,wordvec4) cos ( w o r d v e c 1 − w o r d v e c 2 + w o r d v e c 3 , w o r d v e c 4 )
通过这种方式,能够学习到词与词之间的关系,例如 France 和 Paris 与 Italy 和 Rome 这两个词对就是非常相似的,因此V ( F r a n c e ) − V ( P a r i s ) ≈ V ( I t a l y ) − V ( R o m e ) V(France) - V(Paris) \approx V(Italy) - V(Rome) V ( F r a n c e ) − V ( P a r i s ) ≈ V ( I t a l y ) − V ( R o m e ) ,这种模型的训练就能得到非常多在语义上相似的词对
(2)作为预训练模型提升NLP任务
可以将训练得到的词向量可以用于外部任务比如命名实体识别、文本分类;也可以应用于其他NLP任务上,相当于一个半监督任务,可以有效地提高模型的泛化能力
四、论文精读
1、对比模型
对比模型主要对比两种模型,一种是前馈神经网络语言模型(NNLM) ,一种是循环神经网络模型(RNNLM)
(1)前馈神经网络语言模型(NNLM)
前馈神经网络语言模型最早由 Bengio 在2003年提出,网络结构如下图所示:
从上图中可以看出,NNLM的结构分为三层,最下面为输入层: input layer ,输入的是词的索引而非词本身, 输入后,将每个 index 映射为一个向量,最后将这些向量 contact 在一起;中间一层为隐藏层: hidden layer ,即将输入层的向量接上一个全连接层,用 t a n h tanh t a n h 作为**函数**;最上面为输出层: output layer ,也是接上一个全连接层,利用s o f t m a x softmax s o f t m a x 输出概率。这里输入的是前n − 1 n-1 n − 1 个词语,最后输出的是第n n n 个位置单词的概率。下面详细介绍三个层:
输入层:将词映射为向量,相当于一个1 × V 1\times V 1 × V 的 one-hot 向量乘以一个 V × D V\times D V × D 的向量得到一个 1 × D 1\times D 1 × D 的向量
隐藏层:一个以t a n h tanh t a n h 为**函数的全连接层:a = t a n h ( d + U x ) a=tanh(d+Ux) a = t a n h ( d + U x )
输出层:一个全连接层,后面接个s o f t m a x softmax s o f t m a x 函数来生成概率分布:y = b + W a y=b+Wa y = b + W a ,其中y y y 是一个1 × V 1\times V 1 × V 的向量,即:P ( w t ∣ w t − n + 1 , … , w t − 1 ) = exp ( y w t ) ∑ i exp ( y i )
P\left(w_{t} \mid w_{t-n+1}, \ldots, w_{t-1}\right)=\frac{\exp \left(y_{w_{t}}\right)}{\sum_{i} \exp \left(y_{i}\right)}
P ( w t ∣ w t − n + 1 , … , w t − 1 ) = ∑ i exp ( y i ) exp ( y w t )
Remark:语言模型困惑度和Loss的关系
对于一句话,L o s s Loss L o s s 的定义和困惑度的定义如下:
L o s s Loss L o s s :L = − 1 T ∑ i = 1 T log p ( w i ∣ w i − n + 1 , … , w i − 1 ) L=-\frac{1}{T} \sum_{i=1}^{T} \log p\left(w_{i} \mid w_{i-n+1}, \dots, w_{i-1}\right) L = − T 1 ∑ i = 1 T log p ( w i ∣ w i − n + 1 , … , w i − 1 )
困惑度:P P ( s ) = P ( w 1 , w 2 , … , w T ) − 1 T = 1 P ( w 1 , w 2 , … , w T ) T PP(s)=P\left(w_{1}, w_{2}, \ldots, w_{T}\right)^{-\frac{1}{T}}=\sqrt[T]{\frac{1}{P\left(w_{1}, w_{2}, \ldots, w_{T}\right)}} P P ( s ) = P ( w 1 , w 2 , … , w T ) − T 1 = T P ( w 1 , w 2 , … , w T ) 1
对困惑度取对数得到log ( P P ( s ) ) = − 1 T log P ( w 1 , w 2 , … , w T ) \log(PP(s)) = -\frac{1}{T}\log P\left(w_{1}, w_{2}, \ldots, w_{T}\right) log ( P P ( s ) ) = − T 1 log P ( w 1 , w 2 , … , w T ) ,根据全连接公式和马尔可夫假设可以得到log ( P P ( s ) ) = − 1 T ∑ i = 1 T log p ( w i ∣ w i − n + 1 , … , w i − 1 ) = e L o s s \log(PP(s))= -\frac{1}{T} \sum_{i=1}^{T} \log p\left(w_{i} \mid w_{i-n+1}, \dots, w_{i-1}\right) = e^{Loss} log ( P P ( s ) ) = − T 1 ∑ i = 1 T log p ( w i ∣ w i − n + 1 , … , w i − 1 ) = e L o s s ,所以困惑度是自然对数的L o s s Loss L o s s 次方,这就是两者的关系
讨论: Bingio 在2003年的文章中提出的N N L M NNLM N N L M 是一篇开山之作,也为后面的研究提出了几个研究的思路,具体如下:
仅对一部分输出进行梯度传播:像t h e the t h e ,a a a 这类词语,出现次数多,但是在模型中并没特别重要作用,因此对于这一类词语,可以不进行梯度传播
引入先验知识,如词性等:2003年这篇模型并没有输入词性,因此提出了词性的输入是否可以提高模型的精度这个问题,其中主要有两个子问题:
网络模型自身能否学习到词性
网络模型如果能自己学习词性,学到的词性知识是否够用
解决一词多义问题,对于同一词语的不同意思,模型如何进行区分
加速s o f t m a x softmax s o f t m a x 层,由于输出层是全连接层,对每一个词语都需要输出概率,因此非常慢,需要进行加速
(2)循环神经网络语言模型(RNNLM)
如上图所示,R N N L M RNNLM R N N L M 也有三层:
输入层:和N N L M NNLM N N L M 一样,需要将当 前时间步的转化为词向量( one-hot )
隐藏层:对输入和上一个时间步的隐藏输出进行全连接层操作:s ( t ) = U w ( t ) + W s ( t − 1 ) + d
s(t)=U w(t)+W s(t-1)+d
s ( t ) = U w ( t ) + W s ( t − 1 ) + d
输出层:一个全连接层,后面接个s o f t m a x softmax s o f t m a x 函数来生成概率分布,y ( t ) = b + V s ( t ) y(t) = b + Vs(t) y ( t ) = b + V s ( t ) ,其中,y y y 是一个1 × V 1\times V 1 × V 的向量,P ( w t ∣ w t − n + 1 , … , w t − 1 ) = exp ( y w t ) ∑ i exp ( y i )
P\left(w_{t} \mid w_{t-n+1}, \ldots, w_{t-1}\right)=\frac{\exp \left(y_{w_{t}}\right)}{\sum_{i} \exp \left(y_{i}\right)}
P ( w t ∣ w t − n + 1 , … , w t − 1 ) = ∑ i exp ( y i ) exp ( y w t )
循环神经网络语言模型并没有使用马尔可夫假设,因为每个时间步预测一个词,在预测第n n n 个词时,已经使用了前n − 1 n-1 n − 1 个词的信息
2、Word2vec
(1)Log-linear model
定义:将语言模型的建立看成个多分类问题,相当于线性分类器加上s o f t m a x softmax s o f t m a x ,这样就构成了一个L o g − Log- L o g − 线性模型:Y = s o f t m a x ( W x + b ) Y = softmax(Wx+b) Y = s o f t m a x ( W x + b ) ,多分类的逻辑回归模型就是一个L o g − Log- L o g − 线性模型,w o r d 2 v e c word2vec w o r d 2 v e c 中的两种模型:s k i p − g r a m skip-gram s k i p − g r a m 和C B O W CBOW C B O W 都是L o g − Log- L o g − 线性模型
(2)Word2vec 原理
语言模型基本思想:句子中下一个词的出现和前面的词是有关系的,所以可以使用前面的词预测下一个词
w o r d 2 v e c word2vec w o r d 2 v e c 基本思想:句子中相近的词 之间是有联系的,比如今天后面经常出现上午,下午和晚上。所以w o r d 2 v e c word2vec w o r d 2 v e c 的基本思想就是用词来预测词:
s k i p − g r a m skip-gram s k i p − g r a m 使用中心词预测周围词
C B O W CBOW C B O W 使用周围词预测中心词
w o r d 2 v e c word2vec w o r d 2 v e c 可以看成是对语言模型的一种简化
(3)Skip-gram
S k i p − g r a m Skip-gram S k i p − g r a m 是用中心词预测周围词,若中心词为w i w_i w i ,这里需要定义在中心词附近多大的范围才是中心词,既需要一个w i n d o w window w i n d o w ,例如我们取w i n d o w = 2 window=2 w i n d o w = 2 ,则我们需要计算的就是:P ( w i − 1 ∣ w i ) , P ( w i − 2 ∣ w i ) , P ( w i + 1 ∣ w i ) , P ( w i + 2 ∣ w i ) P(w_{i-1} | w_i), P(w_{i-2} | w_i), P(w_{i+1} | w_i), P(w_{i+2} | w_i) P ( w i − 1 ∣ w i ) , P ( w i − 2 ∣ w i ) , P ( w i + 1 ∣ w i ) , P ( w i + 2 ∣ w i ) ,那么S k i p − g r a m Skip-gram S k i p − g r a m 是如何求取这些概率值的呢?前面讲到,求这种概率的问题本质上是一个多分类问题,以P ( w i − 1 ∣ w i ) P(w_{i-1}| w_i) P ( w i − 1 ∣ w i ) 为例,输入的是w i w_i w i ,l a b e l label l a b e l 是w i − 1 w_{i-1} w i − 1 ,计算过程如下图所示:
注意:
输入的是w i w_i w i 的索引
W W W 为中心词矩阵,W ∈ R V × D W \in \mathbb{R}^{V\times D} W ∈ R V × D ;W ′ W^{\prime} W ′ 为周围词矩阵,W ′ ∈ R D × V W^{\prime} \in \mathbb{R}^{D\times V} W ′ ∈ R D × V
最后通过s o f t m a x softmax s o f t m a x ,求得每个位置的一个概率,为一个1 × V 1\times V 1 × V 的向量,我们需要第i − 1 i-1 i − 1 个位置的值最大,因此通过不断的反向传播,训练W ′ W^{\prime} W ′ 和W W W
计算公式可写为:p ( w i − 1 ∣ w i ) = exp ( u w i − 1 T v w i ) ∑ w = 1 V exp ( u w T v w i )
p\left(w_{i-1} \mid w_{i}\right)=\frac{\exp \left(u_{w_{i-1}}^{T} v_{w_{i}}\right)}{\sum_{w=1}^{V} \exp \left(u_{w}^{T} v_{w_{i}}\right)}
p ( w i − 1 ∣ w i ) = ∑ w = 1 V exp ( u w T v w i ) exp ( u w i − 1 T v w i )
S k i p − g r a m Skip-gram S k i p − g r a m 的损失函数:
J ( θ ) = 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log p ( w t + j ∣ w t )
J(\theta)=\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m, j \neq 0} \log p\left(w_{t+j} \mid w_{t}\right)
J ( θ ) = T 1 t = 1 ∑ T − m ≤ j ≤ m , j = 0 ∑ log p ( w t + j ∣ w t )
需要对J ( θ ) J(\theta) J ( θ ) 求最大值,或者对J ( θ ) J(\theta) J ( θ ) 取相反数并求取最小值
(4)CBOW
C B O W CBOW C B O W 的结构如上图所示,是通过周围词预测中心词,B O W BOW B O W 指的是B a g o f w o r d Bag \ of \ word B a g o f w o r d ,即词袋模型 ,因此C B O W CBOW C B O W 是基于词袋模型的一种模型,具体细节如下图所示:
从上面可以看出,C B O W CBOW C B O W 也是使用了W W W 和W ′ W^{\prime} W ′ ,只是中间进行了一个加和,最后的优化过程仍然是优化W W W 和W ′ W^{\prime} W ′
损失函数:
J ( θ ) = 1 T ∑ T ∑ log P ( c ∣ o ) = 1 T ∑ exp { u o T v c } ∑ j = 1 V exp { u o T v j }
J(\theta)=\frac{1}{T} \sum_{T} \sum \log P(c \mid o)=\frac{1}{T} \sum \frac{\exp \left\{u_{o}^{T} v_{c}\right\}}{\sum_{j=1}^{V} \exp \left\{u_{o}^{T} v_{j}\right\}}
J ( θ ) = T 1 T ∑ ∑ log P ( c ∣ o ) = T 1 ∑ ∑ j = 1 V exp { u o T v j } exp { u o T v c }
其中,P ( c ∣ o ) = exp { u o T v c } ∑ j = 1 V exp { u o T v j }
P(c \mid o)=\frac{\exp \left\{u_{o}^{T} v_{c}\right\}}{\sum_{j=1}^{V} \exp \left\{u_{o}^{T} v_{j}\right\}}
P ( c ∣ o ) = ∑ j = 1 V exp { u o T v j } exp { u o T v c } u 0 u_0 u 0 是窗口内上下文词向量之和,v c v_c v c 、v j v_j v j 是中心词向量‘
(5)关键技术
w o r d 2 v e c word2vec w o r d 2 v e c 中,最后一层需要输出V V V 个概率,因此需要一些降低复杂度的方法:
层次s o f t m a x softmax s o f t m a x :Hierarchical Softmax
负采样:Negative Sampling
高频词的重采样:Subsampling of Frequent Words
下面分别介绍这三种方法
1)Hierarchical Softmax
层次s o f t m a x softmax s o f t m a x 的基本思想是将求s o f t m a x softmax s o f t m a x 操作转化为求s i g m o i d sigmoid s i g m o i d 操作,对于s o f t m a x softmax s o f t m a x ,我们需要做V V V 次操作,而如何转化为s i g m o i d sigmoid s i g m o i d ,则可以采用树结构 ,这样就只需要log 2 V \log_2^V log 2 V 次操作。如下图所示,如果是一个8字符的情况(a ∼ h a \sim h a ∼ h ),则需要对每个字符做s o f t m a x softmax s o f t m a x ,而如果将其构建为下图所示的满二叉树 的结构,则对于任意字符,仅需要3次就能找到,即log 2 V \log_2V log 2 V 次
能否找到比log 2 V \log_2^V log 2 V 还要快的结构呢?答案是肯定的,通过构建 Huffman 树,找到带权重路径最短的二叉树,可以进一步加速,层次s o f t m a x softmax s o f t m a x 就是通过这种方式进行构建,具体的构建方法(S k i p − g r a m Skip-gram S k i p − g r a m 模型)如下图所示:
每一个分支节点(即存在c h i l d child c h i l d 的节点)都是一个向量:θ 0 \theta_0 θ 0 、θ 1 \theta_1 θ 1 等
以单词I I I 为例,计算公式为:p ( I ∣ c ) = σ ( θ 0 T v c ) σ ( θ 1 T v c ) ( 1 − σ ( θ 2 T v c ) ) = σ ( θ 0 T v c ) σ ( θ 1 T v c ) σ ( − θ 2 T v c ) σ ( x ) = 1 1 + e − x
\begin{aligned}
p(\mathrm{I} \mid c) &=\sigma\left(\theta_{0}^{T} v_{c}\right) \sigma\left(\theta_{1}^{T} v_{c}\right)\left(1-\sigma\left(\theta_{2}^{T} v_{c}\right)\right) \\
&=\sigma\left(\theta_{0}^{T} v_{c}\right) \sigma\left(\theta_{1}^{T} v_{c}\right) \sigma\left(-\theta_{2}^{T} v_{c}\right) \qquad \qquad \sigma(x) = \frac{1}{1+ e^{-x}}
\end{aligned}
p ( I ∣ c ) = σ ( θ 0 T v c ) σ ( θ 1 T v c ) ( 1 − σ ( θ 2 T v c ) ) = σ ( θ 0 T v c ) σ ( θ 1 T v c ) σ ( − θ 2 T v c ) σ ( x ) = 1 + e − x 1
这里的θ \theta θ 参数就相当于上下文词向量,大概有log V \log V log V 个,而树的高度为:L ( w ) = O ( log 2 V ) L(w) = O(\log_2^V) L ( w ) = O ( log 2 V )
公式表达 :p ( w ∣ w I ) = ∏ j = 1 L ( w ) − 1 σ ( [ [ n ( w , j + 1 ) = ch ( n ( w , j ) ) ] ] ⋅ v n ( w , j ) ′ ⊤ v w I )
p\left(w \mid w_{I}\right)=\prod_{j=1}^{L(w)-1} \sigma \left([\![ n(w, j+1)=\operatorname{ch}(n(w, j))]\!] \cdot {v_{n(w, j)}^{\prime}}^{\top} v_{w_{I}}\right)
p ( w ∣ w I ) = j = 1 ∏ L ( w ) − 1 σ ( [ [ n ( w , j + 1 ) = c h ( n ( w , j ) ) ] ] ⋅ v n ( w , j ) ′ ⊤ v w I )
n ( w , j ) n(w,j) n ( w , j ) 表示词w w w 在第j j j 个节点上,n ( w , 1 ) n(w,1) n ( w , 1 ) 表示 root 节点,n ( w , L ( w ) ) n(w,L(w)) n ( w , L ( w ) ) 表示叶子节点
ch ( n ( w , j ) ) \operatorname{ch}(n(w,j)) c h ( n ( w , j ) ) 表示节点n ( w , j ) n(w,j) n ( w , j ) 的 right child node
双中括号表示,如果括号中为 true ,则为1,否则为-1,即:[ [ x ] ] = { 1 , if x is true − 1 , else
[\![ x]\!]=\left\{\begin{array}{ll}
1, & \text { if } x \text { is true } \\
-1, & \text { else }
\end{array}\right.
[ [ x ] ] = { 1 , − 1 , if x is true else
v W I v_{W_{I}} v W I 为中心词的词向量,v n ( w , j ) ′ {v_{n(w, j)}^{\prime}} v n ( w , j ) ′ 为词w w w 在树上的第j j j 个节点的参数
CBOW中的层次s o f t m a x softmax s o f t m a x :
前面提到的层次s o f t m a x softmax s o f t m a x 是基于S k i p − g r a m Skip-gram S k i p − g r a m 模型进行构建的,而针对C B O W CBOW C B O W 模型的构建方法如下图所示:
可以看到,C B O W CBOW C B O W 中的层次s o f t m a x softmax s o f t m a x 构建方式与S k i p − g r a m Skip-gram S k i p − g r a m 相似,唯一 的区别在于u 0 u_0 u 0 ,这里的u 0 u_0 u 0 是值窗口内上下文词向量的平均
2)Negative Sampling
核心思想:
负采样的核心思想是:舍弃多分类 以提高速度,在现在的研究中,层次s o f t m a x softmax s o f t m a x 并不常用,因为本质上仍然是一个多分类问题,而负采样在现在的研究中应用十分广泛,原因就在于直接舍弃了多分类,将其变为了一个二分类问题。例如有一个训练样本,中心词是w w w ,它周围上下文共有2 c 2c 2 c 个词,记为c o n t e x t ( w ) context(w) c o n t e x t ( w ) 。由于这个中心词w w w 的确和c o n t e x t ( w ) context(w) c o n t e x t ( w ) 相关存在,因此它是一个真实的正例。通过负采样,我们得到n e g neg n e g 个和w w w 不同的中心词w i , i = 1 , 2 , … , n e g w_i,i=1,2,\ldots,neg w i , i = 1 , 2 , … , n e g ,这样c o n t e x t ( w ) context(w) c o n t e x t ( w ) 和w i w_i w i 就组成了n e g neg n e g 个并不真实存在的负例。利用这一个正例和n e g neg n e g 个负例,我们进行二元逻辑回归,得到负采样对应每个词w i w_i w i 对应的模型参数θ i \theta_i θ i ,和每个词的词向量
损失函数: J neg − sample ( θ ) = log σ ( u o T v c ) + ∑ k = 1 K E k ∼ P ( w ) [ log σ ( − u k T v c ) ]
J_{\operatorname{neg}-\operatorname{sample}}(\theta)=\log \sigma\left(u_{o}^{T} v_{c}\right)+\sum_{k=1}^{K} E_{k \sim P(w)}\left[\log \sigma\left(-u_{k}^{T} v_{c}\right)\right]
J n e g − s a m p l e ( θ ) = log σ ( u o T v c ) + k = 1 ∑ K E k ∼ P ( w ) [ log σ ( − u k T v c ) ]
v c v_c v c 是中心词向量
u 0 u_0 u 0 是窗口内上下文词向量
u k u_k u k 是负采样上下文词向量
采样方法:
P ( w ) = U ( w ) 3 4 Z P(w)=\frac{U(w)^{\frac{3}{4}}}{Z} P ( w ) = Z U ( w ) 4 3
U ( w ) U(w) U ( w ) 是词w w w 在数据集中出现的频率,Z Z Z 为归一化的参数,使得求解之后的概率和依旧为1
例如U ( a ) = 0.01 , U ( b ) = 0.99 U(a)=0.01, U(b)=0.99 U ( a ) = 0 . 0 1 , U ( b ) = 0 . 9 9 ,则
P ( a ) = 0.01 × 0.75 0.01 × 0.75 + 0.99 × 0.75 = 0.03 P(a)=\frac{0.01 \times 0.75}{0.01 \times 0.75+0.99 \times 0.75}=0.03 P ( a ) = 0 . 0 1 × 0 . 7 5 + 0 . 9 9 × 0 . 7 5 0 . 0 1 × 0 . 7 5 = 0 . 0 3
P ( b ) = 0.99 × 0.75 0.01 × 0.75 + 0.99 × 0.75 = 0.97 P(b)=\frac{0.99 \times 0.75}{0.01 \times 0.75+0.99 \times 0.75}=0.97 P ( b ) = 0 . 0 1 × 0 . 7 5 + 0 . 9 9 × 0 . 7 5 0 . 9 9 × 0 . 7 5 = 0 . 9 7
通过这样的采样方法,可以减少频率大的词的抽样概率,增加评率小的词的抽样概率
CBOW中的负采样 C B O W CBOW C B O W 中的负采样与S k i p − g r a m Skip-gram S k i p − g r a m 中的负采样形式相似,损失函数为:J ( θ ) = log σ ( u o T v c ) + ∑ i = 1 k E j ∼ P ( w ) [ log σ ( − u o T v j ) ]
J(\theta)=\log \sigma\left(u_{o}^{T} v_{c}\right)+\sum_{i=1}^{k} E_{j \sim P(w)}\left[\log \sigma\left(-u_{o}^{T} v_{j}\right)\right]
J ( θ ) = log σ ( u o T v c ) + i = 1 ∑ k E j ∼ P ( w ) [ log σ ( − u o T v j ) ]
u 0 u_0 u 0 是窗口内上下文词向量的平均
v c v_c v c 是正确的中心词向量
v j v_j v j 是错误的中心词向量
3)Subsampling of Frequent Words
自然语言处理有一个共识,即文档或者数据集中出现频率高的词往往携带信息较少,比如 the, is, a, and 等,而出现频率低的词往往携带信息多。因此应当重点关注这些低频词,这也是重采样的目的,而进行重采样 的原因有以下两个:
想更多地训练重要的词对,比如训练 France 和 Paris 之间的关系比训练 France 和 the 之间的关系要有用
高频词很快就训练好了,而低频次需要更多的轮次
重采样的方法
P ( w i ) = 1 − t f ( w i )
P\left(w_{i}\right)=1-\sqrt{\frac{t}{f\left(w_{i}\right)}}
P ( w i ) = 1 − f ( w i ) t
f ( w ) f(w) f ( w ) 为词w i w_i w i 在数据集中出现的频率,t t t 为一个超参数,文中t t t 选取为1 0 − 5 10^{-5} 1 0 − 5 ,训练集中的词w i w_i w i 会以P ( w i ) P(w_i) P ( w i ) 的概率被删除。词频越大,f ( w i ) f(w_i) f ( w i ) 越大,P ( w i ) P(w_i) P ( w i ) 越大,那么词w i w_i w i 就有更大的概率被删除,反之亦然。如果词w i w_i w i 的词频小于等于t t t ,那么w i w_i w i 则不会被别除,这样就加速训练,能够得到更好的词向量。
(6)小结
w o r d 2 v e c word2vec w o r d 2 v e c 可以总结为“2 + 3 2+3 2 + 3 ”或者“2 + 2 + 1 2+2+1 2 + 2 + 1 ”,第一个“2 2 2 ”表示两种模型,一种是S k i p − g r a m Skip-gram S k i p − g r a m 模型,是用中心词预测周围词,一种是C B O W CBOW C B O W 模型,是用周围词预测中心词”“3 3 3 “表示的是三种关键技术:层次s o f t m a x softmax s o f t m a x 、负采样、重采样;也可以分为“2 + 1 2+1 2 + 1 ”,本质上是一样的
3、模型复杂度
(1)模型复杂度的概念
模型复杂度用O O O 表示,代表的是训练的复杂度,计算公式为:
O = E × T × Q
O=E \times T \times Q
O = E × T × Q
O O O 是训练复杂度( training complexity )
E E E 是迭代次数( number of training epochs )
T T T 是数据集大小( number of words in the training set )
Q Q Q 是模型计算复杂度( model computational complexity )
对不同的模型进行复杂度比较时,需要保证E E E 和T T T 相同,因此实际上是比较Q Q Q 的大小,而Q Q Q 的计算可以通过计算模型的参数个数来等价代替,从而进行模型之间复杂度的比较
(2)NNLM复杂度
N N L M NNLM N N L M 是输入N − 1 N-1 N − 1 个词,预测第N N N 个词,每个输入的词都会被映射为一个D D D 维的向量,因此输入层的参数x x x 的维度为N × D N\times D N × D ,隐藏层W W W 是一个全连接层,因此W W W 的维度为N × D × H N \times D \times H N × D × H ,输出层U U U 也是一个全连接层,因此U U U 的维度为H × V H\times V H × V ,因此N N L M NNLM N N L M 的复杂度Q Q Q 为:Q = V × H + N × D × H + N × D
Q=V \times H+N \times D \times H+N \times D
Q = V × H + N × D × H + N × D
如果使用层次s o f t m a x softmax s o f t m a x ,则复杂度可降为Q = log 2 V × H + N × D × H + N × D Q=\log_2^V \times H+N \times D \times H+N \times D Q = log 2 V × H + N × D × H + N × D
(3)RNNLM复杂度
N N L M NNLM N N L M 输入的是w ( t ) w(t) w ( t ) ,维度1 × D 1\times D 1 × D ,U U U 为全连接层,维度为D × H D \times H D × H ,W W W 为H × H H \times H H × H ,输出层V V V 为H × V H \times V H × V ,因此
Q = 1 × D + D × H + H × H + H × V Q = 1\times D + D\times H + H \times H + H \times V Q = 1 × D + D × H + H × H + H × V
由于D ≈ H D \approx H D ≈ H ,因此Q = H ( 2 H + 1 ) + H × V Q = H(2H +1)+H\times V Q = H ( 2 H + 1 ) + H × V ,因此可以写为:
Q = H × H + H × V Q = H \times H + H \times V Q = H × H + H × V
如果使用层次s o f t m a x softmax s o f t m a x ,则Q = H × H + H × log 2 V Q = H \times H + H \times \log_2^V Q = H × H + H × log 2 V
(4)CBOW模型复杂度
如果周围词个数为N N N ,则输入层的维度为N × D N\times D N × D ,输出层为D × V D\times V D × V ,因此Q = N × D + D × V Q = N\times D + D\times V Q = N × D + D × V
如果使用层次s o f t m a x softmax s o f t m a x ,则Q = N × D + D × log 2 V Q=N\times D+D \times \log_2^V Q = N × D + D × log 2 V
如果使用负采样,则Q = N × D + D × ( K + 1 ) Q=N\times D+D \times (K+1) Q = N × D + D × ( K + 1 )
(5)Skip-gram模型复杂度
对于一个中心词,维度为D D D ,周围词矩阵W ∗ W^{*} W ∗ 为D × V D\times V D × V ,同时需要求解C C C 个周围词,因此Q Q Q 为:Q = C ( D + D × V )
Q=C(D+D \times V)
Q = C ( D + D × V )
如果使用层次s o f t m a x softmax s o f t m a x ,则Q = C ( D + D × log 2 V ) Q=C(D+D \times \log_2 V) Q = C ( D + D × log 2 V )
如果使用负采样,则Q = C ( D + D × ( K + 1 ) ) Q=C(D+D \times (K+1)) Q = C ( D + D × ( K + 1 ) )
(6)复杂度比较
不同模型的复杂度Q Q Q 如下:
NNLM:Q = N × D + N × D × H + H × log 2 V Q = N \times D+N \times D \times H+H \times \log _{2} V Q = N × D + N × D × H + H × log 2 V
RNNLM:Q = H × H + H × log 2 V Q= H \times H+H \times \log _{2} V Q = H × H + H × log 2 V
CBOW + HS:Q = N × D + D × log 2 V Q=N \times D+D \times \log _{2} V Q = N × D + D × log 2 V
Skip-gram + HS:Q = C ( D + D × log 2 V ) Q=C\left(D+D \times \log _{2} V\right) Q = C ( D + D × log 2 V )
CBOW + NEG:Q = N × D + D × ( K + 1 ) ) Q=N \times D+D \times(K+1)) Q = N × D + D × ( K + 1 ) )
Skip-gram + NEG:Q = C ( D + D × ( K + 1 ) ) Q=C(D+D \times (K+1)) Q = C ( D + D × ( K + 1 ) )
w o r d 2 v e c word2vec w o r d 2 v e c 中的两种模型时间复杂度都比N N L M NNLM N N L M 和R N N L M RNNLM R N N L M 要低
S k i p − g r a m Skip-gram S k i p − g r a m 比C B O W CBOW C B O W 要稍微慢一些
负采样一般比层次s o f t m a x softmax s o f t m a x 要快一些
五、论文总结与启发
1、关键点
更简单的预测模型:w o r d 2 v e c word2vec w o r d 2 v e c
更快的分类方案:H S HS H S 和N E G NEG N E G
2、创新点
使用词对的预测来替代语言模型的预测
使用H S HS H S 和N E G NEG N E G 降低分类复杂度
使用s u b s a m p l i n g subsampling s u b s a m p l i n g 加快训练
新的词对推理数据集来评估词向量的质量
3、启发点
大数据集上的简单模型往往强于小数据集上的复杂模型
King 的词向量减去 Man 的词向量加上 Woman 的词向量和 Queen 的词向量最接近
我们决定设计简单的模型来训练词向量,虽然简单的模型无法像神经网络那么准确地表示数据,但是可以在更多地数据上更快地训练
我们相信在更大的数据集上使用更大的词向量维度能够训练得到更好的词向量
六、代码实现
实现S k i p − g r a m Skip-gram S k i p − g r a m 和C B O W CBOW C B O W 以及H S HS H S 和N G E NGE N G E ,具体代码见我的Github