人工智能算法分析 课件 【ch09】文本挖掘_第1页
人工智能算法分析 课件 【ch09】文本挖掘_第2页
人工智能算法分析 课件 【ch09】文本挖掘_第3页
人工智能算法分析 课件 【ch09】文本挖掘_第4页
人工智能算法分析 课件 【ch09】文本挖掘_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能算法分析新知识体系人工智能教材文本挖掘第九章9.1.1文本挖掘概念根据IBM的数据,2017年,每天都会生成2.5艾字节(1字节=1073741824千兆字节)的数据,而且该量级还在不断增加。从这个角度来看,如果这些数据全都要被处理,我们每个人每天将要处理约300MB的数据。因为人们每天都会产生数量庞大的电子邮件、社交媒体内容及语音电话,而在所有这些数据中,很大一部分是非结构化的文本和语音。文本挖掘,即自然语言处理,是计算机科学领域与人工智能领域的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言是一门融合语言学、计算机科学、数学于一体的科学。因此,这一领域的研究涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有很大的区别。自然语言处理并不是传统意义上的研究自然语言,而是指使用一些文本或语言处理算法对文本或语言问题进行处理。9.1.2文本挖掘现状文本挖掘自1995年被提出以后,国外就开始进行了相关的研究。国内从国外引进文本挖掘这一概念,然后开展研究,因此相对较晚。目前,国内对于文本挖掘的研究主要包括阐述文本挖掘的相关技术,如文本分类、文本聚类、自动文摘、中文分词:介绍文本挖掘与数据挖掘、信息检索、信息抽取之间的联系与区别:描述文本挖掘的应用;电子邮件管理、文档管理、自动问答系统、市场研究、情报收集等,以及目前的文本挖掘工具等。当前,文本挖掘的模型或算法包括Word2vec-词嵌入、即制、LSTM、CNN等经典模型或算法,本章将对Word2vec-词嵌入和递归神经网络(RNN)算法进行介绍,这也是目前主主芥挖掘领域应用最多的两种方法。Word2vec-词嵌入029.2.1背景介绍背景介绍“含义”本身是什么意思?这更像是一个哲学问题,而不是技术问题。因此,我们不会试图找出这个问题的最佳答案,而是接受一个折中的答案,即含义是一个单词所表达的想法或某种表示。由于NLP的主要目标是在语言任务中达到和人类一样的表现,因此为机器寻找表示单词的原则性方法是有用的。为了实现这一目标,我们使用可以分析给定文本语料库并给出单词的良好数字表示(词嵌入〉的算法,它可以便属于类似上下文的单词(如one和two、I和we)与不相关的单词(如cat和volcano)相比有更相似的数字表示。首先我们将讨论实现这一目标的一些经典方法,然后介绍目前采用的更复杂的方法,后者使用神经网络来学习这些特征表示,并具有最好的性能。在本节中,我们将讨论用数字表示单词的一些经典方法。这些方法主要可以分为两类:使用外部资源表示单词的方法和不使用外部资源表示单词的方法。首先,我们将讨论WordNet:一种使用外部资源表示单词的最流行的方法。019.2.1背景介绍WordNet是处理单词表示的最流行的经典方法和统计NLP方法之一。它依赖外部词汇知识库,该知识库对给定单词的定义、同义词、祖先、派生词等信息进行编码。WordNet允许用户推断给定单词的各种信息,如前一句中讨论的单词的各种信息和两个单词之间的相似性。如前面所述,WordlNet是一个词汇数据库,用于对单词之间的词性标签关系(包括名词、动词、形容词和副词)进行编码。WordNet由美国普林斯顿大学心理学系首创,目前由普林斯顿大学计算机科学系负责。WordNet考虑单词之间的同义性来评估单词之间的关系。用于英语的WordNet目前拥有超过150000个单词和超过100000个同义词组Csynset)。此外,WordNet不仅限于英语,自成立以来,已经建立了许多基于不同语言的WordNet。为了学习使用WordNet,需要对WordNet中使用的术语有坚实的基础。首先,WordNet使用术语synset来表示一群或一组同义词。接下来,每个synset都有个definition,用于解释synset表示的内容。synset中包含的同义词称为lemma。9.2.1背景介绍在WordNet中,单词表示是分层建模的,它在给定的synset与另个synset之间进行关联,形成一个复杂的图。有两种不同类别的关联方式:is-a关系或is-made-of关系。首先,我们将讨论is-a关系。对于给定的synset,存在两类关系:上位词和下位词。synset的上位词是所考虑的synset的一般(更高一层)含义的同义词。例如,vehicle是同义词car的上位词。接下来,下位词是比相应的同义词组更具体的同义词。例如,Toyotacar是同义词car的下位词。在让我们讨论一个synset的is-made-of关系。一个synset的整体词是可以表示所考虑的这个synset的全部实体的synset。例如,tires的整体词是cars。部分词是is-made-of类别的关系,是整体词的反义词,部分词是组成相应synset的一部分,我们可以在图9.2中看到它们。9.2.1背景介绍虽然WordNet是个令人惊叹的资源,任何人都可以在NLP任务中用它学习单词的含义,但使用WordNet有很多不足之处,如下所示。缺少细微差别是WordNet的个关键问题。WordNet在理论和实际应用中都有不可行的原国。从理论的角度来看,对两个实体之间微妙差异的定义进行建模并不恰当。实际上,定义细微差别是主观的。例如,单词want和need具有相似的含义,但其中一个(need)更具有主张性,这被认为是种细微差别。一9.2.1背景介绍接下来,WordNet本身就是主观的,因为WordNet是由一个相对较小的社区设计的。根据你要解决的具体问题判断WordNet是否合适,或者可以通过更加宽泛的方式来定义单词,以提高WordNet的性能。维护WordNet也存在问题,这是需要大量人力的。维护和添加新的synset、definitionslemma等的代价可能非常昂贵。这会对WordNet的可扩展性产生负面影响,因为人力对更新WordNet至关重要。为其他语言开发WordNet成本可能很高。有一些人努力为其他语言构建WordNet并将其与英语WordNet链接为MultiWordNetCMWN),但尚未完成。接下来,我们将讨论几种不依赖外部资源的单词表示技术。(1)独热编码方式。表示单词的更简单的方法是使用独热编码表示。这意味着,如果我们有一个V大小的词汇表,对于第i个词叭,我们将用一个长度为Y的向量[0,0,0,0,1,0,···,0,0]来表示单词9.2.1背景介绍其中,第i个元素为1,其他元素为零。举个例子,考虑一下下面这句话:BobandMaryaregoodfriends,其每个单词的独热编码表示如下所示。但是,正如你可能己经想到的那样,这种表示有许多缺点。该表示并没有用任何方式对单词之间的相似性进行编码,并且完全忽略了单词的上下文。让我们考虑单词向量之间的点积作为相似性度量方法,两个矢量越相似,这两个矢量的点积越高。例如,单词car和cars的单词表示的相似距离是0,而car和pencil也有相同的值。对于大型词汇表,此方法变得效果甚微。此外,对于典型的NLP任务,词汇量很容易超过50000。因此,用50000单词表示矩阵将形成非常稀疏的50000×50000的矩阵。然而,即使在最先进的词嵌入学习算法中,独热编码也起着重要作用。我们使用独热编码方式将单词表示为数字向量,并将其送入神经网络,以便神经网络可以学习单词的更好和更短的数字特征表示。9.2.1背景介绍然而,即使在最先进的词嵌入学习算法中,独热编码也起着重要作用。我们使用独热编码方式将单词表示为数字向量,并将其送入神经网络,以便神经网络可以学习单词的更好和更短的数字特征表示。(2)TF-IDF方法。TF-IDF是一种基于频率的方法,它考虑了单词在语料库中出现的频率。这是一种表示给定文档中特定单词的重要性的单词表示。直观地说,单词的频率越高,该单词在文档中就越重要。例如,在关于猫的文档中,单词cats会出现更多次。然而,仅仅计算频率是行不通的,因为像this和is这样的词有很多,但是它们并没有携带很多信息。TF-IDF将此考虑在内,并把这些常用单词的值置为零。同样,TF代表词频率,IDF代表逆文档频率。TF(

)=单词中

