word2vec

本节课将开始学习Deep NLP的基础——词向量模型。

本文转自 https://www.cnblogs.com/Leo_wl/p/5727530.html

背景

word vector是一种在计算机中表达word meaning的方式。在Webster词典中,关于meaning有三种定义:

  • the idea that is represented by a word, phrase, etc.
  • the idea that a person wants to express by using words, signs, etc.
  • the idea that is expressed in a word of writing, art, etc.

这三种定义由具象到抽象,但对于Deep NLP而言,处理的难度却是由难入易。

传统的NLP领域里主要是针对第一种定义——word representation——进行研究。例如,通过在一张描述语义关系的拓扑图(WordNet)上定义的上义词(Hypernyms)和同义词(Synonym),进而给出word在计算机中的表达。但这种方式存在很多问题。

首先,由于大多数词都有着属于自己独特的语境,例如,我们会说某人在某个领域是一个专家(expert),也会称赞某人的语言很流利(proficient)。虽然在WordNet中expert和proficient被定义为是一对同义词,但显然我们不能说某人在某个领域很proficient。这种一刀切的定义上义词和同义词的方式显然不够精细。

其次,语言的变化日新月异。而这种人工定义WordNet的方式显然跟不上变化的步伐。此外,人类对自然语言理解的主观性,以及在标注和维护WordNet时消耗的大量人力,都成为了制约WordNet发展的瓶颈。

最后,也是最糟糕的问题是,对于计算机而言,这种基于WordNet的词义定义方式很难对两个word之间的语义相似度进行准确的计算。我们只能粗劣地对两个词是否同义给出一个二分类的结果。

WordNet的这些问题是词的离散化表达(discrete representation)所带来的通病。除了WordNet,还有很多基于规则或是统计的NLP模型将word视为一个独立的原子单元(atomic symbols)进行处理。例如,在经典的VSM模型里,每一个word都被表示为一个one-hot向量(除了一个索引下标对应的位置是11,其他位置上的元素都是00)。显然,在这种表达方式下,对任意两个word计算出来的相似度都是00。此外,one-hot向量表达还存在着数据稀疏性和维度灾难的问题。

Distributional Representation

于是,人们想出了一种新的word meaning的定义方式:通过一个word相邻的词来定义这个word的meaning。这个定义来源于一个古老的idea(J.R.Firth, 1957):

You shall know a word by the company it keeps

并成为了包括传统NLP模型和今天将要介绍的word2vec模型在内的大部分word representation模型的基础。

具体来说,我们通过从大量的语料文本中构建一个co-occurrence矩阵来定义word representation。矩阵的构造通常有两种方式:基于document和基于windows。

通过统计word与document共现的次数得到的矩阵被称为word-document矩阵。这个矩阵一般被用于主题模型。相同主题的word之间往往有着较高的相似度。但该矩阵很难描述word的语法信息(例如POS tag)。

我们在课堂上主要讲授的是第二类矩阵:word-context矩阵。通过统计一个事先指定大小的窗口内的word共现次数,不仅可以刻画word的语义信息,还在一定程度上反应了word的语法结构信息。

举一个简单的例子。假设我们的语料库由三句话构成:

  1. I like deep learning.
  2. I like NLP.
  3. I enjoy flying.

设置统计窗口的大小为11,并采用对称窗口(与之相对的是非对称窗口,即仅考虑目标词左侧或右侧的上下文),则可以得到word-context矩阵如下:
word-context matrix

矩阵里的元素是列向量所代表的word出现在行向量所代表的word的上下文里的次数。(注意,我们并没有对句首或句尾的词做任何特殊的处理:比如增加一个S或E的标记Token作为句首或句尾的padding。)

现在,我们可以用矩阵的行向量来计算word之间的相似度了。

然而, 这种定义方式得到的词向量的维度等于词典的大小。这意味着,我们需要大量的空间来存储这些高维的词向量。同时,伴随着高维向量出现的数据稀疏性问题,也使得基于这些词向量的机器学习模型的训练变得异常困难。

简单来说,co-occurrence矩阵定义的词向量在一定程度上缓解了one-hot向量相似度为00的问题,但没有解决数据稀疏性和维度灾难的问题。

SVD分解:低维词向量的间接学习

