【Hello NLP】CS224n学习笔记[3]:共现矩阵、SVD与GloVe词向量

相比于计算机视觉,NLP可能看起来没有那么有趣,这里没有酷炫的图像识别、AI作画、自动驾驶,我们要面对的,几乎都是枯燥的文本、语言、文字。但是,对于人工智能的征途来说,NLP才是皇冠上的那颗珍珠,它美丽却又难以摘取,当NLP的问题解决了,机器才真正具备了理解、思考的能力,我们才敢说实现了真正的“智能”。

SimpleAI 【HelloNLP】系列笔记,主要参考各知名网课(Stanford CS224n、DeepLearning.ai、李宏毅机器学习等等),并配合NLP的经典论文和研究成果、我的个人项目实践经验总结而成。希望能和各位NLP爱好者一起探索这颗AI皇冠的明珠!

CS224n笔记[3]:共现矩阵、SVD与GloVe词向量

作者:郭必扬

在第一节(CS224n学习笔记[1]:词向量从而何来中,我们讨论了人们对词语的几种表示方法,有WordNet这样的电子词典法,还有one-hot这样的离散表示法,后来我们介绍了Word2Vec词向量这样的低维分布式表示法。实际上,还有另外一派做法。

基于共现矩阵的词向量

我们再回顾一下Word2Vec的思想:

让相邻的词的向量表示相似。

我们实际上还有一种更加简单的思路——使用「词语共现性」,来构建词向量,也可以达到这样的目的。即,我们直接统计哪些词是经常一起出现的,那么这些词肯定就是相似的。那么,每一个词,都可以做一个这样的统计,得到一个共现矩阵。这里直接贴一个cs224n上的例子:

共现矩阵构造举例(图源自cs224n课程slides)

上面的例子中,给出了三句话,假设这就是我们全部的语料。我们使用一个size=1的窗口,对每句话依次进行滑动,相当于只统计紧邻的词。这样就可以得到一个共现矩阵。

共现矩阵的每一列,自然可以当做这个词的一个向量表示。这样的表示明显优于one-hot表示,因为它的每一维都有含义——共现次数,因此这样的向量表示可以求词语之间的相似度。

然后这样表示还有有一些问题:

  • 维度=词汇量大小,还是太大了;
  • 还是太过于稀疏,在做下游任务的时候依然不够方便。

但是,维度问题,我们有解决方法——「SVD矩阵分解」!我们将巨大的共现矩阵进行SVD分解后,只选取最重要的几个特征值,得到每一个词的低维表示。

SVD分解降维示意图(图源自http://www.imooc.com/article/267351)

图中的A在我们的场景中就是共现矩阵,、、就是分解出的三个矩阵。我们只「选择U矩阵的前r维来作为词的向量表示」

上述的过程使用python编程十分简单,这里也是直接引用cs224n课程中的例子:

可见,即使这么简单的三句话构建的语料,我们通过构建共现矩阵、进行SVD降维、可视化,依然呈现出了类似Word2Vec的效果。

但是,由于共现矩阵巨大,SVD分解的计算代价也是很大的。另外,像a、the、is这种词,与其他词共现的次数太多,也会很影响效果。

所以,我们需要使用很多技巧,来改善这样的词向量。例如,直接把一些常见且意义不大的词忽略掉;把极度不平衡的计数压缩到一个范围;使用皮尔森相关系数,来代替共现次数。等等很多技巧。因此就有了2005年的论文《An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence》提出的COALS模型。这个模型训练得到的词向量,也表现出了很多有趣的性质,跟我们熟悉的Word2Vec十分类似。

基于共现矩阵的词向量 vs. Word2Vec词向量

上面的介绍中,我们发现基于共现矩阵的词向量,也可以表现出很多优秀的性质,它也可以得到一个低维的向量表示,进行相似度的计算,甚至也可以做一定的推理(即存在man is to king as women is to queen这样的关系)。但是,它主要的问题在于两方面:

  1. SVD要分解一个巨型的稀疏矩阵(共现矩阵),计算开销大,甚至无法计算;
  2. 需要进行复杂麻烦的预处理,例如计数的规范化、清除常见词、使用皮尔森系数等等。

「Word2Vec」的算法,「不需要一次性处理这么大量的数据」,而是通过「迭代」的方式,一批一批地进行处理,不断迭代词向量参数,使得我们可以处理海量的语料,构建十分稳健的词向量。所以在实验中,Word2Vec的表现,一般都要优于传统的SVD类方法。

但是,「基于共现矩阵的方法也有其优势」,那就是「充分利用了全局的统计信息」。因为我们进行矩阵分解,是对整个共现矩阵进行分解,这个矩阵中包含着全局的信息。而Word2Vec由于是一个窗口一个窗口(或几个窗口)地进行参数的更新,所以学到的词向量更多的是局部的信息。

总之,二者各有优劣,这启发了斯坦福的一群研究者,GloVe词向量就是在这样的动机下产生的。

GloVe词向量

GloVe是斯坦福团队来2014年提出一个新的词向量,GloVe的全名叫“Global Vectors”,重点在于这个global,即它是直接利用全局的统计信息进行训练的。

理解GloVe词向量,有两种思路:

  1. 一种是由Word2Vec的skip-gram算法改进而来(思路较为清晰);
  2. 一种是由词语见的“共现概率比”构造出来(过程较为复杂)。

这里为了简便,「我按照第一种思路来讲解」

GloVe会用到全局的词语之间共现的统计信息,因此我们需要首先构建「共现矩阵」,我们设:

  • 代表词和词共现的次数
  • 代表词出现的次数
  • 代表词出现在词周围的概率,即共现概率

回到skip-gram算法中,我们是这样构造由中心词预测上下文词的概率的:

其中,v就代表词向量(为了表示简便,这里也就使用一套词向量)。

这样,整体的损失函数可以写为:

这些大家应该很熟悉了,在第一篇笔记的末尾有详细的公式介绍。

实际上,对于上面的损失函数,我们可以有一种更加高效的计算方法,因为会出现次,所以我们不用一个窗口一个窗口慢慢地滑动计算,而是直接把这些重复的项一起计算:

上面可以根据可以进一步变形:

这个公式中的我们仔细定睛一看,就会发现,这就是「交叉熵」嘛!

交叉熵,只是众多损失函数中的一种,而交叉熵损失函数天然有一些缺陷:由于它是处理两个分布,而很多分布都具有「长尾」的性质,这使得基于交叉熵的模型常常会给那些不重要、很少出现的情形给予过高的权重。另外,由于我们需要计算概率,所以「必须进行合理的规范化」(normalization),规范化,就意味着要除以一个「复杂的分母」,像Softmax中,我们需要遍历所有的词汇来计算分母,这样的开销十分巨大。

所以,我们可以考虑使用一个新的损失函数,比如——「平方损失」(least squares)函数,则损失函数就变为:

其中,和其实就是「没有经过规范化」的和。相当于我们把复杂的分母都一起丢掉了。「在平方损失中,我们可以不进行规范化处理」,因为我们处理的是两者之间的差异,使差异最小化,那经不经过规范化,都不影响。但是在交叉熵中就必须进行规范化了,因为我们处理的是概率。

由于的取值范围非常大,这样会不容易优化,所以我们再进行取「对数处理」

最后,对于那个权重项,其实我们可以更加优化的用一个同时依赖于i,j的函数:来代替,来让我们更精细地调整不同频率的词的损失。GloVe论文中f函数的图像长这样:

这样的函数使得过于高频的词权重不会过高。

「千呼万唤始出来」,我们终于得到了GloVe的损失函数:

(当然,其实还有一点不完整,那就是我们可以在内部再添加一些偏置项,bias term,但是这个不重要了)

GloVe词向量好在哪?

上面详细讲述了GloVe词向量如何通过改进Word2Vec的skip-gram算法得来。最主要的,就是我们把交叉熵损失函数替换成了平方损失函数。这样,就明显可以让我们的计算更简单。

另外,GloVe词向量的训练,是直接面对,即共现矩阵,进行优化的。也就是它是直接朝着全局的统计信息进行训练优化的。这样有什么好处呢?

「a」 更充分的利用统计信息
「b」 充分利用语料中的大量重复信息来简化计算

第二点怎么理解?在Word2Vec中,我们是通过滑动窗口来进行计算的,我们在遍历整个语料的过程中,同样一对<中心词i,上下文词j>可能会出现在多个窗口中,这些计算我们都存在重复,而如果利用统计信息,我们可以只计算一次,然后乘以次数即可。

对于GloVe,模型的计算复杂度依赖于共现矩阵中非零元素的个数,其「上限」为,而skip-gram的复杂度为。其中V是词汇量大小,C是语料库的长度,一般情况下,.

但是,实际的语料中,一般是十分稀疏的,非零元素相比之下是很小的。经过对实际语料的研究,我们发现GloVe的实际复杂度大概为,显然还是小于skip-gram的复杂度的。这也进一步印证了上的第二点好处。

以上。


(0)

相关推荐

  • gensim:用Word2Vec进行文本分析

    文本分析我写过一期gensim库的,今天我想实现下word2vec,进行一些词语相似性分析. 用gensim库做文本相似性分析 参数解释 参数 含义 sentences 形如[a,b,c...],且a ...

  • 视觉增强词向量:我是词向量,我开眼了!

    设为 "星标",重磅干货,第一时间送达! 转载自 | 夕小瑶的卖萌屋 文 | 橙橙子 亲爱的读者,你是否被各种千亿.万亿模型的发布狂轰乱炸,应接不暇,甚至有点产生对大模型的审美疲劳 ...

  • VoLTE学习笔记杂谈(9)-现网测试案例分析

    提到甜点,大家第一时间想到的应该都是法国吧.德国美食在人们心中往往都是一副硬派的形象,肥美的烤猪肘子.烤香肠,再搭配上麦芽味醇厚的自酿黑啤酒,简直就是完美的享受.但是德国这个国家粗中有细,把严谨的做 ...

  • NeurIPS 2020 | 马尔科夫链上的矩阵Chernoff Bound和它在共现矩阵中应用

    导读:在 NeurIPS 2020 上,清华大学,微软雷德蒙德研究院,腾讯量子实验室和佐治亚理工的团队证明了一个马尔科夫链上的矩阵 Chernoff Bound,并介绍了它在共现矩阵收敛速度分析中应用 ...

  • 一则公报案例学习笔记:对修改股东出资期限应否适用资本多数决规则的思考|审判研究

    一.问题的提出 2021年第3期<最高人民法院公报案例>刊登了鸿大(上海)投资管理有限公司与姚锦城公司决议纠纷上诉案,裁判要旨为:"公司股东滥用控股地位,以多数决方式通过修改出资 ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...

  • 周哥学习笔记(2021.5.8)

    心理界限存在的意义,正是为了帮助人们控制情绪进入的量,不至于太过冷漠或太过投入,让我们保持一个合适的距离与外界互动. 人没有办法只通过吸收变得更美好和丰富,它必须通过大胆的碰撞和创造.如果不能保持足够 ...

  • 【学习笔记】控制角色移动的N种方法,但都离不开重复执行

    [学习笔记]控制角色移动的N种方法,但都离不开重复执行 今天我们讲一下控制角色移动的多种方法,因为缺少操作实例,希望课下同学们结合例子好好练习. 首先,我们说一下控制角色移动的多种方法.最比较常见的就 ...

  • 胡希恕伤寒论学习笔记——42

    42.太阳病,外证未解,脉浮弱者,当以汗解,宜桂枝汤. 字面意思是说:太阳病,外证依然存在,脉是浮弱的,治疗上依然需要通过出汗的方法,这时应该用桂枝汤一类的方剂. "宜"字说明不是 ...

  • 量柱擒涨停 - 量柱战法学习笔记(2)

    四.倍量战术 1.倍量的理解 [形态特征]:与前一个交易日比较高出1倍或1倍以上,就是倍量(4倍以上为发烧柱) ; [本质特征]:体现主力强势态度,主动(倍量阳/阴)买/卖盘吸筹坚决; [位置性质]: ...

  • 胡希恕伤寒论学习笔记——43

    43.太阳病,下之微喘者,表未解故也,桂枝加厚朴杏子汤主之. 桂枝加厚朴杏子汤方 桂枝三两 芍药三两 厚朴二两(炙,去皮) 杏仁五十枚(去皮尖)甘草二两(炙) 生姜三两(切)大枣十二枚(掰) 上七味, ...