出现的次数IDF(

)=log(文档总数/包含

的文档数量)9.2.1背景介绍(3)共现矩阵。与独热编码表示方法不同,共现矩阵对单词的上下文信息进行编码,但是需要维持V×V矩阵。为了理解共现矩阵,请看以下两个例句:• JerryandMaryare企1ends.• JerrybuysflowersforMary.共现矩阵看起来像下面的矩阵,我们只显示矩阵的上三角,因为矩阵是对称的,如表9.19.2.1背景介绍不难看出,因为矩阵的大小随着词汇量的大小而呈多项式增长,维持这样的共现矩阵是一有代价的。此外,上下文窗口扩展到大小大于1并不简单。种选择是引入加权计数,其中,上下文中的单词的权重随着与中心单词的距离增大而减小。所有这些缺点促使我们研究更有原则、更健壮和更可扩展的推断单词含义的学习方法。Word2vec一词嵌入是分布式单词表示学习技术,目前被用作许多NLP任务的特征工程技术(如机器翻译、聊天机器人和图像标题生成)。从本质上讲,Word2vec词嵌入通过查看所使用的单词的周围单词(上下文)来学习单词表示。更具体地说,我们试图通过神经网络根据给定的一些单词来预测上下文单词(反之亦然),这使得神经网络被迫学习良好的词嵌入方法。我们将在下节中详细讨论这种方法。Word2vec一词嵌入方法与之前描述的方法相比具有以下优点。9.2.1背景介绍1.Word2vec-词嵌入方法并不像基于WordNet的方法那样对于人类语言知识具有主观性。2.与独热编码表示和共现矩阵不同,Word2vec一词嵌入所表示的向量的大小与词汇量大小无关。3.Word2vec一词嵌入是一种分布式表示方法。与表示向量取决于单个元素的激活状态的(如独热编码)局部表示方法不同,分布式表示方法取决于向量中所有元素的激活状态。这为Word2vec一词嵌入提供了比独热编码表示更强的表达能力。在下一节中,我们将首先通过一个示例来建立对学习词嵌入的直观感受。然后我们将定义一个损失函数,以便使用机器学习方法来学习词嵌入。此外,我们将讨论两种Word2vec一词嵌入方法,即skip-gram和连续词袋(CBOW)算法。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示Word2vec一词嵌入利用给定单词的上下文来学习它的语义。Word2vec一词嵌入是一种开创性的方法,可以在没有任何人为干预的情况下学习单词的含义。此外,Word2vec一词嵌入通过查看给定单词周围的单词来学习单词的数字表示。我们可以想象一个真实世界中存在的场景来测试上述说法的正确性。例如,你正在参加考试,你在第一个问题中找到了这句话:“Maryisaverystubbornchild.Herpervicaciousaturealwaysgetsherintrouble.”除非你非常聪明,否则你可能不知道pervicacious是什么意思。在这种情况下,你会自动查看感兴趣的单词周围的短语。在此例子中,pervicacious的周围是stubbom、nature和trouble,这3个词就足以说明,pervicacious事实上是指顽固状态。我认为这足以证明语境对于认识一个词的含义的重要性。现在,让我们讨论Word2vec一词嵌入的基础知识。如前面所述,Word2vec一词嵌入通过查看单词上下文并以数字方式表示它,来学习给定单词的含义。所谓“上下文”,指的是在感兴趣的单词的前面和后面的固定数量的单词。假设我们有一个包含N个单词的语料库,在数学上,这可以由以w0,w1…wi和wn表示的一系列单词表示,其中,w是语料库中的第i个单词。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示接下来,如果我们想找到一个能够学习单词含义的好算法,那么在给定一个单词之后,我们的算法应该能够正确预测上下文单词。这意味着对于任何给定的单词wi,以下概率应该较高为了得到等式右边,我们需要假设给定目标单词(wi)的上下文单词彼此独立(如wi-₂和wi-1,是独立的)。虽然不完全正确,但这种近似使得学习更切合实际,并且在实际中的效果良好。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示1.损失函数即使是简单的现实世界中的任务,其词汇量也很容易超过10000个单词。因此,我们不能手动为大型文本语料库开发词向量,而需要设计一种方法来使用一些机器学习算法(如神经网络),自动找到好的词嵌入方法,以便有效地执行这项繁重的任务。此外,要在任何类型的任务中使用任何类型的机器学习算法,需要定义损失,这样,完成任务就转化为让损失最小化。接下来我们就开始介绍损失函数。首先,让我们回想以下在本节中开头讨论过的等式有了这个等式之后,我们为神经网络定义成本函数9.2.2Word2vec-词嵌入——基于神经网络学习单词表示记住,J(θ)是损失(成本),而不是奖励,另外,我们想要使P(w)lw)最大化。因此,式最小我们需要在表达式前面加一个减号将其转换为损失函数。现在,让我们将其转换对数空间,而不是使用点积运算符。将等式转换为对数空间会增加一致性和数值稳定性.这种形式的成本函数称为“负对数似然”。现在,因为有一个精心设计的成本函数,我们可以用神经网络来优化这个成本函数。这样做会迫使词向量或词嵌入根据单词含义很好地被组织起来。下面介绍如何使用上述成本函数来提出更好的词嵌入算法。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示2.skip-gram算法我们将讨论的第一个算法称为skip-gram算法,它由Mikolov等人在2013年提出,该算法是一种利用文本单词上下文来学习好的词嵌入方法的算法。让我们一步一步地了解skip-gram算法。首先,我们将讨论数据准备过程,然后介绍理解算法所需要的表示法,最后我们将讨论需要在算法本身。正如我们前面所讨论的那样,单词的含义可以从围绕该单词的上下文单词中得到。但是,建立一个利用这种性质来学习单词含义的模型并不是很容易。首先,我们需要设计一种方法来提取可以送入学习模型的数据集,这样的数据集应该是格式为(输入,输出)的一类元组。而且,这需要以无监督学习的方式创建。也就是说,人们不应形式的应该手动设置数据标签。总之,数据准备过程应该执行以下操作。。获取给定的那个单词周围的单词。。以无监督学习的方式执行。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示skip-gram模型使用以下方法来构建这样的数据集。(1)对于给定的单词w,假设上下文窗口大小为mo上下文窗口大小指的是单侧被视为上下文的单词数。因此,对于wi,上下文窗口(包括目标词Wi)大小为2m+1,如下所示:[wi-m,...,Wi-1,wi,Wi+1,...,Wi+m]。(2)接下来,输入输出元组的格式为[...,(wi,wi-m),•..,(wi,wi-1,(wi,wi+1,),...,(wi,wi+m).,.]这里,m+1<=i<=N-m。N是文本中用于获得实际含义的单词数。让我们假设以下句子的上下文窗口大小m为1:Thedogbarkedatthemailman.对于此示例,数据集如下所示:(dog,The),(dog,barked),(barked,dog),(barked,at),...,(the,at),(the,mailman)9.2.2Word2vec-词嵌入——基于神经网络学习单词表示下面介绍如何使用神经网络学习词嵌入。一旦数据是(输入,输出)格式,我们就可以使用神经网络来学习词嵌入。首先,让我们确定学习词嵌入所需要的变量。为了存储词嵌入,我们需要一个Y×D矩阵,其中,Y是词汇量大小,D是词嵌入的维度(在向量中表示单个单词的元素数量)。D是用户定义的超参数,D越大,学习到的词嵌入的表达力越强。该矩阵被称为嵌入空间或嵌入层。接下来,有一个softmax层,其权重大小为DxV,偏置大小为V。每个词将被表示为大小为V的独热编码向量,其中,一个元素为1,所有其他元素为0。因此,输入单词和相应的输出单词各自的大小为V。让我们把第i个输入记为xi,xi的对应嵌入为zi,对应输出为yi。此时,我们定义了所需要的变量。接下来,对于每个输入xi,我们将从对应于输入的嵌入层中查找嵌入向量。该操作向我们提供zi,它是大小为D的向量(长度为D的嵌入向量)。然后,我们做以下转换以计算xi的预测输出:9.2.2Word2vec-词嵌入——基于神经网络学习单词表示其中,logit(x)表示非标准化分数Clogit),真是大小为Y的预测输出(表示输出是大小为V的词汇表的单词的概率),w是D×V权重矩阵,b是V×1偏置矢量,softmax就是softmax激活函数。我们将可视化skip-gram模型的概念图(见图9.3)和实现图(见图9.4)。以下是对符号的总结。•V:词汇量的大小。•D:嵌入层的维度。•Xi:第i个输入单词,表示为独热编码向量。·zi:与xi对应的嵌入(表示)向量。·yi:与xi对应的输出单词的独热编码向量。·:xi的预测输出。。logit(x):输入xi的非标准化得分。·:单词wj的独热编码表示。。W:softmax权重矩阵。b:softmax的偏置。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示通过使用现有单词和计算得到的实体,可以使用负对数似然损失函数来计算给定数据点(xi,yi)的损失。如果想知道是什么,它可以从已定义的实体派生出来。接下来,让我们讨论如何从计算并得到一个正式的定义。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示(1)制定实际的损失函数。让我们更仔细地查看损失函数,得出的损失如下所示:但是,根据目前掌握的信息,计算这一特定损失并不是很容易。首先,让我们理解P(wj|wi)代表什么。为此,我们将从单个单词表示法转为单个数据点表示法。也就是说,我们会说P(wj|wi)由第n个数据点给出,其中,wi的独热编码向量作为输入(xn),wj的独热编码表示作为真实输出(yn)。这由以下等式给出:9.2.2Word2vec-词嵌入——基于神经网络学习单词表示其中,logit(xn)项表示给定输入xn,获得的非标准化预测得分(logit)向量(大小为V),而logit(xn)wj的独热编码表示中非零的索引所对应的得分值(从现在开始,我们称之为wj的索引)。以所有单词所对应的logit值作为基准,对wj索引处的logit值进行标准化。这种特定类型的归一化称为softmax激活(或归一化)。现在,通过将其转换为对数空间,可以得到以下等式:为了有效地计算logit函数,可以调整变量,从而得出以下表示法:其中,