既然基于co-occurrence矩阵得到的离散词向量存在着高维和稀疏性的问题,一个自然而然的解决思路是对原始词向量进行降维,从而得到一个稠密的连续词向量。

第一个出场的对原始矩阵进行降维的方法是奇异值分解(SVD)。SVD的基本思想是,通过将原co-occurrence矩阵XX分解为一个正交矩阵UU,一个对角矩阵SS,和另一个正交矩阵VV乘积的形式,并提取UU的kk个主成分(按SS里对角元的大小排序)构造低维词向量。(关于SVD更多的介绍可以参考这篇博客:机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

除此之外,在对原始矩阵XX的处理上,还有很多简单但很好用的Hacks。比如对原始矩阵中高频词的降频处理;带权重的统计窗口(距离越近的词对词义的贡献越大);用Pearson相关性系数替代简单的词频统计等。包括我们后面要学习到的word2vec模型,也属于这一类Hacks。

即便是简单的对co-occurrence矩阵进行SVD分解得到的稠密词向量,也具有很多优美的性质。语义相近的词(比如"wrist"和"ankle")可以通过用词向量内积定义的相似度聚类到一起;同一动词的不同时态也往往出现在向量空间的同一片区域。词向量甚至可以一定程度上反应word之间的线性联系。

然而,高昂的计算复杂度(O(mn2)O(mn2))是SVD算法的性能瓶颈。这对于现在动辄上百万甚至上亿数据量的语料库而言,是一笔巨大的计算开销。更不用说每一个新词的加入都需要在一个新的矩阵上重新运行一遍SVD分解。此外,后面我们会看到,SVD算法和其他Deep Learning模型本质上是属于两类不同的学习算法。

*尽管SVD分解存在着这样或那样的问题,但是其将word表示为一个稠密的低维连续向量的思想,成为了包括Deep NLP在内的众多NLP模型的基础。

*

From now on, every word will be a dense vector.

word2vec:低维词向量的直接学习

接下来,我们来看下Deep Learning是如何从原始的语料库中直接学习到低维词向量的表达。这也是我们学习的第一个Deep NLP模型——word2vec模型。

与直接从co-occurrence矩阵里提取词向量的SVD算法不同,word2vec模型背后的基本思想是对出现在上下文环境里的词进行预测(事实上,后面会看到,这种对上下文环境的预测本质上也是一种对co-occurrence统计特征的学习)。对于每一条输入文本,我们选取一个上下文窗口和一个中心词,并基于这个中心词去预测窗口里其他词出现的概率。因此,word2vec模型可以方便地从新增语料中学习到新增词的向量表达,是一种高效的在线学习算法(online learning)。

对于一个长度为TT的语料库,假设我们为每一个词选取的上下文窗口的大小是mm(指的是上下文各mm个词),则我们的目标函数是最大化训练语料的对数似然概率:

J(θ)=1Tt=1Tmjm,j0logp(wt+j|wt)J(θ)=1T∑t=1T∑−m≤j≤m,j≠0log⁡p(wt+j|wt)


其中,θθ是模型的所有参数。

 

一个简单的计算条件概率p(wt+j|wt)p(wt+j|wt)的公式如下:

p(o|c)=exp(uTovc)Ww=1exp(uTwvc)p(o|c)=exp(uoTvc)∑w=1Wexp(uwTvc)


其中,oo为输出的目标词的id,cc为输入的中心词的id。每一个词都有两套向量:作为中心词的"center"向量vv,和作为目标词的"outside"向量uu。vv和uu都是模型要学习的参数。(事实上,我们也可以用一套向量去描述每一个word。之所以用两套向量只是为了后面计算的简单。)

 

对机器学习有一定基础的同学会发现,这里的条件概率其实是一个Softmax分类函数,而目标函数对应着这个分类函数的交叉熵。

优化这个目标函数的算法是SGD——随机梯度下降法。为此,我们要求解这个目标函数的一阶导数。

首先,我们引入两个重要的求导法则:

  1. 向量求导法则:xTax=aTxx=a∂xTa∂x=∂aTx∂x=a
  2. 链式求导法则:dydx=dydududxdydx=dydududx

有线性代数和微积分基础的同学可以轻松证明这两个法则的正确性。

接下来,我们首先对"center"向量vcvc进行求导:

logp(o|c)vc=vc(uTovclogw=1Wexp(uTwvc)) =uovclogw=1Wexp(uTwvc) =uo1Ww=1exp(uTwvc)vcw=1Wexp(uTwvc) =uow=1W1Ww=1exp(uTwvc)vcexp(uTwvc) =uow=1Wexp(uTwvc)Ww=1exp(uTwvc)vcuTwvc =uow=1Wp(w|c)uw∂log⁡p(o|c)∂vc=∂∂vc(uoTvc−log⁡∑w=1Wexp(uwTvc)) =uo−∂∂vclog⁡∑w=1Wexp(uwTvc) =uo−1∑w=1Wexp(uwTvc)∂∂vc∑w′=1Wexp(uw′Tvc) =uo−∑w′=1W1∑w=1Wexp(uwTvc)∂∂vcexp(uw′Tvc) =uo−∑w′=1Wexp(uw′Tvc)∑w=1Wexp(uwTvc)∂∂vcuw′Tvc =uo−∑w′=1Wp(w′|c)uw′

 

类似地,我们可以求出"outside"向量uu的导数:

logp(o|c)uo=vcvcp(o|c)∂log⁡p(o|c)∂uo=vc−vcp(o|c)


logp(o|c)uo,oo=vcp(o|c)∂log⁡p(o|c)∂uo′,o′≠o=−vcp(o′|c)

 

(如果从神经网络的角度出发,可以借助反向传播算法轻松写出这两个变量的求导公式。参见我的ProblemSet1的作业笔记。)

显然,这种定义下的梯度计算需要对每个上下文窗口都计算出训练集中所有单词的条件概率。这对于动辄上百万的词典而言,几乎是一件不可能完成的任务。因此,Mikolov在他2013年发表的论文里提出了一些性能优化的Hacks,包括近似归一化的层次Softmax,和避免归一化的负采样技术。这些技术的细节在我的另一篇博文word2vec前世今生里有详细的讨论,这里就不再赘述。但是,word2vec基本的思想和背后的数学已全部展示在这里了。

word2vec得到的词向量很好地编码了词与词在语义和语法上的联系(不只是相似性)。例如单数与复数,子类和父类。一个著名的例子是:vkingvman+vwomanvqueenvking−vman+vwoman≈vqueen。曾经只能用WordNet人工定义的联系,如今从co-occurrence的统计特征自动涌现了出来!

Count Based vs Direct Prediction

我们学习了基于co-occurrence矩阵和SVD分解的向量降维技术,也学习了直接对co-occurrence进行预测的word2vec技术。那么,这两类词向量生成的技术在计算效率和结果上又有哪些差异呢?

与每次只处理部分语料的word2vec模型相比,基于SVD的矩阵模型充分地利用了数据集的统计特征。同时,SVD分解的计算复杂度只依赖于语料的词典大小,而word2vec模型的计算复杂度与整个语料库的大小线性相关。因此,在某些情况下,前者的训练更加高效。

不过,在评估最终得到的词向量的效果时,word2vec模型要远超SVD矩阵模型。前者不仅可以刻画词在语义或语法上的相似性,更可以描述词与词之间的线性关系。在一些复杂任务上,word2vec向量的效果也更为突出。

在下一节课,我们将学习一种结合二者优势的新的词向量模型——Glove模型。

来源:网络


智能推荐

word2vec

例子 word2vec就是对word做了一个embedding操作,简单来说就是将原有用one-hot编码的预料库(一般来说百万级别)转为embedding形式(几百维)。 比如:维基百科预料库包含的词有100W,将其使用one-hot编码。 “The dog barked at the mailman” 基于这个句子,可以构建一个大小为5的词汇表(忽略大小写和标点符号):...

word2vec

Google 于 2013 年开源推出的一个用于获取 word vector 的工具包(word2vec), 其中的两个训练模型(Skip-gram,CBOW) 两种加速的方法(Hierarchical Softmax,Negative Sampling) 作用: 将所有词语投影到K维的向量空间,每个词语都可以用一个K维向量表示。 由于它简洁,高效的特点,引起了人们的广泛关注,并应用在很多NLP任...

Word2vec

算法介绍 2013年,Google开源了一款用于词向量计算的工具–Word2vec,引起了工业界和学术界的关注。Word2vec可以在百万数量级的词典和上亿数量级的数据集上进行高效的训练,得到的训练结果–词向量(Word Embedding)–可以很好的度量词与词之间的相似性。 语言模型 语言模型也就是自然语言处理(NLP),语言模型的范围非常广,比如分词、信息...

Word2Vec

Lecture 1: Introduction and Word Vectors One-hot 主要思想:means one 1, the rest 0s. 缺点:①如果想表示合理大小词汇,向量维度太大; ②两个不同词对应的向量是正交的,数学上无法描述他们的相似性。 Word2Vec Idea ①有一个很大的文本语料库; ②每个词在固定词典中由一个向量表示,我们随机初始化向量; ③遍历文本中的每...

word2vec

常用、流行的词嵌入方法,就是Word2Vec。这是Tomas Mikolov在谷歌工作时发明的一类方法,也是由谷歌开源的一个工具包的名称。具体来说,Word2Vec中涉及到了两种算法,一个是CBOW一个是Skip-Gram。这也是因为深度学习流行起来之后,基于神经网络来完成的Word Embedding方法。 当前Deep Learning在NLP领域的三个阶段为 还有BERT的变形ALBERT和...

猜你喜欢

word2vec

转自:http://www.cnblogs.com/iloveai/p/word2vec.html 系列参考文献:http://www.cnblogs.com/Determined22/p/5804455.html http://blog.csdn.net/itplus/article/details/37969817 http://techblog.youdao.com/?p=915 http:...

word2vec

1.英文语料库的处理 大写变小写,去除表情符号,或则参考表情符号库,进行情感分析 词向量:word2vec,fasttext 为什么不用one-hot向量表示词向量? 如’a b c’ ==》 a:[1,0,0] , b:[0 1 0],c:[0 0 1],容易维度过高,特征过于稀疏。 word2vec的认识:是一个工具。主要包括两个模型:跳字模型(skip-gram)和连...

Word2Vec

Word2Vec 背景知识 语言模型 词表示 对比模型 NNLM RNNLM 模型结构 skip-gram模型 CBOW模型 关键技术 Hierarchical Softmax (层次Softmax) 负采样(Negative Sampling) 模型复杂度分析 代码实现 背景知识 Word2Vec是一种词向量的表示方式,是在论文《Efficient Estimation of Word Repr...

Word2vec

文章目录 研究背景 前期知识储备 学习目标 论文储备知识 论文导读 论文背景知识 研究成果 研究意义 论文总览 介绍 对比模型 前馈神经网络语言模型(NNLM) 语言模型困惑度和Loss得关系 回顾网络模型 循环神经网络语言模型(RNNLM) 对比模型 Log-linear model word2ver 原理 Skip-gram CBOW 关键技术 模型复杂度的概念 基于前馈网络的语言模型的时间复...

word2vec

NLP -词向量模型-Word2Vec NLP中词向量维度一般在50-300维,建议300(google官方) 数据从哪来? 不同模型对比 CBOW: 思想是取目标词的上下文 input: 上下文 output: 预测中间词即缺失部分内容 Skipgram:思想是根据上下文确定目标词 input:传入中间词 output:预测上下文 如何进行训练 前向传播计算loss 根据loss反向传播更新参数...

问答精选

SQL, update command not ending properly

It keeps saying : ORA-00933: SQL command not properly ended Pls help me or give me a link to a solution You can use a correlated subquery instead:...

How can I escape $.each loop with my data?

I'm doing an Json call to retrieve an a list of locations with information details for each location. longitude and latitude are included in this info. I am using Google's distance matrix api to get t...

How to display all the columns (and their type) in all tables of all schemas in a database?

Suppose you have a database which has an 'n' number of schemas with an 'n' number of tables each. Each of these contain an 'n' number of columns. How would I print all this data along with the data ty...

How to set the java.library.path in intelliJ Idea

Could anyone please help how do I solve this error: I am using IDEA IDE as a first time, and have been using Resin_4.0.37 as a server to test my work. As soon as I start my lcoal server in debug mode ...

How to calculate mouse coordinate based on resolution c#

i am trying to develop a remote desktop apps with c#. so i have couple of question regarding mouse coordinate calculation based on picture box suppose i have picture box and i want to capture mouse co...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答