From 0f60f5c5922f7522debb782d4d6336e4c3975db8 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Sat, 16 Jan 2021 17:36:43 +0800 Subject: [PATCH] 2021-01-16 17:36:43 --- new/handson-nlp-pt-1x/9.md | 140 ++++++++++++++++++---------------- new/handson-nlp-pt-1x/sec1.md | 4 +- new/handson-nlp-pt-1x/sec2.md | 6 +- new/handson-nlp-pt-1x/sec3.md | 12 +-- new/pt-tut-17/27.md | 4 +- new/pt-tut-17/32.md | 2 +- new/pt-tut-17/56.md | 8 +- 7 files changed, 94 insertions(+), 82 deletions(-) diff --git a/new/handson-nlp-pt-1x/9.md b/new/handson-nlp-pt-1x/9.md index 23749042..b1bb186c 100644 --- a/new/handson-nlp-pt-1x/9.md +++ b/new/handson-nlp-pt-1x/9.md @@ -23,7 +23,7 @@ ## BERT -**BERT** 代表**变压器**的双向编码器表示形式,由 Google 于 2018 年开发,被广泛认为是 NLP 领域的领先模型,在自然语言中已取得领先的性能 语言推理和问答任务。 幸运的是,它已作为开源模型发布,因此可以下载并用于您自己的 NLP 任务。 +**BERT** 代表**转换器**的双向编码器表示形式,由 Google 于 2018 年开发,被广泛认为是 NLP 领域的领先模型,在自然语言中已取得领先的性能 语言推理和问答任务。 幸运的是,它已作为开源模型发布,因此可以下载并用于您自己的 NLP 任务。 BERT 是作为预训练的模型发布的,这意味着用户可以下载和实施 BERT,而无需每次都从头开始重新训练模型。 预先训练的模型在几个语料库上进行了训练,包括整个 Wikipedia(由 25 亿个单词组成)和另一个图书集(其中还包括 8 亿个单词)。 但是,BERT 与其他类似模型不同的主要因素是它提供了一种深度,双向,无监督的语言表示形式,该语言表示形式提供了更复杂,更详细的表示形式,从而提高了 NLP 任务的性能。 。 @@ -35,7 +35,7 @@ BERT 是作为预训练的模型发布的,这意味着用户可以下载和实 “他用球拍打了棒球” -尽管单词 *bat* 在两个句子中都是名词,但我们可以辨别出单词的上下文和含义明显不同,这取决于周围的其他单词。 某些单词也可能具有不同的含义,具体取决于它们是句子中的名词还是动词: +尽管单词`bat`在两个句子中都是名词,但我们可以辨别出单词的上下文和含义明显不同,这取决于周围的其他单词。 某些单词也可能具有不同的含义,具体取决于它们是句子中的名词还是动词: “她曾经配过火” @@ -53,9 +53,9 @@ BERT 是作为预训练的模型发布的,这意味着用户可以下载和实 为了创建这种双向语言表示,BERT 使用了两种不同的技术,第一种是屏蔽语言建模。 这种方法通过用掩蔽标记代替输入句子,从而有效地隐藏了 15% 的单词。 然后,模型基于句子中其他单词的上下文,尝试预测被屏蔽单词的真实值。 双向进行此预测是为了在两个方向上捕获句子的上下文: -**输入**:*我们[MASK_1]在句子*中隐藏了部分[MASK_2] +**输入**:`We [MASK_1] hide some of the [MASK_2] in the sentence` -**标签**:*MASK_1 =随机,MASK_2 =单词* +**标签**:`MASK_1 = randomly, MASK_2 = words` 如果我们的模型可以学习预测正确的上下文相关词,那么我们就可以更接近上下文相关表示。 @@ -63,17 +63,17 @@ BERT 是作为预训练的模型发布的,这意味着用户可以下载和实 BERT 用于学习语言表示的另一种技术是下一句预测。 在这种方法中,我们的模型接收两个句子,并且模型学习预测第二个句子是否是第一个句子之后的句子。 例如: -**句子 A**:*“我喜欢喝咖啡”* +**句子 A**:`I like to drink coffee` -**句子 B**:*“这是我最喜欢的饮料”* +**句子 B**:`It is my favorite drink` -**是下句话吗?**:*是* +**是下句话吗?**:`True` -**句子 A**:*“我喜欢喝咖啡”* +**句子 A**:`I like to drink coffee` -**句子 B**:*“天空是蓝色的”* +**句子 B**:`The sky is blue` -**是下句话吗?**:*错误* +**是下句话吗?**:`False` 通过像这样传递我们的模型句子对,它可以学习确定是否有两个句子是相关的并且彼此遵循,或者它们仅仅是两个随机的,不相关的句子。 学习这些句子关系在语言模型中很有用,因为许多与 NLP 相关的任务(例如,问答)都需要模型理解两个句子之间的关系。 在下一句预测上训练模型可以使模型识别一对句子之间的某种关系,即使该关系是非常基本的。 @@ -83,12 +83,12 @@ BERT 使用这两种方法(屏蔽语言建模和下一句预测)进行了训 模型架构建立在前几章中看到的许多原理的基础上,以使用双向编码提供复杂的语言表示。 BERT 有两种不同的变体,每种变体由不同数量的层和关注头组成: -* **BERT Base**:12 个变压器块(层),12 个关注头,约 1.1 亿个参数 -* **BERT 大型**:24 个变压器块(层),16 个关注头,约 3.4 亿个参数 +* **BERT 基本**:12 个转换器块(层),12 个关注头,约 1.1 亿个参数 +* **BERT 大型**:24 个转换器块(层),16 个关注头,约 3.4 亿个参数 虽然 BERT Large 只是具有更多参数的 BERT Base 的更深版本,但我们将专注于 BERT Base 的架构。 -BERT 是按照**变压器**的原理构建的,现在将对其进行详细说明。 +BERT 是按照**转换器**的原理构建的,现在将对其进行详细说明。 ### 变形金刚 @@ -96,13 +96,13 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 ![Figure 9.2 – Transformer workflow ](img/B12365_09_2.jpg) -图 9.2 –变压器工作流程 +图 9.2 –转换器工作流程 但是,我们的转换器为此方法添加了另一种复杂性,其中,转换器实际上具有一堆编码器和一堆解码器,每个解码器接收最终编码器的输出作为其输入: ![Figure 9.3 – Transformer workflow for multiple encoders ](img/B12365_09_3.jpg) -图 9.3 –多个编码器的变压器工作流程 +图 9.3 –多个编码器的转换器工作流程 在每个编码器层中,我们发现两个组成部分:自我注意层和前馈层。 自我注意层是首先接收模型输入的层。 该层使编码器在对任何接收到的单词进行编码时检查输入句子中的其他单词,从而使编码上下文知道。 自我注意层的输出被转发到前馈层,该前馈层将独立地应用于每个位置。 可以这样示意地说明: @@ -126,15 +126,15 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 ### 编码器 -变压器的独特属性是单词分别流过编码器层,并且每个位置的每个单词都有自己的路径。 尽管自我注意层中存在某些依赖关系,但这些不存在于前馈层中。 单个单词的向量是从嵌入层获得的,然后在通过前馈网络馈送之前通过自我关注层馈送: +转换器的独特属性是单词分别流过编码器层,并且每个位置的每个单词都有自己的路径。 尽管自我注意层中存在某些依赖关系,但这些不存在于前馈层中。 单个单词的向量是从嵌入层获得的,然后在通过前馈网络馈送之前通过自我关注层馈送: ![Figure 9.7 – Encoder layout ](img/B12365_09_7.jpg) 图 9.7 –编码器布局 -自我关注可以说是编码器中最复杂的部分,因此我们将首先对其进行更详细的研究。 假设我们有一个由三个单词组成的输入句子; 例如*“很好”* 。 对于此句子中的每个单词,我们将它们表示为从模型的嵌入层获得的单个单词向量。 然后,我们从此单个单词向量中提取三个向量:查询向量,键向量和值向量。 这三个向量是通过将词向量乘以训练模型时获得的三个不同权重矩阵而获得的。 +自我关注可以说是编码器中最复杂的部分,因此我们将首先对其进行更详细的研究。 假设我们有一个由三个单词组成的输入句子; 例如`fine`。 对于此句子中的每个单词,我们将它们表示为从模型的嵌入层获得的单个单词向量。 然后,我们从此单个单词向量中提取三个向量:查询向量,键向量和值向量。 这三个向量是通过将词向量乘以训练模型时获得的三个不同权重矩阵而获得的。 -如果我们在输入句子 *Ethis* , *Eis* 和 *Efine* 中为每个单词调用单词嵌入,则可以计算查询,键和值向量 像这样: +如果我们在输入句子`Ethis`,`Eis`和`Efine`中为每个单词调用单词嵌入,则可以计算查询,键和值向量 像这样: **查询向量**: @@ -146,7 +146,7 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 ![](img/Formula_09_004.png) -**关键向量**: +**键向量**: ![](img/Formula_09_005.png) @@ -170,7 +170,7 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 让我们继续我们的工作示例。 我们需要依次考虑输入句子中的每个单词。 为此,我们为句子中的每对查询/关键字向量计算得分。 这是通过获取输入句子中每个单词的每个查询/关键字向量对的点积来完成的。 例如,要计算句子“ this”中第一个单词的分数,我们计算“ this”的查询向量与位置 0 处的键向量之间的点积。我们在所有其他位置的键向量中重复此点积 输入句子中的位置,因此我们获得输入句子中第一个单词的`n`分,其中`n`是句子的长度: -**分数(“ this”)**: +**分数(`"this"`)**: ![](img/Formula_09_013.png) @@ -180,7 +180,7 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 接下来,我们对每个得分应用 softmax 函数,以使每个得分现在处于 0 到 1 之间(因为这有助于防止梯度梯度爆炸并使梯度下降更加有效且易于计算)。 然后,我们将这些分数中的每一个与值向量相乘,然后将它们总和求和,以获得最终向量,然后将其在编码器中传递: -**最终向量(“ this”)**: +**最终向量(`"this"`)**: ![](img/Formula_09_016.png) @@ -194,19 +194,21 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 在此示例中,我们仅为查询,键和值向量学习了单个权重矩阵。 但是,我们实际上可以为这些元素中的每一个学习多个不同的矩阵,并将其同时应用于输入句子中以获得最终输出。 这就是,即所谓的**多头注意力**,它使我们能够依靠多种不同的学习模式而不仅仅是一个单独的注意力机制来执行更复杂的注意力计算。 -我们知道 BERT 包含 12 个关注头,这意味着 *Wq* , *Wk* 和 *Wv* 学会了 12 种不同的权重矩阵。 +我们知道 BERT 包含 12 个关注头,这意味着`Wq`,`Wk`和`Wv`学会了 12 种不同的权重矩阵。 最后,我们需要一种让编码器考虑输入序列中单词顺序的方法。 当前,我们的模型独立对待输入序列中的每个单词,但实际上,输入序列中单词的顺序将对句子的整体含义产生巨大的影响。 为了解决这个问题,我们使用**位置编码**。 为了应用这一点,我们的模型将每个输入嵌入并分别向每个位置添加位置编码向量。 这些位置向量是由我们的模型学习的,遵循一种特定的模式来帮助它们确定序列中每个单词的位置。 从理论上讲,将这些位置向量添加到我们的初始嵌入中后,一旦将它们投影到各个查询,键和值向量中,就应该转化为最终向量之间的有意义的距离: -*x0 =原始嵌入* +```py +x0 = Raw Embedding -*t0 =位置编码* +t0 = Positional Encoding -*E0 =嵌入时间信号* +E0 = Embedding with Time Signal -*x0 + t0 = E0* +x0 + t0 = E0 +``` 我们的模型为每个位置学习不同的位置编码矢量(`t`0,`t`1,依此类推),然后我们将应用于输入句子中的每个单词,然后再输入 甚至输入我们的编码器: @@ -218,7 +220,7 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 ### 解码器 -解码器中的组件与编码器中的组件非常相似。 但是,我们的变压器中的解码器不是像编码器那样接收原始输入语句,而是从编码器的输出接收其输入。 +解码器中的组件与编码器中的组件非常相似。 但是,我们的转换器中的解码器不是像编码器那样接收原始输入语句,而是从编码器的输出接收其输入。 我们的堆叠编码器处理我们的输入语句,然后剩下一组注意向量`K`和`V`,它们在我们解码器的编码器-解码器注意层中使用。 这使它可以仅关注输入序列的相关部分: @@ -226,17 +228,17 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 图 9.9 –堆叠式解码器 -在每个时间步,我们的解码器都使用句子中先前生成的单词和 *K,V* 注意向量的组合来生成句子中的下一个单词。 反复重复此过程,直到解码器生成< END >令牌,表明它已完成生成最终输出。 变压器解码器上的给定时间步长可能看起来像这样: +在每个时间步,我们的解码器都使用句子中先前生成的单词和`K, V`注意向量的组合来生成句子中的下一个单词。 反复重复此过程,直到解码器生成< END >令牌,表明它已完成生成最终输出。 转换器解码器上的给定时间步长可能看起来像这样: ![Figure 9.10 – Transformer decoder ](img/B12365_09_10.jpg) -图 9.10 –变压器解码器 +图 9.10 –转换器解码器 在这里值得注意的是,解码器中的自我注意层的运行方式与我们的编码器中的自我关注层略有不同。 在我们的解码器中,自我注意层仅关注输出序列中的较早位置。 这是通过将序列的任何未来位置设置为负无穷大来掩盖的。 这意味着当发生分类时,softmax 计算始终会得出 0 的预测。 编码器-解码器注意层的工作方式与我们编码器中的多头自我注意层相同。 但是,主要区别在于它从下面的层创建查询矩阵,并从编码器的输出获取键和值矩阵。 -这些编码器和解码器部分构成了我们的变压器,构成了 BERT 的基础。 接下来,我们将研究 BERT 的某些应用程序,并研究一些在特定任务下表现出更高性能的变体。 +这些编码器和解码器部分构成了我们的转换器,构成了 BERT 的基础。 接下来,我们将研究 BERT 的某些应用程序,并研究一些在特定任务下表现出更高性能的变体。 ## BERT 的应用 @@ -249,45 +251,45 @@ BERT 是按照**变压器**的原理构建的,现在将对其进行详细说 当前,由于 BERT 的训练方式,它只能解决非常狭窄的 NLP 任务。 但是,BERT 的许多变体已经以微妙的方式进行了更改,以在特定任务上实现更高的性能。 这些包括但不限于以下内容: * **roBERTa**:由 Facebook 构建的 BERT 的变体。 删除 BERT 的下一个句子预测元素,但通过实现动态屏蔽来增强单词屏蔽策略。 -* **xlm** / **BERT**:也是由 Facebook 构建的,该模型对 BERT 应用了双语言训练机制,从而使它能够学习不同语言的单词之间的关系。 这使 BERT 可以有效地用于机器翻译任务,与基本的序列到序列模型相比,表现出更高的性能。 +* **xlm**/**BERT**:也是由 Facebook 构建的,该模型对 BERT 应用了双语言训练机制,从而使它能够学习不同语言的单词之间的关系。 这使 BERT 可以有效地用于机器翻译任务,与基本的序列到序列模型相比,表现出更高的性能。 * **distilBERT**:BERT 的更紧凑版本,保留了原始版本的 95%,但将学习到的参数数量减半,从而减少了模型的总大小和训练时间。 * **ALBERT**:此经过 Google 训练的模型使用了自己独特的训练方法,称为句子顺序预测。 BERT 的这种变体在许多任务上均表现出优于标准 BERT 的性能,现在被认为是 BERT 之前的最先进技术(说明了事物可以快速改变的速度!)。 -虽然 BERT 可能是最著名的,但也有其他基于变压器的模型被认为是最新技术。 通常被认为与 BERT 竞争的主要竞争对手是 GPT-2。 +虽然 BERT 可能是最著名的,但也有其他基于转换器的模型被认为是最新技术。 通常被认为与 BERT 竞争的主要竞争对手是 GPT-2。 ## GPT-2 -GPT-2 与 BERT 类似,但在一些细微的方面有所不同。 虽然这两种模型都基于先前概述的变压器架构,但是 BERT 使用一种称为自我注意力的注意力形式,而 GPT-2 使用屏蔽的自我注意力。 两者之间的另一个细微差别是 GPT-2 的构造方式使其可以一次输出一个令牌。 +GPT-2 与 BERT 类似,但在一些细微的方面有所不同。 虽然这两种模型都基于先前概述的转换器架构,但是 BERT 使用一种称为自我注意力的注意力形式,而 GPT-2 使用屏蔽的自我注意力。 两者之间的另一个细微差别是 GPT-2 的构造方式使其可以一次输出一个令牌。 这是因为 GPT-2 实际上在其工作方式上是自回归的。 这意味着当它生成输出(句子中的第一个单词)时,该输出将递归添加到输入中。 然后,此输入用于预测句子中的下一个单词,并重复进行直到生成完整的句子为止。 您可以在以下示例中看到这一点: **步骤 1:** -**输入**:*天空是什么颜色?* +**输入**:`What color is the sky?` -**输出**:*...* +**输出**:`...` 然后,将预测的输出添加到输入的末尾并重复此步骤: **步骤 2:** -**输入**:*天空是什么颜色?* +**输入**:`What color is the sky? The` -**输出**:*天空* +**输出**:`sky` 我们重复此过程,直到生成完整的句子: **步骤 3:** -**输入**:*天空是什么颜色? 天空* +**输入**:`What color is the sky? The sky` -**输出**:*为* +**输出**:`is` **步骤 4:** -**输入**:*天空是什么颜色? 天空是* +**输入**:`What color is the sky? The sky is` -**输出**:*蓝色* +**输出**:`blue` 就 BERT 和 GPT-2 之间的性能而言,这是关键的权衡之一。 BERT 被双向训练的事实意味着这种单令牌生成是不可能的。 但是,GPT-2 不是双向的,因此在进行预测时只考虑句子中的先前单词,这就是为什么 BERT 在预测句子中缺少的单词时胜过 GPT-2 的原因。 @@ -311,15 +313,21 @@ GPT-2 与 BERT 类似,但在一些细微的方面有所不同。 虽然这两 GPT-2 的语言生成功能意味着它能够使用很少的提示来生成非常现实且句法正确的句子。 通过仅提供两行输入来识别主题,该模型就可以生成有关该主题的详细信息的段落,而不管其是否真实! 一个现在臭名昭著的例子是“独角兽”故事,该模型收到了一个句子输入: -**输入**:*“一个令人震惊的发现,科学家发现了一群独角兽生活在安第斯山脉的一个偏远的,以前未被开发的山谷中。令研究人员更惊讶的是,独角兽说话 完美的英语。”* +**输入**:`"In a shocking finding, scientists discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English."` 该模型提供了以下输出: -**输出**:*科学家以其独特的角 Ovid 的独角兽命名了种群。 这些四角银白色独角兽以前是科学界所未知的。* +**输出**: -*现在,将近两个世纪之后,终于解决了引发这种奇怪现象的谜团。* +```py +The scientist named the population, after their distinctive horn, Ovid's Unicorn. These four-horned, silver-white unicorns were previously unknown to science. -*拉巴斯大学的进化生物学家 JorgePérez 博士和几位同伴正在探索安第斯山脉时发现一个小山谷,没有其他动物或人类。 佩雷斯注意到该山谷似乎是一个天然喷泉,周围环绕着两个岩石和银色雪峰。* +Now, after almost two centuries, the mystery of what sparked this odd phenomenon is finally solved. + +Dr. Jorge Pérez, an evolutionary biologist from the University of La Paz, and several companions, were exploring the Andes Mountains when they found a small valley, with no other animals or humans. Pérez noticed that the valley had what appeared to be a natural fountain, surrounded by two peaks of rock and silver snow. + +This is only the first th +``` 这只是模型从很少的输入中生成的更大的九段响应的前三段。 值得注意的是,这些句子都非常合理(不管不可能的主题是什么!),各段以逻辑顺序排列在一起,并且该模型能够从很小的输入中产生所有这些。 @@ -358,7 +366,7 @@ Jeff-专有名词,表示名称 晚餐-晚餐是物体/事物 -但是,名词短语略有不同,因为每个名词短语都应指一个单独的实体。 在前面的句子中,即使 *Jeff* 和*厨师*都是名词,短语 *Jeff 厨师*都指一个人,因此可以将其视为名词 短语。 但是,如何从语法上确定名词短语是指单个实体? 一种简单的方法是将短语置于动词之前,看看该句子是否具有句法意义。 如果确实如此,那么该短语就是名词短语: +但是,名词短语略有不同,因为每个名词短语都应指一个单独的实体。 在前面的句子中,即使`Jeff`和`Cook`都是名词,短语`Jeff Cook`都指一个人,因此可以将其视为名词 短语。 但是,如何从语法上确定名词短语是指单个实体? 一种简单的方法是将短语置于动词之前,看看该句子是否具有句法意义。 如果确实如此,那么该短语就是名词短语: 厨师杰夫做饭… @@ -412,7 +420,7 @@ Jeff-专有名词,表示名称 图 9.17 将句子分为几个组成部分 -句子的这些部分具有特定的语义角色。 任何给定句子的**谓词**表示该句子内发生的事件,而该句子的所有其他部分都与给定谓词相关。 在这句话中,我们可以将“谁”标记为谓词的代理。 **代理**是导致事件的原因。 我们还可以将“ Whom”标记为谓词的主题。 **主题**是我们句子中受相关事件影响最大的元素: +句子的这些部分具有特定的语义角色。 任何给定句子的**谓词**表示该句子内发生的事件,而该句子的所有其他部分都与给定谓词相关。 在这句话中,我们可以将“谁”标记为谓词的代理。 **代理**是导致事件的原因。 我们还可以将`Whom`标记为谓词的主题。 **主题**是我们句子中受相关事件影响最大的元素: ![Figure 9.18 – Breaking down the roles ](img/B12365_09_18.jpg) @@ -424,7 +432,7 @@ Jeff-专有名词,表示名称 通过执行语义角色标记,我们可以为句子的每个部分分配特定的角色。 这在 NLP 中非常有用,因为它允许模型更好地“理解”一个句子,因此而不是仅作为角色分类的句子,应理解为语义角色的组合,可以更好地传达 实际上是在句子描述的情况下发生的。 -当我们阅读句子*“男孩踢了球”* 时,我们固有地知道有一个男孩,有一个球,并且那个男孩正在踢球。 但是,到目前为止,我们所研究的所有 NLP 模型都可以通过查看句子中的各个单词并为其创建一些表示来理解该句子。 到目前为止,我们所看到的系统不可能理解存在两个“事物”并且一个物体(男孩)对第二物体(球)执行某种动作(踢)的事实。 在模型中引入语义角色元素可以更好地帮助我们的系统通过定义句子的主题及其之间的相互作用来形成更现实的句子表示形式。 +当我们阅读句子`The boy kicked the ball`时,我们固有地知道有一个男孩,有一个球,并且那个男孩正在踢球。 但是,到目前为止,我们所研究的所有 NLP 模型都可以通过查看句子中的各个单词并为其创建一些表示来理解该句子。 到目前为止,我们所看到的系统不可能理解存在两个“事物”并且一个物体(男孩)对第二物体(球)执行某种动作(踢)的事实。 在模型中引入语义角色元素可以更好地帮助我们的系统通过定义句子的主题及其之间的相互作用来形成更现实的句子表示形式。 语义角色标签极大地帮助了我们一件事,即识别具有相同含义但在语法或语法上不同的句子; 例如以下内容: @@ -472,23 +480,23 @@ Figure 9.20 – Bi-directional LSTM (SLING) 通常以以下方式设置此任务,我们的第一个文本标记为文本,第二个文本标记为假设: -**文字**:*如果您将钱捐给慈善事业,您会很高兴的* +**文字**:`If you give money to charity, you will be happy` -**假设**:*将钱捐给慈善机构会带来良好的后果* +**假设**:`Giving money to charity has good consequences` 这是**肯定文本蕴涵**的示例。 如果假说来自文本,那么可以说这两个文本之间存在方向性关系。 设置带有文本/假设的示例非常重要,因为它定义了关系的方向。 大多数时候,这种关系是不对称的。 例如,在此示例中,句子 1 包含句子 2(我们可以根据句子 1 中的信息推断出句子 2 是正确的)。 但是,我们不能根据第二句中的信息推断出第一句是正确的。 尽管这两种说法都可能是正确的,但如果我们不能推断出两者之间存在方向关系,就无法从另一种推断出。 -也存在**否定性文本蕴涵**。 这是陈述矛盾的时候。 例如以下内容: +也存在**否定文本蕴涵**。 这是陈述矛盾的时候。 例如以下内容: -**文字**:*如果您将钱捐给慈善事业,您会很高兴的* +**文字**:`If you give money to charity, you will be happy` -**假设**:*将钱捐给慈善机构会带来不良后果* +**假设**:`Giving money to charity has bad consequences` 在此示例中,文本没有假设。 相反,本文与假设相矛盾。 最后,如果两个句子之间没有关系,也可以确定在两个句子之间没有**文本蕴涵**。 这意味着这两个陈述不一定是矛盾的,而是该案文并不包含以下假设: -**文字**:*如果您将钱捐给慈善事业,您会很高兴的* +**文字**:`If you give money to charity, you will be happy` -**假设**:*将钱捐给慈善机构会使您放松身心* +**假设**:`Giving money to charity will make you relaxed` 从 NLP 的角度来看,自然语言的歧义使其成为一项有趣的任务。 两个句子可以具有不同的句法结构,不同的语义结构,并且由完全不同的单词组成,但含义仍然非常相似。 同样,两个句子可以由相同的词和实体组成,但含义却大不相同。 @@ -514,13 +522,15 @@ Figure 9.20 – Bi-directional LSTM (SLING) 鉴于您了解此文本,您现在应该能够回答有关此文本的以下问题: -**问**:*水的沸点是多少?* +```py +Q: What is the boiling point of water? -`A`: *100°C(212°F)* +A: 100 °C (212 °F) -**问**:*沸水会影响其味道吗?* +Q: Does boiling water affect its taste? -`A`:*否* +A: No +``` 这种理解文本并回答有关问题的能力构成了我们机器理解任务的基础。 我们希望能够训练一种机器学习模型,该模型不仅可以形成对文本的理解,还可以用语法正确的自然语言回答有关该文本的问题。 @@ -530,7 +540,7 @@ Figure 9.20 – Bi-directional LSTM (SLING) 图 9.22 –查找信息的过程 -在此示例中,为回答*“水的沸点是多少?”* ,我们首先提出问题。 然后,我们在搜索引擎上搜索主题。 这可能是该问题的某种简化表示; 例如,*“水沸点”* 。 然后,我们的搜索引擎将返回一些相关文档,最有可能是 Wikipedia 中关于水的条目,然后我们将不得不手动搜索并使用它来推断问题的答案。 尽管此方法有效,但机器理解模型将使此过程有所简化。 +在此示例中,为回答`What is the boiling point of water`,我们首先提出问题。 然后,我们在搜索引擎上搜索主题。 这可能是该问题的某种简化表示; 例如,`boiling point of water`。 然后,我们的搜索引擎将返回一些相关文档,最有可能是 Wikipedia 中关于水的条目,然后我们将不得不手动搜索并使用它来推断问题的答案。 尽管此方法有效,但机器理解模型将使此过程有所简化。 假设我们有一个完美的模型,能够完全理解并回答文本语料库上的问题。 我们可以在大量数据源(例如,互联网或 Wikipedia 的大型文本抓图)上训练该模型,并形成充当大型知识库的模型。 这样,我们便可以查询具有实际问题的知识库,并且答案将自动返回。 这消除了我们图的推理步骤,因为推理已由模型处理,因为该模型已经对主题有所了解: @@ -538,9 +548,9 @@ Figure 9.20 – Bi-directional LSTM (SLING) 图 9.23 –使用模型的新过程 -在理想情况下,这就像键入*“水的沸点是多少?”一样简单。 将*插入搜索引擎,并返回*“ 100°C(212°F)”* 作为答案。 +在理想情况下,这就像键入搜索引擎`What is the boiling point of water`,并返回`100 °C (212 °F)`作为答案一样简单。 -假设我们首先有此模型的简化版本。 假设我们已经知道该问题的答案已出现在文档中。因此,鉴于有关水的 Wikipedia 页面,我们能否训练一个模型来回答问题*“水的沸点是多少?”。* 首先做一个简单的方法,而不是合并完整语言模型的元素,而是简单地返回包含我们问题答案的 Wikipedia 页面的段落。 +假设我们首先有此模型的简化版本。 假设我们已经知道该问题的答案已出现在文档中。因此,鉴于有关水的 Wikipedia 页面,我们能否训练一个模型来回答问题`What is the boiling point of water`。首先做一个简单的方法,而不是合并完整语言模型的元素,而是简单地返回包含我们问题答案的 Wikipedia 页面的段落。 我们可以训练以完成此任务的架构可能看起来像这样: @@ -558,7 +568,9 @@ Figure 9.20 – Bi-directional LSTM (SLING) 在任何机器理解任务中,实际上都有三个要素在起作用。 我们已经知道存在一个问题和答案,但是也有一个可以确定给定问题答案的相关上下文。 例如,我们可以问以下问题: -*今天星期几?* +```py +What day is it today? +``` 答案可能会有所不同,具体取决于提出问题的环境。 例如,圣诞节的 3 月 6 日星期一,星期二,3 月 6 日。 @@ -580,7 +592,7 @@ Figure 9.20 – Bi-directional LSTM (SLING) 图 9.27 –对偶模型表示 -实际上,近来在 NLU 中的进步意味着这种模型现已成为现实。 通过组合许多元素,我们能够创建一个神经网络结构,该结构能够执行对偶模型的功能,如先前的所示。 这就是**双问-答网络**。 实际上,我们的模型包含到目前为止我们在本书中看到的神经网络的大多数组件,即,嵌入层,卷积层,编码器,解码器和注意层。 问答网络的完整架构类似于以下内容: +实际上,近来在 NLU 中的进步意味着这种模型现已成为现实。 通过组合许多元素,我们能够创建一个神经网络结构,该结构能够执行对偶模型的功能,如先前的所示。 这就是**双问答网络**。 实际上,我们的模型包含到目前为止我们在本书中看到的神经网络的大多数组件,即,嵌入层,卷积层,编码器,解码器和注意层。 问答网络的完整架构类似于以下内容: ![Figure 9.28 – Architecture of ask-answer network ](img/B12365_09_28.jpg) diff --git a/new/handson-nlp-pt-1x/sec1.md b/new/handson-nlp-pt-1x/sec1.md index 0ac935fe..3afdfc72 100644 --- a/new/handson-nlp-pt-1x/sec1.md +++ b/new/handson-nlp-pt-1x/sec1.md @@ -4,5 +4,5 @@ 本节包含以下章节: -* “第 1 章” 和*机器学习和深度学习基础知识* -* “第 2 章” 和 *NLP 的 PyTorch 1.x 入门* \ No newline at end of file +* “第 1 章”,“机器学习和深度学习基础知识” +* “第 2 章”,“NLP 的 PyTorch 1.x 入门” \ No newline at end of file diff --git a/new/handson-nlp-pt-1x/sec2.md b/new/handson-nlp-pt-1x/sec2.md index c3f18969..f64ac410 100644 --- a/new/handson-nlp-pt-1x/sec2.md +++ b/new/handson-nlp-pt-1x/sec2.md @@ -1,8 +1,8 @@ # 第 2 部分:自然语言处理基础 -# 在本节中,您将学习构建**自然语言处理**(**NLP**)应用程序的基础知识。 您还将在本节中学习如何在 PyTorch 中使用各种 NLP 技术,例如单词嵌入,CBOW 和标记化。 +在本节中,您将学习构建**自然语言处理**(**NLP**)应用程序的基础知识。 您还将在本节中学习如何在 PyTorch 中使用各种 NLP 技术,例如单词嵌入,CBOW 和标记化。 本节包含以下章节: -* “第 3 章” , *NLP 和文本嵌入* -* “第 4 章” 和*词根和词法提取* \ No newline at end of file +* “第 3 章”,“NLP 和文本嵌入” +* “第 4 章”,“词根和词干提取” \ No newline at end of file diff --git a/new/handson-nlp-pt-1x/sec3.md b/new/handson-nlp-pt-1x/sec3.md index b0fcb4e9..67de8c41 100644 --- a/new/handson-nlp-pt-1x/sec3.md +++ b/new/handson-nlp-pt-1x/sec3.md @@ -1,11 +1,11 @@ # 第 3 节:使用 PyTorch 1.x 的实际 NLP 应用程序 -在本节中,我们将使用 PyTorch 中可用的各种**自然** **语言** **处理**(**NLP**)技术来构建各种实际 -使用 PyTorch 的世界应用程序。 情感分析,文本摘要,文本分类以及使用 PyTorch 构建聊天机器人应用程序是本节将介绍的一些任务。 +在本节中,我们将使用 PyTorch 中可用的各种**自然语言处理**(**NLP**)技术来构建各种实际 -使用 PyTorch 的世界应用程序。 情感分析,文本摘要,文本分类以及使用 PyTorch 构建聊天机器人应用程序是本节将介绍的一些任务。 本节包含以下章节: -* “第 5 章” 和*循环神经网络和情感分析* -* “第 6 章” 和*卷积神经网络用于文本分类* -* “第 7 章” 和*使用序列到序列神经网络的文本翻译* -* “第 8 章” 和*使用基于注意力的神经网络构建聊天机器人* -* “第 9 章” 和*未来之路* \ No newline at end of file +* “第 5 章”,“循环神经网络和情感分析” +* “第 6 章”,“用于文本分类的卷积神经网络” +* “第 7 章”,“使用序列到序列神经网络的文本翻译” +* “第 8 章”,“使用基于注意力的神经网络构建聊天机器人” +* “第 9 章”,“未来之路” \ No newline at end of file diff --git a/new/pt-tut-17/27.md b/new/pt-tut-17/27.md index 93423cbc..9e9652bf 100644 --- a/new/pt-tut-17/27.md +++ b/new/pt-tut-17/27.md @@ -4,7 +4,7 @@ 这是一个有关如何训练使用 [nn.Transformer](https://pytorch.org/docs/master/nn.html?highlight=nn%20transformer#torch.nn.Transformer) 模块的序列到序列模型的教程。 -PyTorch 1.2 版本包括一个基于纸张[的标准变压器模块。 事实证明,该变压器模型在许多序列间问题上具有较高的质量,同时具有更高的可并行性。 `nn.Transformer`模块完全依赖于注意机制(另一个最近实现为](https://arxiv.org/pdf/1706.03762.pdf) [nn.MultiheadAttention](https://pytorch.org/docs/master/nn.html?highlight=multiheadattention#torch.nn.MultiheadAttention) 的模块)来绘制输入和输出之间的全局依存关系。 `nn.Transformer`模块现已高度模块化,因此可以轻松地修改/组成单个组件(如本教程中的 [nn.TransformerEncoder](https://pytorch.org/docs/master/nn.html?highlight=nn%20transformerencoder#torch.nn.TransformerEncoder) )。 +PyTorch 1.2 版本包括一个基于纸张[的标准转换器模块。 事实证明,该转换器模型在许多序列间问题上具有较高的质量,同时具有更高的可并行性。 `nn.Transformer`模块完全依赖于注意机制(另一个最近实现为](https://arxiv.org/pdf/1706.03762.pdf) [nn.MultiheadAttention](https://pytorch.org/docs/master/nn.html?highlight=multiheadattention#torch.nn.MultiheadAttention) 的模块)来绘制输入和输出之间的全局依存关系。 `nn.Transformer`模块现已高度模块化,因此可以轻松地修改/组成单个组件(如本教程中的 [nn.TransformerEncoder](https://pytorch.org/docs/master/nn.html?highlight=nn%20transformerencoder#torch.nn.TransformerEncoder) )。 ![../_img/transformer_architecture.jpg](img/4b79dddf1ff54b9384754144d8246d9b.png) @@ -128,7 +128,7 @@ test_data = batchify(test_data, eval_batch_size) ### 生成输入序列和目标序列的函数](docs / modern-java-zh / -`get_batch()`功能为变压器模型生成输入和目标序列。 它将源数据细分为长度为`bptt`的块。 对于语言建模任务,模型需要以下单词作为`Target`。 例如,如果`bptt`值为 2,则`i` = 0 时,我们将获得以下两个变量: +`get_batch()`功能为转换器模型生成输入和目标序列。 它将源数据细分为长度为`bptt`的块。 对于语言建模任务,模型需要以下单词作为`Target`。 例如,如果`bptt`值为 2,则`i` = 0 时,我们将获得以下两个变量: ![../_img/transformer_input_target.png](img/20ef8681366b44461cf49d1ab98ab8f2.png) diff --git a/new/pt-tut-17/32.md b/new/pt-tut-17/32.md index 95d5b215..295173ff 100644 --- a/new/pt-tut-17/32.md +++ b/new/pt-tut-17/32.md @@ -114,7 +114,7 @@ test_iter = DataLoader(test_data, batch_size=BATCH_SIZE, 具体来说,我们的模型遵循此处中描述的[架构(您可以在](https://arxiv.org/abs/1409.0473)中找到注释更多的版本[)。](https://github.com/SethHWeidman/pytorch-seq2seq/blob/master/3%20-%20Neural%20Machine%20Translation%20by%20Jointly%20Learning%20to%20Align%20and%20Translate.ipynb) -注意:此模型只是可用于语言翻译的示例模型; 我们选择它是因为它是任务的标准模型,而不是因为它是用于翻译的推荐模型。 如您所知,目前最先进的模型基于“变形金刚”; 您可以在上看到 PyTorch 的实现 Transformer 层[的功能; 特别是,以下模型中使用的“注意”与变压器模型中存在的多头自我注意不同。](https://pytorch.org/docs/stable/nn.html#transformer-layers) +注意:此模型只是可用于语言翻译的示例模型; 我们选择它是因为它是任务的标准模型,而不是因为它是用于翻译的推荐模型。 如您所知,目前最先进的模型基于“变形金刚”; 您可以在上看到 PyTorch 的实现 Transformer 层[的功能; 特别是,以下模型中使用的“注意”与转换器模型中存在的多头自我注意不同。](https://pytorch.org/docs/stable/nn.html#transformer-layers) ```py import random diff --git a/new/pt-tut-17/56.md b/new/pt-tut-17/56.md index ab0f6a1f..79797da1 100644 --- a/new/pt-tut-17/56.md +++ b/new/pt-tut-17/56.md @@ -24,7 +24,7 @@ ## 1.设置](docs / modern-java-zh / -### 1.1 安装 PyTorch 和 HuggingFace 变压器](docs / modern-java-zh / +### 1.1 安装 PyTorch 和 HuggingFace 转换器](docs / modern-java-zh / 要开始本教程,首先请遵循 PyTorch [(此处](https://github.com/pytorch/pytorch/#installation))和 HuggingFace Github Repo [(此处](https://github.com/huggingface/transformers#installation))中的安装说明。 此外,我们还将安装 [scikit-learn](https://github.com/scikit-learn/scikit-learn) 软件包,因为我们将重复使用其内置的 F1 分数计算帮助器功能。 @@ -118,7 +118,7 @@ python download_glue_data.py --data_dir='glue_data' --tasks='MRPC' BERT 的精神是预训练语言表示形式,然后以最小的任务相关参数微调各种任务上的深层双向表示形式,并获得最新的结果。 在本教程中,我们将专注于对预训练的 BERT 模型进行微调,以对 MRPC 任务上的语义等效句子对进行分类。 -要为 MRPC 任务微调预训练的 BERT 模型(HuggingFace 变压器中的`bert-base-uncased`模型),可以按照[示例](https://github.com/huggingface/transformers/tree/master/examples#mrpc)中的命令进行操作: +要为 MRPC 任务微调预训练的 BERT 模型(HuggingFace 转换器中的`bert-base-uncased`模型),可以按照[示例](https://github.com/huggingface/transformers/tree/master/examples#mrpc)中的命令进行操作: ```py export GLUE_DIR=./glue_data @@ -435,8 +435,8 @@ loaded_quantized_model = torch.jit.load("bert_traced_eager_quant.pt") ## 参考文献](docs / modern-java-zh / -[1] J.Devlin,M。Chang,K。Lee 和 K. Toutanova, [BERT:用于语言理解的深度双向变压器的预训练(2018)](https://arxiv.org/pdf/1810.04805.pdf)。 +[1] J.Devlin,M。Chang,K。Lee 和 K. Toutanova, [BERT:用于语言理解的深度双向转换器的预训练(2018)](https://arxiv.org/pdf/1810.04805.pdf)。 -[2] [HuggingFace 变压器](https://github.com/huggingface/transformers)。 +[2] [HuggingFace 转换器](https://github.com/huggingface/transformers)。 [3] O. Zafrir,G。Boudoukh,P。Izsak 和 M. Wasserblat(2019 年)。 [Q8BERT:量化的 8 位 BERT](https://arxiv.org/pdf/1910.06188.pdf) 。 \ No newline at end of file -- GitLab