是wj,的独热编码向量。现在,logit操作缩减为对乘积求和。由于对应单词wj,

仅有一个非零元素,因此在计算中将仅使用向量的该索引。这比通过扫描词汇量大小的向量找到对应非零元素的索引的logit向量中的值的计算效率更高。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示现在,通过将获得的计算结果赋给logit,对于损失函数,可以得到以下结果:接下来,让我们考虑输入输出元组(like,I)。当我们通过skip-gram学习模型输入like时-,假设按照该顺序获得了Like、I和NLP这些单词的以下logit值:2,10,5现在,词汇表中每个单词的softmax输出如下所示:9.2.2Word2vec-词嵌入——基于神经网络学习单词表示P(likellike)=exp(2)/(exp(2)+exp(10)+exp(5))=0.118P(Illike)=exp(10)/(exp(2)+exp(10)+exp(5))=0.588P(NLPIlike)=exp(5)/(exp(2)+exp(10)+exp(5))=0.294有了这个损失函数,对于减号之前的项,y向量中只有一个非零元素对应于单词,因此,我们只考虑概率P(Illike),这就是我们想要的。但是,这不是理想解决方案。从实际角度来看,该损失函数的目标是使预测给定单词的上下文单词的概率最大化,同时使预测给出单词的“所有”非上下文单词的概率最小化。我们很快就会发现,有一个良好定义的损失函数并不能在实践中有效地解决我们的问题,需要设计一个更聪明的近似损失函数,以在可行的时间内学习良好的词嵌入。(2)有效的近似损失函数我们很幸运有一个在数学上和感觉上都很正确的损失函数,但是,困难并没有就此结束。如果我们像前面讨论的那样尝试以封闭形式计算损失的数,将不可避免地面对算法执行得非常缓慢的问题,这种缓慢是由于词汇量大而导致的性能瓶颈。下面来看损失函数9.2.2Word2vec-词嵌入——基于神经网络学习单词表示可以看到计算单个示例的损失需要计算词汇表中所有单词的logit。与通过数百个输出类别就足以解决大多数现有的真实问题的计算机视觉问题不同,skip-gram并不具备这些特性。因此,我们需要在不失去模型效果的前提下寻找有效的损失近似方案。下面我们将讨论两种主流的近似选择:负采样。分层softmaxo(1)对softmax层进行负采样。在这里,我们将讨论第一种方法:对so伽1ax层进行负采样。负采样是对噪声对比估计(NCE)方法的近似。NCE要求,一个好的模型应该通过逻辑回归来区分数据和噪声。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示考虑到这个属性,让我们重新设计学习词嵌入的目标。我们不需要完全概率模型,该模型给出的是词汇表中给定单词的确定概率。我们需要的是高质量的词向量。因此,我们可以简化问题,将其变为区分实际数据(输入输出对)与噪声(K个虚拟噪声输入输出对)。噪声指的是使用不属于给定单词的上下文的单词所创建的错误输入输出对。我们还将摆脱softmax激活,并将其替换为signoid激活(也称为逻辑函数)。这使得我们能够在使输出保持在[0,1]之间的同时,消除损失函数对完整词汇表的依赖。我们可以可视化如图9.5所示的负采样过程。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示我们花一点时间来理解这个等式所说的内容。为简化起见,我们假设k=1,这样可以得到以下等式其中,wj表示wi的上下文单词,wq表示其非上下文单词。这个等式表示,为了使J(0)最小化,我们应该使σ(logit(xn)wj)=1,这意味着logit(xn)wq)=1应该是一个大的正值。然后,o(logit(xn)wq)=1意味着logit(xn)wq需要是一个大的负值。换句话说,表示真实目标单词和上下文单词的真实数据点应该获得大的正值,而表示目标单词和噪声的伪数据点应该获得大的负值。这与使用softmax函数获得的效果相同,但具有更高的计算效率。这里,σ表示sigmoid激活函数。直观地看,在计算损失的时候,我们应进行以下两步。计算w的非零列的损失(推向正值)。。计算k个噪声样本的损失(拉向负值)。(2)分层sofimax。分层softmax比负采样略复杂,但与负采样的目标相同,也就是说,其与softmax类似,而不必计算所有训练样本的词汇表中所有单词的激活状态。但是,与负采样不同,分层softmax仅使用实际数据,并且不需要噪声采样。图9.6所示为可视化的分层softmax模型。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示要了解分层softmax,让我们考虑一个例子:IlikeNLP.Deeplearn工ngisamazing.其词汇表如下:工,like,NLP,deep,learning,is,amazing:使用上述词汇表构建一个二叉树,其中,词汇表中的所有单词都以叶子节点的形式出现。添加一个特殊的标记PAD,以确保所有叶子节点都有两个成员。最后一个隐藏层将完全连接到分层结构中的所有节点。注意,与经典的softmax模型相比,该模型具有相似的总权重,但是,对于给定的计算,它仅使用其中一部分。分层softmax是如何连接到嵌入层的如图9.7所示。假设需要推断P(NLPllike)的概率,其中,like是输入词,那么我们只需要权重的子集即可计算概率,如图9.8所示。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示计算概率的过程如下:现在我们己经知道如何计算P{飞[w;},可以使用原始的损失函数。注意,该方法仅使用连接到路径中的节点的权重进行计算,从而提高了计算效率。(3)学习分层结构。虽然分层sofunax是有效的,但一个重要的问题仍然没有答案。如何确定树的分支?更准确地说,哪个词会跟随哪个分支?有下面几种方法可以解决上述问题。随机初始化层次结构:此方法确实存在一些性能下降,因为随机分配无法保证特定单词在最佳分支上。使用WordNet确定层次结构:WordNet可用于确定树中单词的合适顺序,该方法明显比随机初始化有更好的性能。(4)优化学习模型。点由于有了一个精心设计的损失函数,因此优化就是从深度学习库调用正确函数。要使用的优化过程是随机优化过程,这意味着我们不会一次输入完整数据集,只需要在许多步中随机提供批量数据。9.2.3案例分析通过以上内容讲解,相信读者对Word2vec-词嵌入算法已经有了一定的了解。下面,将采用Python中的gensim包实现Word2vec-词嵌入,并介绍相关函数功能。我们将本次案例按步骤进行介绍。1.获取文本语料一词这里采用网上的文本语料,语料大小将近100MB。下载之后,可以查看语料内容,方便可用后面对语料数据进行读取,具体程序如下:可以发现,语料已经按空格分好词,并且去除了所有的标点符号,也没有换行符,语料输出图如图9.9所示。9.2.3案例分析9.2.2Word2vec-词嵌入——基于神经网络学习单词表示这一行表示程序会输出日志信息,形式(format)为日期(asctime):信息级别(levelname):日志信息(message),信息级别为正常信息(loggingINFO)。当然,logging.basicConfig函数里面可以添加各个参数,这里只添加了format参数,也可以根据需要增加参数,建议只添加自己想知道的东西。logging.basicConfig函数各参数的含义如下。filename:指定日志文件名。filemode和file函数的意义相同,指定日志文件的打开模式,'w’或'a‘。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示format:指定输出的格式和内容,format可以输出很多有用信息。%(levelno)s:打印日志级别的数值。%(levelname)s:打印日志级别的名称。%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[O]。%(filename)s:打印当前执行程序名。%(funcName)s:打印日志的当前函数。%(lineno)d:打印日志的当前行号。%(asctime)s:打印日志的时间。%(thread)d:打印线程ID。%(也readName)s:打印线程名称。%(process)d:打印进程ID.%(message)s:打印日志信息。datefmt:指定时间格式,同time础武ime()。level:设置日志级别,默认为logging.W成NINGo9.2.2Word2vec-词嵌入——基于神经网络学习单词表示stream:指定将日志的输出流输出到sys.stderr,sys.stdout或文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略。logging打印信息函数如下:logging.debug('Thisisdebugmessage’);('Thisisinfomessage’);logging.warning('Thisiswarningmessage’)。运行上述程序,可以得到如图9.10所示的日志输出结果图。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示(2)将语料保存在sentence中。输入:Sentences=word2vec.TextsCorpus(`texts')这里采用的'text8’语料已经按空格分好词,并且去除了所有的标点符号,也没有换行符,所以不需要任何预处理。对于大规模数据集,sentences可以采用word2vec.BrownCorpus()、word2vec.Text8Corpus(或word2vec.LineSentence0来读取;对于小规模数据集,sentences可以是一个List的形式,如sentences=[["I","love","China","very","much"]或["China","is","a","strong","country"]]。(3)生成词向量空间模型。model=word2vec.Word2Vec(sentences,sg=1,size=100,window=5,min_count=5,negative=3,sample=0.001,hs=1,workers=4)此行通过设置各个参数来配置Word2vec-词嵌入模型,具体参数的含义如下。sentences:可以是一个List,对于大语料集,建议使用BrownCorpus、Text8Corpus或lineSentence构建。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示sg:用于设置训练算法,默认为0,对应CBOW算法;若sg=1,则采用skip-gram算法。size:输出的词的向量维数,默认为100。若size大,则需要更多的训练数据,但是效果会更好,推荐size值为几十到几百。window:训练的窗口大小,8表示每个词考虑前8个词与后8个词(实际代码中还有一个随机选窗口的过程,窗口大小≤5),默认值为5。alpha:学习速率。seed:用于随机数发生器,与初始化词向量有关。min_count:可以对字典做截断,词频少于min_count次数的单词会被丢弃掉,默认min_count值为5。max_vocab_size:设置词向量构建期间的RAM限制。如果所有独立单词个数超过此限制,就消除其中出现得最不频繁的一个。每一千万个单词大约需要1GB的RAM。若设置成None,则没有限制。sample:采样阈值,一个词在训练样本中出现的频率越大,就越容易被采样。默认为e-3,范围是(0,e~)workers:参数控制训练的并行数。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示hs:是否使用hs方法,0表示不使用,1表示使用,默认为0。negative:若>0,则会采用negativesampling,用于设置有多少个noisewords。cbow_mean:若为0,则采用上下文词向量的和,若为I(default),则采用均值。cbow_mean只有在使用CBOW的时候才起作用。hashfxn:hash函数用来初始化权重。默认使用Python的hash函数。iter:迭代次数,默认为5。trim_rule:用于设置词汇表的整理规则,指定哪些单词要留下,哪些单词要被删除。可以设置为None(mincount会被使用)或者一个接受O并返回RULEDISCARDutils.RULE_KEEP或utils.RULE_DEFAULT的函数。sorted_vocab:若为1(default),则在分配wordindex的时候会先对单词基于频率降序排序。batch_words:每一批传递给线程的单词数量,默认为10000。9.2.2Word2vec-词嵌入——基于神经网络学习单词表示(4)保存模型。输入:model.save(text8word2vec.model')将模型保存起来,以后再使用的时候就不用重新训练了,直接加载训练好的模型就可以直接使用了。下面介绍加载模型后,直接使用Word2vec-词嵌入来实现各种功能。3.保存模型,实现功能9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示9.2.2Word2vec-词嵌入——基于神经网络学习单词表示递归神经网络039.3.1递归神经网络介绍递归神经网络(RNN)是一个特殊的神经网络系列,旨在处理序列数据(时间序列数据),如一系列文本(如可变长度句子或文档)或股票市场价格。RNN维护一个状态变量,用于捕获序列数据中存在的各种模式,因此,它们能够对序列数据建模。传统的全连接神经网络不具备这种能力,除非用捕获到的序列中重要模式的特征表示来表示数据。然而,提取这样的特征表示是非常困难的。对序列数据建模的全连接模型的另一替代方案是时间/序列中的每个位置有单独的参数集,这样,分配给某个位置的参数集就可以学习在该位置发生的模式。但是,这将大幅增加模型对内存的需求。然而,与全连接网络在每个位置都要有单独的参数集相反,RNN随时间共享相同的参数集。在时间跨度上进行参数共享是RNN的重要特点,实际上这是RNN能学习序列每一时刻模式的主要原因之一。对于我们在序列中观察到的每个输入,状态变量将随时间更新。在给定先前观察到的序列值的情况下,这些随时间共享的参数通过与状态向量组合,能够预测序列的下一个值。此外,由于我们一次只处理序列的一个元素(如一次处理文档中的一个单词),因此RNN可以处理任意长度的数据,而无须使用特殊标记填充数据。9.3.1递归神经网络介绍下面仔细探讨RNN是什么,并为RNN中的计算定义数学等式。让我们先从xi学习yi的近似函数开始:正如我们所看到的那样,神经网络由一组权重和偏置,以及一些非线性激活函数组成。因此,我们可以将上面的关系写成如下形式:其中,tanh是激活函数,U是大小为mxd的权重矩阵,m是隐藏神经元的数量,d是输入的维数。此外,W是从h,到循环链的权重矩阵,大小为mxm。y,养系由以下等式给出:9.3.1递归神经网络介绍其中,V是大小为cxm的权重矩阵,c是输出的维数(可以是输出类别的数量)。图9.11说明了这些权重如何形成RNN。到目前为止,我们已经看到如何用包含计算节点的图来表示RNN,其中,边表示相应计算。此外,我们探讨了RNN背后的数学原理。现在让我们看看如何优化(或训练)RNN的权重,以学习序列数据。9.3.1递归神经网络介绍1.基于时间的反向传播训练RNN需要使用一种特殊的反向传播(BP),称为基于事件的反向传播(BPTT)。但是,要了解BPTT,首先需要了解BP的工作原理。然后,我们将讨论为什么BP不能直接应用于RNN,经过调整的BP如何适应RNN,从而产生BPTT。反向传播是用于训练全连接神经网络的技术。在BP中,将执行以下操作。计算给定输入的预测结果。比较预测结果与输入的实际标签,以计算预测误差E(如均方误差和交叉熵损失)。通过在所有wij的梯度

