公元前770年
word2vec原理(⼀):词向量、CBOW与Skip-Gram模型基础⽬录
word2vec是Google在2013年推出的⼀个NLP⼯具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。
word2vec⼯具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种⾼效训练的⽅法:负采样(negative sampling)和层序softmax (hierarchical softmax)。值得⼀提的是,word2vec词向量可以较好地表达不同词之间的相似和类⽐关系。
Skip-gram和CBOW是Word2vec架构的两种类型,可以理解为两种实现⽅式,不是说,word2vec包含这两个模型。word2vec⾃提出后被⼴泛应⽤在⾃然语⾔处理任务中。它的模型和训练⽅法也启发了很多后续的词向量模型。
1. 词向量基础
牛浦向量空间模型长期以来⼀直被⽤于分布式语义的⽬的,它以向量的形式表⽰⽂本⽂档和查询语句。通过以向量空间模型在N维空间中来表⽰单词,可以帮助不同的NLP算法实现更好的结果,因此这使得相似的⽂本在新的向量空间中组合在⼀起。
⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在机器学习中,如何
使⽤向量表⽰词?顾名思义,词向量是⽤来表⽰词的向量,通常也被认为是词的特征向量。词向量,⼜名词嵌⼊(Word Embedding)。近年来,词向量已逐渐成为⾃然语⾔处理的基础知识。
⽤词向量来表⽰词并不是word2vec的⾸创,在很久之前就出现了,表⽰⽅式:
1.1 One-Hot 编码(独热编码)
保留三位有效数字
⼀种最简单的词向量⽅式是one-hot reprentation,就是⽤⼀个很长的向量来表⽰⼀个词,向量的长度为词汇表的⼤⼩,向量的分量只有⼀个 1,其他全为 0,1 的位置对应该词在词典中的位置。⽐如:
'中国'表⽰为: []
'美国'表⽰为:[]
每个词都是茫茫 0 海中的⼀个 1。这种 One-hot Reprentation 采⽤稀疏向量⽅式存储,会是⾮常的简洁:也就是给每个词分配⼀个数字 ID。⽐如刚才的例⼦中,中国记为 3,美国记为 8(假设从 0 开始记)。如果要编程实现的话,⽤ Hash 表给每个词分配⼀个编号就可以了。这么简洁的表⽰⽅法配合上最⼤熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。
这种词表⽰有两个缺点:
(1)容易受维数灾难的困扰,尤其是将其⽤于 Deep Learning 的⼀些算法时:词汇表⼀般都⾮常⼤,⽐如达到百万级别,这样每个词都⽤百万维的向量来表⽰简直是内存的灾难。这样的向量其实除了⼀个位置是1,其余的位置全部都是0,表达的效率不⾼,能不能把词向量的维度变⼩呢?
(2)不能很好地刻画词与词之间的相似性(术语好像叫做“词汇鸿沟”):任意两个词之间都是孤⽴的,
这样使得算法对相关词的泛化能⼒不强。因为任何两个one-hot向量之间的内积都是0,很难区分他们之间的差别。光从这两个向量中看不出两个词是否有关系,哪怕是丈夫和⽼公这样的同义词也不能幸免于难。号码的英文
(个⼈认为,主要原因在于one-hot编码是把不适合欧式距离度量的类别数据,转换到欧式空间,适合距离度量,⽽⽂本分析中,更常⽤的是余弦距离,此时one-hot编码体现不出⾓度概念,因为余弦距离将距离归⼀化了)
1.2 分布式表⽰:词向量/词嵌⼊
Distributed reprentation可以解决One hot reprentation的问题,它最早是 Hinton 于 1986 年提出的。它的思路是通过训练,将每个词都映射到⼀个较短的词向量上来。所有的这些词向量就构成了向量空间,进⽽可以⽤普通的统计学的⽅法来研究词与词之间的关系。这就是word embedding,即指的是将词转化成⼀种分布式表⽰,⼜称词向量。分布式表⽰将词表⽰成⼀个定长的连续的稠密向量,这个较短的词向量维度是多⼤呢?这个⼀般需要我们在训练时⾃⼰来指定。
Distributed Reprentation 可以创建多个层次结构或分段,其中可以为每个单词显⽰的信息分配不同的权重。这些分段或维度的选择可以是我们决定的,并且每个单词将由这些段中的权重分布表⽰。
⽐如上图我们将词汇表⾥的词⽤"位置","⼈⼝", "⾯积"和"距离"4个维度来表⽰,Rome这个词对应的词向量可能是
凉拌油麦菜的做法(0.99,0.99,0.05,0.7),也就是普通的向量表⽰形式。维度以 50 维和 100 维⽐较常见。当然在实际情况中,我们并不能对词向量的每个维度做⼀个很好的解释。
有了⽤Distributed Reprentation表⽰的较短的词向量,我们就可以较容易的分析词之间的关系了,⽐如我们将词的维度降维到2维,有⼀个有趣的研究表明,⽤下图的词向量表⽰我们的词时,我们可以发现:
分布式表⽰优点:
(1) 词之间存在相似关系: 是词之间存在“距离”概念,这对很多⾃然语⾔处理的任务⾮常有帮助。
(2) 包含更多信息: 词向量能够包含更多信息,并且每⼀维都有特定的含义。在采⽤one-hot特征时,可以对特征向量进⾏删减,词向量则不能。
可见我们只要得到了词汇表⾥所有词对应的词向量,那么我们就可以做很多有趣的事情了。不过,怎么训练得到合适的词向量呢?⼀个很常见的⽅法是使⽤神经⽹络语⾔模型。
当然⼀个词怎么表⽰成这么样的⼀个向量是要经过⼀番训练的,训练⽅法较多,word2vec是其中⼀种,在后⾯会提到,这⾥先说它的意义。还要注意的是每个词在不同的语料库和不同的训练⽅法下,得到的词向量可能是不⼀样的。
小恙由于是⽤向量表⽰,⽽且⽤较好的训练算法得到的词向量的向量⼀般是有空间上的意义的,也就是说,将所有这些向量放在⼀起形成⼀个词向量空间,⽽每⼀向量则为该空间中的⼀个点,在这个空间上的词向量之间的距离度量也可以表⽰对应的两个词之间的“距离”。所谓两个词之间的“距离”,就是这两个词之间的语法,语义之间的相似性。
个人性格⼀个⽐较实⽤的场景是找同义词,得到词向量后,假如对于词⽼婆来说,想找出与这个词相似的词,
尘的繁体字这个场景对⼈来说都不轻松,毕竟⽐较主观,但是对于建⽴好词向量后的情况,对计算机来说,只要拿这个词的词向量跟其他词的词向量⼀⼀计算欧式距离或者cos距离,得到距离⼩于某个值那些词,就是它的同义词。这个特性使词向量很有意义,⾃然会吸引很多⼈去研究,google的word2vec模型也是基于这个做出来的。
1.3 词向量可视化
如果我们能够学习到⼀个 300 维的特征向量,或者说 300 维的词嵌⼊,通常我们可以做⼀件事,把这 300 维的数据嵌⼊到⼀个⼆维空间⾥,这样就可以可视化了。常⽤的可视化算法是 t-SNE 算法,来⾃于 Laurens van der Maaten 和 Geoff Hinton 的论⽂。
t-SNE 算法:所做的就是把这些 300 维的数据⽤⼀种⾮线性的⽅式映射到 2 维平⾯上,可以得知 t-SNE 中这种映射很复杂⽽且很⾮
线性。
如果观察这种词嵌⼊的表⽰⽅法,会发现 man 和 woman 这些词聚集在⼀块(上图编号 1 所⽰), king 和queen 聚集在⼀块(上图编号 2 所⽰),这些都是⼈,也都聚集在⼀起(上图编号 3 所⽰)。动物都聚集在⼀起(上图编号 4 所⽰),⽔果也都聚集在⼀起(上图编号 5 所⽰),像 1、2、 3、 4 这些数字也聚集在⼀起(上图编号 6 所⽰)。如果把这些⽣物看成⼀个整体,他们也聚集在⼀起(上图编号 7 所⽰)。
词嵌⼊算法对于相近的概念,学到的特征也⽐较类似,在对这些概念可视化的时候,这些概念就⽐较相似,最终把它们映射为相似的特征向量。
这种表⽰⽅式⽤的是在 300 维空间⾥的特征表⽰,这叫做嵌⼊( embeddings)。之所以叫嵌⼊的原因是,你可以想象⼀个 300 维的空间,这⾥⽤个 3 维的代替(上图编号 8 所⽰)。现在取每⼀个单词⽐如 orange,它对应⼀个 3 维的特征向量,所以这个词就被嵌在这个 300 维空间⾥的⼀个点上了(上图编号 9 所⽰), apple 这个词就被嵌在这个 300 维空间的另⼀个点上了(上图编号 10 所⽰)。为了可视化, t-SNE 算法把这个空间映射到低维空间,你可以画出⼀个 2 维图像然后观察,这就是这个术语嵌⼊的来源。
1.4 词嵌⼊⽤做迁移学习
如果对于⼀个命名实体识别任务,只有⼀个很⼩的标记的训练集,训练集⾥可能没有某些词,但是如果有⼀个已经学好的词嵌⼊,就可以⽤迁移学习,把从互联⽹上免费获得的⼤量的⽆标签⽂本中学习到的知识迁移到⼀个命名实体识别任务中。
如果从某⼀任务 A 迁移到某个任务 B,只有 A 中有⼤量数据,⽽ B 中数据少时,迁移的过程才有⽤。
⽤词嵌⼊做迁移学习的步骤:
(1)先从⼤量的⽂本集中学习词嵌⼊,或者可以下载⽹上预训练好的词嵌⼊模型,⽹上可以找到不少,词嵌⼊模型并且都有许可。
(2)把这些词嵌⼊模型迁移到新的只有少量标注训练集的任务中。
(3)考虑是否微调,⽤新的数据调整词嵌⼊。当在新的任务上训练模型时,如命名实体识别任务上,只有少量的标记数据集上,可以⾃⼰选择要不要继续微调,⽤新的数据调整词嵌⼊。实际中,只有第⼆步中有很⼤的数据集时才会这样做,如果你标记的数据集不是很⼤,通常不建议在微调词嵌⼊上费⼒⽓。
当任务的训练集相对较⼩时,词嵌⼊的作⽤最明显。词嵌⼊在语⾔模型、机器翻译领域⽤的少⼀些,尤其是做语⾔模型或者机器翻译任务时,这些任务有⼤量的数据。
1.4 词嵌⼊⽤做类⽐推理
我们⽤⼀个四维向量来表⽰ man,称为,woman 的嵌⼊向量称为,对 king 和 queen 也是⽤⼀样的表⽰⽅法。在该例中,假设你⽤的是4维的嵌⼊向量,⽽不是⽐较典型的 50 到 1000 维的向量。这些向量有⼀个有趣的特性,就是假如
你有向量和,将它们进⾏减法运算,即
类似的,假如⽤和,最后也会得到⼀样的结果,即
这个结果表⽰, man 和 woman 主要的差异是 gender ( 性别)上的差异,⽽ king 和 queen之间的主要差异,根据向量的表⽰,也是 gender( 性别)上的差异,这就是为什么与结果是相同的。所以得出这种类⽐推理的结论的⽅法就是,当算法被问及 man 对 woman 相当于 king 对什么时,算法所做的就是计算,然后找出⼀个向量也就是找出⼀个词,使得,也就是说,当这个新词是 queen时,式⼦的左边会近似地等于右边。
计算当 man 对于 woman,那么 king 对于什么,能做的就是找到单词 w 来使得
这个等式成⽴,就是找到单词 w 来最⼤化与
的相似度,即
测算 与的相似度,我们最常⽤的相似度函数叫做余弦相似度。