上一篇文章5-1 Coursera吴恩达《序列模型》 第一周课程笔记-循环序列网络(RNN)我们主要介绍了循环神经网络(RNN)的基本概念、模型和具体应用。欢迎来到第二周,今天开始《序列模型》第二周的课程笔记:自然语言处理和词嵌入。接下来我们开始吧。
目录
《2.1词汇表征》Word Representation
《2.2使用词嵌入》Using Word Embeddings
《2.3词嵌入的特性》Properties of Word Embeddings
《2.4嵌入矩阵》Embedding Matrix
《2.5学习词嵌入》Learning Word Embeddings
《2.6Word2Vec》Word2Vec
《2.7负采样》Negative Sampling
《2.8GloVe 词向量》GloVe Word Vectors
《2.9情感分类》Sentiment Classification
《2.10词嵌入除偏》Debiasing Word Embeddings
(课程引入)上周我们学习了RNN、GRU单元和LSTM单元。本周我们把这些知识用到NLP上,用于自然语言处理,深度学习已经给这一领域带来了革命性的变革。自然语言处理中一个很关键的概念就是词嵌入(word embeddings),这是语言表示的一种方式,可以让算法自动的理解一些类似的词,比如男人对女人,比如国王对王后,还有其他很多的例子。通过词嵌入的概念我们可以构建NLP应用了,即使模型标记的训练集相对较小。这周的最后我们会消除词嵌入的偏差,就是去除不想要的特性,或者学习算法有时会学到的其他类型的偏差。让我们开始吧。
目前为止我们一直都是用词汇表(vocabulary)来表示词,词汇表可能是10000个单词,我们一直用one-hot向量来表示词。比如man在词典里是第5391个,那么就可以表示成一个向量,只在第5391处为1,我们用O_5391代表这个量,这里的O代表one-hot。接下来,如果woman是编号9853,那么就可以用O_9853来表示,这个向量只在9853处为1,其他为0,其他的词king、queen、apple、orange都可以这样表示出来,这种表示方法的一大缺点(weakness)就是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强。
举个例子,假如我们已经学习到了一个语言模型,当你看到“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,如果你取两个向量,比如king和queen,然后计算它们的内积,结果就是0。如果用apple和orange来计算它们的内积,结果也是0。很难区分它们之间的差别,因为这些向量内积都是一样的,所以无法知道apple和orange要比king和orange,或者queen和orange相似地多。
换一种方式表示会更好,如下图所示:
如果我们不用one-hot表示,而是用特征化的表示(learn a featurized representation)来表示每个词,man,woman,king,queen,apple,orange或者词典里的任何一个单词,我们学习这些词的特征或者数值。
对于这些词,(1)比如第一个特征是性别(Gender)。假定男性的性别为-1,女性的性别为+1,那么man的性别值可能就是-1,而woman就+1。最终根据经验king就是-0.95,queen是+0.97,apple和orange没有性别可言。
(2)另一个特征可以是这些词有多高贵(Royal),man,woman和高贵没太关系,所以它们的特征值接近0。而king和queen很高贵,取值更大一些,apple和orange跟高贵也没太大关系。
(3)那么年龄(Age)呢?man和woman一般没有年龄的意思,也许man和woman隐含着成年人的意思,但也可能是介于young和old之间,所以它们(man和woman)的值也接近0。而通常king和queen都是成年人,apple和orange跟年龄更没什么关系了。
(4)还有一个特征,这个词是否是食物(Food),man不是食物,woman不是食物,king和queen也不是,但apple和orange是食物。
当然还可以有很多的其他特征,从尺寸大小(Size),花费多少(Cost),这个东西是不是活的(Alive),是不是一个动作(Action),或者是不是名词(Noun)或者是不是动词(Verb),还是其他的等等。
在这里我们假设有300个不同的特征,这样的话你就有了这一列数字(上图蓝色竖框),有一个300维的向量来表示man这个词。用符号e_5391来表示。同样用这个300维的向量用来表示woman这个词,符号为e_9853,这些其他的例子也一样。现在,如果用这种表示方法来表示apple和orange这些词,那么apple和orange的这种表示会非常相似。这样对于已经知道orange juice的算法很大几率上也会明白apple juice这个东西,这样对于不同的单词算法会泛化的更好。
接下来的讲解中有一种学习词嵌入的方式,现在只需要理解这种高维特征的表示能够比one-hot更好的表示不同的单词。而我们最终学习的特征不会像这里一样这么好理解,新的特征表示的东西肯定会更难搞清楚。尽管如此,接下来要学的特征表示方法却能使算法高效地发现apple和orange会比king和orange,queen和orange更加相似。
如果我们能够学习到一个300维的特征向量(词嵌入),通常我们可以把这300维的数据嵌入到一个二维空间里实现可视化。常用的可视化算法是t-SNE算法,来自于Laurens van der Maaten 和 Geoff Hinton的论文。
如上图,如果观察这种词嵌入的表示方法,我们看到man和woman这些词聚集在一块,king和queen聚集在一块,表示人的单词也都聚集在一起。动物都聚集在一起,水果也都聚集在一起,像1、2、3、4这些数字也聚集在一起。如果把这些生物看成一个整体,他们也聚集在一起。
就整体而言,这种词嵌入算法(word embeddings algorithms)对于相近的概念,学到的特征也比较类似,在对这些概念可视化的时候,最终把它们映射为相似的特征向量。这种表示方式用的是在300维空间里的特征表示,这叫做嵌入(embedding)。之所以叫嵌入的原因是,你可以想象一个300维的空间,这里用个3维的代替。现在取每一个单词比如orange,它对应一个3维的特征向量,所以这个词就被嵌在这个300维空间里的一个点上了,apple这个词就被嵌在这个300维空间的另一个点上。为了可视化,t-SNE算法把这个空间映射到低维空间,也可以画出一个2维图像然后观察,这就是这个术语嵌入的来源。
词嵌入已经是NLP领域最重要的概念之一了,在自然语言处理领域。本节视频中我们已经知道为什么要学习或者使用词嵌入了,下节视频我们会深入讲解如何用这些算法构建NLP算法。
上一个视频中,我们已经了解不同单词的特征化表示(featurized representations)了。这节将看到我们如何把这种表示方法应用到NLP应用中。
如上图所示,我们用命名实体识别(named entity recognition)的例子,假如有一个句子:“Sally Johnson is an orange farmer.”(Sally Johnson是一个种橙子的农民),Sally Johnson是一个人名,所以这里的输出为1。之所以能确定Sally Johnson是一个人名而不是一个公司名,是因为你知道种橙子的农民一定是一个人。
如果用特征化表示方法,将词嵌入向量输入训练好的模型,如果你看到一个新的输入:“Robert Lin is an apple farmer.”(Robert Lin是一个种苹果的农民),因为知道orange和apple很相近,那么你的算法很容易得出Robert Lin也是一个人。那么对于不常见的单词,如这句话:“Robert Lin is a durian cultivator.”(Robert Lin是一个榴莲培育家)怎么办?榴莲(durian)是一种比较稀罕的水果,这种水果在新加坡和其他一些国家流行。如果对于一个命名实体识别任务,你只有一个很小的标记的训练集,里面甚至可能没有durian(榴莲)或者cultivator(培育家)这两个词。但是如果你有一个已经学好的词嵌入,它会告诉你durian(榴莲)也是水果,就像orange(橙子),并且cultivator(培育家),做培育工作的人其实跟farmer(农民)差不多,那么你就有可能从你的训练集里的“an orange farmer”(种橙子的农民)推断出“a durian cultivator”(榴莲培育家)也是一个人。
词嵌入能够达到上述效果,因为学习词嵌入的算法会考察非常大的文本集(very large text corpuses),可以从网上找到,因此数据集可以是1亿个单词,甚至达到100亿。通过大量无标签文本的训练集,学习这种嵌入表达,可以发现orange(橙子)和durian(榴莲)相近,都是水果,farmer(农民)和cultivator(培育家)相近。尽管你只有一个很小的训练集,也许训练集里有100,000个单词,甚至更小,这就使得你可以使用迁移学习(transfer learning),把从互联网上免费获得的大量的无标签文本中学习到的知识迁移到一个任务中,比如只有少量标记的训练数据集的命名实体识别任务中。这里为了简化Andrew只画了单向的RNN,事实上在命名实体识别任务中应该用一个双向的RNN,而不是这样一个简单的。
如下图我们总结一下用词嵌入做迁移学习的步骤。
(1)第一步,先从大量的文本集中学习词嵌入(一个非常大的文本集)或者可以下载网上预训练好的词嵌入模型。
(2)第二步,你可以用这些词嵌入模型把它迁移到你的新的只有少量标注训练集的任务中,比如说用这个300维的词嵌入来表示你的单词。这样做的一个好处就是你可以用更低维度的特征向量代替原来的10000维的one-hot向量,可以用一个300维更加紧凑的向量。尽管one-hot向量很快计算,而学到的用于词嵌入的300维的向量会更加紧凑。
(3)第三步,当你在你新的任务上训练模型时,在你的命名实体识别任务上,只有少量的标记数据集上,你可以自己选择要不要继续微调(fine-tune),用新的数据调整词嵌入。实际中,只有这个第二步中有很大的数据集你才会这样做,如果你标记的数据集不是很大,通常Andrew不会在微调词嵌入上费力气。
当你的任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域。例如,在命名实体识别,用在文本摘要(text summarization),用在文本解析(co-reference resolution)、指代消解(parsing),这些都是非常标准的NLP任务。
词嵌入在语言模型、机器翻译领域用的少一些,尤其是你做语言模型或者机器翻译任务时,这些任务你有大量的数据。
最后,注意词嵌入和人脸编码之间有奇妙的关系。看下面这张幻灯片。
在之前的学习中,对于人脸识别我们训练了一个Siamese网络结构,这个网络会学习不同人脸的一个128维表示,然后通过比较编码结果来判断两张图片是否是同一个人脸,这个词嵌入的意思和这个差不多。在人脸识别领域一般用编码来指代这些向量f(x^(i))和f(x^(j))。人脸识别和词嵌入有个不同之处就是在人脸识别中我们训练一个网络,任给一个人脸照片,甚至是没有见过的照片,神经网络都会计算出相应的一个编码结果;而学习词嵌入则是有一个固定的词汇表,学习一个固定的编码,每一个词汇表的单词的固定嵌入。这里的术语编码(encoding)和嵌入(embedding)可以互换。区别不是因为术语不一样,而是人脸识别中的算法未来可能涉及到海量的人脸照片,而自然语言处理有一个固定的词汇表,而像一些没有出现过的单词我们就记为未知单词(unknown word)。
这节视频里,我们看到如何用词嵌入来实现这种类型的迁移学习,并且通过替换原来的one-hot表示,使用嵌入的向量,算法会泛化的更好,也可以从较少的标记数据中进行学习。接下来会学习一些词嵌入的特性,这之后再讨论学习这些词嵌入的算法。下个视频我们会看到词嵌入在做类比推理中发挥的作用。
词嵌入还有一个迷人的特性就是它还能帮助实现类比推理(analogy reasoning),尽管类比推理(reasonable analogies)可能不是自然语言处理应用中最重要的,不过它能帮助人们理解词嵌入做了什么,以及词嵌入能够做什么,让我们来一探究竟。
如上图,这是一系列词嵌入可以捕捉的单词的特征表示,假如提出一个问题,man如果对应woman,那么king应该对应什么?我们应该都能猜到king应该对应queen。能否有一种算法来自动推导出这种关系,下面就是实现的方法。
用一个四维向量e_5391来表示man,也称为e_man,同样表示woman的嵌入向量称为e_woman,对king和queen也是一样的表示方法。对向量e_man和e_woman进行减法运算(minus),即
类似地,用e_king减去e_queen,也有一样的结果,即
这个结果表示,man和woman主要的差异是gender(性别)上的差异,而king和queen之间的主要差异,根据向量的表示,也是gender(性别)的差异。这种思想首先是被Tomas Mikolov 和 Wen-tau Yih还有Geoffrey Zweig提出的,参考论文的链接为:Linguistic regularities in continuous space word representations。这是词嵌入领域影响力最为惊人和显著的成果之一,这种思想帮助了研究者们对词嵌入领域建立了更深刻的理解。
接下来我们正式探讨如何把这种思想写成算法。
如上图所示,词嵌入向量在一个可能有300维的空间里,于是单词man代表的就是空间中的一个点,另一个单词woman代表空间另一个点,单词king也代表一个点,还有单词queen也在另一点上。事实上,我们在上个幻灯片所展示的就是向量man和woman的差值非常接近于向量king和queen之间的差值,如上图的箭头代表的就是向量在gender(性别)这一维的差,不过这些点是在300维的空间里。为了得出这样的类比推理,计算当man对于woman,那么king对于什么,你能做的就是找到单词w来使得下面的等式成立:
我们需要找到单词w来最大化e_w和e_king-e_man+e_woman的相似度,即
我们有一些用于测算e_w和e_king-e_man+e_woman的相似度的函数,然后通过方程(equation)找到一个使得相似度最大的单词,如果结果理想的话会得到单词queen。
在继续下一步之前,再说明一下(上图右上方所示),在之前我们谈到过用t-SNE算法来实现单词可视化。t-SNE算法所做的就是把这些300维的数据用一种非线性的方式(non-linear way)映射到2维平面上,可以得知t-SNE中这种映射很复杂而且很非线性。在进行t-SNE映射后,我们不能总期望使等式成立的关系,会像左边那样成一个平行四边形,尽管在这个例子最初的300维的空间内你可以依赖这种平行四边形(parallelogram)的关系来找到使等式成立的一对类比,通过t-SNE算法映射出的图像可能是正确的。但在大多数情况下,由于t-SNE的非线性映射,于是没法再指望这种平行四边形了,很多这种平行四边形的类比关系在t-SNE映射中都会失去原貌。
现在,快速地列举一个最常用的相似度函数,叫做余弦相似度(cosine similarity)。
如上图所示,在余弦相似度中,假如在向量u和v之间定义相似度:
分子是u和v的内积,u的转置乘以v(u transpose v divided),如果u和v非常相似,那么它们的内积将会很大。分母是u和v的欧氏距离(Euclidean lengths)。
把整个式子叫做余弦相似度,其实就是因为该式是u和v的夹角的余弦值,所以这个夹角就是Φ角(phi),这个公式实际就是计算两向量夹角Φ角的余弦。在微积分中,Φ角的余弦图像是递减的,所以夹角为0度时,余弦相似度就是1,当夹角是90度角时余弦相似度就是0,当它们是180度时,图像完全跑到了相反的方向,这时相似度等于-1,这就是为什么余弦相似度对于类比工作能起到非常好的效果。
如果你想的话,距离也可以用平方距离或者欧氏距离来表示:
从学术上来说,比起测量相似度,这个函数更容易测量的是相异度(dissimilarity),所以对其取负,这个函数才能正常工作。不过Andrew还是觉得余弦相似度用得多,这两者的主要区别是它们对u和v之间的距离标准化的方式不同。
词嵌入的一个显著成果就是,可学习的类比关系的一般性。举个例子,它能学会man对于woman相当于boy对于girl,因为man和woman之间和king和queen之间,还有boy和girl之间的向量差在gender(性别)这一维都是一样的。它还能学习Canada(加拿大)的首都是Ottawa(渥太华),而渥太华对于加拿大相当于Nairobi(内罗毕)对于Kenya(肯尼亚),这些都是国家中首都城市名字。它还能学习big对于bigger相当于tall对于taller,还能学习Yen(円)对于Janpan(日本),円是日本的货币单位(currency),相当于Ruble(卢比)对于Russia(俄罗斯)。这些东西都能够学习,只要你在大型的文本语料库上实现一个词嵌入学习算法,只要从足够大的语料库中进行学习,它就能自主地发现这些模式。
在本节视频中,我们见到了词嵌入是如何被用于类比推理的,可能你不会自己动手构建一个类比推理系统作为一项应用,不过希望在这些可学习的类特征的表示方式能够给你一些直观的感受。还知道了余弦相似度可以作为一种衡量两个词嵌入向量间相似度的办法。下节视频中,我们来讨论如何真正的学习这些词嵌入。
接下来我们要将学习词嵌入这一问题具体化,当你应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵(embedding matrix),我们来看一下这是什么意思。
和之前一样,假设我们的词汇表含有10,000个单词,词汇表里有a,aaron,orange,zulu,可能还有一个未知词标记UNK。我们要做的就是学习一个嵌入矩阵E,它将是一个300×10,000的矩阵,如果使用的词汇表里有10,000个,或者加上未知词就是10,001维。这个矩阵的各列代表的是词汇表中10,000个不同的单词所代表的不同向量。假设orange的单词编号是6257,代表词汇表中第6257个单词,我们用符号O_6257来表示这个one-hot向量,这个向量除了第6527个位置上是1,其余各处都为0,显然它是一个10,000维的列向量,它只在一个位置上有1,它的高度和左边的嵌入矩阵的宽度(行数)相等。
假设用嵌入矩阵E去乘以O_6257,那么就会得到一个300维的向量,E是300×10,000的,O_6257是10,000×1的,所以它们的积是300×1的,即300维的向量。以此类推,直到你得到这个向量剩下的所有元素。得到的300维向量我们记为e_6257,这个符号是我们用来表示这个300×1的嵌入向量(embedding vector)的,它表示的单词是orange。
在这一小节中,要记住我们的目标是学习一个嵌入矩阵E。在下节视频中你将会随机地初始化矩阵E,然后使用梯度下降法来学习这个300×10,000的矩阵中的各个参数,E乘以one-hot向量会得到嵌入向量。但当你动手实现时,用大量的矩阵和向量相乘来计算它,效率是很低下的,因为one-hot向量是一个维度非常高的向量,并且几乎所有元素都是0,所以矩阵向量相乘效率太低。所以在实践中你会使用一个专门的函数(function)来单独查找矩阵E的某列,而不是用通常的矩阵乘法来做,但是在画示意图时(上图所示,即矩阵E乘以one-hot向量示意图),这样写比较方便。例如Keras中就有一个嵌入层(embedding layer),然后我们用这个嵌入层更有效地从嵌入矩阵中提取出你需要的列,而不是对矩阵进行很慢很复杂的乘法运算。
在本视频中我们见到了在学习嵌入向量的过程中用来描述这些算法的符号(notations)以及关键术语(key terminology),矩阵E它包含了词汇表中所有单词的嵌入向量。在下节视频中,我们将讨论学习矩阵E的具体算法。
在本节视频中,你将要学习一些具体的算法来学习词嵌入(learning word embeddings)。从稍微复杂一些的算法开始,因为Andrew觉得这样更容易对算法的运作方式有一个更直观的了解,之后我们会对这些算法进行简化,使你能够明白即使一些简单的算法也能得到非常好的结果,我们开始吧。
假如你在构建一个语言模型(language model),并且用神经网络(neural network)来实现这个模型。于是在训练过程中,你可能想要你的神经网络能够做到比如输入:“I want a glass of orange ___.”,然后预测这句话的下一个词。在每个单词下面,都写上了这些单词对应词汇表中的索引。实践证明,建立一个语言模型是学习词嵌入的好方法,Andrew提出的这些想法是源于Yoshua Bengio,Rejean Ducharme,Pascal Vincent,Rejean Ducharme,Pascal Vincent还有Christian Jauvin的这篇论文:A neural probabilistic language model。
下面将介绍如何建立神经网络来预测序列中的下一个单词,首先为这些词列一个表格,每个词都用一个one-hot向量表示。然后生成一个参数矩阵E,用E乘以one-hot向量,得到嵌入向量。于是现在你有许多300维的嵌入向量。我们能做的就是把它们全部放进神经网络中,经过神经网络以后再通过softmax层,这个softmax也有自己的参数,然后这个softmax分类器会在10,000个可能的输出中预测结尾这个单词。假如说在训练集中有juice这个词,训练过程中softmax的目标就是预测出单词juice,就是结尾的这个单词。隐藏层有自己的参数,这里用W^[1]和b^[1]来表示,这个softmax层也有自己的参数W^[2]和b^[2]。如果它们用的是300维大小的嵌入向量,而这里有6个词,所以用6×300,所以这个输入(input)会是一个1800维的向量,这是通过将这6个嵌入向量堆在一起得到的。
如上图,实际上更常见的是有一个固定的历史窗口。举个例子,你总是想预测给定四个单词(上图紫色标记)后的下一个单词,注意这里的4是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词,所以说我只用这4个单词(a,glass,of,orange)而不去看这几个词(上图红色标记)。如果你一直使用一个4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到这个层中,然后再通过softmax来预测输出,选择有很多种,用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。所以这个模型的参数就是矩阵E,对所有的单词用的都是同一个矩阵E,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似然(maximize the likelihood of your training set),通过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。
事实上通过这个算法能很好地学习词嵌入,原因是,如果你还记得我们的orange jucie,apple juice的例子,在这个算法下,apple和orange会学到很相似的嵌入,这样做能够让算法更好地拟合训练集,因为它有时看到的是orange juice或者apple juice。如果你只用一个300维的特征向量来表示所有这些词,算法会发现要想最好地拟合训练集,就要使apple(苹果)、orange(橘子)、grape(葡萄)和pear(梨)等等,还有像durian(榴莲)这种很稀有的水果都拥有相似的特征向量。
这就是早期最成功的学习词嵌入,学习这个矩阵E的算法之一。现在我们先概括一下这个算法,看看我们该怎样来推导出更加简单的算法。
如上图所示,Andrew用一个更复杂的句子作为例子来解释这些算法,假设在训练集中有这样一个更长的句子:“I want a glass of orange juice to go along with my cereal.”。我们在上个幻灯片看到的是算法预测出了某个单词juice,我们把它叫做目标词(target word)(上图蓝色标记所示),它是通过一些上下文,(1)在本例中也就是这前4个词(上图蓝色标记所示)推导出来的。如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文。
(2)比如说,它的上下文是左边和右边的四个词(4 words on left & right),你可以把目标词左右各4个词作为上下文(上图紫色标记所示)。算法获得左边4个词,也就是a glass of orange,还有右边四个词to go along with,然后要求预测出中间这个词。提出这样一个问题,这个问题需要将左边的还有右边这4个词的嵌入向量提供给神经网络,就像我们之前做的那样来预测中间的单词是什么,来预测中间的目标词,这也可以用来学习词嵌入。
(3)或者你想用一个更简单的上下文,也许只提供目标词的前一个词(last 1 word),比如只给出orange这个词来预测orange后面是什么(上图绿色标记所示),这将会是不同的学习问题。只给出一个词orange来预测下一个词是什么,你可以构建一个神经网络,只把目标词的前一个词或者说前一个词的嵌入向量输入神经网络来预测该词的下一个词。
(4)还有一个效果非常好的做法就是上下文是附近一个单词(nearby 1 word),它可能会告诉你单词glass(上图红色标记所示)是一个邻近的单词。或者说我看见了单词glass,然后附近有一个词和glass位置相近,那么这个词会是什么?这就是用附近的一个单词作为上下文。我们将在下节视频中把它公式化,这用的是一种Skip-Gram模型的思想。这是一个简单算法的例子,因为上下文相当的简单,比起之前4个词,现在只有1个,但是这种算法依然能工作得很好。
研究者发现,(1)如果你真想建立一个语言模型,用目标词的前几个单词(last few words)作为上下文是常见做法(上图蓝色标记所示)。(2)但如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文(后面三种类型),它们也能得到很好的词嵌入。Andrew会在下节视频详细介绍这些,我们会谈到Word2Vec模型。
总结一下,在本节视频中你学习了语言模型问题,模型提出了一个机器学习问题,即输入一些上下文,例如目标词的前4个词然后预测出目标词,学习了提出这些问题是怎样帮助学习词嵌入的。在下节视频,你将看到如何用更简单的上下文和更简单的算法来建立从上下文到目标词的映射,这将让你能够更好地学习词嵌入,一起进入下节视频学习Word2Vec模型。
在上个视频中我们已经见到了如何学习一个神经语言模型来得到更好的词嵌入,在本视频中将会见到Word2Vec算法,这是一种简单而且计算时更加高效的方式来学习这种类型的嵌入,让我们来看看。
本视频中的大多数的想法来源于Tomas Mikolov,Kai Chen,Greg Corrado 和 Jeff Dean。
(Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.)
如上图,假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的n个单词。我们要的做的是随机选一个词作为上下文词(context),比如选orange,然后随机在一定词距内选另一个词,比如在上下文词前后5个词内或者10个词内,我们就在这个范围内选择目标词。可能你正好选到了juice作为目标词,正好是下一个词(表示orange的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是glass,还可能正好选到了单词my作为目标词。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。显然,这不是个非常简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。
接下来说说模型的细节(details)。
假设使用一个10,000词的词汇表,我们要解决的基本的监督学习问题是学习一种映射关系,从上下文c,比如单词orange,到某个目标词,记为t,可能是单词juice或者单词glass或者单词my。在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出y的输入x。
回忆之前的表示方式,对上下文词而言,将嵌入矩阵E乘以one-hot向量O_c,得到嵌入向量e_c,表达式为:
在这个神经网络中,把向量e_c喂给一个softmax单元,Andrew通常把softmax单元画成神经网络中的一个节点(node),softmax单元要做的就是输出y帽。这是softmax模型,预测不同目标词的概率:
这是常用的softmax损失函数,y就是只有一个1其他都是0的one-hot向量,如果目标词是juice,那么第4834个元素就是1,其余是0。类似的y帽是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率(probabilities)。
总结一下(上图绿色标记),这大体上就是一个可以找到词嵌入的简化模型和神经网络,其实就是个softmax单元。矩阵E将会有很多参数,所以矩阵E有对应所有嵌入向量e_c的参数,softmax单元也有θ_t的参数。如果优化这个关于所有这些参数的损失函数,会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。
实际上使用这个算法会遇到一些问题,首要的问题就是计算速度(computational speed)。
如上图所示,尤其是在softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。
这里有一些解决方案,在一些文献中你会看到如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。
在文献中你会看到的方法是使用一个分级(hierarchical)的softmax分类器,意思就是说不是一下子就确定到底是属于10,000类中的哪一类。想象如果你有一个分类器,它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假如这个二分类器告诉你这个词在前5000个词中,然后第二个分类器会告诉你这个词在词汇表的前2500个词中,或者在词汇表的第二组2500个词中,诸如此类,直到最终你找到一个词准确所在的分类器,那么就是这棵树的一个叶子节点。像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的10,000个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比,而不是词汇表大小的线性函数,这个就叫做分级softmax分类器。
需要注意的是,在实践中分级softmax分类器不会使用一棵完美平衡的分类树或者说一棵左边和右边分支的词数相同的对称树(symmetric tree)。实际上,分级的softmax分类器会被构造成常用词在顶部,然而不常用的词像durian会在树的更深处,因为你想更常见的词会更频繁,所以你可能只需要少量检索就可以获得常用单词像the和of。然而你更少见到的词比如durian就更合适在树的较深处,因为你一般不需要到那样的深处,所以有不同的经验法则可以帮助构造分类树形成分级softmax分类器。所以这是你能在文献中见到的一个加速softmax分类的方法,但是Andrew不会再花太多时间在这上面了,你可以从我在第一张幻灯片中提到的Tomas Mikolov等人的论文中参阅更多的细节。因为在下个视频中,我们会讲到另一个方法叫做负采样(negative sampling),感觉这个会更简单一点,对于加速softmax和解决需要在分母中对整个词汇表求和的问题也很有作用,下个视频中你会看到更多的细节。
但是在进入下个视频前,思考怎么对上下文c进行采样(sample),一旦你对上下文c进行采样,那么目标词t就会在上下文c的正负10个词距内进行采样。但是你要如何选择上下文c?(1)一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像the、of、a、and、to诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像orange、apple或durian就不会那么频繁地出现了。你可能不会想要你的训练集都是这些出现得很频繁的词,因为这会导致你花大部分的力气来更新这些频繁出现的单词的e_c,但你想要的是花时间来更新像durian这些更少出现的词的嵌入,即e_durian。实际上词p(c)的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。
这就是Word2Vec的Skip-Gram模型,如果你读过我之前提到的论文原文,你会发现那篇论文实际上有两个不同版本的Word2Vec模型,Skip-Gram只是其中的一个,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),它获得中间词两边的的上下文,然后用周围的词去预测中间的词,这个模型也很有效,也有一些优点和缺点。
总结来讲:CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。而刚才讲的Skip-Gram模型,关键问题在于softmax这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。通常情况下,Skip-Gram模型用到更多点。在下个视频中,我会展示给你一个算法,它修改了训练目标使其可以运行得更有效,因此它可以让你应用在一个更大的训练集上面,也可以学到更好的词嵌入。
在上个视频中,我们见到了Skip-Gram模型如何构造一个监督学习任务,把上下文映射到了目标词上,它如何学到一个实用的词嵌入(word embedding)。但是它的缺点(downside)就在于softmax计算起来很慢。
在本视频中,将会介绍一个改善过的学习问题叫做负采样(negative sampling),它能做到与Skip-Gram模型相似的事情,但是用了一个更加有效的学习算法,让我们来看看这是怎么做到的。
在本视频中大多数的想法源于Tomas Mikolov,Ilya Sutskever,Kai Chen,Greg Corrado 和 Jeff Dean的这篇论文:Distributed Representations of Words and Phrases and their Compositionality。
如上图,我们在这个算法中要做的是构造一个新的监督学习问题,那么问题就是给定一对单词,比如orange和juice,我们要去预测这是否是一对上下文词-目标词(context-target)。
在这个例子中orange和juice就是个正样本(标为1),那么orange和king就是个负样本(标为0)。我们要做的就是采样得到一个上下文词和一个目标词,把中间这列(juice,king,book....)叫做词(word)。生成样本的步骤:先抽取一个上下文词,然后在一定词距内比如说正负10个词距内选一个目标词,①这就是生成这个表的第一行,即orange– juice -1的过程。②然后为了生成一个负样本,用相同的上下文词,再在字典中随机选一个词,在这里随机选了单词king,标记为0。③以此类推,再随机选一个词,于是orange–book–0。④我们再选点别的,orange可能正好选到the,然后是0。⑤还是orange,再可能正好选到of这个词,把这个标记为0,注意of被标记为0,即使of的确出现在orange词的前面。
总结一下,生成这些数据的方式是我们选择一个上下文词(orange),再选一个目标词(juice),这(上图绿色横框)就是表的第一行,它给了一个正样本(上下文,目标词,标签为1)。然后我们要做的是给定几次,比如K次。如果我们从字典中随机选到的词,正好出现在了词距内,比如说在上下文词orange正负10个词之内,也没事。
接下来我们将构造一个监督学习问题,其中学习算法输入x,输入这对词(context-word),要去预测目标的标签,即预测输出y(0或者1)。因此问题就是给定一对词,像orange和juice,你觉得它们会一起出现么?你觉得这两个词是通过对靠近的两个词采样获得的吗?这个算法就是要分辨这两种不同的采样方式,这就是如何生成训练集的方法。
那么如何选取K?Mikolov等人推荐小数据集的话,K从5到20比较好。如果数据集很大,K就选小一点。对于更大的数据集K选2到5,数据集越小K就越大(larger values of K for smaller data sets)。那么在这个例子中,我们就用K = 4。
下面我们讲解从x映射到y的监督学习模型,如下:
如上图,首先介绍softmax模型,公式如下:
用记号c表示上下文词(context-word),记号t表示可能的目标词(target),用y表示0和1,表示是否是一对上下文-目标词。我们要做的就是定义一个逻辑回归模型,给定输入的c,t对的条件下,y = 1的概率,即:
这个模型基于逻辑回归模型,对每一个可能的目标词有一个参数向量θ_t和另一个参数向量e_c,即每一个可能上下文词的的嵌入向量,用这个公式估计y = 1的概率。如果你有K个样本,你可以把这个看作1/K的正负样本比例,即每一个正样本你都有K个对应的负样本来训练一个类似逻辑回归的模型。
在神经网络中,输入one-hot向量,再传递给E,通过两者相乘得到嵌入向量,这样转化为10,000个可能的逻辑回归分类问题,预测词汇表中这些可能的单词。把这些看作10,000个二分类逻辑回归分类器,但并不是每次迭代都训练全部10,000个,我们只训练其中的5个,我们要训练对应真正目标词那一个分类器,再训练4个随机选取的负样本,这就是K = 4的情况。不使用一个巨大的10,000维度的softmax是因为计算成本很高,而是把它转变为10,000个二分类问题,每个都很容易计算,每次迭代我们要做的只是训练它们其中的5个,一般而言就是 K + 1个,其中K个负样本和1个正样本。这个算只需更新K + 1个逻辑单元,K + 1个二分类问题,相对而言每次迭代的成本比更新10,000维的softmax分类器成本低。
这个技巧就叫负采样。你有一个正样本词orange和juice,然后你会特意生成一系列负样本,所以叫负采样,即用这4个负样本训练,4个额外的二分类器,在每次迭代中你选择4个不同的随机的负样本词去训练你的算法。
这个算法有一个重要的细节就是如何选取负样本,即在选取了上下文词orange之后,你如何对这些词进行采样生成负样本?
(1)一个办法是对中间的这些词进行采样,即候选的目标词,根据其在语料中的经验频率(empirical frequency)进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在like、the、of、and诸如此类的词上有很高的频率。(2)另一个极端就是用1除以词汇表总词数,即1/|v|,均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。(3)所以论文的作者Mikolov等人根据经验,他们发现这个经验值的效果最好,它位于这两个极端的采样方法之间,既不用经验频率,也就是实际观察到的英文文本的分布,也不用均匀分布,他们采用以下方式:
上式的f(w_i)是观测到的在语料库中的某个英文词的词频(frequency of the word),通过3/4次方(the power of three-fourths)的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。Andrew并不确定这是否有理论证明,但是很多研究者现在使用这个方法,似乎也效果不错。
总结一下,我们已经知道了在softmax分类器中如何学到词向量,但是计算成本很高。在这个视频中,可以通过将其转化为一系列二分类问题来有效地学习词向量。当然和深度学习的其他领域一样,有很多开源的实现,当然也有预训练过的词向量,就是其他人训练过的然后授权许可发布在网上的,所以如果想要在NLP问题上取得进展,去下载其他人的词向量是很好的方法,在此基础上改进。
Skip-Gram模型就介绍到这里,在下个视频中,会讲解另一个版本的词嵌入学习算法GloVe,而且这可能比我们之前看到的都要简单。
目前为止我们已经了解了几个计算词嵌入的算法,另一个在NLP社区有着一定势头的算法是GloVe算法,这个算法并不如Word2Vec或是Skip-Gram模型用的多,但是也有人热衷于它,Andrew认为可能是因为它简便(its simplicity)吧,我们来看看这个算法。
Glove算法是由Jeffrey Pennington,Richard Socher和Chris Manning发明的,具体可从参考论文:Glove: Global Vectors for Word Representation。
GloVe指用词表示的全局变量(global vectors for word representation)。之前,我们列举过上下文和目标词词对,GloVe算法就是使其关系开始明确化。假定X_ij表示单词i在单词j上下文中出现的次数,那么i和j与t和c的功能一样,所以X_ij等同于X_tc。事实上,如果你将上下文和目标词的范围定义为出现于左右各10词以内的话,有一种对称关系(symmetric relationship)。如果你选择的上下文总是目标词前一个单词的话,那么X_ij和X_ji就不对称。不过对于GloVe算法,我们可以定义上下文和目标词为任意两个位置相近的单词,假设是左右各10词的距离,那么X_ij就是一个能够获取单词i和单词j出现位置相近时或是彼此接近的频率的计数器。
GloVe模型做的就是进行优化,下面具体来看看。
我们将他们之间的差距进行最小化处理:
我们想要知道的是这两个单词之间有多少联系,他们同时出现的频率,这是由这个X_ij影响的。然后,我们要做的是解决参数θ和e的问题,可用梯度下降来最小化上面的公式,只需要学习一些向量,这样他们的输出能够对这两个单词同时出现的频率进行良好的预测。
如果X_ij是等于0的话,那么log0是负无穷大的,于是约定0log0=0。上面的求和公式表明,这个和仅是一个上下文和目标词关系里连续出现至少一次的词对的和。
f(X_ij)的另一个作用是加权,有些词在英语里词频较高,比如说this,of,a等等,但是在频繁词和不常用词之间也会有一个连续统(continuum)。不过也有一些不常用的词,我们还是想将其考虑在内,但又不像那些常用词这样频繁。
因此,f(X_ij)就可以是一个加权因子,对于不常用的词同样给大量有意义的运算,同时不会给在英语里出现更频繁的词过分大的权重。因此有一些对加权函数f的选择有着启发性的原则(heuristics),就是既不给词频高的词过分的权重,也不给这些不常用词(durion)太小的权值。如果想知道f是怎么能够启发性地完成这个功能的话,可以看一下GloVe算法论文。
最后,一件有关这个算法有趣的事是θ和e现在是完全对称的(completely symmetric),所以θ_i和e_j就是对称的。如果只看数学式的话,θ_i和e_j的功能很相近,我们可以将它们颠倒或者排序,实际上他们都输出了最佳结果。因此一种训练算法的方法是一致地初始化θ和e,然后使用梯度下降法来最小化输出,当每个词都处理完之后取平均值(mean),因为θ和e在这个特定的公式里是对称的(symmetric),所以给定一个词w,有
这就是GloVe算法的内容。仅仅是最小化,像这样的一个二次代价函数是怎么能够让你学习有意义的词嵌入的呢?但是结果证明它确实有效。
在我们总结词嵌入学习算法之前,有一件更优先的事(one more property)。
如上图,以这个特制的表格(featurization view)作为例子来开始学习词向量。前四行的嵌入向量分别来表示Gender、Royal、Age和Food。但是当你在使用我们了解过的算法的一种来学习一个词嵌入时,例如我们之前的幻灯片里提到的GloVe算法,会发生一件事就是你不能保证嵌入向量的独立组成部分是能够理解的,为什么呢?
假设说有个空间,里面的第一个轴(上图红色标记1)是Gender,第二个轴(上图红色标记2)是Royal,你能够保证的是第一个嵌入向量对应的轴(上图红色标记3)是和这个轴(红色标记1,2所示)有联系的,它的意思可能是Gender、Royal、Age和Food。具体而言,这个学习算法会选择这个(上图红色标记3)作为第一维的轴,所以给定一些上下文词,第一维可能是这个轴(上图红色标记3),第二维也许是这个(上图红色标记4),或者它可能不是正交的,它也可能是第二个非正交轴(上图红色标记5),它可以是你学习到的词嵌入中的第二部分。如果有某个可逆矩阵A,因为我们将其展开:
如果没有学过线性代数(linear algebra)的话,也没关系。你不能保证这些用来表示特征的轴能够等同于人类可能简单理解的轴,具体而言,第一个特征可能是个多个属性的组合,所以很难看出独立组成部分,然后解释出它的意思。尽管有这种类型的线性变换,这个平行四边形映射(parallelogram map)也说明了我们解决了这个问题,当你在类比其他问题时,该方法也是可以的。
这就是GloVe 词向量的内容,我们现在已经了解了一些学习词嵌入的算法。下节课讲解怎样使用这些算法来解决情感分类问题。
情感分类(sentiment classification)任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,这是NLP中最重要的模块之一,经常用在许多应用中。情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器,让我们看看是怎么做到的。
如上图所示,是一个情感分类问题的例子,输入x是一段文本,而输出y是要预测的相应情感。例如一个餐馆评价的星级,
比如"The dessert is excellent."(甜点很棒),四星的评价(review);
"Service was quite slow"(服务太慢),这是两星评价;
"Good for a quick meal but nothing special"(适合吃快餐但没什么亮点),三星评价;
还有比较刁钻的评论,"Completely lacking in good taste, good service and good ambiance."(完全没有好的味道,好的服务,好的氛围),给了一星评价。
如果你能训练一个从x到y的映射,基于这样的标记的数据集,那么你就了解大家对餐馆的评价。一般而言,可以通过一个情感分类器分析一些社交平台上的评价,然后分析出大家对你的餐馆的评论的情感是正面的还是负面的,这样可以了解餐馆是在蒸蒸日上还是每况愈下。
情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集时。
接下来我们看几个不同的算法。
如上图,这是一个简单的情感分类的模型,看这个句子"The dessert is excellent",我们通常用10,000个词的词汇表(dictionary)。我们要构建一个分类器能够把它映射成输出四个星,对于句子中的4个单词,找到相应的one-hot向量,所以the就是o_8928,乘以嵌入矩阵E,E可以从一个很大的文本集里学习到(它可以从一亿个词或者一百亿个词里学习嵌入),然后提取单词the的嵌入向量e_8928,对dessert、is、excellent做同样的步骤。
如果在很大的训练集上训练E,比如一百亿的单词,这样你就会获得很多知识,甚至从有些不常用的词中获取,然后应用到你的问题上,即使你的标记数据集里没有这些词。我们可以这样构建一个分类器,取这些嵌入向量,比如是300维度的向量。接着把它们求和(sum)或者求平均(mean)。在这里取平均之后会得到一个300维的特征向量,把这个特征向量送进softmax分类器,然后输出y帽。这个softmax能够输出5个可能结果的概率值,从一星到五星,这个就是5个可能输出的softmax结果用来预测y的值。
这里用的平均值运算单元(the average operation here),这个算法适用于任何长短的评论,因为即使你的评论是100个词长,你也可以对这一百个词的特征向量求和或者平均它们,然后得到一个表示一个300维的特征向量表示,然后把它送进你的softmax分类器,所以这个平均值运算效果不错。
这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价,"Completely lacking in good taste, good service, and good ambiance.",good这个词出现了3次,如果算法忽略词序,只是把所有单词的词嵌入加起来或者平均下来,最后的特征向量会有很多good的表示,分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,一星评价。
我们有一个更加复杂的模型,不用简单的把所有的词嵌入都加起来,我们用一个RNN来做情感分类。
如上图所示,首先取这条评论,"Completely lacking in good taste, good service, and good ambiance.",用每一个one-hot向量乘以词嵌入矩阵E,得到词嵌入表达e,然后把它们送进RNN里。RNN的工作就是在最后一步(上图编号1所示)计算一个特征表示,用来预测y帽,这是一个多对一(many-to-one)的网络结构的例子。这个算法考虑词的顺序效果就更好了,它就能意识到"things are lacking in good taste",这是个负面的评价,“not good”也是一个负面的评价。而不像原来的算法一样,只是把所有的加在一起得到一个大的向量,根本意识不到“not good”和 “good”不是一个意思,"lacking in good taste"也是如此,等等。
如果你训练一个这样的算法,最后会得到一个很合适的情感分类的算法。由于你的词嵌入是在一个更大的数据集里训练的,这样效果会更好,更好的泛化一些没有见过的新的单词。比如其他人可能会说,"Completely absent of good taste, good service, and good ambiance.",即使absent这个词不在标记的训练集里,如果是在一亿或者一百亿单词集里训练词嵌入,它仍然可以正确判断,并且泛化的很好,甚至这些词是在训练集中用于训练词嵌入的,但是可以不在专门用来做情感分类问题的标记的训练集中。
以上就是情感分类的问题。一旦你学习到或者从网上下载词嵌入,你就可以很快构建一个很有效的NLP系统。
现在机器学习和人工智能算法正渐渐地被信任用以辅助或是制定极其重要的决策,因此我们想尽可能地确保它们不受非预期形式偏见影响(they’re free of undesirable forms of bias),比如说性别歧视(gender bias)、种族歧视(ethnicity bias)等。本节视频中Andrew会展示词嵌入中一些有关减少或是消除这些形式的偏见的办法。
本节视频中使用术语bias时,不是指bias本身这个词或是偏见,而是指性别、种族、性取向方面的偏见,那是不同的偏见,同时这也通常用于机器学习的学术讨论中。不过我们讨论的大部分内容是词嵌入是怎样学习类比像Man:Woman,就像King:Queen,另外,如果Man对应Computer Programmer,那么Woman会对应什么呢?所以这篇论文Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings得到了一个十分可怕的结果,一个已经完成学习的词嵌入可能会输出Man:Computer Programmer,同时输出Woman:Homemaker,那个结果看起来是错的,并且它执行了一个十分不良的性别歧视。如果算法输出的是Man:Computer Programmer,同时Woman:Computer Programmer这样子会更合理。同时他们也发现如果Father:Doctor,那么Mother应该对应什么呢?一个十分不幸的结果是,有些完成学习的词嵌入会输出Mother:Nurse。
因此根据训练模型所使用的文本,词嵌入能够反映出性别、种族、年龄、性取向等其他方面的偏见,Andrew尤其热衷的一件事是,这些偏见都和社会经济状态相关,每个人不论你出身富裕还是贫穷,亦或是二者之间,每个人都应当拥有好的机会,同时因为机器学习算法正用来制定十分重要的决策(make very important decisions),它也影响着世间万物,从大学录取到人们找工作的途径,到贷款申请,再到刑事司法系统,甚至是判决标准,学习算法都在作出非常重要的决策,所以Andrew认为我们尽量修改学习算法来尽可能减少或是理想化消除这些非预期类型的偏见是十分重要的。
至于词嵌入,它们能够轻易学会用来训练模型的文本中的偏见内容,所以算法获取到的偏见内容就可以反映出人们写作中的偏见。在漫长的世纪里,Andrew认为人类已经在减少这些类型的偏见上取得了进展,幸运的是对于人工智能来说,实际上Andrew认为有更好的办法来实现更快地减少AI领域中相比与人类社会中的偏见。虽然Andrew认为我们仍未实现人工智能,仍然有许多研究许多难题需要完成来减少学习算法中这些类型的偏见。
接下来看一个例子(example)。
假设说我们已经完成一个词嵌入的学习,那么babysitter,doctor,grandmother,grandfather分布在左上方的坐标系中,也许girl嵌入在这里,boy嵌入在这里,也许she嵌在这里,he在这里,所以首先我们要做的事就是辨别出我们想要减少或想要消除的特定偏见的趋势。
为了便于说明,Andrew会集中讨论性别歧视,分析思路对上述其他类型的偏见都是通用的。这个例子中,怎样辨别出与这个偏见相似的趋势呢?主要有以下三个步骤:
(1)对于性别歧视这种情况来说,我们能做的是e_he - e_she,因为它们的性别不同,然后将e_male - e_female,然后将这些差简单地求平均。这个趋势看起来就是性别趋势或说是偏见趋势,然后这个趋势与我们想要尝试处理的特定偏见并不相关,因此这就是个无偏见趋势。在这种情况下,偏见趋势可以将它看做1D子空间,所以这个无偏见趋势就会是299D的子空间。原文章中的描述这个偏见趋势可以比1维更高,实际上它会用一个更加复杂的算法叫做SVU(singular value decomposition奇异值分解),这个算法的一些方法和主成分分析 (Principle Component Analysis-PCA)其实很类似。
(2)中和步骤(neutralize),对于那些定义不确切的词可以将其处理一下,避免偏见。有些词本质上就和性别有关,像grandmother、grandfather、girl、boy、she、he,不过也有一些词像doctor和babysitter我们希望在性别方面是中立的,即种族中立的(ethnicity neutral)或是性取向中立的(sexual orientation neutral)。对于那些定义不明确的词,它的基本意思是不像grandmother和grandfather这种定义里有着十分合理的性别含义的,因为从定义上来说grandmothers是女性,grandfather是男性。所以对于像doctor和babysitter这种单词我们就可以将它们在这个轴上进行处理,来减少或是消除他们的性别歧视趋势的成分,即减少他们在这个水平方向上的距离,这就是第二个中和步。
(3)均衡步(equalization),对于这样的词对,grandmother和grandfather或者是girl和boy,我们只希望其区别是性别。那为什么要那样呢?在这个例子中,babysitter和grandmother之间的距离(相似度)实际上是小于babysitter和grandfather之间的,因此这可能会加重不良状态,或者可能是非预期的偏见,也就是说grandmothers相比于grandfathers最终更有可能输出babysitting。所以在最后的均衡步中,我们想要确保的是像grandmother和grandfather这样的词都能够有一致的相似度(相等的距离),和babysitter或是doctor这样性别中立的词一样。这其中会有一些线性代数的步骤,但它主要做的就是将grandmother和grandfather移至与中间轴线等距的一对点上,现在性别歧视的影响也就是这两个词与babysitter的距离就完全相同了。所以总体来说,会有许多对象grandmother-grandfather,boy-girl,sorority-fraternity,girlhood-boyhood,sister-brother,niece-nephew,daughter-son这样的词对,你可能想要通过均衡步来解决他们。
最后一个细节是我们怎样才能够决定哪个词是中立的呢?对于这个例子来说doctor看起来像是一个应该对其中立的单词来使之性别不确定(non-gender-specific)或是种族不确定(non-ethnicity-specific)。相反地,grandmother和grandfather就不应是性别不确定的词。也会有一些像是beard词,一个统计学上的事实是男性相比于比女性更有可能拥有胡子,因此也许beard应该比female更靠近male一些。
因此论文作者做的就是训练一个分类器来尝试解决哪些词是有明确定义的,哪些词是性别确定的,哪些词不是。结果表明英语里大部分词在性别方面上是没有明确定义的,意思就是说性别并是其定义的一部分,只有一小部分词像是grandmother-grandfather,girl-boy,sorority-fraternity等等,不是性别中立的。因此一个线性分类器能够告诉你哪些词能够通过中和步来预测这个偏见趋势,或将其与这个本质是299D的子空间进行处理。
最后,我们需要平衡的词对的数实际上是很小的,至少对于性别歧视这个例子来说,用手都能够数出来你需要平衡的大部分词对。完整的算法会比这里展示的更复杂一些,可以看一下这篇论文了解详细内容。
总结一下,减少或者是消除学习算法中的偏见问题是个十分重要的问题,因为这些算法会用来辅助制定越来越多的社会中的重要决策,在本节视频中分享了一套如何尝试处理偏见问题的办法,不过这仍是一个许多学者正在进行(ongoing)主要研究的领域。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。