的相反方向上前进一小步,更新全连接网络的权重,以最小化上一步中计算的预测误差,其中,wij,是第i层的第j个权重。为了更清楚地理解,请考虑图9.12中描述的全连接网络。它图9.12全连接网络的计算有两个单一权重w1和w2,计算得到两个输出h和y,如图9.12所示。为简单起见,我们假设模型中没有非线性激活。9.3.1递归神经网络介绍9.3.1递归神经网络介绍2.为什么RNN不能直接使用反向传播现在,让我们尝试对图9.13中的RNN进行相同的处理。现在我们多了额外的循环权重w3。为了明确我们试图强调的问题,这里省略了输入和输出中的时间成分。9.3.1递归神经网络介绍

会产生问题,因为这是个递归的变量,最终会得到无穷多的导数项,因为h是递26归的(也就是说,计算力包括h本身),而h不是常数并依赖w。若要解决这一问题,可以将25输入序列随时间展开,为每个输入x创建RNN的副本,分别计算每个副本的导数,并通过计算梯度的总和将它们回滚,以计算需要更新的权重大小。接下来将讨论细节。3.训练RNN30计算RNN反向传播的技巧是不考虑单个输入,而考虑完整的输入序列。然后,如果计算w3第4个时间步的会得到如下结果9.3.1递归神经网络介绍这意味着我们需要计算直到第4个时间点的所有时间步的梯度之和。换句话说,首先展开序列,以便可以对每个时间步j计算

