From 6afa72a5c6a589386a75ac264873838d5d1fc944 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Mon, 4 Jan 2021 14:32:31 +0800 Subject: [PATCH] 2021-01-04 14:32:31 --- docs/1.md | 12 +++++++++--- docs/2.md | 36 ++++++++++++++++++++++++++++++------ docs/3.md | 16 +++++++++++++--- docs/4.md | 8 ++++++-- docs/5.md | 14 +++++++++++--- docs/8.md | 32 ++++++++++++++++++++++++++------ docs/9.md | 18 +++++++++++++++--- 7 files changed, 110 insertions(+), 26 deletions(-) diff --git a/docs/1.md b/docs/1.md index 1bc52f6..7d16a5f 100644 --- a/docs/1.md +++ b/docs/1.md @@ -29,7 +29,9 @@ ## The Supervised Learning Paradigm -机器学习中的监督,或者简单的监督学习,是指将目标(被预测的内容)的真实情况用于观察(输入)的情况。例如,在文档分类中,目标是一个分类标签,观察(输入)是一个文档。例如,在机器翻译中,观察(输入)是一种语言的句子,目标是另一种语言的句子。通过对输入数据的理解,我们在图 1-1 中演示了监督学习范式。 ![nlpp_0101](img/58c13549534aa235ea3328c43765c9f9.jpg) +机器学习中的监督,或者简单的监督学习,是指将目标(被预测的内容)的真实情况用于观察(输入)的情况。例如,在文档分类中,目标是一个分类标签,观察(输入)是一个文档。例如,在机器翻译中,观察(输入)是一种语言的句子,目标是另一种语言的句子。通过对输入数据的理解,我们在图 1-1 中演示了监督学习范式。 + +![nlpp_0101](img/58c13549534aa235ea3328c43765c9f9.jpg) 我们可以将监督学习范式分解为六个主要概念,如图 1-1 所示: 观察: 观察是我们想要预测的东西。我们用 x 表示观察值。我们有时把观察值称为“输入”。 目标: 目标是与观察相对应的标签。它通常是被预言的事情。按照机器学习/深度学习中的标准符号,我们用`y`表示这些。有时,这被称为真实情况。 模型: 模型是一个数学表达式或函数,它接受一个观察值`x`,并预测其目标标签的值。 参数: 有时也称为权重,这些参数化模型。标准使用的符号`w`(权重)或`w_hat`。 预测: 预测,也称为估计,是模型在给定观测值的情况下所猜测目标的值。我们用一个`hat`表示这些。所以,目标`y`的预测用`y_hat`来表示。 损失函数: 损失函数是比较预测与训练数据中观测目标之间的距离的函数。给定一个目标及其预测,损失函数将分配一个称为损失的标量实值。损失值越低,模型对目标的预测效果越好。我们用`L`表示损失函数。 @@ -47,7 +49,9 @@ ## Observation and Target Encoding -我们需要用数字表示观测值(文本),以便与机器学习算法一起使用。图 1-2 给出了一个可视化的描述。 ![nlpp_0102](img/a63991e391610b511b1fcd8202f6cb8c.jpg) +我们需要用数字表示观测值(文本),以便与机器学习算法一起使用。图 1-2 给出了一个可视化的描述。 + +![nlpp_0102](img/a63991e391610b511b1fcd8202f6cb8c.jpg) 表示文本的一种简单方法是用数字向量表示。有无数种方法可以执行这种映射/表示。事实上,本书的大部分内容都致力于从数据中学习此类任务表示。然而,我们从基于启发式的一些简单的基于计数的表示开始。虽然简单,但是它们非常强大,或者可以作为更丰富的表示学习的起点。所有这些基于计数的表示都是从一个固定维数的向量开始的。 @@ -120,7 +124,9 @@ sns.heatmap(tfidf, annot=True, cbar=False, xticklabels=vocab, ``` -![nlpp_01_tfidf](img/2fdbe9e5e1ab207ed4555c3ffd873753.jpg) 在深度学习中,很少看到使用像 TF-IDF 这样的启发式表示对输入进行编码,因为目标是学习一种表示。通常,我们从一个使用整数索引的单热编码和一个特殊的“嵌入查找”层开始构建神经网络的输入。在后面的章节中,我们将给出几个这样做的例子。 +![nlpp_01_tfidf](img/2fdbe9e5e1ab207ed4555c3ffd873753.jpg) + +在深度学习中,很少看到使用像 TF-IDF 这样的启发式表示对输入进行编码,因为目标是学习一种表示。通常,我们从一个使用整数索引的单热编码和一个特殊的“嵌入查找”层开始构建神经网络的输入。在后面的章节中,我们将给出几个这样做的例子。 ### Target Encoding diff --git a/docs/2.md b/docs/2.md index 01d0d53..a8c26f2 100644 --- a/docs/2.md +++ b/docs/2.md @@ -28,7 +28,15 @@ ![metadata_1](img/c35eca55ae92dbc6325e2ba9ac2b7710.jpg) -将文本分解为标记(Tokens)的过程称为分词(tokenization)。世界语的句子,`Maria frapis la verda sorĉistino`有六个标记。分词可能比简单地基于非字母数字字符拆分文本更加复杂,如图 2-2 所示。对于像土耳其语这样的粘合语言来说,分隔空格和标点符号可能是不够的,因此可能需要更专业的技术。正如您将在第 4 章和第 6 章中看到的,通过将文本表示为字节流,我们可能能够在某些神经网络模型中完全规避分词问题;这对于粘合语言来说变得非常重要。 ![Tokenization](img/2a941f4b722f7fb4031402398e5c0882.jpg) 最后,看看下面这条推文: ![Tweet](img/3529b4f55a52c83aaf242bd51bf5ca3a.jpg) 分词 tweets 涉及到保存话题标签和`@handle`,将表情符号(如:-)和 urls 分割为一个单元。`#MakeAMovieCold`标签应该是 1 个标记还是 4 个?虽然大多数研究论文对这一问题并没有给予太多的关注,而且事实上,许多分词决策往往是任意的,但是这些决策在实践中对准确性的影响要比公认的要大得多。通常被认为是预处理的繁琐工作,大多数开放源码 NLP 包为分词提供了合理的支持。示例 2-1 展示了来自 NLTK 和 SpaCy 的示例,这是两个用于文本处理的常用包。 +将文本分解为标记(Tokens)的过程称为分词(tokenization)。世界语的句子,`Maria frapis la verda sorĉistino`有六个标记。分词可能比简单地基于非字母数字字符拆分文本更加复杂,如图 2-2 所示。对于像土耳其语这样的粘合语言来说,分隔空格和标点符号可能是不够的,因此可能需要更专业的技术。正如您将在第 4 章和第 6 章中看到的,通过将文本表示为字节流,我们可能能够在某些神经网络模型中完全规避分词问题;这对于粘合语言来说变得非常重要。 + +![Tokenization](img/2a941f4b722f7fb4031402398e5c0882.jpg) + +最后,看看下面这条推文: + +![Tweet](img/3529b4f55a52c83aaf242bd51bf5ca3a.jpg) + +分词 tweets 涉及到保存话题标签和`@handle`,将表情符号(如:-)和 urls 分割为一个单元。`#MakeAMovieCold`标签应该是 1 个标记还是 4 个?虽然大多数研究论文对这一问题并没有给予太多的关注,而且事实上,许多分词决策往往是任意的,但是这些决策在实践中对准确性的影响要比公认的要大得多。通常被认为是预处理的繁琐工作,大多数开放源码 NLP 包为分词提供了合理的支持。示例 2-1 展示了来自 NLTK 和 SpaCy 的示例,这是两个用于文本处理的常用包。 Example 2-1\. Tokenizing text @@ -140,7 +148,11 @@ witch - NOUN ## Categorizing Spans: Chunking and Named Entity Recognition -通常,我们需要标记文本的范围;即,一个连续的多标记边界。例如,`Mary slapped the green witch.`我们可能需要识别其中的名词短语(NP)和动词短语(VP),如下图所示: ![Sentence_1](img/77ada2c4a9a2bcb1ad37475522db4edc.jpg) 这称为分块(Chunking)或浅解析(Shallow parsing)。浅解析的目的是推导出由名词、动词、形容词等语法原子组成的高阶单位。如果没有训练浅解析模型的数据,可以在词性标记上编写正则表达式来近似浅解析。幸运的是,对于英语和最广泛使用的语言来说,这样的数据和预先训练的模型是存在的。示例 2-5 给出了一个使用 SpaCy 的浅解析示例。 +通常,我们需要标记文本的范围;即,一个连续的多标记边界。例如,`Mary slapped the green witch.`我们可能需要识别其中的名词短语(NP)和动词短语(VP),如下图所示: + +![Sentence_1](img/77ada2c4a9a2bcb1ad37475522db4edc.jpg) + +这称为分块(Chunking)或浅解析(Shallow parsing)。浅解析的目的是推导出由名词、动词、形容词等语法原子组成的高阶单位。如果没有训练浅解析模型的数据,可以在词性标记上编写正则表达式来近似浅解析。幸运的是,对于英语和最广泛使用的语言来说,这样的数据和预先训练的模型是存在的。示例 2-5 给出了一个使用 SpaCy 的浅解析示例。 Example 2-5\. Noun chunks @@ -157,17 +169,29 @@ the green witch - NP ``` -另一种有用的短语类型是命名实体。命名实体是一个字符串,它提到了一个真实世界的概念,如人员、位置、组织、药品名称等等。这里有一个例子: ![Nameentity](img/f01ca7a7f18a64f876482e91e9fcb5e0.jpg) +另一种有用的短语类型是命名实体。命名实体是一个字符串,它提到了一个真实世界的概念,如人员、位置、组织、药品名称等等。这里有一个例子: + +![Nameentity](img/f01ca7a7f18a64f876482e91e9fcb5e0.jpg) ## Structure of Sentences -浅层解析识别短语单位,而识别它们之间关系的任务称为解析(parsing)。您可能还记得,在初级英语课上,用图表表示句子,如图 2-6 所示。 ![Parase_1](img/2f1511a2b2c9bf499667cb6649dbda15.jpg) +浅层解析识别短语单位,而识别它们之间关系的任务称为解析(parsing)。您可能还记得,在初级英语课上,用图表表示句子,如图 2-6 所示。 + +![Parase_1](img/2f1511a2b2c9bf499667cb6649dbda15.jpg) + +解析树(Parse tree)表示句子中不同的语法单元在层次上是如何相关的。图 2-6 中的解析树显示了所谓的成分解析。另一种可能更有用的显示关系的方法是使用依赖项解析(dependency parsing),如图 2-7 所示。 -解析树(Parse tree)表示句子中不同的语法单元在层次上是如何相关的。图 2-6 中的解析树显示了所谓的成分解析。另一种可能更有用的显示关系的方法是使用依赖项解析(dependency parsing),如图 2-7 所示。 ![Parase_2](img/b4d0b914345a17162773e581f0ee08f9.jpg) 要了解更多关于传统解析的信息,请参阅本章末尾的参考资料部分。 +![Parase_2](img/b4d0b914345a17162773e581f0ee08f9.jpg) + +要了解更多关于传统解析的信息,请参阅本章末尾的参考资料部分。 ## Word Senses and Semantics -单词有意义,而且通常不止一个。一个词的不同含义称为它的意义(senses)。WordNet 是一个长期运行的词汇资源项目,它来自普林斯顿大学,旨在对所有英语单词(嗯,大部分)的含义以及其他词汇关系进行分类。例如,考虑像`plane`这样的单词。图 2-8 显示了`plane`一词的不同用法。 ![Plane](img/f756e802f10adc3bacf2e61e4b5f160e.jpg)") 在 WordNet 这样的项目中数十年的努力是值得的,即使是在有现代方法的情况下。本书后面的章节给出了在神经网络和深度学习方法的背景下使用现有语言资源的例子。词的意义也可以从上下文中归纳出来。从文本中自动发现词义实际上是半监督学习在自然语言处理中的第一个应用。尽管我们在本书中没有涉及到这一点,但我们鼓励您阅读 Jurasky and Martin(2014),第 17 章,Manning and Schutze(1999),第 7 章。 +单词有意义,而且通常不止一个。一个词的不同含义称为它的意义(senses)。WordNet 是一个长期运行的词汇资源项目,它来自普林斯顿大学,旨在对所有英语单词(嗯,大部分)的含义以及其他词汇关系进行分类。例如,考虑像`plane`这样的单词。图 2-8 显示了`plane`一词的不同用法。 + +![Plane](img/f756e802f10adc3bacf2e61e4b5f160e.jpg) + +") 在 WordNet 这样的项目中数十年的努力是值得的,即使是在有现代方法的情况下。本书后面的章节给出了在神经网络和深度学习方法的背景下使用现有语言资源的例子。词的意义也可以从上下文中归纳出来。从文本中自动发现词义实际上是半监督学习在自然语言处理中的第一个应用。尽管我们在本书中没有涉及到这一点,但我们鼓励您阅读 Jurasky and Martin(2014),第 17 章,Manning and Schutze(1999),第 7 章。 ## 总结 diff --git a/docs/3.md b/docs/3.md index a9a808f..27ff919 100644 --- a/docs/3.md +++ b/docs/3.md @@ -16,7 +16,11 @@ ## Perceptron: The Simplest Neural Network -最简单的神经网络单元是感知器。感知器在历史上是非常松散地模仿生物神经元的。就像生物神经元一样,有输入和输出,“信号”从输入流向输出,如图 3-1 所示。 ![neural](img/58bd03f5bc961bd29d7f05203ba2e97f.jpg) 每个感知器单元有一个输入(`x`),一个输出(`y`),和三个“旋钮”(knobs):一组权重(`w`),偏量(`b`),和一个激活函数(`f`)。权重和偏量都从数据学习,激活函数是精心挑选的取决于网络的网络设计师的直觉和目标输出。数学上,我们可以这样表示: +最简单的神经网络单元是感知器。感知器在历史上是非常松散地模仿生物神经元的。就像生物神经元一样,有输入和输出,“信号”从输入流向输出,如图 3-1 所示。 + +![neural](img/58bd03f5bc961bd29d7f05203ba2e97f.jpg) + +每个感知器单元有一个输入(`x`),一个输出(`y`),和三个“旋钮”(knobs):一组权重(`w`),偏量(`b`),和一个激活函数(`f`)。权重和偏量都从数据学习,激活函数是精心挑选的取决于网络的网络设计师的直觉和目标输出。数学上,我们可以这样表示: 通常情况下感知器有不止一个输入。我们可以用向量表示这个一般情况;即,`x`和`w`是向量,`w`和`x`的乘积替换为点积: @@ -245,7 +249,9 @@ tensor(0.9003) ### Constructing Toy Data -在机器学习中,当试图理解一个算法时,创建具有易于理解的属性的合成数据是一种常见的实践。在本节中,我们使用“玩具”任务的合成数据——将二维点分类为两个类中的一个。为了构建数据,我们从 xy 平面的两个不同部分采样点,为模型创建了一个易于学习的环境。示例如图 3-2 所示。模型的目标是将星星(`⋆`)作为一个类,圆圈(`◯`)作为另一个类。这可以在图的右边看到,线上面的东西和线下面的东西分类不同。生成数据的代码位于本章附带的 Python 笔记本中名为`get_toy_data()`的函数中。 ![data](img/0d6e80407f2dd1f5de804ffdfc65fc53.jpg) +在机器学习中,当试图理解一个算法时,创建具有易于理解的属性的合成数据是一种常见的实践。在本节中,我们使用“玩具”任务的合成数据——将二维点分类为两个类中的一个。为了构建数据,我们从 xy 平面的两个不同部分采样点,为模型创建了一个易于学习的环境。示例如图 3-2 所示。模型的目标是将星星(`⋆`)作为一个类,圆圈(`◯`)作为另一个类。这可以在图的右边看到,线上面的东西和线下面的东西分类不同。生成数据的代码位于本章附带的 Python 笔记本中名为`get_toy_data()`的函数中。 + +![data](img/0d6e80407f2dd1f5de804ffdfc65fc53.jpg) ### 选择模型 @@ -345,7 +351,11 @@ for epoch_i in range(n_epochs): ### Regularization -深度学习(以及机器学习)中最重要的概念之一是正则化。正则化的概念来源于数值优化理论。回想一下,大多数机器学习算法都在优化损失函数,以找到最可能解释观测结果(即,产生的损失最少)。对于大多数数据集和任务,这个优化问题可能有多个解决方案(可能的模型)。那么我们(或优化器)应该选择哪一个呢?为了形成直观的理解,请考虑图 3-3 通过一组点拟合曲线的任务。 ![regularize](img/041220e3a08190537249ac65e19e948a.jpg)") +深度学习(以及机器学习)中最重要的概念之一是正则化。正则化的概念来源于数值优化理论。回想一下,大多数机器学习算法都在优化损失函数,以找到最可能解释观测结果(即,产生的损失最少)。对于大多数数据集和任务,这个优化问题可能有多个解决方案(可能的模型)。那么我们(或优化器)应该选择哪一个呢?为了形成直观的理解,请考虑图 3-3 通过一组点拟合曲线的任务。 + +![regularize](img/041220e3a08190537249ac65e19e948a.jpg) + +") 两条曲线都“拟合”这些点,但哪一条是不太可能的解释呢?通过求助于奥卡姆剃刀,我们凭直觉知道一个简单的解释比复杂的解释更好。这种机器学习中的平滑约束称为 L2 正则化。在 PyTorch 中,您可以通过在优化器中设置`weight_decay`参数来控制这一点。`weight_decay`值越大,优化器选择的解释就越流畅;也就是说,L2 正则化越强。 diff --git a/docs/4.md b/docs/4.md index 100c158..c8a2abe 100644 --- a/docs/4.md +++ b/docs/4.md @@ -12,7 +12,9 @@ > > 许可协议: [署名-非商业性使用-禁止演绎 4.0 国际](https://creativecommons.org/licenses/by-nc-nd/4.0/) 转载请保留原文链接及作者。 -在第 3 章中,我们通过观察感知器来介绍神经网络的基础,感知器是现存最简单的神经网络。感知器的一个历史性的缺点是它不能学习数据中存在的一些非常重要的模式。例如,查看图 4-1 中绘制的数据点。这相当于非此即彼(XOR)的情况,在这种情况下,决策边界不能是一条直线(也称为线性可分)。在这个例子中,感知器失败了。 ![classifier](img/8dc539599dfa8638d1c07a77f68a8ed6.jpg) +在第 3 章中,我们通过观察感知器来介绍神经网络的基础,感知器是现存最简单的神经网络。感知器的一个历史性的缺点是它不能学习数据中存在的一些非常重要的模式。例如,查看图 4-1 中绘制的数据点。这相当于非此即彼(XOR)的情况,在这种情况下,决策边界不能是一条直线(也称为线性可分)。在这个例子中,感知器失败了。 + +![classifier](img/8dc539599dfa8638d1c07a77f68a8ed6.jpg) 在这一章中,我们将探索传统上称为前馈网络的神经网络模型,以及两种前馈神经网络:多层感知器和卷积神经网络。多层感知器在结构上扩展了我们在第 3 章中研究的简单感知器,将多个感知器分组在一个单层,并将多个层叠加在一起。我们稍后将介绍多层感知器,并在“示例:带有多层感知器的姓氏分类”中展示它们在多层分类中的应用。 @@ -40,7 +42,9 @@ mlp 的力量来自于添加第二个线性层和允许模型学习一个线性 虽然在图中显示 MLP 有两个决策边界,这是它的优点,但它实际上只是一个决策边界!决策边界就是这样出现的,因为中间表示法改变了空间,使一个超平面同时出现在这两个位置上。在图 4-4 中,我们可以看到 MLP 计算的中间值。这些点的形状表示类(星形或圆形)。我们所看到的是,神经网络(本例中为 MLP)已经学会了“扭曲”数据所处的空间,以便在数据通过最后一层时,用一线来分割它们。 MLP 的输入和中间表示是可视化的。从左到右:(1)网络的输入,(2)第一个线性模块的输出,(3)第一个非线性模块的输出,(4)第二个线性模块的输出。如您所见,第一个线性模块的输出将圆和星分组,而第二个线性模块的输出将数据点重新组织为线性可分的。”) -相反,如图 4-5 所示,感知器没有额外的一层来处理数据的形状,直到数据变成线性可分的。 ![MLP_3](img/a0cec65c8e77beeb01f46f5fef1a61ad.jpg) +相反,如图 4-5 所示,感知器没有额外的一层来处理数据的形状,直到数据变成线性可分的。 + +![MLP_3](img/a0cec65c8e77beeb01f46f5fef1a61ad.jpg) ### Implementing MLPs in PyTorch diff --git a/docs/5.md b/docs/5.md index 9fcc561..a340586 100644 --- a/docs/5.md +++ b/docs/5.md @@ -28,7 +28,9 @@ ### Efficiency of Embeddings -为了理解嵌入是如何工作的,让我们看一个用单热向量乘以线性层中的权重矩阵的例子,如图 5-1 所示。在第 3 章和第 4 章中,单热向量的大小与词汇表相同。这个向量被称为“单热”,因为它在索引中有一个 1,表示存在一个特定的单词。 ![onehot](img/cabb9e708a2dd06f3ebc33ec3d1e8702.jpg) +为了理解嵌入是如何工作的,让我们看一个用单热向量乘以线性层中的权重矩阵的例子,如图 5-1 所示。在第 3 章和第 4 章中,单热向量的大小与词汇表相同。这个向量被称为“单热”,因为它在索引中有一个 1,表示存在一个特定的单词。 + +![onehot](img/cabb9e708a2dd06f3ebc33ec3d1e8702.jpg) 根据定义,接受这个单热向量作为输入的线性层的权值矩阵必须与这个单热向量的大小具有相同的行数。当您执行矩阵乘法时,如图 5-1 所示,结果向量实际上只是选择了由非零项指示的行。从这个观察结果中,我们可以跳过乘法步骤,直接使用整数作为检索所选行的索引。 @@ -281,7 +283,11 @@ man : doctor :: woman : nurse 在本例中,我们将从玛丽·雪莱(Mary Shelley)的小说《弗兰肯斯坦》(Frankenstein)的数字化版本构建一个文本数据集,可以通过古登堡计划(Project Gutenberg)获得。本节介绍预处理过程,为这个文本数据集构建一个 PyTorch 数据集类,最后将数据集分解为训练、验证和测试集。 -从 Project Gutenberg 分发的原始文本文件开始,预处理是最小的:我们使用 NLTK 的 Punkt 标记器将文本分割成不同的句子。然后,将每个句子转换为小写字母,并完全去掉标点符号。这种预处理允许我们稍后在空白中拆分字符串,以便检索标记列表。这一预处理功能是从“示例:餐厅评论情绪分类”中重用的。 ![Example](img/10857949f566f1cdd16b43a53c4d40a0.jpg) 下一步是将数据集枚举为一系列窗口,以便对 CBOW 模型进行优化。为此,我们迭代每个句子中的标记列表,并将它们分组到指定窗口大小的窗口中,如图 5-2 所示。 +从 Project Gutenberg 分发的原始文本文件开始,预处理是最小的:我们使用 NLTK 的 Punkt 标记器将文本分割成不同的句子。然后,将每个句子转换为小写字母,并完全去掉标点符号。这种预处理允许我们稍后在空白中拆分字符串,以便检索标记列表。这一预处理功能是从“示例:餐厅评论情绪分类”中重用的。 + +![Example](img/10857949f566f1cdd16b43a53c4d40a0.jpg) + +下一步是将数据集枚举为一系列窗口,以便对 CBOW 模型进行优化。为此,我们迭代每个句子中的标记列表,并将它们分组到指定窗口大小的窗口中,如图 5-2 所示。 构建数据集的最后一步是将数据分割为三个集:培训集、验证集和测试集。回想一下,训练和验证集是在模型训练期间使用的:训练集用于更新参数,验证集用于度量模型的性能。测试集最多使用一次,以提供偏差较小的测量。在本例中(以及本书中的大多数示例中),我们使用了 70% 的训练集、15% 的验证集和 15% 的测试集。 @@ -494,7 +500,9 @@ class NewsDataset(Dataset): 在这个例子中,我们引入了`SequenceVocabulary`,它是标准`Vocabulary`类的子类,它捆绑了用于序列数据的四个特殊标记:`UNK`标记,`MASK`标记,`BEGIN-SEQUENCE`标记和`END-SEQUENCE`标记。 我们在第 6 章中更详细地描述了这些标记,但简而言之,它们有三个不同的用途。 我们在第 4 章中看到的`UNK`标记(Unknown 的缩写)允许模型学习稀有单词的表示,以便它可以容纳在测试时从未见过的单词。 当我们有可变长度的序列时,`MASK`标记充当嵌入层和损失计算的标记。 最后,`BEGIN-SEQUENCE`和`END-SEQUENCE`标记给出了关于序列边界的神经网络提示。 图 5-3 显示了在更广泛的矢量化管道中使用这些特殊标记的结果。 -![Vec](img/d76dd2ca233f00e8dfd8804b7a2f4d37.jpg) 图 5-3\. 矢量化管道的一个简单示例从基本序列序列开始。`Sequencevocabulary`有四个特殊标记描述在文本。首先,它用于将单词映射到整数序列。因为单词`Jerry`不在序列表中,所以它被映射到`unk`整数。接下来,标记句子边界的特殊标记放在前面并附加到整数中。最后,整数用 0 填充到特定的长度,这允许数据集中的每个向量都是相同的长度。 +![Vec](img/d76dd2ca233f00e8dfd8804b7a2f4d37.jpg) + +图 5-3\. 矢量化管道的一个简单示例从基本序列序列开始。`Sequencevocabulary`有四个特殊标记描述在文本。首先,它用于将单词映射到整数序列。因为单词`Jerry`不在序列表中,所以它被映射到`unk`整数。接下来,标记句子边界的特殊标记放在前面并附加到整数中。最后,整数用 0 填充到特定的长度,这允许数据集中的每个向量都是相同的长度。 文本到向量化的小批量管道中的第二个组件是`Vectorizer`,它实例化并封装了`SequenceVocabulary`的使用。 在这个例子中,`Vectorizer`遵循我们在第 3-5 节中演示的模式,通过对特定频率进行计数和阈值处理来限制词汇表中允许的总词集。 此操作的核心目的是通过消除噪声,低频字并限制内存模型的内存使用来提高模型的信号质量。 diff --git a/docs/8.md b/docs/8.md index d483d51..1e9e36a 100644 --- a/docs/8.md +++ b/docs/8.md @@ -16,11 +16,19 @@ ## Sequence-to-Sequence Models, Encoder–Decoder Models, and Conditioned Generation -序列到序列(S2S)模型是一种称为编码器-解码器模型的一般模型家族的特殊情况。编码器-解码器模型是两个模型(图 8-1)的组合,一个是“编码器”模型,另一个是“解码器”模型,这两个模型通常是联合训练的。编码器模型需要输入并产生一个编码或表示ϕ的输入,通常一个向量。编码器的目标是捕获与当前任务相关的输入的重要属性。解码器的目标是获取编码输入并产生所需的输出。通过对编码器和解码器的理解,我们将 S2S 模型定义为编码器-解码器模型,其中编码器和解码器是序列模型,输入和输出都是序列,可能长度不同。 ![S2S](img/e35a261d985c5ea7ba83bde48d98929d.jpg) 一种查看编码器-解码器模型的方法是将其作为称为条件生成模型的模型的特殊情况。在条件生成中,替代输入表示`ϕ`,一般条件上下文`c`影响译码器产生一个输出。当条件上下文`c`来自编码器模型时,条件生成与编码器-解码器模型相同。并非所有的条件生成模型都是编码器-解码器模型,因为条件上下文可能来自结构化源。以天气报告生成器为例。温度、湿度、风速和风向的值可以“调节”解码器,生成文本天气报告。在“模型 2:条件性姓氏生成模型”中,我们看到了一个基于国籍条件性姓氏生成的例子。图 8-2 展示了一些条件生成模型的实际示例。 +序列到序列(S2S)模型是一种称为编码器-解码器模型的一般模型家族的特殊情况。编码器-解码器模型是两个模型(图 8-1)的组合,一个是“编码器”模型,另一个是“解码器”模型,这两个模型通常是联合训练的。编码器模型需要输入并产生一个编码或表示ϕ的输入,通常一个向量。编码器的目标是捕获与当前任务相关的输入的重要属性。解码器的目标是获取编码输入并产生所需的输出。通过对编码器和解码器的理解,我们将 S2S 模型定义为编码器-解码器模型,其中编码器和解码器是序列模型,输入和输出都是序列,可能长度不同。 + +![S2S](img/e35a261d985c5ea7ba83bde48d98929d.jpg) + +一种查看编码器-解码器模型的方法是将其作为称为条件生成模型的模型的特殊情况。在条件生成中,替代输入表示`ϕ`,一般条件上下文`c`影响译码器产生一个输出。当条件上下文`c`来自编码器模型时,条件生成与编码器-解码器模型相同。并非所有的条件生成模型都是编码器-解码器模型,因为条件上下文可能来自结构化源。以天气报告生成器为例。温度、湿度、风速和风向的值可以“调节”解码器,生成文本天气报告。在“模型 2:条件性姓氏生成模型”中,我们看到了一个基于国籍条件性姓氏生成的例子。图 8-2 展示了一些条件生成模型的实际示例。 ![example](img/e0efc32c40cec36d36b5cb2245b6f4b4.jpg) -在这一章中,我们深入研究了 S2S 模型,并在机器翻译任务的背景下进行了说明。考虑一个“智能”的 iOS/Android 键盘,它可以在你打字时自动将文本转换成表情符号。如果你输入`omg!`房子着火了!,你希望键盘输出类似内联输出的内容。注意,输出的长度(4 个标记)与输入的长度(6 个标记)不同。输出和输入之间的映射称为对齐,如图 8-3 所示。 ![example2](img/b7d81537e2e606730712b8dcdc5eb05f.jpg) 同样,在本例中,输入中的单个标记可以在输出中生成零个或多个标记。传统上,许多解决 S2S 问题的方法都是尝试使用工程和启发式重统计方法。虽然回顾这些方法超出了本章和本书的范围,但是我们建议您阅读 Koehn(2009)并参考 statmt.org 中的参考资料。 +在这一章中,我们深入研究了 S2S 模型,并在机器翻译任务的背景下进行了说明。考虑一个“智能”的 iOS/Android 键盘,它可以在你打字时自动将文本转换成表情符号。如果你输入`omg!`房子着火了!,你希望键盘输出类似内联输出的内容。注意,输出的长度(4 个标记)与输入的长度(6 个标记)不同。输出和输入之间的映射称为对齐,如图 8-3 所示。 + +![example2](img/b7d81537e2e606730712b8dcdc5eb05f.jpg) + +同样,在本例中,输入中的单个标记可以在输出中生成零个或多个标记。传统上,许多解决 S2S 问题的方法都是尝试使用工程和启发式重统计方法。虽然回顾这些方法超出了本章和本书的范围,但是我们建议您阅读 Koehn(2009)并参考 statmt.org 中的参考资料。 在第 6 章中,我们学习了序列模型如何将任意长度的序列编码成向量。在第 7 章中,我们看到单个向量如何使循环神经网络(RNN)有条件地产生不同的姓氏。S2S 模型是这些概念的自然延伸。 @@ -34,11 +42,19 @@ 因此,如果把过去和未来的信息结合在一起,就能够有力地按顺序表示一个单词的意思。这就是双向递归模型的目标。递归家族的任何模型,如 Elmann RNNs 或 LSTMs 或 GRUs,都可以用于这种双向表达。与第 6 章和第 7 章中的单向模型一样,双向模型可以用于分类和序列标记设置,我们需要预测输入中每个单词的一个标签。图 8-5 和图 8-6 详细说明了这一点。在图 8-6 中,`ϕ[love]`是表示、编码或该时刻网络的“隐藏的状态”,当输入的词是`love`。当我们讨论注意力时,这种状态信息在“从一个序列中获取更多信息:注意力”中变得很重要。 -![Attention](img/b74e4cae22941eb118bc6f363c85fa2d.jpg) ![Attention2](img/d6df8a4d46a3f6a19896d574f58dbbb2.jpg) +![Attention](img/b74e4cae22941eb118bc6f363c85fa2d.jpg) + + + +![Attention2](img/d6df8a4d46a3f6a19896d574f58dbbb2.jpg) ## Capturing More from a Sequence: Attention -“序列到序列模型,编码器 - 解码器模型和条件生成”中引入的 S2S 模型公式的一个问题是它将整个输入句子变成单个矢量(“编码”)φ并使用该编码生成输出,如图 8-7 所示。虽然这可能适用于非常短的句子,但对于长句,这样的模型无法捕获整个输入中的信息;例如,见 Bengio 等。 (1994)和 Le 和 Zuidema(2016)。这是仅使用最终隐藏状态作为编码的限制。长输入的另一个问题是,当长时间输入反向传播时,梯度消失,使训练变得困难。 ![Attention3](img/63c2d0fdd2e3d4fc9ebaa90f29949bce.jpg) 对于曾尝试翻译的双语/多语言读者来说,这种首先编码然后解码的过程可能会有点奇怪。作为人类,我们通常不会提炼句子的含义并从意义中产生翻译。对于图 8-7 中的示例,当我们看到`pour`,我们知道会有一个`for`; 类似地,当我们看到`petit-déjeuner`时,我们就会想到`breakfast`,等等。 换句话说,我们的思维在产生输出时专注于输入的相关部分。 这种现象称为注意力。 注意已经在神经科学和其他相关领域得到了广泛的研究,这使我们尽管记忆有限,却取得了相当的成功。 注意无处不在。 实际上,亲爱的读者,现在正在发生这种情况。 **现在每个你阅读的单词都受到注意**。 即使您记忆犹新,您可能也不会读整本书。 在阅读单词时,您会注意相邻的单词,可能是本节和本章的主题,等等。 +“序列到序列模型,编码器 - 解码器模型和条件生成”中引入的 S2S 模型公式的一个问题是它将整个输入句子变成单个矢量(“编码”)φ并使用该编码生成输出,如图 8-7 所示。虽然这可能适用于非常短的句子,但对于长句,这样的模型无法捕获整个输入中的信息;例如,见 Bengio 等。 (1994)和 Le 和 Zuidema(2016)。这是仅使用最终隐藏状态作为编码的限制。长输入的另一个问题是,当长时间输入反向传播时,梯度消失,使训练变得困难。 + +![Attention3](img/63c2d0fdd2e3d4fc9ebaa90f29949bce.jpg) + +对于曾尝试翻译的双语/多语言读者来说,这种首先编码然后解码的过程可能会有点奇怪。作为人类,我们通常不会提炼句子的含义并从意义中产生翻译。对于图 8-7 中的示例,当我们看到`pour`,我们知道会有一个`for`; 类似地,当我们看到`petit-déjeuner`时,我们就会想到`breakfast`,等等。 换句话说,我们的思维在产生输出时专注于输入的相关部分。 这种现象称为注意力。 注意已经在神经科学和其他相关领域得到了广泛的研究,这使我们尽管记忆有限,却取得了相当的成功。 注意无处不在。 实际上,亲爱的读者,现在正在发生这种情况。 **现在每个你阅读的单词都受到注意**。 即使您记忆犹新,您可能也不会读整本书。 在阅读单词时,您会注意相邻的单词,可能是本节和本章的主题,等等。 以类似的方式,我们希望序列生成模型将注意力集中到输入的不同部分,而不仅仅是整个输入的最终总结。这就是注意力机制。第一个包含自然语言处理(NLP)注意概念的模型是 Bahdanau 等人(2015)的机器翻译模型。从那时起,人们提出了几种注意机制和提高注意的方法。在本节中,我们将回顾一些基本的注意机制,并介绍一些与注意相关的术语。事实证明,注意力对于改进输入和输出复杂的深度学习系统非常有用。事实上,Bahdanau 等人通过“BLEU 得分”(我们在“评估序列生成模型”中看到的)来衡量机器翻译系统的性能,当输入变长时,机器翻译系统在没有注意机制的情况下会下降,如图 8-8 所示。增加注意力可以解决问题。 @@ -48,7 +64,9 @@ 注意力是一种通用的机制,可以用于本书前面讨论过的任何一种模型。但我们在这里用编码器-解码器模型来描述它,因为这些模型是注意力机制真正发挥作用的地方。考虑一个 S2S 模型。回想一下,在一个典型的 S2S 模型中,每个时间步生成一个隐藏的状态表示,表示`ϕ[w]`,特定于该时间步的编码器。(如图 8-6 所示。)为了引起注意,我们不仅要考虑编码器的最终隐藏状态,还要考虑每个中间步骤的隐藏状态。这些编码器隐藏状态,在某种程度上是非信息性的,称为值。在某些情况下,编码器的隐藏状态也称为键。注意力还取决于调用查询的解码器的前一个隐藏状态。图 8-9 说明了时间步骤 0 的所有这些。时间步长`t=0`的查询向量是一个固定的超参数。注意由一个向量来表示,这个向量的维数与它所关注的值的维数相同。这被称为注意力向量,或注意力权重,有时也称为对齐。注意力权重与编码器状态(“值”)相结合,生成一个有时也称为瞥见的上下文向量。这个上下文向量成为解码器的输入,而不是完整的句子编码。使用兼容性函数更新下一个时间步骤的注意向量。相容函数的确切性质取决于所使用的注意机制。 -![Encoder_Decoder](img/e9a33e716b27aa7486aa9abbfa4f93e8.jpg) 有几种方法可以实现关注。最简单和最常用的是内容感知机制。您可以在“示例:神经机器翻译”中看到内容感知注意力。另一种流行的注意机制是位置感知注意力,它仅依赖于查询向量和密钥。注意权重通常是 0 到 1 之间的浮点值。这称为软注意。相反,可以学习二进制 0/1 向量以引起注意。这被称为硬关注。 +![Encoder_Decoder](img/e9a33e716b27aa7486aa9abbfa4f93e8.jpg) + +有几种方法可以实现关注。最简单和最常用的是内容感知机制。您可以在“示例:神经机器翻译”中看到内容感知注意力。另一种流行的注意机制是位置感知注意力,它仅依赖于查询向量和密钥。注意权重通常是 0 到 1 之间的浮点值。这称为软注意。相反,可以学习二进制 0/1 向量以引起注意。这被称为硬关注。 图 8-9 中所示的注意机制取决于输入中所有时间步长的编码器状态。这也被称为全球关注。相反,对于本地注意力,您可以设计一种注意机制,该机制仅依赖于当前时间步长周围的输入窗口。 @@ -62,7 +80,9 @@ 人体评估涉及一个或多个人类受试者,要么对模型输出给出“竖起拇指”或“拇指向下”评级,要么进行编辑以纠正翻译。这导致了一个简单的“错误率”,它非常接近系统输出与人工任务相关的最终目标。人类评价很重要,但是很少使用,因为人类注释者往往是缓慢,昂贵和难以获得的。最后,人类也可能彼此不一致,并且,与任何其他金标准一样,人类评估与注释器间协议率配对。测量注释器间协议率也是另一个昂贵的主张。一种常见的人类评估指标是人为目标翻译错误率(HTER)。 HTER 是一个加权编辑距离,由人类为了合理充分的意义和流畅性而“修复”翻译输出而进行的插入,删除和转置次数计算得出(参见图 8-10)。 -![Just](img/388af7f8313976c5e8fb5b223f851953.jpg) 另一方面,自动评估操作简单快捷。有两种度量标准可用于自动评估生成的序列。我们再次使用机器翻译作为示例,但这些指标也适用于涉及生成序列的任何任务。这些指标包括基于 N 元组重叠的指标和困惑。基于 N 元组重叠的度量倾向于通过使用 N 元组重叠统计来计算得分来测量输出相对于参考的接近程度。 BLEU,ROUGE 和 METEOR 是基于 N 元组重叠的度量的示例。其中,BLEU 经受了时间的考验,成为机器翻译文献中的衡量标准。 BLEU 代表“双语评估学习”。我们跳过 BLEU 的确切表述,并建议您阅读 Papineni 等人。 (2002 年)。出于实际目的,我们使用像 NLTK7 或 SacreBLEU8 这样的包来计算分数。当参考数据可用时,BLEU 本身的计算非常快速和容易。 +![Just](img/388af7f8313976c5e8fb5b223f851953.jpg) + +另一方面,自动评估操作简单快捷。有两种度量标准可用于自动评估生成的序列。我们再次使用机器翻译作为示例,但这些指标也适用于涉及生成序列的任何任务。这些指标包括基于 N 元组重叠的指标和困惑。基于 N 元组重叠的度量倾向于通过使用 N 元组重叠统计来计算得分来测量输出相对于参考的接近程度。 BLEU,ROUGE 和 METEOR 是基于 N 元组重叠的度量的示例。其中,BLEU 经受了时间的考验,成为机器翻译文献中的衡量标准。 BLEU 代表“双语评估学习”。我们跳过 BLEU 的确切表述,并建议您阅读 Papineni 等人。 (2002 年)。出于实际目的,我们使用像 NLTK7 或 SacreBLEU8 这样的包来计算分数。当参考数据可用时,BLEU 本身的计算非常快速和容易。 困惑是基于信息理论的另一种自动评估指标,您可以将其应用于可以测量输出序列概率的任何情况。对于序列`x`,如果`P(x)`是序列的概率,则困惑定义如下: diff --git a/docs/9.md b/docs/9.md index 5accd24..f2a5160 100644 --- a/docs/9.md +++ b/docs/9.md @@ -32,7 +32,15 @@ NLP 比单本书范围内的内容还多,本书也不例外。在第 2 章中 话语涉及理解文本文档的部分整体性质。例如,话语解析的任务涉及理解两个句子在上下文中如何彼此相关。表 9-1 给出了 Penn Discourse Treebank(PDTB)的一些例子来说明这项任务。 -Table 9-1\. Examples from the CoNLL 2015 Shallow Discourse Processing task ![pic2](img/b9468b8fa88bae589f119466a2354398.jpg) 理解话语还涉及解决其他问题,如回指解析和转喻检测。在 Anaphora Resolution 中,我们希望将代词的出现解析为它们所引用的实体。如图 9-2 所示,这可能成为一个复杂的问题。 ![pic3](img/2aaf2adfdd3fa9a320c69390bb6cc52e.jpg) 对象可以是转喻,如下例所示:`Beijing imposed trade tariffs in response to tariffs on Chinese goods.` +Table 9-1\. Examples from the CoNLL 2015 Shallow Discourse Processing task + +![pic2](img/b9468b8fa88bae589f119466a2354398.jpg) + +理解话语还涉及解决其他问题,如回指解析和转喻检测。在 Anaphora Resolution 中,我们希望将代词的出现解析为它们所引用的实体。如图 9-2 所示,这可能成为一个复杂的问题。 + +![pic3](img/2aaf2adfdd3fa9a320c69390bb6cc52e.jpg) + +对象可以是转喻,如下例所示:`Beijing imposed trade tariffs in response to tariffs on Chinese goods.` 北京在这里指的不是中国政府的所在地。有时,成功解决所指对象可能需要使用知识库。 @@ -62,10 +70,14 @@ NLP 技术的范围和适用性很广,事实上,NLP 技术可以应用于存 生产 NLP 系统可能很复杂。在构建 NLP 系统时,重要的是要记住,您正在构建的系统正在解决任务,并且只是实现这一目标的手段。在系统构建期间,工程师,研究人员,设计人员和产品经理可以做出多种选择。虽然我们的书主要关注技术或基础构建块,但将这些构建块放在一起以提出满足您需求的复杂结构将需要一些模式思考。模式思维和描述模式的语言是“在专业领域内描述良好设计实践或有用组织模式的方法。”这在许多学科(Alexander,1979)中很流行,包括软件工程。在本节中,我们将介绍生产 NLP 系统的一些常见设计和部署模式。这些是团队经常需要做出的选择或权衡,以使产品开发与技术,业务,战略和运营目标保持一致。我们在六个轴下检查这些设计选择: -1. 在线 VS 离线系统。在线系统是需要实时或接近实时地进行模型预测的系统。诸如打击垃圾邮件和内容审核等一些任务本质上需要在线系统。另一方面,离线系统不需要实时运行。我们可以将它们构建为在一批输入上有效运行,并且可以利用转换学习等方法。一些在线系统可以是被动的,甚至可以以在线方式进行学习(也称为在线学习),但是许多在线系统是通过定期离线模型构建来构建和部署的,该构建被推向生产。使用在线学习构建的系统应该对对抗性环境特别敏感。最近的一个例子是着名的 Twitter 聊天机器人 Tay,它误入歧途并开始从在线巨魔学习。正如后见之明所预见的那样,Tay 很快就开始回应令人反感的推文,其母公司微软不得不在推出后不到一天就关闭了这项服务。系统构建中的典型轨迹是首先构建一个离线系统,将其作为一个“在线”系统进行大量工程工作,然后通过添加反馈循环并可能改变学习方法使其成为“在线学习”系统。虽然这种路径在代码库中增加的复杂性方面是有机的,但它可能会引入诸如处理攻击者之类的盲点等等。图 9-3 显示了“Facebook 免疫系统”作为检测垃圾邮件的在线系统的一个例子(警告:大约 2012 年。不是当前 Facebook 基础设施的反映)。请注意在线系统如何比类似的离线系统需要更多的工程设计。 ![pic4](img/0425cc70e45b99ad32c4df9ecd82680b.jpg) +1. 在线 VS 离线系统。在线系统是需要实时或接近实时地进行模型预测的系统。诸如打击垃圾邮件和内容审核等一些任务本质上需要在线系统。另一方面,离线系统不需要实时运行。我们可以将它们构建为在一批输入上有效运行,并且可以利用转换学习等方法。一些在线系统可以是被动的,甚至可以以在线方式进行学习(也称为在线学习),但是许多在线系统是通过定期离线模型构建来构建和部署的,该构建被推向生产。使用在线学习构建的系统应该对对抗性环境特别敏感。最近的一个例子是着名的 Twitter 聊天机器人 Tay,它误入歧途并开始从在线巨魔学习。正如后见之明所预见的那样,Tay 很快就开始回应令人反感的推文,其母公司微软不得不在推出后不到一天就关闭了这项服务。系统构建中的典型轨迹是首先构建一个离线系统,将其作为一个“在线”系统进行大量工程工作,然后通过添加反馈循环并可能改变学习方法使其成为“在线学习”系统。虽然这种路径在代码库中增加的复杂性方面是有机的,但它可能会引入诸如处理攻击者之类的盲点等等。图 9-3 显示了“Facebook 免疫系统”作为检测垃圾邮件的在线系统的一个例子(警告:大约 2012 年。不是当前 Facebook 基础设施的反映)。请注意在线系统如何比类似的离线系统需要更多的工程设计。 + +![pic4](img/0425cc70e45b99ad32c4df9ecd82680b.jpg) 2. 交互 VS 非交互系统。大多数自然语言系统在预测仅来自模型的意义上是非交互式的。实际上,许多生产 NLP 模型深深嵌入到数据处理的提取,转换和加载(ETL)管道的转换步骤中。在某些情况下,人类参与预测循环可能会有所帮助。图 9-4 显示了 Lilt Inc 的交互式机器翻译界面的一个例子,其中模型和人类共同参与所谓的“混合主动模型”(Green-Initiative Models)中的预测(Green 2014)。交互式系统难以设计,但通过将人类带入循环可以实现非常高的精度。 -![pic5](img/a8a3d29c19e970bdd9965e839f4d4ee4.jpg) 图 9-4。一种人-环机器翻译模型,允许人们修正或改写来自 MT 系统的建议,以产生非常高质量的翻译。 (图片由 Lilt Inc 提供) +![pic5](img/a8a3d29c19e970bdd9965e839f4d4ee4.jpg) + +图 9-4。一种人-环机器翻译模型,允许人们修正或改写来自 MT 系统的建议,以产生非常高质量的翻译。 (图片由 Lilt Inc 提供) 1. Unimodal versus multimodal systems