历史

词向量大致经过3个时期:

  • 最早在做检索系统,或者推荐系统时候,需要计算query和文档,或者user和文档之间的相关性,涉及到相关性,很直观的利用到了向量的欧式距离活着余弦距离。所以这个时期的向量化主要是基于整体数据的矩阵分解,使用的是整体数据的global信息。
  • 词向量的是一个主题回归的过程,相同主题的词的向量彼此就比较接近。
  • 分布式语义的表示,使用机器学习的方式,然后选择合适的学习目标,然后词的向量作为变量来学习迭代。

下面是整体大纲:

  1. Global Matrix Factorization
    1.1 Vector Space Model (VSM)
    1.2 Latent Semantic Analysis (LSA)
    2.3 Latent Dirichlet Allocation (LDA)
  2. 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
  3. 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-高纬向量空间

Salton & Buckley

这个阶段向量是用来表示文本段的,比如一个query,一个文档,还没有具体落到一个词上面

最初使用向量空间模型的是在搜索场景,假设Query 和 Document都可以用一个向量来表示,
那么计算Query和Document的相关性可以直接转化为求解他们向量的距离(如:欧式距离,余弦距离等)

最初的做法是用基于BOW(词袋)的思想,向量的维数是词的个数,每一个维度代表文档中对应词是否出现出现为1否则为0(或者其他的权重变形,如:增加tf-idf信息)

假设:

Q=(t1,wt1;t2,wt2;...;tq,wtq)
D=(q1,wq1;q2,wq2;...,qd,wqd)

其中向量的维度为包含的词的个数,这样 Query 和Document的相似性为:

similarity(Q,D)=Cosin(Qw,Dw)=kwtkwqk|wq|2|wd|2 

然后Query 和 Document 的term的权重计算方式

term的权重都是基于term在全局和Query或者Document里面的统计值进行计算
主要用到的是tf-idf及各种变形来进行

主要方式如下:
Word Vector的综述
Word Vector的综述
这个阶段向量的计算已经解决了部分相似性和计算量的问题。
但是完全基于词是否出现这样的向量的弊端很明显
比如:
高兴/愉快, ship/boat 在这里是完全不同的词,但是实际上他们的语义是接近的

弊端:

  1. 在语义表示(Sematic)方面非常弱
  2. 向量的维度非常高

1.2 Latent Semantic Analysis-低维潜在语义

上面讲的高纬度的向量空间,为了解决

  1. 向量的维度过高,导致计算复杂度上升;
  2. 完全基于词频的统计会导致计算损失过多的语义方面的信息。很接近的,但是如果基于词频,就是完全不同的两个id

这个阶段是将高纬向量利用SVD方式进行降维,保留词的语义表示。

基于SVD分解:

假设 term 和 Document组成的矩阵为XR[m,n]
其中m为term的个数,n为Document的个数。
根据SVD分解,我们可以知道,X可以分解为一个左正交矩阵 * 对角矩阵 * 右对角矩阵的格式

X=TSDT

其中TR[m,m],DR[n,n]分别是左右正交矩阵
SR[m,n]是对角矩阵,它的元素是矩阵XTX的特征值开方,它的值按对角线递减,其他元素是0的矩阵

注:X=TSDT
所以XTX=(TSDT)TTSDT=DSTTTTSDT=DSTSDT
因为STS是对角方阵,它的对角元素是矩阵XTX的特征值,所以S的元素是XTX特征值的开方。

如果S的元素是从大到小排列的,那么这种分解是唯一的

基于特征值降维/降噪解释

这里我们简单的回顾下特征值和特征向量的作用:

假设一个矩阵A分解后的特征向量是一组正交基vi, 特征值为λi, 那么AV=λV
这里AV表示矩阵A作用在这组正交基下面的正交旋转,正交变换不损失信息,那么AV的表示可以转化为对λV的研究上面
V是一组正交基,那么所有这个空间的向量都可以表示为V的线性组合
所以λV表示在正交基上面的张量,该方向上面的权重为对应的特征值。
所以不同的特征值大小代表矩阵在这个方向上面的重要程度,如果绝对值趋于0,那么这个方向上面的信息是不重要,或者可能是噪音。