,这是通过创建4份RNN的副本完成的。因此,为了计算

,我们需要t-j+1个RNN副本。将副本汇总到单个RNN中,求所有先前时间步长的梯度和,得到一个梯度,并用梯度

更新RNN。然而,随着时间步数的增加,这会使计算代价变得更大。为了获得更高的计算效率,我们可以使用BPTT的近似,即截断的基于时间的反向传播(TBPTT),来优化递归模型。4.TBPTT:更有效地训练RNN在TBPTT中,我们仅计算固定数量的T个时间步长的梯度(与在BPTT中计算到序列的最开始不同)。更具体地说,当计算时间步长t的

时,我们只计算导数到时间步长t-T(也就是说,我们不计算所有的导数)9.3.1递归神经网络介绍这比标准BPTT的计算效率高得多。在标准BPTT中,对于每个时间步长,我们计算直到序列最开始的导数。但随着序列长度变得越来越大(如逐字处理文本文档),这在计算上变递得不可行。但是,在TBPTT中,我们仅向后计算固定数量的导数,可以得知,随着序列变长,计算成本不会改变。5.BPTT的限制,梯度消失和梯度爆炸拥有计算递归权重梯度的方法和高效的近似计算算法(如TBPTT)并没能让我们完全没有问题地训练RNN,计算时可能现问题。明白为什么会这样,让我们展开

