智能系统与技术丛书
点击查看第二章
点击查看第三章
TensorFlow自然语言处理
Natural Language Processing with TensorFlow
[澳] 图珊·加内格达拉(Thushan Ganegedara) 著
马恩驰 陆 健 译
第1章
自然语言处理简介
自然语言处理(NLP)是理解和处理当今世界中大量非结构化数据的重要工具。最近,深度学习已被广泛用于许多NLP任务,因为深度学习算法在诸如图像分类、语音识别和现实文本生成等众多具有挑战性的任务中表现出显著的性能。另一方面,TensorFlow是目前最直观、最有效的深度学习框架之一。本书将向有志于深度学习的开发人员提供帮助,使他们能够使用NLP和TensorFlow处理大量数据。
在本章中,我们对NLP以及本书其余部分的内容提供基本介绍。将回答“什么是自然语言处理?”这个问题。此外,也将介绍一些自然语言处理最重要的用途。还将介绍传统方法和最新的基于深度学习的NLP方法,包括全连接神经网络(FCNN)。最后,在概述本书其余部分的内容以后,我们将介绍本书会使用的技术工具。
1.1 什么是自然语言处理
根据IBM的数据,2017年每天都会生成2.5艾字节(1艾字节= 1?000?000?000千兆字节)的数据,在本书的编写过程中,这个量级还在不断增加。从这个角度来看,如果这些数据全都要被处理,我们每个人每天将要处理大约300MB。因为人们每天都会产生数量庞大的电子邮件、社交媒体内容以及语音电话,而在所有这些数据中,很大一部分是非结构化的文本和语音。
这些统计数据为我们确定NLP是什么提供了良好的基础。简而言之,NLP的目标是让机器理解我们说的话和书面语言。此外,NLP无处不在,已经成为人类生活的重要组成部分。比如,Google智能助理、Cortana和Apple Siri这类虚拟助手(VA)主要是NLP系统。当一个人询问VA时,会发生许多NLP任务,比如有人问:“你能告诉我附近有好吃的意大利餐馆吗?”首先,VA需要将话语转换为文本(即语音到文本)。接下来,它必须理解请求的语义(例如,用户正在寻找一个提供意大利美食的餐厅),并将请求结构化(例如,美食=意大利菜,评级= 3-5,距离<10千米)。然后,VA必须以美食和地点为筛选条件来搜索餐厅,之后,根据收到的评级对餐厅进行排序。为了计算餐馆的整体评级,一个好的NLP系统可能会查看每个用户提供的评级和文字描述。最后,一旦用户到达该餐厅,VA可能会帮助用户将各种菜名从意大利语翻译成英语。这个例子表明,NLP已经成为人类生活中不可或缺的一部分。
我们需要明白,NLP是一个极具挑战性的研究领域,因为单词和语义具有高度复杂的非线性关系,并且将这些信息变为鲁棒的数字表示更加困难。更糟糕的是,每种语言都有自己的语法、句法和词汇。因此,处理文本数据涉及各种复杂的任务,比如文本解析(例如,分词和词干提取)、形态分析、词义消歧以及理解语言的基础语法结构。例如,在“I went to the bank”和“I walked along the river bank”这两句话中,词语bank有两个完全不同的含义。为了区分或(弄清楚)这个单词,我们需要理解单词的使用环境。机器学习已成为NLP的关键推动因素,它通过各种模型帮助我们完成上述任务。
1.2 自然语言处理的任务
在现实世界中,NLP有很多实际的应用。一个好的NLP系统可以执行许多NLP任务。当你在Google上搜索今天的天气或使用谷歌翻译将“how are you?”翻译成法语时,你依赖NLP中的此类任务的一个子集。这里列出一些最普遍的任务,本书涵盖这些任务中的大部分:
- 分词:该任务将文本语料库分隔成原子单元(例如,单词)。虽然看似微不足道,但是分词是一项重要任务。例如,在日语中,词语不以空格或标点符号分隔。
- 词义消歧(WSD):WSD是识别单词正确含义的任务。例如,在句子“The dog barked
- the mailman”和“Tree bark is sometimes used as a medicine”中,单词bark有两种不同的含义。WSD对于诸如问答之类的任务至关重要。
- 命名实体识别(NER):NER尝试从给定的文本主体或文本语料库中提取实体(例如,人物、位置和组织)。例如,句子“John gave Mary two apples at school on Monday”将转换为[John]name gave [Mary]name [two]number apples at [school]organization on [Monday.]time。NER在诸如信息检索和知识表示等领域不可或缺。
- 词性(PoS)标记:PoS标记是将单词分配到各自对应词性的任务。它既可以是名词、动词、形容词、副词、介词等基本词、也可以是专有名词、普通名词、短语动词、动词等。
- 句子/概要分类:句子或概要(例如,电影评论)分类有许多应用场景,例如垃圾邮件检测、新闻文章分类(例如,政治、科技和运动)和产品评论评级(即正向或负向)。我们可以用标记数据(即人工对评论标上正面或负面的标签)训练一个分类模型来实现这项任务。
- 语言生成:在语言生成中,我们使用文本语料库(包含大量文本文档)来训练学习模型(例如,神经网络),以预测后面的新文本。例如,可以通过使用现有的科幻故事训练语言生成模型,来输出一个全新的科幻故事。
- 问答(QA):QA技术具有很高的商业价值,这些技术是聊天机器人和VA(例如,Google Assistant和Apple Siri)的基础。许多公司已经采用聊天机器人来提供客户支持。聊天机器人可用于回答和解决客户的直接问题(例如,更改客户的每月学习计划),这些任务无须人工干预即可解决。QA涉及NLP的许多其他方面,例如信息检索和知识表示。结果,所有这些任务都使得开发QA系统变得非常困难。
- 机器翻译(MT):MT是将句子/短语从源语言(例如,德语)转换为目标语言(例如,英语)的任务。这是一项非常具有挑战性的任务,因为不同的语言具有不同的形态结构,这意味着它不是一对一的转换。此外,语言之间的单词到单词关系可以是一对多、一对一、多对一或多对多,这在MT文献中被称为单词对齐问题。
最后,为了开发一个可以帮助人们完成日常任务的系统(例如,VA或聊天机器人),许多这些任务需要合并执行。正如在前面的例子中看到的那样,当用户问:“你能告诉我附近有不错的意大利餐馆吗?”需要完成几个不同的NLP任务,比如语音转换到文本、语义和情感分析、问答和机器翻译。在图1.1中,我们对不同的NLP任务进行层级分类,将它们分为不同的类型。首先有两大类:分析(分析现有文本)和生成(生成新文本)任务。然后将分析分为三个不同的类别:句法(基于语言结构的任务)、语义(基于意义的任务)和实用(难以解决的公开问题):
了解了NLP中的各种任务后,让我们继续了解如何借助机器解决这些任务。
1.3 传统的自然语言处理方法
NLP问题的传统或经典的解决方法是几个关键步骤组成的顺序工作流,它是一种统计方法。当仔细研究传统的NLP学习模型时,我们将能够看到一系列明显不同的任务,例如,通过删除不需要的数据来预处理数据,使用特征工程来获得文本数据的良好数值表示,借助于训练数据来使用机器学习算法,以及预测新的不熟悉数据的输出。其中,如果要在给定NLP任务上获得良好性能,特征工程是最耗时且最关键的步骤。
1.3.1 理解传统方法
解决NLP任务的传统方法涉及一组不同的子任务。首先,需要对文本语料库进行预处理,重点是减少词汇量和干扰。所谓干扰,指的是会干扰算法,使其无法捕获完成任务所需的重要语言信息的那些东西(例如,标点符号和停止词被删除)。
接下来,介绍几个特征工程步骤。特征工程的主要目标是使算法的学习更容易,这些特征通常是手工设计的,并且偏向于人类对语言的理解。特征工程对于经典NLP算法非常重要,因此,性能最佳的系统通常具有最佳的工程特征。例如,对于情感分类任务,你可以用解析树表示一个句子,并为树中的每个节点/子树标上正、负或中性标签,以此将该句子分类为正面或负面。此外,特征工程阶段可以使用外部资源(如词汇数据库WordNet)来发现更好的特征。我们很快就会看到一种简单的特征工程技术,称为词袋。
接下来,该学习算法将使用所获得的特征和可选的外部资源,来学习如何在给定任务中表现良好。例如,对于文本摘要任务,包含单词同义词的同义词库是很好的外部资源。最后,执行预测。预测非常简单,只需将新的数据输入学习模型,然后获得对应的预测标签。传统方法的整个过程如图1.2所示。
传统方法示例:生成足球比赛摘要
为了深入理解传统的NLP方法,让我们从足球比赛的统计数据中考虑自动生成文本的任务。我们有几组游戏统计数据(例如,得分、罚球和黄牌)和记者的比赛报道,将它们作为训练数据。假设对于给定的比赛,有一个从每个统计参数到该参数的摘要中最相关短语的映射。我们的任务是,对于一场新的比赛,我们需要生成一个关于这场比赛的看上去自然的摘要。当然,可以简单地从训练数据中找到与新比赛最匹配的统计数据,并找到相应的摘要,但是,这里采用更智能和更优雅的文本生成方式。
如果要结合机器学习技术来生成自然语言,那么可能会执行一系列诸如预处理文本,分词、特征工程、学习和预测等操作。
预处理文本涉及一系列操作,比如词干化(例如,listened转化为listen)和删除标点符号(例如,删除“!”和“;”),以减少词汇量(即特征),从而减少所需的内存。明白词干化不是一项微不足道的操作很重要。词干化看似依赖于一组简单规则的操作,比如从动词中删除ed(例如,listened的词干是listen),然而,开发一个好的词干算法需要的不仅仅是一个简单的规则库,因为某些词的词干可能很棘手(例如,argued的词干是argue)。此外,由于不同语言的复杂程度不一样,正确词干化所需的工作量可能各不相同。
分词是可能需要执行的另一个预处理步骤。分词是将语料库划分为小实体(例如,单词)的过程。对于像英语这样的语言来说,这可能很容易,因为单词是孤立的。但是,对于某些语言(如泰语、日语和中文)而言,情况并非如此,因为这些语言的词语界定方式不一样。
特征工程用于将原始文本数据转换为数值形式,以便基于数据训练模型,例如,稍后将讨论把文本转换为词袋表示,或使用n-gram表示。但请记住,有良好效果的经典模型依赖于更智能的特征工程技术。
下面是一些特征工程技术:
(1)词袋:这是一种根据单词出现频率来创建特征表示的特征工程技术。例如,考虑以下句子:
- Bob went to the market to buy some f?lowers?
- Bob bought the f?lowers to give to Mary?
这两句话的词汇表是:
接下来,将为每个句子创建一个大小为V(词汇表大小)的特征向量,以表示该词汇表中每个单词出现在句子中的次数。在这个例子中,句子的特征向量分别如下:
词袋方法的一个关键缺陷是,由于不再保留单词的顺序,它会丢失上下文信息。
(2)n-gram:这是另一种特征工程技术,它将文本分解为由n个字母(或单词)组成的较小元素。例如,2-gram会将文本分成两个字母(或两个单词)的实体。例如,考虑这句话:
这句话的字母级别n-gram分解如下:
这句话的单词级别n-gram分解如下:
这种字母级别表示法的优点是,在大型语料上词汇表大小比我们使用单词作为特征的词汇表要小得多。
接下来,需要让我们的数据形成某种结构,以便能够将其输入学习模型。例如,将使用以下形式的数据元组(统计量,是用于解释统计信息的短语):
学习过程可以包括三个子模块:隐马尔可夫模型(HMM)、句子规划器和话语规划器。在我们的例子中,HMM可以通过分析相关短语的语料库来学习语言的形态结构和语法属性。更具体地说,我们把数据集中的每个短语连起来形成一个序列,其中,第一个元素是统计量,后跟解释它的短语。然后,我们将根据当前序列,通过要求HMM预测下一个单词来训练它。具体地说,首先将统计量输入HMM,然后得到HMM的预测,之后,将最后一个预测与当前序列连接起来,并要求HMM给出另一个预测,以此类推。这将使HMM能够在给定统计量的情况下输出有意义的短语。
接下来,我们可以用一个句子规划器来纠正可能出现在短语中的任何语言错误(形态或语法错误)。例如,一个句子规划器可以将“I go house”这个短语纠正为“I go home”。它可以使用规则数据库,这个数据库包含使含义得以正确表达的方法(例如,在动词和“house”之间需要有介词)。
现在,可以使用HMM为给定的统计数据集生成一组短语,然后,需要把这些短语聚合在一起,使得使用这些短语创作的文章是可阅读的,并且是流畅的。例如,考虑三个短语:“Player 10 of the Barcelona team scored a goal in the second half”、“Barcelona played against Manchester United”和“Player 3 from Manchester United got a yellow card in the f?irrst
half”。按此顺序排列这些句子没有多大意义。我们希望按如下顺序排列:“Barcelona played against Manchester United, Player 3 from Manchester United got a yellow card in the rst half, and Player 10 of the Barcelona team scored a goal in the second half”。为此,我们使用话语规划器,话语规划器可以对需要传达的信息进行排列和结构组织。
现在可以获得一组任意的测试统计数据,并按照前面的处理流程得到一篇解释该统计数据的文章,如图1.3所示。
在这里要注意,这是一个在很高层次上的说明,仅涵盖传统NLP方式中最有可能包含的主要的一般性组成部分。取决于我们有兴趣解决的具体应用,细节可能会有很大差异。例如,某些任务可能需要其他特定应用的关键组成部分(机器翻译中的规则库和对齐模型)。然而,在本书中,我们并没有强调这些细节,因为这里的主要目标是讨论更先进的自然语言处理方法。
1.3.2 传统方法的缺点
让我们列出传统方法的几个主要缺点,因为这将为讨论为什么需要深度学习奠定良好的基础:
- 传统NLP中使用的预处理步骤迫使我们对文本中嵌入的潜在有用信息(例如,标点符号和时态信息)进行取舍权衡,以便通过减少词汇量来使学习成为可能。尽管在现代的基于深度学习的解决方案中我们仍然会使用预处理,但由于深度网络具有较大的表征容量,因此预处理并不像在传统的NLP流程中那样重要。
- 需要人工手动设计特征工程。为了设计可靠的系统,需要设计好的特征。由于需要广泛探索不同的特征空间,因此这个过程非常烦琐。此外,为了有效地探索强大的特征,需要领域专业知识,这对于某些NLP任务来说是缺乏的。
- 传统方法需要各种外部资源才能表现良好,并且没有多少免费提供的资源。这样的外部资源通常包括存储在大型数据库中的人工创建的信息。为特定任务创建资源可能需要几年时间,具体取决于任务的严格性(例如,机器翻译规则库)。
1.4 自然语言处理的深度学习方法
我认为深度学习彻底改变了机器学习,特别是在计算机视觉、语音识别和NLP领域。深层模型在机器学习的许多领域掀起了一轮范式转换的波澜,因为深层模型可以从原始数据中学习丰富的特征,而无须使用有限的人工设计特征。这导致令人讨厌且成本昂贵的特征工程被淘汰。这样一来,深层模型使得传统方法更有效,因为深层模型可以同时执行特征学习和任务学习。此外,由于深层模型中有大量参数(即权重),这使得它可以比人工设计拥有更多的特征。然而,由于模型的可解释性差,深层模型被认为是黑盒。例如,对于给定问题,理解深层模型“如何”学习特征和学习“什么”特征仍然是一个悬而未决的问题。
深层模型本质上是一种人工神经网络,它有输入层、位于中间的许多相互连接的隐藏层以及输出层(例如,分类器或回归器)。就像你看到的那样,这构成了从原始数据到最终预测的端到端模型。中间的这些隐藏层为深层模型提供动力,因为它们负责从原始数据中学习“好”的特征,从而最终成功解决手头的任务。
1.4.1 深度学习的历史
让我们简单地介绍一下深度学习的根源,以及它是如何演变为一种非常有前景的机器学习技术的。1960年,Hubel和Weisel进行了一项有趣的实验,发现猫的视觉皮层由简单细胞和复杂细胞组成,并且这些细胞以分层形式组织,而且,这些细胞对不同刺激的反应不同。例如,简单细胞会被不同朝向的边缘外形激活,而复杂细胞则对空间变化(例如,边缘外形的朝向)不敏感。这刺激了人们在机器中复制类似行为,从而产生了深度学习的概念。
在随后的几年中,神经网络引起了许多研究者的关注。1965年,由Ivakhnenko和其他人引入了一种神经网络,该网络以Rosenblatt提出的著名的感知器(Perceptron)为基础,并通过一种称为数据处理组方法(GMDH)进行训练。后来,在1979年,福岛引入了Neocognitron,该网络为最著名的深层模型之一(卷积神经网络)奠定了基础。与始终采用一维输入的感知器不同,Neocognitron能够使用卷积操作处理2D输入。
人工神经网络过去通常通过计算当前层和前一层的雅可比矩阵来反向传播误差信号,以优化网络参数。此外,梯度消失的问题严重限制了神经网络的潜在层数(深度)。靠近输入的层的梯度非常小,这被称为梯度消失现象,其原因是应用链式法则来计算较低层权重的梯度(雅可比矩阵),这又限制了经典神经网络的可能的最大深度。
然后在2006年,人们发现通过最小化网络的每一层的重建误差(通过尝试将输入压缩到较低维度然后将其重建回原始维度而获得该误差)来预训练深度神经网络,可以为神经网络权重提供一个良好的初值。这使得梯度可以从输出层一直保持到输入层。这基本上使神经网络模型可以有更多层,从而避免梯度消失的不利影响。此外,这些更深层的模型能够在许多任务中超越传统的机器学习模型,主要是在计算机视觉领域(例如,MNIST手写数字数据集的测试准确度)。有了这一突破,深度学习成为机器学习社区的流行语。
在2012年,由Alex Krizhevsky(http://www.cs.toronto.edu/~kriz/ )、Ilya Sutskever(http://www.cs.toronto.edu/~lya/ )和Geoff Hinton创建的深度卷积神经网络AlexNet赢得了2012年大规模视觉识别挑战赛(LSVRC),误差比从之前的最佳值下降了10%,这为神经网络的进步提供了动力。在此期间,语音识别取得了进展,据报道,良好的语音识别准确度是因为使用了深层神经网络。此外,人们开始意识到图形处理单元(GPU)可以实现更多的并行性,与中央处理单元(CPU)相比,它可以更快地训练更大和更深的神经网络。
更好的模型初始化技术(例如,Xavier初始化)进一步改进了深层模型,使得耗时的预训练变得多余。此外,还引入了更好的非线性激活函数,如ReLU(Rectied Linear Unit),它减少了深层模型处理梯度消失的不良影响。更好的优化(或学习)技术(如Adam)可以在神经网络模型所拥有的数百万个参数中自动调整每个参数的学习率,这一技术在许多不同的机器学习领域中刷新了最好的成绩,如物体分类和语音识别。这些进步还允许神经网络模型具有大量隐藏层,而可以增加隐藏层数(从而使神经网络更深)是神经网络模型明显比其他机器学习模型效果更好的主要原因之一。此外,更好的层间归一化(例如,批量归一化层)已经在很多任务中提高了深度网络的性能。
后来,人们引入了更深层的模型,如ResNets、HighwayNets和LadderNets,它们有数百层和数十亿个参数。借助各种由经验和理论所激发的技术,神经网络可以具有庞大的层数。例如,ResNets通过捷径连接技术在相距很远的层之间建立连接,这可以最大限度地减少之前提到的层之间的梯度消失问题。
1.4.2 深度学习和NLP的当前状况
自2000年年初以来,许多不同的深层模型已经开始崭露头角。即使它们有相似之处(例如所有这些模型都对输入和参数进行非线性变换),但细节仍然有很大差异。例如,卷积神经网络(CNN)可以从原始二维数据(例如,RGB图像)中进行学习,而多层感知器模型需要将输入变为一维向量,这会导致损失重要的空间信息。
在处理文本时,由于对文本最直观的解释之一是将其视为字符序列,因此,学习模型应该能够对时间序列进行建模,从而需要有过去的记忆。要理解这一点,可以想象有这样一个语言建模任务,单词cat的下一个单词应该与单词climbed的下一个单词不同。递归神经网络(RNN)是具有这种能力的流行模型中的一种。我们将在第6章中看到RNN如何通过交互式训练来实现这一点。
应该注意,记忆不是学习模型固有的微不足道的操作,相反,持久记忆的方式是需要仔细设计的。此外,记忆不应与仅关注当前输入的无序深度网络学习到的权重相混淆,序列模型(例如,RNN)将同时关注学习到的权重和序列中前一个元素,以此预测下一个输出。
RNN的一个突出缺点是它不能记住超过若干(大约为7个)时间步长的元素,因此它缺乏长期记忆能力。长短期记忆(LSTM)网络是具有长期记忆的RNN扩展模型。因此,如今LSTM模型通常优于标准RNN模型。我们将在第7章深入探讨,以便更好地理解它。
总之,我们可以将深度网络主要分为两类:在训练和预测时每次只处理单个输入的无序模型(例如,图像分类),和处理任意长度序列的输入的顺序模型(例如,在文本生成中,单个单词是一个输入)。然后,可以将无序(也称为前馈)模型分类为深(大约少于20层)和非常深(可以大于数百层)的网络。序列模型分为只能记忆短期模式的短期记忆模型(例如,RNN)和可记忆更长模式的长期记忆模型。在图1.4中,我们大致描述了以上讨论的分类,你不必完全按照这种方式理解不同的深度模型,它只是说明深度学习模型的多样性。
1.4.3 理解一个简单的深层模型—全连接神经网络
现在让我们仔细研究深度神经网络,以便更好地理解它。虽然深层模型有许多不同的变体,但最早的模型之一可追溯到1950~1960年,它被称为全连接神经网络(FCNN),有时也被称为多层感知器,图1.5描绘了标准的三层FCNN。
FCNN的目标是将输入(例如,图像或句子)映射到特定标签或注释(例如,图像的类别)。这可以使用h = sigma(W x + b)之类的变换,通过计算x的隐藏表示h来实现。这里,W和b分别是FCNN的权重和偏差,sigma是S形(sigmoid)激活函数。接下来,将分类器(例如,softmax分类器)放置在FCNN的顶部,该分类器能够利用隐藏层中的学习特征来对输入进行分类。分类器是具有权重Ws和偏差bs的另一个隐藏层,它本质上是FCNN的一部分。然后,可以用公式output = softmax(Ws h + bs)计算FCNN的输出。例如,softmax分类器提供分类器层输出分数的归一化表示,该标签被认为是具有最高softmax值的输出节点。然后,根据这个结果,我们可以计算预测的输出标签和实际的输出标签之间的差异,将它定义为分类损失。均方损失是这种损失函数的一个例子。你不必担心不理解损失函数的实际细节,我们将在后面的章节中讨论很多损失函数。接下来,使用标准随机优化器(例如,随机梯度下降)来优化神经网络参数W,b,Ws和bs,以减少所有输入的分类损失。图1.5描述了本段中针对三层FCNN的解释过程。我们将在第3章逐步介绍如何将这种模型用于NLP任务的细节。
让我们看一个如何将神经网络用于情感分析任务的示例。想象一下我们有一个数据集,其中,输入是一个表达对电影的正面或负面意见的句子,以及一个相应的标签,说明该句子实际上是正面(1)还是负面(0)。然后,针对一个测试数据集,其中只包含电影评论(没有评论标签),我们的任务是将这些新句子分类为正面或负面的。
按照以下工作流程,可以使用神经网络(深层或浅层,取决于任务的难度)来处理这项任务:
- 对句子进行分词
- 如有必要,使用特殊标记填充句子,使所有句子都是固定长度
- 将句子转换为数值表示(例如,词袋表示)
- 将数值表示输入到神经网络并预测输出(正面或负面)
- 使用所需的损失函数优化神经网络
1.5 本章之外的学习路线
本节描述本书其余部分的细节,虽然很简短,但是它囊括了本书各章内容的详细信息。在本书中,我们将研究NLP的众多令人兴奋的领域,从在没有任何类型的注释数据情况下寻找单词相似性的算法,到可以自己编写故事的算法,均会涉及。
从下一章开始,我们将深入探讨几个流行且有趣的NLP任务的细节。为了更深入地了解获得的知识并增加学习的互动性,我们还提供了各种练习。我们将使用Python和TensorFlow(一个用于分布式数值计算的开源库)来实现所有任务。TensorFlow封装了先进的技术,例如,使用CUDA(Compute Unied Device Architecture)优化GPU代码,这可能具有挑战性。此外,TensorFlow提供内置函数来实现深度学习算法,例如激活函数、随机优化方法和卷积,这使得实现过程更轻松。
本书将开始一个涵盖NLP的许多热门话题以及它们如何实现的旅程,同时使用TensorFlow来了解最先进的算法。下面是我们将在本书中看到的内容:
- 第2章介绍如何编写客户端程序并在TensorFlow中运行它们。这一点非常重要,特别是在你不熟悉TensorFlow的情况下,因为TensorFlow与传统的编码语言(如Python)的运行方式不同。本章首先深入解释TensorFlow如何执行客户端程序,这将有助于你了解TensorFlow的执行工作流程,并习惯TensorFlow的术语。接下来,本章将引导你了解TensorFlow客户端程序的各种元素,例如定义变量、定义操作/函数、向算法提供输入以及获取结果。最后将讨论如何用所有这些TensorFlow知识实现一个复杂的神经网络以对手写图像进行分类。
- 第3章的目的是介绍Word2vec,这是一种用于学习单词的数值表示的方法,这种表示可以反映单词的语义。但在深入研究Word2vec技术之前,我们将首先讨论一些用于表示单词语义的经典方法。早期的方法之一是依赖WordNet这个大型词汇数据库,WordNet可用于衡量不同单词之间的语义相似性。但是,要维护这么大的词汇数据库,其成本是很昂贵的,因此,还有其他更简单的表示技术,例如独热编码表示以及tf-idf方法,这些技术不依赖于外部资源。接下来,我们将介绍学习单词向量化的现代方法,称为Word2vec,在这种方法中,我们使用神经网络来学习单词表示。该章将讨论两种流行的Word2vec技术:skip-gram和连续词袋(CBOW)模型。
- 第4章首先比较几个算法(包括skip-gram和CBOW算法),看看是否有明确的赢家。然后,将讨论在过去几年中对原始Word2vec技术的几项扩展。例如,忽略文本中高概率的常见单词(例如“the”和“a”)可以提高Word2vec模型的性能。另一方面,Word2vec模型仅考虑单词的局部上下文,而忽略整个语料库的全局统计信息。因此,将讨论称为GloVe的单词嵌入学习技术,它在学习单词向量的过程中会结合全局和局部统计信息。
- 第5章介绍卷积神经网络(CNN)。卷积网络是一个强大的深层模型系列,它可以利用输入的空间结构来从数据中进行学习。换句话说,CNN能够以二维形式处理图像,在此过程中,多层感知器需要将图像展开为一维向量。我们将首先详细讨论CNN中的各种操作,例如卷积和池化操作。然后,将通过一个例子介绍如何用CNN对手写数字图像进行分类。之后,将过渡到NLP中的CNN应用。准确地说,我们将研究如何用CNN来对涉及人、位置、物体等内容的句子进行分类。
- 第6章重点介绍递归神经网络(RNN)和使用RNN进行语言生成。RNN具有记忆功能,因此与前馈神经网络(例如,CNN)不同,它可以将记忆作为持续更新的系统状态进行存储。我们将从前馈神经网络的表示开始,然后修改这种表示,以便可以从数据序列而不是单个数据点进行学习,此过程会将前馈网络转换为RNN。接下来,我们从技术角度描述RNN内部计算的方程式。然后,将讨论用于更新RNN权重的RNN的优化过程。此后,将逐一介绍不同类型的RNN,例如一对一RNN和一对多RNN。接着,将介绍一个令人兴奋的RNN应用,其中,RNN通过学习现有故事的语料库,尝试讲述新故事。我们通过训练RNN在故事中给定前一个单词序列的情况下预测下一个单词,来实现此目的。最后,将讨论标准RNN的变体,我们将其称为RNN-CF(具有上下文特征的RNN),并将其与标准RNN进行比较,看看哪个更好。
- 第7章首先直观地介绍长期短期记忆网络模型是如何工作的,然后逐步深入技术细节,让你可以自己应用它们。标准RNN的严重限制在于不能记忆长期信息,其改进模型是可以记住大量时间步长序列的先进的RNN模型,例如,长短期记忆网络(LSTM)和门控循环单元(GRU)。我们还将考查LSTM如何缓解记忆长期信息的问题(称为梯度消失问题)。然后,将讨论可以进一步提高LSTM模型性能的若干改进,例如,一次向前预测几个时间步长,并向前和向后读取序列信息。最后,我们将讨论LSTM模型的几种变体,例如,带有窥孔连接的GRU和LSTM。
- 第8章解释如何使用第7章中讨论的带有窥孔连接的LSTM、GRU和LSTM。此外,将在质量和数量上比较这些扩展的性能。我们还将讨论如何实现第7章中提到的一些扩展,例如,预测前面的几个时间步长(称为集束搜索),并使用词向量而非独热编码作为输入。最后,将讨论如何使用TensorFlow的子库RNN API,它简化了模型的实现。
- 第9章着眼于另一个激动人心的应用,即让模型学习如何使用LSTM和CNN生成图像的标题(描述)。这个应用程序很有趣,因为它向我们展示了如何组合两种不同类型的模型,以及如何学习多模态数据(例如,图像和文本)。具体实现方法是,首先利用CNN学习图像表示(类似于单词向量),然后把该图像向量和相应的图像描述单词作为序列来训练LSTM。我们将首先讨论如何使用预训练的CNN来获得图像表示,之后讨论如何学习词嵌入。接下来,将讨论如何把图像向量与字词嵌入一起送入网络来训练LSTM,随后是对评估图像描述系统的不同度量方法的描述。之后,我们将定性和定量地评估模型生成的标题。在本章结束时会介绍如何使用TensorFlow的RNN API实现相同的系统。
- 第10章介绍神经机器翻译。由于翻译自动化的必要性和任务的固有难度,机器翻译已经引起了很多关注。我们将在本章开头简要介绍机器翻译在早期的实现方式,最后会讨论神经机器翻译(NMT)系统。我们将看到当前NMT系统与旧系统(如统计机器翻译系统)相比的表现如何,这将激励我们了解NMT系统。之后,将讨论NMT系统设计背后的灵感,并继续介绍技术细节。然后,将讨论用于评估翻译系统的指标。在此之后,将研究如何从头实现德语到英语的翻译系统。接下来,将了解改进NMT系统的方法。会将详细介绍其中一个扩展,称为注意力机制。注意力机制已经成为序列到序列学习问题的必要条件。最后,将比较通过引入注意力机制获得的性能提升,并分析性能提升背后的原因。本章最后一小节将介绍如何把NMT系统的概念扩展到聊天机器人,聊天机器人是可以与人交流并解答各种客户请求的系统。
- 第11章介绍当前趋势和自然语言处理的未来。自然语言处理已广泛扩展到各种不同任务。本章将讨论NLP的一些当前趋势和未来NLP发展前景。首先讨论最近出现的各种词嵌入的扩展方法,还将研究一种称为tv-embedding的词嵌入学习技术的实现。接下来,将研究神经机器翻译领域的各种趋势。然后,将看看NLP如何与其他领域(如计算机视觉和强化学习)相结合,以解决一些有趣的问题,比如教计算机设计自己的语言进行交流。如今,另一个蓬勃发展的领域是泛人工智能,它是用单个系统完成多项任务(分类图像、翻译文本、字幕图像等)的系统。我们将介绍几个这样的系统。之后,将讨论挖掘社交媒体中的NLP。本章结束时会介绍一些新任务(例如,语言基础-开发广义NLP系统)和新模型(例如,短语LSTM)。
- 附录将向读者介绍各种数学数据结构(例如,矩阵)和操作(例如,矩阵的逆),我们还将讨论概率中的几个重要概念,然后介绍Keras,这是一个底层使用TensorFlow的高级库。Keras通过隐藏TensorFlow中的一些具有挑战性的细节,使得神经网络的实现更简单。具体而言,我们将看到如何使用Keras实现CNN,以了解如何使用Keras。接下来,将讨论如何在TensorFlow中使用seq2seq库来实现一个神经机器翻译系统,这比我们在第11章中使用的代码要少很多。最后,将向你介绍如何使用TensorBoard可视化词嵌入的指南。TensorBoard是TensorFlow附带的便捷可视化工具,可用于可视化和监视TensorFlow程序中的各种变量。
1.6 技术工具简介
在本节中,你将了解在之后章节的练习中会使用的技术工具。首先,将简要介绍所提供的主要工具。接下来,将提供有关如何安装每个工具的粗略指南,以及官方网站提供的详细指南的链接。此外,会有如何确保工具正确安装的提示。
1.6.1 工具说明
我们将使用Python作为编程/脚本语言。Python是一种非常通用的易于设置的编程语言,它被科学界广泛使用。此外,还有许多围绕Python的科学计算库,适用于从深度学习到概率推理,再到数据可视化等各个领域。TensorFlow就是这样一个在深度学习社区中众所周知的库,它提供许多对深度学习有用的基本和高级操作。接下来,我们将在所有练习中使用Jupyter Notebook,因为与使用IDE相比,它提供了更具交互性的编码环境。我们还将使用scikit-learn(另一种流行的Python机器学习工具包)以实现各种各样的目的,例如数据预处理。另一个将用于各种文本相关操作的库是NLTK(Python自然语言工具包)。最后,我们将使用Matplotlib进行数据可视化。
1.6.2 安装Python和scikit-learn
Python可以轻松安装在任何常用的操作系统中,如Windows、macOS或Linux。我们将使用Anaconda来设置Python,因为它可以完成设置Python以及基本库的所有繁重工作。
按照以下步骤安装Anaconda:
1.从https://www.continuum.io/downloads 下载Anaconda。
2.选择合适的操作系统然后下载Python 3.5。
3.按照链接https://docs.continuum.io/anaconda/install/ 中的说明安装Anaconda。
按照以下步骤查看Anaconda是否正确安装:
1.打开终端窗口(Windows中的命令提示符)。
2.运行以下命令:
如果安装正确,当前Anaconda发行版的版本号应在终端显示。
接下来,按照http://scikit-learn.org/stable/install.html 中的指导安装scikit-learn,安装NLTK的指导是https://www.nltk.org/install.html ,安装Matplotlib的指导是https://matplotlib.org/users/installing.html 。
1.6.3 安装Jupyter Notebook
可以按照http://jupyter.readthedocs.io/en/latest/install.html 中的指导安装Jupyter Notebook。
按照以下步骤查看Jupyter Notebook是否安装正确:
1.打开终端。
2.运行命令:
你应该看到一个新的浏览器窗口,如图1.6所示。
1.6.4 安装TensorFlow
请按照https://www.tensorflow.org/install/ 中“Installing with Anaconda”部分下的说明安装TensorFlow,我们将在所有练习中使用TensorFlow 1.8.x。
在按照说明提供tfBinaryURL时,请确保提供TensorFlow 1.8.x版本。之所以强调这一点,因为与以前的TensorFlow版本相比,API已有许多变化。
按照以下步骤查看TensorFlow是否正确安装:
1.在Windows或Linux或MacOS中打开命令提示符。
2.输入python进入Python运行环境,之后应该可以看到Python版本号,请确保你使用的是Python 3。
3.接下来输入以下代码:
如果一切顺利,应该没有任何错误(如果你的计算机没有专用GPU,可能会有警告,但你可以忽略它们),并且应显示TensorFlow版本1.8.x。
还可以使用许多基于云的计算平台,在那里你可以使用各种自定义选项(操作系统、GPU卡类型、GPU卡数量等)配置自己的计算机。许多人正在迁移到这种基于云的服务,因为它有以下好处:
- 更多个性化选项
- 更少的维护成本
- 没有基础设施要求
以下是一些流行的基于云的计算平台:
- Google云平台(GCP):https://cloud.google.com/
- Amazon Web服务(AWS):https://aws.amazon.com/
- TensorFlow研究云(TFRC):https://www.tensorf?low.org/tfrc/
1.7 总结
在本章中,通过广泛探索NLP,我们了解了构建基于NLP的良好系统所涉及的任务类型。首先,我们解释了为什么需要NLP,然后讨论NLP的各种任务,以便大致了解每项任务的目标以及在这些任务中取得成功的难度。接下来,我们研究了解决NLP的经典方法,并使用生成足球比赛的摘要作为例子,了解流程的细节。我们看到传统方法通常涉及烦琐乏味的特征工程。例如,为了检查生成的短语的正确性,我们可能需要为该短语生成一个解析树。接下来,我们讨论了深度学习所带来的范式转变,并看到了深度学习如何使特征工程步骤变得过时。我们回顾了深度学习和人工神经网络的历史,然后介绍了有数百个隐藏层的大规模现代网络。之后,我们通过一个简单的例子来阐明一个深层模型(多层感知器模型)来理解在这样一个模型中的数学原理。
有了传统和现代NLP方法的良好基础后,我们讨论了本书主题的路线图,从学习词嵌入到强大的LSTM,从生成图像的标题到神经机器翻译。最后,我们介绍了如何安装Python、scikit-learn、Jupyter Notebook和TensorFlow来设置我们的环境。
在下一章中,你将学习TensorFlow的基础知识,学习结束时,你应该学会编写一个简单算法,它可以接受输入,并通过定义的函数对输入进行转换,最后输出结果。