历史
词向量大致经过3个时期:
- 最早在做检索系统,或者推荐系统时候,需要计算query和文档,或者user和文档之间的相关性,涉及到相关性,很直观的利用到了向量的欧式距离活着余弦距离。所以这个时期的向量化主要是基于整体数据的矩阵分解,使用的是整体数据的global信息。
- 词向量的是一个主题回归的过程,相同主题的词的向量彼此就比较接近。
- 分布式语义的表示,使用机器学习的方式,然后选择合适的学习目标,然后词的向量作为变量来学习迭代。
下面是整体大纲:
-
Global Matrix Factorization
1.1 Vector Space Model (VSM)
1.2 Latent Semantic Analysis (LSA)
2.3 Latent Dirichlet Allocation (LDA) -
Distributed Word Embedding
2.1 A Neural Probabilistic Language Model
2.2 CBOW and SKip-Gram by Tomas Mikolov
2.3 Global Vector by Manning - out of vocab training
Learning to Compute Word Embeddings On the Fly
[Character Embedding] (https://arxiv.org/abs/1601.01343)
1. Global Matrix Factorization
这个阶段的向量空间大致是基于词和文档组成的矩阵,然后根据某种规则来降维,达到学习词和文档的向量化表示。因为类似处理矩阵的信息,所以用到了全局的信息,是一个Global算法。
这样的算法的优势是利用了全局的统计信息,对于文档的表示具有优势。
但是对于单个词来说,还是比较缺乏个性化的训练,对词的语义表示来说是比较匮乏的。
在维度上和计算量方面都是一个挑战,在大预料库上面训练基本是不太可能的。
1.1 Vector Space Model-高纬向量空间
这个阶段向量是用来表示文本段的,比如一个query,一个文档,还没有具体落到一个词上面
最初使用向量空间模型的是在搜索场景,假设Query 和 Document都可以用一个向量来表示,
那么计算Query和Document的相关性可以直接转化为求解他们向量的距离(如:欧式距离,余弦距离等)
最初的做法是用基于BOW(词袋)的思想,向量的维数是词的个数,每一个维度代表文档中对应词是否出现出现为1否则为0(或者其他的权重变形,如:增加tf-idf信息)
假设:
其中向量的维度为包含的词的个数,这样 Query 和Document的相似性为:
然后Query 和 Document 的term的权重计算方式
term的权重都是基于term在全局和Query或者Document里面的统计值进行计算
主要用到的是tf-idf及各种变形来进行
主要方式如下: 
这个阶段向量的计算已经解决了部分相似性和计算量的问题。
但是完全基于词是否出现这样的向量的弊端很明显
比如:
高兴/愉快, ship/boat 在这里是完全不同的词,但是实际上他们的语义是接近的
弊端:
- 在语义表示(Sematic)方面非常弱
- 向量的维度非常高
1.2 Latent Semantic Analysis-低维潜在语义
上面讲的高纬度的向量空间,为了解决
- 向量的维度过高,导致计算复杂度上升;
- 完全基于词频的统计会导致计算损失过多的语义方面的信息。很接近的,但是如果基于词频,就是完全不同的两个id
这个阶段是将高纬向量利用SVD方式进行降维,保留词的语义表示。
基于SVD分解:
假设 term 和 Document组成的矩阵为
其中m为term的个数,n为Document的个数。
根据SVD分解,我们可以知道,X可以分解为一个左正交矩阵 * 对角矩阵 * 右对角矩阵的格式
其中
注:
所以
因为
如果S的元素是从大到小排列的,那么这种分解是唯一的
基于特征值降维/降噪解释
这里我们简单的回顾下特征值和特征向量的作用:
假设一个矩阵A分解后的特征向量是一组正交基
这里
V是一组正交基,那么所有这个空间的向量都可以表示为V的线性组合
所以
所以不同的特征值大小代表矩阵在这个方向上面的重要程度,如果绝对值趋于0,那么这个方向上面的信息是不重要,或者可能是噪音。
假设我们要简化线性组合表示,是表示变的简单,且不希望我们的信息损失太多。
这里很直观的是:直接将绝对值排在后面的特征值置为0
应用
S是一个对角矩阵,且它的对角元素是非负递减的,所以如果我们需要保留r维的向量,我们只要舍弃S的第r个元素后面的秩,将这些元素置为0。
这样我们得到矩阵
优势:
1. 既得到词的语义向量,又得到Document的向量,所以不仅可以做词的聚类,可以做Document的聚类
2. 降维作用明显,又保留重要的信息
3. 这是全局的算法,基于的是所有词和所有Document的信息,所以得到的解是全局最优的
4. 是一个topic算法:每一个term的表示都是这些特征向量方向上面的线形组合,这些特征向量是彼此没有交集的,所以一个特征方向是一个很好的topic表示
类似:
1. 不能解决一词多义的问题
2. SVD的计算非常复杂,增量训练困难
3. r的选择不是学习的
1.3 Latent Dirichlet Allocation
LDA
上面介绍LSI,它是一个topic算法,
这里的LDA介绍的也是类似的算法,每一个词得到一个k维的向量,每一个向量是在这个topic下面的概率
假设有k个topic,我们得到每一个词的表示是一个k维的向量,里面的每一个元素代表这个词在这个topic下面的概率
方法的目标:
给定topic数k, 计算每个词在这些topic下面的概率,得到词的概率向量
求解方式是构造概率模型,然后以概率最大化的方式计算得到
一些不证明的先验知识:
- 给定一个文档Document,它属于哪个topic是服从多项式分布的,但是分布服从的参数
θ 是不同 - 给定一个topic,在这个topic出现某个词也是服从多项式分布。
- 假设
θ 的先验分布是Dirichlet分布,那么,先验 Dirichlet分布 + 多项式分布=后验Dirichlet分布,所以这里θ 的先验分布选择Dirichlet分布,另外一方面Dirichlet经常被用来作为非均衡自由度下的向量采样(比如Beta分布是它的1个自由度的形式,我们经常使用Beta分布来拟合点击率或者转化率分布,然后将拟合出来的分布作为ctr预估的先验分布,或者作为e && e策略的先验分布)。
最大似然函数
这里跟着这个式子,通俗的介绍下这个式子的符号代表的意思:
α,β 是需要求的参数,分别代表θ 先验Dir分布的
这里先简单的用通俗的表达说下统计知识:一个Document在样本中属于哪一个topic服从多项式分布,这个多项式的分布参数我们认为它服从Dirichlet分布(如果二元参数就是一个Beta分布),那么它的后验校正分布也是是一个Dirichlet分布。
- 我们都知道先验分布是独立于单个样本的,只和整体的统计有关系,假定Dirichlet先验分布的参数
α 是一个要学习的参数。那么给定文档i,我们从先验Dirichlet概率分布得到θ , 它是多项式分布的参数。 - 得到的
θ ,就得到这个文档在各个topic下面的概率zn - 假设概率矩阵为
β ,βij=p(wj=1|zi=1) ,当topic 为i时,每个词出现的概率。 - 给定
zn 和β ,我们就可以得到,这样就可以在p(wn|zn,β) 的概率分布下面得到wn
然后我们开始介绍下式子的由来:
首先对于一个文档
我们需要已经知道
- 首先
θ 是从Dir(α) 分布里面采样得到的 - 得到
θ , 就得到文档属于每一个topic的多项分布,zn~Multinomial(θ) ,∑znp(zn|θ)=1 - 对于给定的topic 概率
zn 和词的概率分布β , 然后从文档中采样出N个词。对于每一个词wn , 它基于当前的分布的概率为:p(wn|zn,β) , 然后对于所有的topic,我们得到该词的概率:∑znp(zn|θ)p(wn|zn,β) 。然后这个文档的N个词的联合概率为:∏Nn=1∑znp(zn|θ)p(wn|zn,β) - 然后对于采样的
θ 机型期望计算得到:p(Dd|α,β)=∫p(θ|α)(∏n=1N∑znp(zn|θ)p(wn|zn,β))dθ - 然后对于M个文档,我们利用因子相乘的方式,对每个文档的概率进行累乘,得到:
p(D|α,β)=∏d=1M∫p(θ|α)(∏n=1N∑znp(zn|θ)p(wn|zn,β))dθ
关于优化方式,从上面的步骤我们可以看到,求解的过程是一个近似逼近的过程,比如Laplace逼近,变量逼近,MCMC等,也可以用基于凸优化的变量逼近方式。
2. Distributed Word Embedding
这个阶段,已经开始关注到词本身的一些向量表示,更多的关注词的向量表示和机器学习的目标结合,弱化了全局词的统计信息。
(Bengio) 在一些语言模型中尝试将词作为一个向量变量来做提督下降优化,这样出来的词的向量表示需要结合特定的语言构造模型来使用,单独是用词的向量的意义性不大。
(Cbow,Skip-Gram, Tomas Mikolov) 他们尝试以词是否邻近作为目标,两个词的向量直接做点积,如果数值大代表相近,如果距离远代表不相似,这样每个词的训练只是和他的语料库里里面的相邻的词有关。学些出来词之间的距离是有实际意义的。
(global vector, Manning) 在Mikolov的基础上,融入了词的全局统计信息
2.1 Neural Probabilistic Language Model
A Neural Probabilistic Language Model
这种工作其实开创了NLP的Embedding工作的先河,使得词的表示可以合理的使用语义数值向量,而不是只有count等统计信息,一旦有了语义方面的数值表示,不管在统计模型还是在神经网络,都可以做很多的事情。
对于一个统计语言模型,它的统计信息可以被表示成条件概率的形式:
这个在长文本上面的效果不是很好,计算量特别大,所以常见的是N-Gram 模型,每个词和序列的前N-1个词相关。
似然函数
对于所有的文本信息:
softmax 层
我们看单个概率
我们知道
我们令:
所以
满足这样的f函数有很多,在神经网络里面,我们常用的是 softmax 函数。
比如:
Embedding 层
再看对词
令:
中间业务 层
在Embedding层和softmax直接可以根据业务目标,定义各种层级 
比如像这种单层的结构,也可以在各种NLP task 里面,定义各种复杂的结构,比如RNN
这种方式:
词向量的计算就不需要大矩阵的处理,可以用SGD等方式优化收敛,处理大规模的数据
然后能将词向量的表示和训练的任务相结合,训练出固定维度的低纬向量
2.2 CBOW and SKip-Gram by Tomas Mikolov
Cbow,Skip-Gram, Tomas Mikolov and negtive sample, Tomas Mikolov
Neural Probabilistic Language Model(NPLM) 虽然开创了Embedding的先河,但是还是存在几个问题需要解决:
- 基于深度模型训练,对于大规模的预料数据,训练是非常耗时耗资源的。
- 学习出来的词的表示迁移能力不强,词向量之间本身的距离没有太多实际的物理含义。
这里 Mikilov 等人在此基础上对上面的模型做了改进

差异点:
1. 语料feature的滑动窗口不同
- NPLM:使用的是前N-1 个词作为训练序列,第N个词作为预测序列,
- 这里有两种方式改进,一个词是和它的前后词都是关联的,假设选择的序列长度是2n +1,前n后n。
- CBOW(Continual bag of word):feafure为前n后n个词,他们的权重一样,预测为当前的值;
- Skip-Gram:中训练的语料feature为当前的词,预测的为前后n个词。
2. 输出层的函数不一致
- 在NPLM中,使用的是Softmax来预测当前的词,但是一方面由于词的量很大,比如汉语词可能几十万,softmax在这么大的空间中计算很浪费计算量;另外由于Softmax容易饱和,导致训练的精度变低。
- 这里(以Negative Sample)为例,把softmax蜕化为二分类,正样本为前后的预料库,负样本可以以采样的形式生成,一个正样本对应于5~20 个负样本差不多就可以有很好的结果,采样的话如果简单话可以直接随机采样,比如:
p(w)~f(w)3/4 ,U(x) 是词的一元count分布,Z是归一常量。或者更复杂点的p(w)~1−tf(w)‾‾‾‾√ 。所以目标函数简化成:logσ(h(wn))+∑kEwneg[logσ(−h(wneg))]
3. 对于中间层h(w)的生成
- 在NPLM,各种复杂的forward 或者循环结构
- 这里为了使得词之间的cosine或者欧式距离是有意义的,在构造logits时,直接可以用
wiwj 代表两个词来构造,比如在CBOW中,前后n个词在预测当前词的时候,隐藏层可以这么构造:logits=h(wn)=(12n(w−n+w−n+1+...+wn−1+wn))⨀wn , 这样其实有两个隐藏的好处:1.cosine可以直接衡量词向量;2.词向量的可加性,如:v(man) + v(king) - v(woman)=v(quen)
CBOW和Skip-Gram According to Mikolov:
- Skip-gram: works well with small amount of the training data, represents well even rare words or phrases.
- CBOW: several times faster to train than the skip-gram, slightly better accuracy for the frequent words
- This can get even a bit more complicated if you consider that there are two different ways how to train the models: the normalized hierarchical softmax, and the un-normalized negative sampling. Both work quite differently.
2.3 Global Vector by Manning
global vector: Manning
背景
Cbow 或者Skip-Gram取得了很大的成功,不管在训练效率还是在词向量的计算效果上面。
但是考虑到Cbow/Skip-Gram 是一个local context window的方法,比如使用NS来训练,缺乏了整体的词和词的关系,负样本采用sample的方式会缺失词的关系信息。
另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重
Global Vector融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。
概率及表示
首先用符号

我们看这个
我们知道solid是ice的形状,gas是steam的状态,如果用概率表示,我们希望
为了数值化这个相对大小,我们引入他们的比例:
下一步:
首先它应该和
因为
我们构造一个函数F
当然满足这种关系的F函数是很多的,我们对F的构造进行分析:
- 既然F要体现
wi,wj 的相对对比大小关系,直接可以想到的是wi−wj 和wi/wj ,相对来说wi−wj 更加简单,所以我们更新F的展现方式F(wi−wj,wk^)=PikPjk - 看最终的比例是一个常量的形式,但是F的输入变量都是向量,一种最直接的方式是对向量做点积,得到常量。
F((wi−wj)Twk^)=PikPjk - 对于
Pik=XikXi ,它应该也可以直接表示成F的函数形式,为:F(wTiwk^)=Pik - 综上,满足这种函数的F,我们很快会想到:F=exp, 所以,
wTiwk^=log(Pik)=log(Xik)−log(Xi)
目标函数构造
我们来看
我们知道
观察
目标函数:
为了避免
-
f(0)=0 ,或者至少当x趋近于0时,xlog2(x) 有限 -
f(x) 非递减函数,这样可以避免出现次数低的词的条件概率过低 -
f(x) 有上界,避免频率高的词权重过高
这里的
所以得到最终的目标函数:
到这里,全部的问题已经解决,
对比Skip—Gram 对比:
我们看下词向量训练的似然函数, 然后从似然函数反推出上面的目标函数:
然后Negative sample的处理是,负样本采样,得到:
对于Global Vector
这里如果词i和词j同时出现
因为:
所以:
将交叉熵距离改成平方差距离方式:
其中
所以
到这里,我们已经详细的介绍了词向量的历史以及各种算法