目录
一.Word2Vec
二.负采样
三.GloVe词向量
四.情绪分类
五.词嵌入除偏
一.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个单词。我们要的做的是随机选一个词作为上下文词,比如选orange这个词,然后我们要做的是随机在一定词距内选另一个词,比如在上下文词前后5个词内或者前后10个词内,我们就在这个范围内选择目标词。可能你正好选到了juice作为目标词,正好是下一个词(表示orange的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是glass,还可能正好选到了单词my作为目标词。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。显然,这不是个非常简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。
接下来说说模型的细节,我们继续假设使用一个10,000词的词汇表,有时训练使用的词汇表会超过一百万词。但我们要解决的基本的监督学习问题是学习一种映射关系,从上下文c,比如单词orange,到某个目标词,记为t,可能是单词juice或者单词glass或者单词my。延续上一张幻灯片的例子,在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出y的输入x。
为了表示输入,比如单词orange,你可以先从one-hot向量开始,我们将其写作O_c,这就是上下文词的one-hot向量(上图编号1所示)。然后和你在上节视频中看到的类似,你可以拿嵌入矩阵E乘以向量O_c,然后得到了输入的上下文词的嵌入向量,于是这里e_c=E*O_c。在这个神经网络中(上图编号2所示),我们将把向量e_c喂入一个softmax单元。我通常把softmax单元画成神经网络中的一个节点(上图编号3所示),这不是字母O,而是softmax单元,softmax单元要做的就是输出yhat。然后我们再写出模型的细节,这是softmax模型(上图编号4所示),预测不同目标词的概率:
这里是一个与输出t有关的参数,即某个词t和标签相符的概率是多少。我省略了softmax中的偏差项,想要加上的话也可以加上。
最终softmax的损失函数就会像之前一样,我们用y表示目标词,我们这里用的y和yhat都是用one-hot表示的,于是损失函数就会是:
这是常用的softmax损失函数,y 就是只有一个1其他都是0的one-hot向量,如果目标词是juice,那么第4834个元素就是1,其余是0(上图编号5所示)。类似的yhat是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率。
总结一下,这大体上就是一个可以找到词嵌入的简化模型和神经网络(上图编号2所示),其实就是个softmax单元。矩阵E将会有很多参数,所以矩阵E有对应所有嵌入向量e_c的参数(上图编号6所示),softmax单元也有的参数(上图编号3所示)。如果优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。
实际上使用这个算法会遇到一些问题,首要的问题就是计算速度。尤其是在softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。
这里有一些解决方案,如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。
在文献中你会看到的方法是使用一个分级(hierarchical)的softmax分类器,意思就是说不是一下子就确定到底是属于10,000类中的哪一类。想象如果你有一个分类器(上图编号1所示),它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假如这个二分类器告诉你这个词在前5000个词中(上图编号2所示),然后第二个分类器会告诉你这个词在词汇表的前2500个词中,或者在词汇表的第二组2500个词中,诸如此类,直到最终你找到一个词准确所在的分类器(上图编号3所示),那么就是这棵树的一个叶子节点。像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的10,000个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比(上图编号4所示),而不是词汇表大小的线性函数,这个就叫做分级softmax分类器。
我要提一下,在实践中分级softmax分类器不会使用一棵完美平衡的分类树或者说一棵左边和右边分支的词数相同的对称树(上图编号1所示的分类树)。实际上,分级的softmax分类器会被构造成常用词在顶部,然而不常用的词像durian会在树的更深处(上图编号2所示的分类树),因为你想更常见的词会更频繁,所以你可能只需要少量检索就可以获得常用单词像the和of。然而你更少见到的词比如durian就更合适在树的较深处,因为你一般不需要到那样的深处,所以有不同的经验法则可以帮助构造分类树形成分级softmax分类器。所以这是你能在文献中见到的一个加速softmax分类的方法,但是我不会再花太多时间在这上面了,你可以从我在第一张幻灯片中提到的Tomas Mikolov等人的论文中参阅更多的细节,所以我不会再花更多时间讲这个了。因为在下个视频中,我们会讲到另一个方法叫做负采样,我感觉这个会更简单一点,对于加速softmax和解决需要在分母中对整个词汇表求和的问题也很有作用,下个视频中你会看到更多的细节。
但是在进入下个视频前,我想要你理解一个东西,那就是怎么对上下文c进行采样,一旦你对上下文c进行采样,那么目标词t就会在上下文c的正负10个词距内进行采样。但是你要如何选择上下文c?一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像the、of、a、and、to诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像orange、apple或durian就不会那么频繁地出现了。你可能不会想要你的训练集都是这些出现得很频繁的词,因为这会导致你花大部分的力气来更新这些频繁出现的单词的e_c(上图编号1所示),但你想要的是花时间来更新像durian这些更少出现的词的嵌入,即e_durian。实际上词p(c)的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。
这就是Word2Vec的Skip-Gram模型,如果你读过我之前提到的论文原文,你会发现那篇论文实际上有两个不同版本的Word2Vec模型,Skip-Gram只是其中的一个,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),它获得中间词两边的的上下文,然后用周围的词去预测中间的词,这个模型也很有效,也有一些优点和缺点。
总结下:CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。 (下图左边为CBOW,右边为Skip-Gram)
而刚才讲的Skip-Gram模型,关键问题在于softmax这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。通常情况下,Skip-Gram模型用到更多点。在下个视频中,我会展示给你一个算法,它修改了训练目标使其可以运行得更有效,因此它可以让你应用在一个更大的训练集上面,也可以学到更好的词嵌入。
二.负采样
在上个视频中,你见到了Skip-Gram模型如何帮助你构造一个监督学习任务,把上下文映射到了目标词上,它如何让你学到一个实用的词嵌入。但是它的缺点就在于softmax计算起来很慢。在本视频中,你会看到一个改善过的学习问题叫做负采样,它能做到与你刚才看到的Skip-Gram模型相似的事情,但是用了一个更加有效的学习算法,让我们来看看这是怎么做到的。
在本视频中大多数的想法源于Tomas Mikolov,Ilya Sutskever,Kai Chen,Greg Corrado 和 Jeff Dean。
(Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.)
我们在这个算法中要做的是构造一个新的监督学习问题,那么问题就是给定一对单词,比如orange和juice,我们要去预测这是否是一对上下文词-目标词(context-target)。
在这个例子中orange和juice就是个正样本,那么orange和king就是个负样本,我们把它标为0。我们要做的就是采样得到一个上下文词和一个目标词,在这个例子中就是orange 和juice,我们用1作为标记,我把中间这列(下图编号1所示)叫做词(word)。这样生成一个正样本,正样本跟上个视频中生成的方式一模一样,先抽取一个上下文词,在一定词距内比如说正负10个词距内选一个目标词,这就是生成这个表的第一行,即orange– juice -1的过程。然后为了生成一个负样本,你将用相同的上下文词,再在字典中随机选一个词,在这里我随机选了单词king,标记为0。然后我们再拿orange,再随机从词汇表中选一个词,因为我们设想,如果随机选一个词,它很可能跟orange没关联,于是orange–book–0。我们再选点别的,orange可能正好选到the,然后是0。还是orange,再可能正好选到of这个词,再把这个标记为0,注意of被标记为0,即使of的确出现在orange词的前面。
总结一下,生成这些数据的方式是我们选择一个上下文词(上图编号2所示),再选一个目标词(上图编号3所示),这(上图编号4所示)就是表的第一行,它给了一个正样本,上下文,目标词,并给定标签为1。然后我们要做的是给定几次,比如K次(上图编号5所示),我们将用相同的上下文词,再从字典中选取随机的词,king、book、the、of等,从词典中任意选取的词,并标记0,这些就会成为负样本(上图编号6所示)。出现以下情况也没关系,就是如果我们从字典中随机选到的词,正好出现在了词距内,比如说在上下文词orange正负10个词之内。
接下来我们将构造一个监督学习问题,其中学习算法输入x,输入这对词(上图编号7所示),要去预测目标的标签(上图编号8所示),即预测输出y。因此问题就是给定一对词,像orange和juice,你觉得它们会一起出现么?你觉得这两个词是通过对靠近的两个词采样获得的吗?或者你觉得我是分别在文本和字典中随机选取得到的?这个算法就是要分辨这两种不同的采样方式,这就是如何生成训练集的方法。
那么如何选取K?Mikolov等人推荐小数据集的话,K从5到20比较好。如果你的数据集很大,K就选的小一点。对于更大的数据集K就等于2到5,数据集越小K就越大。那么在这个例子中,我们就用K=4。
我们把这个画成一个神经网络,如果输入词是orange,即词6257,你要做的就是输入one-hot向量,再传递给E,通过两者相乘获得嵌入向量e_6257,你就得到了10,000个可能的逻辑回归分类问题,其中一个(上图编号4所示)将会是用来判断目标词是否是juice的分类器,还有其他的词,比如说可能下面的某个分类器(上图编号5所示)是用来预测king是否是目标词,诸如此类,预测词汇表中这些可能的单词。把这些看作10,000个二分类逻辑回归分类器,但并不是每次迭代都训练全部10,000个,我们只训练其中的5个,我们要训练对应真正目标词那一个分类器,再训练4个随机选取的负样本,这就是K=4的情况。所以不使用一个巨大的10,000维度的softmax,因为计算成本很高,而是把它转变为10,000个二分类问题,每个都很容易计算,每次迭代我们要做的只是训练它们其中的5个,一般而言就是K+1个,其中个负样本和1个正样本。这也是为什么这个算法计算成本更低,因为只需更新K+1个逻辑单元,K+1个二分类问题,相对而言每次迭代的成本比更新10,000维的softmax分类器成本低。
你也会在本周的编程练习中用到这个算法,这个技巧就叫负采样。因为你做的是,你有一个正样本词orange和juice,然后你会特意生成一系列负样本,这些(上图编号6所示)是负样本,所以叫负采样,即用这4个负样本训练,4个额外的二分类器,在每次迭代中你选择4个不同的随机的负样本词去训练你的算法。
这个算法有一个重要的细节就是如何选取负样本,即在选取了上下文词orange之后,你如何对这些词进行采样生成负样本?一个办法是对中间的这些词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在like、the、of、and诸如此类的词上有很高的频率。另一个极端就是用1除以词汇表总词数,即均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。所以论文的作者Mikolov等人根据经验,他们发现这个经验值的效果最好,它位于这两个极端的采样方法之间,既不用经验频率,也就是实际观察到的英文文本的分布,也不用均匀分布,他们采用以下方式:
进行采样,所以如果f(w_i)是观测到的在语料库中的某个英文词的词频,通过3/4次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。我并不确定这是否有理论证明,但是很多研究者现在使用这个方法,似乎也效果不错。
总结一下,你已经知道了在softmax分类器中如何学到词向量,但是计算成本很高。在这个视频中,你见到了如何通过将其转化为一系列二分类问题使你可以非常有效的学习词向量。如果你使用这个算法,你将可以学到相当好的词向量。当然和深度学习的其他领域一样,有很多开源的实现,当然也有预训练过的词向量,就是其他人训练过的然后授权许可发布在网上的,所以如果你想要在NLP问题上取得进展,去下载其他人的词向量是很好的方法,在此基础上改进。
Skip-Gram模型就介绍到这里,在下个视频中,我会跟你分享另一个版本的词嵌入学习算法GloVe,而且这可能比你之前看到的都要简单。
三.GloVe词向量
你已经了解了几个计算词嵌入的算法,另一个在NLP社区有着一定势头的算法是GloVe算法,这个算法并不如Word2Vec或是Skip-Gram模型用的多,但是也有人热衷于它,我认为可能是因为它简便吧,我们来看看这个算法。
Glove算法是由Jeffrey Pennington,Richard Socher和Chris Manning发明的。
(Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.)
这就是GloVe算法的内容,我认为这个算法的一个疑惑之处是如果你看着这个等式,它实在是太简单了,对吧?仅仅是最小化,像这样的一个二次代价函数(上图编号3所示)是怎么能够让你学习有意义的词嵌入的呢?但是结果证明它确实有效,发明者们发明这个算法的过程是他们以历史上更为复杂的算法,像是newer language模型,以及之后的Word2Vec、Skip-Gram模型等等为基础,同时希望能够简化所有之前的算法才发明的。
在我们总结词嵌入学习算法之前,有一件更优先的事,我们会简单讨论一下。就是说,我们以这个特制的表格作为例子来开始学习词向量,我们说,第一行的嵌入向量是来表示Gender的,第二行是来表示Royal的,然后是是Age,在之后是Food等等。但是当你在使用我们了解过的算法的一种来学习一个词嵌入时,例如我们之前的幻灯片里提到的GloVe算法,会发生一件事就是你不能保证嵌入向量的独立组成部分是能够理解的,为什么呢?
不必担心,如果你没有学过线性代数的话会,和这个算法一样有一个简单证明过程。你不能保证这些用来表示特征的轴能够等同于人类可能简单理解的轴,具体而言,第一个特征可能是个Gender、Roya、Age、Food Cost和Size的组合,它也许是名词或是一个行为动词和其他所有特征的组合,所以很难看出独立组成部分,即这个嵌入矩阵的单行部分,然后解释出它的意思。尽管有这种类型的线性变换,这个平行四边形映射也说明了我们解决了这个问题,当你在类比其他问题时,这个方法也是行得通的。因此尽管存在特征量潜在的任意线性变换,你最终还是能学习出解决类似问题的平行四边形映射。
这就是词嵌入学习的内容,你现在已经了解了一些学习词嵌入的算法了,你可以在本周的编程练习里更多地运用它们。下节课讲解怎样使用这些算法来解决情感分类问题。
四.情绪分类
情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,这是NLP中最重要的模块之一,经常用在许多应用中。情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器,让我们看看是怎么做到的。
这是一个情感分类问题的一个例子(上图所示),输入x是一段文本,而输出y是你要预测的相应情感。比如说是一个餐馆评价的星级,
比如有人说,"The dessert is excellent."(甜点很棒),并给出了四星的评价;
"Service was quite slow"(服务太慢),两星评价;
"Good for a quick meal but nothing special"(适合吃快餐但没什么亮点),三星评价;
还有比较刁钻的评论,"Completely lacking in good taste, good service and good ambiance."(完全没有好的味道,好的服务,好的氛围),给出一星评价。
如果你能训练一个从x到y的映射,基于这样的标记的数据集,那么你就可以用来搜集大家对你运营的餐馆的评价。一些人可能会把你的餐馆信息放到一些社交媒体上,Twitter、Facebook、Instagram或者其他的社交媒体,如果你有一个情感分类器,那么它就可以看一段文本然后分析出这个人对你的餐馆的评论的情感是正面的还是负面的,这样你就可以一直记录是否存在一些什么问题,或者你的餐馆是在蒸蒸日上还是每况愈下。
情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集时。
接下来你可以这样做,这节我们会讲几个不同的算法。这是一个简单的情感分类的模型,假设有一个句子"dessert is excellent",然后在词典里找这些词,我们通常用10,000个词的词汇表。我们要构建一个分类器能够把它映射成输出四个星,给定这四个词("dessert is excellent"),我们取这些词,找到相应的one-hot向量,所以这里(上图编号1所示)就是O_8928,乘以嵌入矩阵E,E可以从一个很大的文本集里学习到,比如它可以从一亿个词或者一百亿个词里学习嵌入,然后用来提取单词the的嵌入向量e_8928,对dessert、is、excellent做同样的步骤。
如果在很大的训练集上训练E,比如一百亿的单词,这样你就会获得很多知识,甚至从有些不常用的词中获取,然后应用到你的问题上,即使你的标记数据集里没有这些词。我们可以这样构建一个分类器,取这些向量(上图编号2所示),比如是300维度的向量。然后把它们求和或者求平均,这里我画一个大点的平均值计算单元(上图编号3所示),你也可以用求和或者平均。这个单元(上图编号3所示)会得到一个300维的特征向量,把这个特征向量送进softmax分类器,然后输出yhat。这个softmax能够输出5个可能结果的概率值,从一星到五星,这个就是5个可能输出的softmax结果用来预测y的值。
这里用的平均值运算单元,这个算法适用于任何长短的评论,因为即使你的评论是100个词长,你也可以对这一百个词的特征向量求和或者平均它们,然后得到一个表示一个300维的特征向量表示,然后把它送进你的softmax分类器,所以这个平均值运算效果不错。它实际上会把所有单词的意思给平均起来,或者把你的例子中所有单词的意思加起来就可以用了。
这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价,"Completely lacking in good taste, good service, and good ambiance.",但是good这个词出现了很多次,有3个good,如果你用的算法跟这个一样,忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,你最后的特征向量会有很多good的表示,你的分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,只有一星的评价。
我们有一个更加复杂的模型,不用简单的把所有的词嵌入都加起来,我们用一个RNN来做情感分类。我们这样做,首先取这条评论,"Completely lacking in good taste, good service, and good ambiance.",找出每一个one-hot向量,这里我跳过去每一个one-hot向量的表示。用每一个one-hot向量乘以词嵌入矩阵E,得到词嵌入表达e,然后把它们送进RNN里。RNN的工作就是在最后一步(上图编号1所示)计算一个特征表示,用来预测yhat,这是一个多对一的网络结构的例子,我们之前已经见过了。有了这样的算法,考虑词的顺序效果就更好了,它就能意识到"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系统。
五.词嵌入除偏
现在机器学习和人工智能算法正渐渐地被信任用以辅助或是制定极其重要的决策,因此我们想尽可能地确保它们不受非预期形式偏见影响,比如说性别歧视、种族歧视等等。本节视频中我会向你展示词嵌入中一些有关减少或是消除这些形式的偏见的办法。
本节视频中当我使用术语bias时,我不是指bias本身这个词,或是偏见这种感觉,而是指性别、种族、性取向方面的偏见,那是不同的偏见,同时这也通常用于机器学习的学术讨论中。不过我们讨论的大部分内容是词嵌入是怎样学习类比像Man:Woman,就像King:Queen,不过如果你这样问,如果Man对应Computer Programmer,那么Woman会对应什么呢?所以这篇论文(上图编号1所示:Bolukbasi T, Chang K W, Zou J, et al. Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings[J]. 2016.)的作者Tolga Bolukbasi、Kai-Wei Chang、James Zou、Venkatesh Saligrama和 Adam Kalai发现了一个十分可怕的结果,就是说一个已经完成学习的词嵌入可能会输出Man:Computer Programmer,同时输出Woman:Homemaker,那个结果看起来是错的,并且它执行了一个十分不良的性别歧视。如果算法输出的是Man:Computer Programmer,同时Woman:Computer Programmer这样子会更合理。同时他们也发现如果Father:Doctor,那么Mother应该对应什么呢?一个十分不幸的结果是,有些完成学习的词嵌入会输出Mother:Nurse。
因此根据训练模型所使用的文本,词嵌入能够反映出性别、种族、年龄、性取向等其他方面的偏见,一件我尤其热衷的事是,这些偏见都和社会经济状态相关,我认为每个人不论你出身富裕还是贫穷,亦或是二者之间,我认为每个人都应当拥有好的机会,同时因为机器学习算法正用来制定十分重要的决策,它也影响着世间万物,从大学录取到人们找工作的途径,到贷款申请,不论你的的贷款申请是否会被批准,再到刑事司法系统,甚至是判决标准,学习算法都在作出非常重要的决策,所以我认为我们尽量修改学习算法来尽可能减少或是理想化消除这些非预期类型的偏见是十分重要的。
至于词嵌入,它们能够轻易学会用来训练模型的文本中的偏见内容,所以算法获取到的偏见内容就可以反映出人们写作中的偏见。在漫长的世纪里,我认为人类已经在减少这些类型的偏见上取得了进展,幸运的是对于人工智能来说,实际上我认为有更好的办法来实现更快地减少AI领域中相比与人类社会中的偏见。虽然我认为我们仍未实现人工智能,仍然有许多研究许多难题需要完成来减少学习算法中这些类型的偏见。
本节视频里我想要做的是与你们分享一个例子,它是一篇论文的一套办法,就是下面引用的这篇由Bolukbasi和其他人共同撰写的论文,它是研究减少词嵌入中偏见问题的。就是这些,假设说我们已经完成一个词嵌入的学习,那么babysitter就是在这里,doctor在这里,grandmother在这里,grandfather在这里,也许girl嵌入在这里,boy嵌入在这里,也许she嵌在这里,he在这里(上图编号1所示的区域内),所以首先我们要做的事就是辨别出我们想要减少或想要消除的特定偏见的趋势。
为了便于说明,我会集中讨论性别歧视,不过这些想法对于所有我在上个幻灯片里提及的其他类型的偏见都是通用的。这个例子中,你会怎样辨别出与这个偏见相似的趋势呢?主要有以下三个步骤:
一、对于性别歧视这种情况来说,我们能做的是e_he-e_she,因为它们的性别不同,然后将e_male-e_female,然后将这些值取平均(上图编号2所示),将这些差简单地求平均。这个趋势(上图编号3所示)看起来就是性别趋势或说是偏见趋势,然后这个趋势(上图编号4所示)与我们想要尝试处理的特定偏见并不相关,因此这就是个无偏见趋势。在这种情况下,偏见趋势可以将它看做1D子空间,所以这个无偏见趋势就会是299D的子空间。我已经略微简化了,原文章中的描述这个偏见趋势可以比1维更高,同时相比于取平均值,如同我在这里描述的这样,实际上它会用一个更加复杂的算法叫做SVU,也就是奇异值分解,如果你对主成分分析(Principle Component Analysis)很熟悉的话,奇异值分解这个算法的一些方法和主成分分析 (PCA)其实很类似。
二、中和步骤,所以对于那些定义不确切的词可以将其处理一下,避免偏见。有些词本质上就和性别有关,像grandmother、grandfather、girl、boy、she、he,他们的定义中本就含有性别的内容,不过也有一些词像doctor和babysitter我们想使之在性别方面是中立的。同时在更通常的情况下,你可能会希望像doctor或babysitter这些词成为种族中立的,或是性取向中立的等等,不过这里我们仍然只用性别来举例说明。对于那些定义不明确的词,它的基本意思是不像grandmother和grandfather这种定义里有着十分合理的性别含义的,因为从定义上来说grandmothers是女性,grandfather是男性。所以对于像doctor和babysitter这种单词我们就可以将它们在这个轴(上图编号1所示)上进行处理,来减少或是消除他们的性别歧视趋势的成分,也就是说减少他们在这个水平方向上的距离(上图编号2方框内所示的投影),所以这就是第二个中和步。
三、均衡步,意思是说你可能会有这样的词对,grandmother和grandfather,或者是girl和boy,对于这些词嵌入,你只希望性别是其区别。那为什么要那样呢?在这个例子中,babysitter和grandmother之间的距离或者说是相似度实际上是小于babysitter和grandfather之间的(上图编号1所示),因此这可能会加重不良状态,或者可能是非预期的偏见,也就是说grandmothers相比于grandfathers最终更有可能输出babysitting。所以在最后的均衡步中,我们想要确保的是像grandmother和grandfather这样的词都能够有一致的相似度,或者说是相等的距离,和babysitter或是doctor这样性别中立的词一样。这其中会有一些线性代数的步骤,但它主要做的就是将grandmother和grandfather移至与中间轴线等距的一对点上(上图编号2所示),现在性别歧视的影响也就是这两个词与babysitter的距离就完全相同了(上图编号3所示)。所以总体来说,会有许多对像grandmother-grandfather,boy-girl,sorority-fraternity,girlhood-boyhood,sister-brother,niece-nephew,daughter-son这样的词对,你可能想要通过均衡步来解决他们。
最后一个细节是你怎样才能够决定哪个词是中立的呢?对于这个例子来说doctor看起来像是一个应该对其中立的单词来使之性别不确定或是种族不确定。相反地,grandmother和grandfather就不应是性别不确定的词。也会有一些像是beard词,一个统计学上的事实是男性相比于比女性更有可能拥有胡子,因此也许beard应该比female更靠近male一些。
因此论文作者做的就是训练一个分类器来尝试解决哪些词是有明确定义的,哪些词是性别确定的,哪些词不是。结果表明英语里大部分词在性别方面上是没有明确定义的,意思就是说性别并是其定义的一部分,只有一小部分词像是grandmother-grandfather,girl-boy,sorority-fraternity等等,不是性别中立的。因此一个线性分类器能够告诉你哪些词能够通过中和步来预测这个偏见趋势,或将其与这个本质是299D的子空间进行处理。
最后,你需要平衡的词对的数实际上是很小的,至少对于性别歧视这个例子来说,用手都能够数出来你需要平衡的大部分词对。完整的算法会比我在这里展示的更复杂一些,你可以去看一下这篇论文了解详细内容,你也可以通过编程作业来练习一下这些想法。