引言
上图是使用one-hot向量表示词向量的一种方式,这种表示方式优点是方面简洁,但是缺点也很明显,就是词与词之间独立性太强,没有关联,这样使得算法对相关词的泛化能力不强。
举个例子,假如我们已经学习到了一个语言模型,当看到“I want a glass of orange ___”,下一个词会是什么?很可能是juice。即使学习算法已经学到了“I want a glass of orange juice”这样一个很可能的句子,但如果看到“I want a glass of apple ___”,因为算法不知道apple和orange的关系很接近,就像man和woman,king和queen一样。所以算法很难知道orange juice是一个常见的组合,从而不理解apple juice也是很常见的组合。其中的原因是:任何两个one-hot向量的内积都是0,因此很难区分词向量之间的差别和联系。
而词嵌入就是一种让模型理解词与词之间是存在某种关系的方式,让我们一起了解一下。
1.了解词嵌入
Man | Woman | King | Queen | Apple | Orange | |
Gender | -1 | 1 | -0.95 | 0.97 | 0.00 | 0.01 |
Royal | 0.01 | 0.02 | 0.93 | 0.95 | -0.01 | 0.00 |
Age | 0.03 | 0.02 | 0.7 | 0.69 | 0.03 | -0.02 |
...... | ...... | ...... | ...... | ...... | ...... | ...... |
Food | 0.09 | 0.01 | 0.02 | 0.01 | 0.96 | 0.97 |
假设考察这些词与Gender(性别)之间的关系,定义男性为-1,女性为1。那么Man就是-1,Woman就是1。King是国王,一般都是男性,因此可能为-0.95,Queen为女王,都是女性,因此为0.97。而Apple和Orange是水果,没有性别之谈。
如果考虑其他的特征,比如Royal(高贵)、Age(年龄)、Food(食物)等等,假设有300个特征,我们就可以得到300行,组成表格如上。那么每一个词向量都用300维的向量(表格列)表示,这样我们就得到了一种新的表示方式——词嵌入。
词嵌入方式考虑了词与词之间的关联性,使每一个词不再独立,学习算法很容易学习到这种关联性,从而是算法泛化效果更好。
注意:尽管最终学习到的特征向量很难解释和理解,但是词嵌入确实提高了算法的泛化效果,让算法发现apple和orange会比king和orange或queen和orange更加相似。
2.如何理解词嵌入
嵌入的意思就是:假设在300维的特征空间中,每个词都被嵌入了300维空间的某个位置。
假设我们使用t-SNE算法(一种可视化算法),把这300维的数据嵌入到一个二维空间里,就发现man和woman这些词聚集在一块(上图编号1所示),king和queen聚集在一块(上图编号2所示),这些都是人也都聚集在一起(上图编号3所示)。动物都聚集在一起(上图编号4所示),水果也都聚集在一起(上图编号5所示),像1、2、3、4这些数字也聚集在一起(上图编号6所示)。如果把这些生物看成一个整体,他们也聚集在一起(上图编号7所示)。
把一个词通过词嵌入的方式嵌入到特种空间的某个位置,这样相似或者关系相近的词在空间中的距离也就越近,这比one-hot编码方式效果更好。
3.使用词嵌入
用词嵌入作为输入训练识别人名的模型,训练集假如有一个句子:“Sally Johnson is an orange farmer.”(Sally Johnson是一个种橙子的农民),训练完模型后,如果有新的输入:“Robert Lin is an apple farmer.”(Robert Lin是一个种苹果的农民),因为orange和apple关系很相近,那么算法很容易就知道Robert Lin也是一个人的名字。但是如果遇到:“Robert Lin is a durian cultivator.”(Robert Lin是一个榴莲培育家)怎么办?在训练集里可能没有durian(榴莲)或者cultivator(培育家)这两个词。
不用担心,由于学习词嵌入的算法会考察非常大的文本集,可以是1亿个单词,甚至达到100亿也都是合理的。通过考察大量的无标签文本,可以发现orange(橙子)和durian(榴莲)相近,farmer(农民)和cultivator(培育家)相近。因此尽管只有一个很小的训练集,但是可以使用迁移学习,然后把这些知识迁移到一个任务中。
使用词嵌入做迁移学习的步骤:
(1)从大量的文本集中学习词嵌入,可以下载网上预训练好的词嵌入模型。
(2)将词嵌入模型迁移到自己的只有少量标注训练集的任务中。
(3)如果训练集很大,微调整词嵌入。
3.词嵌入特性
我们已经了解到词嵌入的概念和作用,词嵌入还有一个有意思的特性,就是做类比推理。比如由man和woman之间的关系推理出king和?有关系,我们很容易猜出来是king和queen,但是用算法怎么表示呢?一起来看一下:
3.1.向量作差
假设基于下面的词嵌入表,只有4个特征维度构成的词嵌入。
Man | Woman | King | Queen | Apple | Orange | |
Gender | -1 | 1 | -0.95 | 0.97 | 0.00 | 0.01 |
Royal | 0.01 | 0.02 | 0.93 | 0.95 | -0.01 | 0.00 |
Age | 0.03 | 0.02 | 0.7 | 0.69 | 0.03 | -0.02 |
Food | 0.09 | 0.01 | 0.02 | 0.01 | 0.96 | 0.97 |
把man和woman表示的向量作差:
把king和queen表示的向量作差:
比较两个结果会发现,它们的差都约等于右边的向量,这个结果表示man和woman之间的差异主要是性别Gender的差异,king和queen之间的差异也是性别的差异,由此我们可以得到,类比man对woman,可以推理出king对queen。因此可以用如下公式表示这个特性:
上式的w即为我们要找的单词。把上式变形,我们可以得到如下优化目标,表示寻找它们之间的最大相似度:
其中Sim()表示一种相似度函数,相似度函数有很多,常见的有:曼哈顿相似度、欧几里得相似度、皮尔森相关系数、余弦相似度等等。
注意:通过这种方法来做类比推理准确率大概只有30%~75%,只要算法猜中了单词,就把该次计算视为正确,从而计算出准确率。
3.2.余弦相似度
这里列举一种计算语义相似度最常用的一种方式:余弦相似度,公式如下:
当两个向量非常相似时(正相关),它们的夹角接近0度,此时相似度约等于1。当两个向量完全无关时(无关),它们的夹角为90度,相似度等于0。当两个向量相似但特性相反时(负相关),夹角为180度,相似度等于-1。关系图如下:
注意:从学术上来说,比起测量相似度,这个函数更容易测量的是相异度,所以我们通常需要对其取负,但究竟是否取负,根据实际需求来决策。
4.嵌入矩阵
嵌入矩阵就是词嵌入得到的那个表格,把那个表格表示成矩阵,就是嵌入矩阵E。如下为6.3.1表表示的嵌入矩阵E:
现在如果我们想取某个词的词向量,可以用这个词的one-hot向量和矩阵做乘法,由于矩阵是4*6,而one-hot向量是6*1,因此得到的结果是4*1,而one-hot向量只有这个词的位置是1,其他全是0,因此最终可以得到4*1的词向量,即E中的这个词对应的一列。计算流程如下:
上图表示从嵌入矩阵取woman对应的词向量的过程,也就是j=2,O表示one-hot向量。
注意:由于one-hot向量只有一个1,其余全是0,用矩阵乘法做运算效率太低,而one-hot向量实际作用是取嵌入矩阵对应的一列,因此实际中我们一般使用专门的函数查找某一列。