假设我们要简化线性组合表示,是表示变的简单,且不希望我们的信息损失太多。
这里很直观的是:直接将绝对值排在后面的特征值置为0

应用

S是一个对角矩阵,且它的对角元素是非负递减的,所以如果我们需要保留r维的向量,我们只要舍弃S的第r个元素后面的秩,将这些元素置为0。
这样我们得到矩阵 SR,将SR 代入原式我们得到:
XR=TSRDT

XR的每一行都只有R个元素是非0的,其他都为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下面的概率,得到词的概率向量
β=>βij=p(wj=1|zi=1) 表示在topiczi下面出现词wj的概率

求解方式是构造概率模型,然后以概率最大化的方式计算得到β

一些不证明的先验知识:

  1. 给定一个文档Document,它属于哪个topic是服从多项式分布的,但是分布服从的参数θ是不同
  2. 给定一个topic,在这个topic出现某个词也是服从多项式分布。
  3. 假设θ的先验分布是Dirichlet分布,那么,先验 Dirichlet分布 + 多项式分布=后验Dirichlet分布,所以这里θ的先验分布选择Dirichlet分布,另外一方面Dirichlet经常被用来作为非均衡自由度下的向量采样(比如Beta分布是它的1个自由度的形式,我们经常使用Beta分布来拟合点击率或者转化率分布,然后将拟合出来的分布作为ctr预估的先验分布,或者作为e && e策略的先验分布)。

最大似然函数

l(α,β)=d=1Mlogp(Dd|α,β)

p(Dd|α,β)=p(θ|α)(n=1Nznp(zn|θ)p(wn|zn,β))dθ

这里跟着这个式子,通俗的介绍下这个式子的符号代表的意思:

  1. α,β是需要求的参数,分别代表 θ先验Dir分布的
    这里先简单的用通俗的表达说下统计知识:

  2. 一个Document在样本中属于哪一个topic服从多项式分布,这个多项式的分布参数我们认为它服从Dirichlet分布(如果二元参数就是一个Beta分布),那么它的后验校正分布也是是一个Dirichlet分布。

  3. 我们都知道先验分布是独立于单个样本的,只和整体的统计有关系,假定Dirichlet先验分布的参数α是一个要学习的参数。那么给定文档i,我们从先验Dirichlet概率分布得到θ, 它是多项式分布的参数。
  4. 得到的θ,就得到这个文档在各个topic下面的概率zn
  5. 假设概率矩阵为ββij=p(wj=1|zi=1),当topic 为i时,每个词出现的概率。
  6. 给定znβ,我们就可以得到,这样就可以在p(wn|zn,β)的概率分布下面得到wn

然后我们开始介绍下式子的由来:
首先对于一个文档Dd, 我们计算其中的N个词,其中N可以直接提前设定,也可以由分布获取,比如poson分布。