中的单独一项,如下所示9.3.1递归神经网络介绍我们看到,当只有4个时间步时,我们有一项w33。因此,在第n个时间步,它将变为w3n-1。如果初始化w3为非常小的值(如00001),那么在n=1的时间步长,梯度将是无穷小(概率为0.1500)。此外,由于计算机在表示数字方面的精度有限,因此将忽略这次更新(算术下溢),这称为梯度消失。解决梯度消失问题并不容易7没有容易的方法重新缩放梯度,来让它们能够在时间上正确传播。能够在一定程度上解决梯度消失问题的几种技术是在初始化权重的时候要格外仔细(如Xavier初始化),或使用基于动量的优化方法(也就是说,除了当前的梯度更新,还添加了一个额外项,它是所有过去梯度的累积,称为速度项)。然而,对于这个问题,我们已经发现更多原则性的解决方法,如对标准RNN的各种结构性的改造。9.3.1递归神经网络介绍另一方面,假设我们将w初始化为非常大的值(如100000),那么,在n-100的时间步长,梯度将是巨大的(概率为10300)。这会导致数值不稳定,从而在Python中得到诸如Inf或NaN(不是数字)之类的值,这称为梯度爆炸。损失函数的忽大忽小也可能导致发生梯度爆炸。由于输入的维数及模型中存在的大量参数(权重),复杂的非凸损失面在深度神经网络中很常见。图94显示了RNN的损失面,突出显示了非常高的曲率形成了墙。如图9.14中的深色线所示,如果优化方法碰到这样的墙,那么梯度将爆炸或过冲。这可能导致无法将损失降到最低或导致数值不稳定,或两者兼有。在这种情况下,避免梯度爆炸的简单解决方案是在梯度大于某个阈值时,将梯度剪裁为合理小的值。9.3.2递归神经网络分类到目前为止,我们所讨论的是一对一的RNN,其中,当前输出取决于当前输入序列及先前观察到的历史输入序列。这意味着存在先前观察到的输入序列和当前输入序列产生的输出序列。然而,在实际中,可能存在这样的情况:一个输入序列只有一个输出序列、一个输入序列产生一个输出序列,以及一个输入序列产生一个与其序列大小不同的输出序列。在本节中,我们将介绍一些递归神经网络的类型。1.一对一RNN在一对一RNN中,当前输入取决于先前观察到的输入(见图9.15)。这种RNN适用于每个输入都有输出的问题,但其输出取决于当前输入和导致当前输入的输入历史。这种任务的一个例子是股票市场预测,其中,我们根据当前输入的值得到输出,并且该输出取决于先前输入的表现。另一个例子是场景分类,我们对图像中的每个像素进行标记(如汽车、道路和人的标签)。对于某些问题,有时i+1与yi相同。例如,在文本生成问题中,先前预测的单词变为预测下一个单词的输入。图9.15所示为一对一RNN的时间依存关系。9.3.2递归神经网络分类9.3.2递归神经网络分类2.一对多RNN一对多RNN接受一个输入并输出一个序列,如图9.16所示。在这里,我们假设输入彼此独立,也就是说,不需要用先前的输入的相关信息来预测当前输入。但是,需要循环连接,因为尽管处理单个输入,但输出是依赖先前输出值的一系列值。使用这种时刑的一个任务是生成图像标题。例如,对于给定的输入图像,文本标题可以由5个或10个单词组成。换句话说,即仆J将持续预测单词,直到输出能描述图像的有意义的短句。图9.16所示为一对多RNN。9.3.2递归神经网络分类3.多对一RNN多对一赔。4输入任意长度的序列,产生一个输出,如图以17所示。句子分类就是受益于多对-RNN的任务。句子是任意长度的单词序列,它被视为网络的输入,用于产生将句子分类为一组预定义类别之一的输出。句子分类的一些具体例子如下。 将电影评论分类为正向或负向陈述(情感分析)。 根据句子描述的内容(如人物、物体和位置)对句子进行分类。多对一RNN剧的另一个应用是通过一次只处理图像的一块,并在整个图像上移动这个窗口,来对大尺寸图像进行分类。图9.17所示为多对一RNN。9.3.2递归神经网络分类4.多对多RNN多对多时刑通常根据任意长度的输入产生任意长度的输出,如图9.18所示,换句话说,输入和输出不必具有相同的长度。这在将句子从一种语言翻译成另一种语言的机器翻译中特别有用,可以想象,某种语言的一个句子并不总是能与另一种语言的句子对齐。另一个这样的例子是聊天机器人,其中,聊天机器人读取一系列单词(用户请求),并输出一系列单词(答案)。图9.18所示为多对多卧刑。

图9.18多对多RNN9.3.2递归神经网络分类我们对RNN的分类进行了总结,如表9.2所示9.3.3案例分析下面介绍如何使用时州来对文本进行分类。

我们以词作为基本元素,将每个句子分词成若干词。X1、X2等表示的是句子中的单词,我们可以将一个句子从前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论