本文是吴恩达老师的深度学习课程[1]笔记部分。 做者:黄海广[2] 主要编写人员:黄海广、林兴木(第四全部底稿,第五课第一二周,第三周前三节)、祝彦森:(第三课全部底稿)、贺志尧(第五课第三周底稿)、王翔、胡瀚文、 余笑、 郑浩、李怀松、 朱越鹏、陈伟贺、 曹越、 路皓翔、邱牧宸、 唐天泽、 张浩、 陈志豪、 游忍、 泽霖、沈伟臣、 贾红顺、 时超、 陈哲、赵一帆、 胡潇杨、段希、于冲、张鑫倩 参与编辑人员:黄海广、陈康凯、石晴路、钟博彦、向伟、严凤龙、刘成 、贺志尧、段希、陈瑶、林家泳、王翔、 谢士晨、蒋鹏 备注:笔记和做业(含数据、原始做业文件)、视频都在 github[3]中下载。 我将陆续将课程笔记发布在公众号“机器学习初学者”,敬请关注。
上周咱们学习了RNN、GRU单元和LSTM单元。本周你会看到咱们如何把这些知识用到NLP上,用于天然语言处理,深度学习已经给这一领域带来了革命性的变革。其中一个很关键的概念就是词嵌入(word embeddings),这是语言表示的一种方式,可让算法自动的理解一些相似的词,好比男人对女人,好比国王对王后,还有其余不少的例子。经过词嵌入的概念你就能够构建NLP应用了,即便你的模型标记的训练集相对较小。这周的最后咱们会消除词嵌入的误差,就是去除不想要的特性,或者学习算法有时会学到的其余类型的误差。git
如今咱们先开始讨论词汇表示,目前为止咱们一直都是用词汇表来表示词,上周提到的词汇表,多是10000个单词,咱们一直用one-hot向量来表示词。好比若是man(上图编号1所示)在词典里是第5391个,那么就能够表示成一个向量,只在第5391处为1(上图编号github
举个例子,假如你已经学习到了一个语言模型,当你看到“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表示,而是用特征化的表示来表示每一个词,man,woman,king,queen,apple,orange或者词典里的任何一个单词,咱们学习这些词的特征或者数值。编程
举个例子,对于这些词,好比咱们想知道这些词与Gender(性别)的关系。假定男性的性别为-1,女性的性别为+1,那么man的性别值可能就是-1,而woman就是-1。最终根据经验king就是-0.95,queen是+0.97,apple和orange没有性别可言。网络
另外一个特征能够是这些词有多Royal(高贵),因此这些词,man,woman和高贵没太关系,因此它们的特征值接近0。而king和queen很高贵,apple和orange跟高贵也没太大关系。app
那么Age(年龄)呢?man和woman通常没有年龄的意思,也许man和woman隐含着成年人的意思,但也多是介于young和old之间,因此它们(man和woman)的值也接近0。而一般king和queen都是成年人,apple和orange跟年龄更没什么关系了。机器学习
还有一个特征,这个词是不是Food(食物),man不是食物,woman不是食物,king和queen也不是,但apple和orange是食物。ide
固然还能够有不少的其余特征,从Size(尺寸大小),Cost(花费多少),这个东西是否是alive(活的),是否是一个Action(动做),或者是否是Noun(名词)或者是否是Verb(动词),仍是其余的等等。函数
若是咱们可以学习到一个300维的特征向量,或者说300维的词嵌入,一般咱们能够作一件事,把这300维的数据嵌入到一个二维空间里,这样就能够可视化了。经常使用的可视化算法是t-SNE算法,来自于Laurens van der Maaten 和 Geoff Hinton的论文。若是观察这种词嵌入的表示方法,你会发现man和woman这些词汇集在一块(上图编号1所示),king和queen汇集在一块(上图编号2所示),这些都是人,也都汇集在一块儿(上图编号3所示)。动物都汇集在一块儿(上图编号4所示),水果也都汇集在一块儿(上图编号5所示),像一、二、三、4这些数字也汇集在一块儿(上图编号6所示)。若是把这些生物当作一个总体,他们也汇集在一块儿(上图编号7所示)。学习
在网上你可能会看到像这样的图用来可视化,300维或者更高维度的嵌入。但愿你能有个总体的概念,这种词嵌入算法对于相近的概念,学到的特征也比较相似,在对这些概念可视化的时候,这些概念就比较类似,最终把它们映射为类似的特征向量。这种表示方式用的是在300维空间里的特征表示,这叫作嵌入(embeddings)。之因此叫嵌入的缘由是,你能够想象一个300维的空间,我画不出来300维的空间,这里用个3维的代替(上图编号8所示)。如今取每个单词好比orange,它对应一个3维的特征向量,因此这个词就被嵌在这个300维空间里的一个点上了(上图编号9所示)apple这个词就被嵌在这个300维空间的另外一个点上了(上图编号10所示)。为了可视化,t-SNE算法把这个空间映射到低维空间,你能够画出一个2维图像而后观察,这就是这个术语嵌入的来源。
词嵌入已是NLP领域最重要的概念之一了,在天然语言处理领域。本节视频中你已经知道为何要学习或者使用词嵌入了,下节视频咱们会深刻讲解如何用这些算法构建NLP算法。
上一个视频中,你已经了解不一样单词的特征化表示了。这节你会看到咱们如何把这种表示方法应用到NLP应用中。
词嵌入可以达到这种效果,其中一个缘由就是学习词嵌入的算法会考察很是大的文本集,也许是从网上找到的,这样你能够考察很大的数据集能够是1亿个单词,甚至达到100亿也都是合理的,大量的无标签的文本的训练集。经过考察大量的无标签文本,不少都是能够免费下载的,你能够发现orange(橙子)和durian(榴莲)相近,farmer(农民)和cultivator(培育家)相近。所以学习这种嵌入表达,把它们都汇集在一块,经过读取大量的互联网文本发现了orange(橙子)和durian(榴莲)都是水果。接下来你能够把这个词嵌入应用到你的命名实体识别任务当中,尽管你只有一个很小的训练集,也许训练集里有100,000个单词,甚至更小,这就使得你可使用迁移学习,把你从互联网上免费得到的大量的无标签文本中学习到的知识,可以分辨orange(橙子)、apple(苹果)和durian(榴莲)都是水果的知识,而后把这些知识迁移到一个任务中,好比你只有少许标记的训练数据集的命名实体识别任务中。固然了,这里为了简化我只画了单向的RNN,事实上若是你想用在命名实体识别任务上,你应该用一个双向的RNN,而不是这样一个简单的。
总结一下,这是如何用词嵌入作迁移学习的步骤。
第一步,先从大量的文本集中学习词嵌入。一个很是大的文本集,或者能够下载网上预训练好的词嵌入模型,网上你能够找到很多,词嵌入模型而且都有许可。
第二步,你能够用这些词嵌入模型把它迁移到你的新的只有少许标注训练集的任务中,好比说用这个300维的词嵌入来表示你的单词。这样作的一个好处就是你能够用更低维度的特征向量代替原来的10000维的one-hot向量,如今你能够用一个300维更加紧凑的向量。尽管one-hot向量很快计算,而学到的用于词嵌入的300维的向量会更加紧凑。
第三步,当你在你新的任务上训练模型时,在你的命名实体识别任务上,只有少许的标记数据集上,你能够本身选择要不要继续微调,用新的数据调整词嵌入。实际中,只有这个第二步中有很大的数据集你才会这样作,若是你标记的数据集不是很大,一般我不会在微调词嵌入上费力气。
当你的任务的训练集相对较小时,词嵌入的做用最明显,因此它普遍用于NLP领域。我只提到一些,不要太担忧这些术语(下问列举的一些NLP任务),它已经用在命名实体识别,用在文本摘要,用在文本解析、指代消解,这些都是很是标准的NLP任务。
词嵌入在语言模型、机器翻译领域用的少一些,尤为是你作语言模型或者机器翻译任务时,这些任务你有大量的数据。在其余的迁移学习情形中也同样,若是你从某一任务A迁移到某个任务B,只有A中有大量数据,而B中数据少时,迁移的过程才有用。因此对于不少NLP任务这些都是对的,而对于一些语言模型和机器翻译则否则。
最后,词嵌入和人脸编码之间有奇妙的关系,你已经在前面的课程学到了关于人脸编码的知识了,若是你上了卷积神经网络的课程的话。你应该还记得对于人脸识别,咱们训练了一个Siamese网络结构,这个网络会学习不一样人脸的一个128维表示,而后经过比较编码结果来判断两个图片是不是同一我的脸,这个词嵌入的意思和这个差很少。在人脸识别领域
这节视频里,你看到如何用词嵌入来实现这种类型的迁移学习,而且经过替换原来的one-hot表示,而是用以前的嵌入的向量,你的算法会泛化的更好,你也能够从较少的标记数据中进行学习。接下来我会给你展现一些词嵌入的特性,这以后再讨论学习这些词嵌入的算法。下个视频咱们会看到词嵌入在作类比推理中发挥的做用。
到如今,你应该明白了词嵌入是如何帮助你构建天然语言处理应用的。词嵌入还有一个迷人的特性就是它还能帮助实现类比推理,尽管类比推理可能不是天然语言处理应用中最重要的,不过它能帮助人们理解词嵌入作了什么,以及词嵌入可以作什么,让咱们来一探究竟。
这是一系列你但愿词嵌入能够捕捉的单词的特征表示,假如我提出一个问题,man若是对应woman,那么king应该对应什么?大家应该都能猜到king应该对应queen。可否有一种算法来自动推导出这种关系,下面就是实现的方法。
在继续下一步以前,我想再说明一下左边的这幅图(上图编号1所示),在以前咱们谈到过用t-SNE算法来将单词可视化。t-SNE算法所作的就是把这些300维的数据用一种非线性的方式映射到2维平面上,能够得知t-SNE中这种映射很复杂并且很非线性。在进行t-SNE映射以后,你不能老是指望使等式成立的关系,会像左边那样成一个平行四边形,尽管在这个例子最初的300维的空间内你能够依赖这种平行四边形的关系来找到使等式成立的一对类比,经过t-SNE算法映射出的图像多是正确的。但在大多数状况下,因为t-SNE的非线性映射,你就无法再期望这种平行四边形了,不少这种平行四边形的类比关系在t-SNE映射中都会失去原貌。
图1:两个向量之间角度的余弦是衡量它们有多类似的指标,角度越小,两个向量越类似。
从学术上来讲,比起测量类似度,这个函数更容易测量的是相异度,因此咱们须要对其取负,这个函数才能正常工做,不过我仍是以为余弦类似度用得更多一点,这二者的主要区别是它们对
和
之间的距离标准化的方式不一样。
词嵌入的一个显著成果就是,可学习的类比关系的通常性。举个例子,它能学会man对于woman至关于boy对于girl,由于man和woman之间和king和queen之间,还有boy和girl之间的向量差在gender(性别)这一维都是同样的。它还能学习Canada(加拿大)的首都是Ottawa(渥太华),而渥太华对于加拿大至关于Nairobi(内罗毕)对于Kenya(肯尼亚),这些都是国家中首都城市名字。它还能学习big对于bigger至关于tall对于taller,还能学习Yen(円)对于Janpan(日本),円是日本的货币单位,至关于Ruble(卢比)对于Russia(俄罗斯)。这些东西都可以学习,只要你在大型的文本语料库上实现一个词嵌入学习算法,只要从足够大的语料库中进行学习,它就能自主地发现这些模式。
在本节视频中,你见到了词嵌入是如何被用于类比推理的,可能你不会本身动手构建一个类比推理系统做为一项应用,不过但愿在这些可学习的类特征的表示方式可以给你一些直观的感觉。你还看知道了余弦类似度能够做为一种衡量两个词嵌入向量间类似度的办法,咱们谈了许多有关这些嵌入的特性,以及如何使用它们。下节视频中,咱们来讨论如何真正的学习这些词嵌入。
接下来咱们要将学习词嵌入这一问题具体化,当你应用算法来学习词嵌入时,其实是学习一个嵌入矩阵,咱们来看一下这是什么意思。
在本节视频中,你将要学习一些具体的算法来学习词嵌入。在深度学习应用于学习词嵌入的历史上,人们一开始使用的算法比较复杂,但随着时间推移,研究者们不断发现他们能用更加简单的算法来达到同样好的效果,特别是在数据集很大的状况下。但有一件事情就是,如今不少最流行的算法都十分简单,若是我一开始就介绍这些简单的算法,你可能会以为这有点神奇,这么简单的算法到底是怎么起做用的?稍微复杂一些的算法开始,由于我以为这样更容易对算法的运做方式有一个更直观的了解,以后咱们会对这些算法进行简化,使你可以明白即便一些简单的算法也能获得很是好的结果,咱们开始吧。
假如你在构建一个语言模型,而且用神经网络来实现这个模型。因而在训练过程当中,你可能想要你的神经网络可以作到好比输入:“I want a glass of orange _.”, 而后预测这句话的下一个词。在每一个单词下面,我都写上了这些单词对应词汇表中的索引。实践证实,创建一个语言模型是学习词嵌入的好方法,我提出的这些想法是源于Yoshua Bengio,Rejean Ducharme,Pascal Vincent,Rejean Ducharme,Pascal Vincent还有Christian Jauvin。
实际上更常见的是有一个固定的历史窗口,举个例子,你老是想预测给定四个单词(上图编号1所示)后的下一个单词,注意这里的4是算法的超参数。这就是如何适应很长或者很短的句子,方法就是老是只看前4个单词,因此说我只用这4个单词(上图编号2所示)而不去看这几个词(上图编号3所示)。若是你一直使用一个4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到这个层中(上图编号4所示),而后再经过softmax来预测输出,选择有不少种,用一个固定的历史窗口就意味着你能够处理任意长度的句子,由于输入的维度老是固定的。因此这个模型的参数就是矩阵E,对全部的单词用的都是同一个矩阵E,而不是对应不一样的位置上的不一样单词用不一样的矩阵。而后这些权重(上图编号5所示)也都是算法的参数,你能够用反向传播来进行梯度降低来最大化训练集似然,经过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。
事实上经过这个算法能很好地学习词嵌入,缘由是,若是你还记得咱们的orange jucie,apple juice的例子,在这个算法的激励下,apple和orange会学到很类似的嵌入,这样作可以让算法更好地拟合训练集,由于它有时看到的是orange juice,有时看到的是apple juice。若是你只用一个300维的特征向量来表示全部这些词,算法会发现要想最好地拟合训练集,就要使apple(苹果)、orange(橘子)、grape(葡萄)和pear(梨)等等,还有像durian(榴莲)这种很稀有的水果都拥有类似的特征向量。
这就是早期最成功的学习词嵌入,学习这个矩阵
的算法之一。如今咱们先归纳一下这个算法,看看咱们该怎样来推导出更加简单的算法。如今我想用一个更复杂的句子做为例子来解释这些算法,假设在你的训练集中有这样一个更长的句子:“I want a glass of orange juice to go along with my cereal.”。咱们在上个幻灯片看到的是算法预测出了某个单词juice,咱们把它叫作目标词(下图编号1所示),它是经过一些上下文,在本例中也就是这前4个词(下图编号2所示)推导出来的。若是你的目标是学习一个嵌入向量,研究人员已经尝试过不少不一样类型的上下文。若是你要创建一个语言模型,那么通常选取目标词以前的几个词做为上下文。但若是你的目标不是学习语言模型自己的话,那么你能够选择其余的上下文。
好比说,你能够提出这样一个学习问题,它的上下文是左边和右边的四个词,你能够把目标词左右各4个词做为上下文(上图编号3所示)。这就意味着咱们提出了一个这样的问题,算法得到左边4个词,也就是a glass of orange,还有右边四个词to go along with,而后要求预测出中间这个词(上图编号4所示)。提出这样一个问题,这个问题须要将左边的还有右边这4个词的嵌入向量提供给神经网络,就像咱们以前作的那样来预测中间的单词是什么,来预测中间的目标词,这也能够用来学习词嵌入。
或者你想用一个更简单的上下文,也许只提供目标词的前一个词,好比只给出orange这个词来预测orange后面是什么(上图编号5所示),这将会是不一样的学习问题。只给出一个词orange来预测下一个词是什么(上图编号6所示),你能够构建一个神经网络,只把目标词的前一个词或者说前一个词的嵌入向量输入神经网络来预测该词的下一个词。
还有一个效果很是好的作法就是上下文是附近一个单词,它可能会告诉你单词glass(上图编号7所示)是一个邻近的单词。或者说我看见了单词glass,而后附近有一个词和glass位置相近,那么这个词会是什么(上图编号8所示)?这就是用附近的一个单词做为上下文。咱们将在下节视频中把它公式化,这用的是一种Skip-Gram模型的思想。这是一个简单算法的例子,由于上下文至关的简单,比起以前4个词,如今只有1个,可是这种算法依然能工做得很好。
研究者发现,若是你真想创建一个语言模型,用目标词的前几个单词做为上下文是常见作法(上图编号9所示)。但若是你的目标是学习词嵌入,那么你就能够用这些其余类型的上下文(上图编号10所示),它们也能获得很好的词嵌入。我会在下节视频详细介绍这些,咱们会谈到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模型中,咱们要作的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不必定老是目标单词以前离得最近的四个单词,或最近的
个单词。咱们要的作的是随机选一个词做为上下文词,好比选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。
这里有一些解决方案,如分级(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就不会那么频繁地地出现了。你可能不会想要你的训练集都是这些
在上个视频中,你见到了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个词以内。
你已经了解了几个计算词嵌入的算法,另外一个在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所示)就是
这里用的平均值运算单元,这个算法适用于任何长短的评论,由于即便你的评论是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向量乘以词嵌入矩阵
,获得词嵌入表达,而后把它们送进RNN里。RNN的工做就是在最后一步(上图编号1所示)计算一个特征表示,用来预测
,这是一个多对一的网络结构的例子,咱们以前已经见过了。有了这样的算法,考虑词的顺序效果就更好了,它就能意识到"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所示的区域内),因此首先咱们要作的事就是辨别出咱们想要减小或想要消除的特定偏见的趋势。
为了便于说明,我会集中讨论性别歧视,不过这些想法对于全部我在上个幻灯片里说起的其余类型的偏见都是通用的。这个例子中,你会怎样辨别出与这个偏见类似的趋势呢?主要有如下三个步骤:
2、中和步骤,因此对于那些定义不确切的词能够将其处理一下,避免偏见。有些词本质上就和性别有关,像grandmother、grandfather、girl、boy、she、he,他们的定义中本就含有性别的内容,不过也有一些词像doctor和babysitter咱们想使之在性别方面是中立的。同时在更一般的状况下,你可能会但愿像doctor或babysitter这些词成为种族中立的,或是性取向中立的等等,不过这里咱们仍然只用性别来举例说明。对于那些定义不明确的词,它的基本意思是不像grandmother和grandfather这种定义里有着十分合理的性别含义的,由于从定义上来讲grandmothers是女性,grandfather是男性。因此对于像doctor和babysitter这种单词咱们就能够将它们在这个轴(上图编号1所示)上进行处理,来减小或是消除他们的性别歧视趋势的成分,也就是说减小他们在这个水平方向上的距离(上图编号2方框内所示的投影),因此这就是第二个中和步。
3、均衡步,意思是说你可能会有这样的词对,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的子空间进行处理。
最后,你须要平衡的词对的数其实是很小的,至少对于性别歧视这个例子来讲,用手都可以数出来你须要平衡的大部分词对。完整的算法会比我在这里展现的更复杂一些,你能够去看一下这篇论文了解详细内容,你也能够经过编程做业来练习一下这些想法。
如何对两个单词除偏,好比:"actress“(“女演员”)和“actor”(“演员”)。均衡算法适用于您可能但愿仅经过性别属性不一样的单词对。举一个具体的例子,假设"actress“(“女演员”)比“actor”(“演员”)更接近“保姆”。经过将中和应用于"babysit"(“保姆”),咱们能够减小与保姆相关的性别刻板印象。可是这仍然不能保证"actress“(“女演员”)和“actor”(“演员”)与"babysit"(“保姆”)等距。均衡算法能够解决这个问题。
总结一下,减小或者是消除学习算法中的偏见问题是个十分重要的问题,由于这些算法会用来辅助制定愈来愈多的社会中的重要决策,在本节视频中分享了一套如未尝试处理偏见问题的办法,不过这还是一个许多学者正在进行主要研究的领域。
参考资料
[1]
深度学习课程: https://mooc.study.163.com/university/deeplearning_ai
[2]
黄海广: https://github.com/fengdu78
[3]