我们需要已经知道α,β, 我们需要计算这个文档词出现的概率:

  1. 首先θ是从Dir(α)分布里面采样得到的
  2. 得到θ, 就得到文档属于每一个topic的多项分布,znMultinomial(θ), znp(zn|θ)=1
  3. 对于给定的topic 概率zn和词的概率分布β, 然后从文档中采样出N个词。对于每一个词wn, 它基于当前的分布的概率为:p(wn|zn,β), 然后对于所有的topic,我们得到该词的概率:znp(zn|θ)p(wn|zn,β)。然后这个文档的N个词的联合概率为:Nn=1znp(zn|θ)p(wn|zn,β)
  4. 然后对于采样的θ机型期望计算得到:
    p(Dd|α,β)=p(θ|α)(n=1Nznp(zn|θ)p(wn|zn,β))dθ
  5. 然后对于M个文档,我们利用因子相乘的方式,对每个文档的概率进行累乘,得到:
    p(D|α,β)=d=1Mp(θ|α)(n=1Nznp(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等统计信息,一旦有了语义方面的数值表示,不管在统计模型还是在神经网络,都可以做很多的事情。

对于一个统计语言模型,它的统计信息可以被表示成条件概率的形式:

p(w1,w2,...,wT)=t=1Tp(wt|w1,..,wt1)

这个在长文本上面的效果不是很好,计算量特别大,所以常见的是N-Gram 模型,每个词和序列的前N-1个词相关。

p(wt|w1,..,wt1)=p(wt|wtn+1,..,wt1)

似然函数

对于所有的文本信息:

tlogf(wt,...,wtn+1;θ)+R(θ)

R(θ)为正则项

softmax 层
我们看单个概率p(wt|w1,..,wt1),
我们知道Vp(wt=i|w1,..,wt1)=1

我们令:f(wt,..,wtn+1)=p(wt|w1,..,wt1),
所以Vf(i,wt1,...,wtn+1)=1

满足这样的f函数有很多,在神经网络里面,我们常用的是 softmax 函数。

比如:f(wt,...,wtn+1)=exp(h(wt))Vexp(h(wir))

Embedding 层

再看对词wi的处理,它是经过一个大小为|V|的 Map 结构,连存储的是每一个词的向量,词在更新时,先出map里面取出,然后利用最优化的方式更新后,更新到Map中。
令:xi=C(wi) 是词到map中向量的转换,这个层次我们称为Embedding 层。

中间业务 层

在Embedding层和softmax直接可以根据业务目标,定义各种层级
Word Vector的综述
Word Vector的综述
比如像这种单层的结构,也可以在各种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的先河,但是还是存在几个问题需要解决:

  1. 基于深度模型训练,对于大规模的预料数据,训练是非常耗时耗资源的。
  2. 学习出来的词的表示迁移能力不强,词向量之间本身的距离没有太多实际的物理含义。

这里 Mikilov 等人在此基础上对上面的模型做了改进

Word Vector的综述
Word Vector的综述

差异点:

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/4U(x) 是词的一元count分布,Z是归一常量。或者更复杂点的p(w)1tf(w)。所以目标函数简化成:
    logσ(h(wn))+kEwneg[logσ(h(wneg)]
3. 对于中间层h(w)的生成
  • 在NPLM,各种复杂的forward 或者循环结构
  • 这里为了使得词之间的cosine或者欧式距离是有意义的,在构造logits时,直接可以用wiwj 代表两个词来构造,比如在CBOW中,前后n个词在预测当前词的时候,隐藏层可以这么构造:logits=h(wn)=(12n(wn+wn+1+...+wn1+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优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。

概率及表示

首先用符号X来表示词和词之间的表示:
Xij:词i在词j的window context里面的次数,同样也是j出现在i window context的次数
Xi=kXik:词i的window context里面的词的总次数
Pij=P(j|i)=Xij/Xi: 词j出现在词i 的context里面的概率

Word Vector的综述
Word Vector的综述
我们看这个Pij的case:

我们知道solid是ice的形状,gas是steam的状态,如果用概率表示,我们希望
p(solid|ice)>p(solid|steam)
p(gas|ice)<p(gas|steam)
为了数值化这个相对大小,我们引入他们的比例:p(k|ice)/p(k|steam), 这个比例值越大,代表词和ice更加相关,比例的值越小,代表和steam更加相关。

下一步:PikPjk=p(k|i)/p(k|j) 在机器学习里面怎么计算?

首先它应该和wi,wj,wk^ 这几个词向量有关,wi,wj就是需要学习的词向量,我们称为向量空间W
wk^ 也是向量,同Cbow一样,这里会学习两个向量空间,一个是产出词向量wi,一个我们称这个向量空间为Ŵ 

因为wiwk^是对称的,所以更新方式和词向量是一样的,这里在最后输出词向量事,采用两个空间向量的和w+ŵ 

我们构造一个函数F

F(wi,wj,wk^)=PikPjk

当然满足这种关系的F函数是很多的,我们对F的构造进行分析:

  1. 既然F要体现wi,wj的相对对比大小关系,直接可以想到的是wiwjwi/wj,相对来说wiwj更加简单,所以我们更新F的展现方式
    F(wiwj,wk^)=PikPjk
  2. 看最终的比例是一个常量的形式,但是F的输入变量都是向量,一种最直接的方式是对向量做点积,得到常量。
    F((wiwj)Twk^)=PikPjk
  3. 对于Pik=XikXi,它应该也可以直接表示成F的函数形式,为:
    F(wTiwk^)=Pik
  4. 综上,满足这种函数的F,我们很快会想到:F=exp, 所以,
    wTiwk^=log(Pik)=log(Xik)log(Xi)

目标函数构造

我们来看wTiwk^=log(Pik)=log(Xik)log(Xi)
我们知道log(Xi)是和k独立的,所以我们可以认为他是偏置bi, 为了对称,我们增加一个对称的偏置 bk^, 得到

wTiwk^+bi+bk^=log(Xik)

观察log(Xik),当Xik为0时,是一个病态的函数

目标函数:

J=i,j(wTiwk^+bi+bk^log(Xik))2

为了避免Xik=0造成的病态,我们引入一个分段函数f(x)来避免:

f(x)具有的特性为:

  1. f(0)=0,或者至少当x趋近于0时,xlog2(x)有限
  2. f(x)非递减函数,这样可以避免出现次数低的词的条件概率过低
  3. f(x)有上界,避免频率高的词权重过高

f(x)=min((x/xmin)α,1)

这里的α作者选择 3/4和negtive sample, Tomas Mikolov是一致的,xmax=100

所以得到最终的目标函数:

J=ijf(Xij)(wTiwk^+bi+bk^log(Xik))2

到这里,全部的问题已经解决,wi,wk^是词独立的两个词向量空间,bi,bk^是参数,Xij是全局统计信息

对比Skip—Gram 对比:

我们看下词向量训练的似然函数, 然后从似然函数反推出上面的目标函数:

Qij=exp(wTiwj^)kexp(wTiwk^)

然后Negative sample的处理是,负样本采样,得到:

log(Qij)=log(σ(wTiwj^))+kEwneg[log(σ(wTiwk^)))]

对于Global Vector

J=ijQij

这里如果词i和词j同时出现Xij词,那么在Skip-Gram中会在模型里面处理Xij,一种做法是将这个数值先group下,这样计算会更加有效率,得到:
J=ijXijlog(Qij)

因为:Pij=Xij/Xi
所以:

J=ijXijlog(Qij)=iXijPijlogQij=XiH(Pi,Qi)

H(Pi,Qi)是交叉熵,交叉熵是衡量概率误差的一种方式,它的好处可以抵消softmax或者sigmoid带来的饱和性,但是它是一个长尾的分布,很容易给到极小概率的事件过多的权重,为了这里的cost 函数对比

将交叉熵距离改成平方差距离方式:

J=XiH(Pi,Qi)=ijXi(Pij^Qij^)

其中Pij^=log(Xij), Qij^=log(exp(wTiwk^))=wTiwk^

所以

J=ijXi(wTiwk^logXij)2

Xi是一个权重参数,我们可以更换为更加通用的形式f(x)

到这里,我们已经详细的介绍了词向量的历史以及各种算法

相关文章:

  • 2021-11-17
  • 2021-12-04
  • 2021-06-18
  • 2022-01-22
  • 2021-04-22
  • 2021-09-20
  • 2021-08-03
猜你喜欢
  • 2021-06-09
  • 2021-09-20
  • 2021-10-14
  • 2021-10-23
  • 2021-05-01
  • 2021-12-08
相关资源
相似解决方案