Skip to content
This repository has been archived by the owner on Oct 11, 2023. It is now read-only.

Commit

Permalink
2021-01-04 15:54:49
Browse files Browse the repository at this point in the history
  • Loading branch information
wizardforcel committed Jan 4, 2021
1 parent 7a98200 commit a6749ce
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 25 deletions.
4 changes: 2 additions & 2 deletions docs/4.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ class SurnameDataset(Dataset):

```

### 词汇表,向量化器和`DataLoader`
### `Vocabulary``Vectorizer``DataLoader`

为了使用字符对姓氏进行分类,我们使用`Vocabulary``Vectorizer``DataLoader`将姓氏字符串转换为向量化的小批量。这些数据结构与“示例:餐馆评论的情感分类”中使用的数据结构相同,它们举例说明了一种多态性,这种多态性将姓氏的字符标记与 Yelp 评论的单词标记相同对待。数据不是通过将字标记映射到整数来向量化的,而是通过将字符映射到整数来向量化的。

Expand Down Expand Up @@ -641,7 +641,7 @@ class SurnameDataset(Dataset):

```

### 词汇表,向量化器和`DataLoader`
### `Vocabulary``Vectorizer``DataLoader`

在本例中,尽管词汇表和`DataLoader`的实现方式与“示例:带有多层感知器的姓氏分类”中的示例相同,但`Vectorizer``vectorize()`方法已经更改,以适应 CNN 模型的需要。具体来说,正如我们在示例 4-18 中的代码中所示,该函数将字符串中的每个字符映射到一个整数,然后使用该整数构造一个由单热向量组成的矩阵。重要的是,矩阵中的每一列都是不同的单热向量。主要原因是,我们将使用的`Conv1d`层要求数据张量在第 0 维上具有批量,在第 1 维上具有通道,在第 2 维上具有特性。

Expand Down
4 changes: 2 additions & 2 deletions docs/5.md
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ class CBOWDataset(Dataset):

```

### 词汇表,向量化器和`DataLoader`
### `Vocabulary``Vectorizer``DataLoader`

在 CBOW 分类任务中,从文本到向量化的迷你批量的管道大部分都是标准的:词汇表和`DataLoader`功能都与“示例:餐厅评论分类情感”中的示例完全一样。然而,与我们在第 3 章和第 4 章中看到的矢量化器不同,矢量化器不构造单热向量。相反,构造并返回一个表示上下文索引的整数向量。示例 5-8 给出了向量化函数的代码。

Expand Down Expand Up @@ -496,7 +496,7 @@ class NewsDataset(Dataset):

```

### 词汇表,向量化器和`DataLoader`
### `Vocabulary``Vectorizer``DataLoader`

在这个例子中,我们引入了`SequenceVocabulary`,它是标准`Vocabulary`类的子类,它捆绑了用于序列数据的四个特殊标记:`UNK`标记,`MASK`标记,`BEGIN-SEQUENCE`标记和`END-SEQUENCE`标记。 我们在第 6 章中更详细地描述了这些标记,但简而言之,它们有三个不同的用途。 我们在第 4 章中看到的`UNK`标记(Unknown 的缩写)允许模型学习稀有单词的表示,以便它可以容纳在测试时从未见过的单词。 当我们有可变长度的序列时,`MASK`标记充当嵌入层和损失计算的标记。 最后,`BEGIN-SEQUENCE``END-SEQUENCE`标记给出了关于序列边界的神经网络提示。 图 5-3 显示了在更广泛的矢量化管道中使用这些特殊标记的结果。

Expand Down
22 changes: 11 additions & 11 deletions docs/8.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
在本章中,我们以第六章和第七章讨论的序列建模概念为基础,将它们扩展到序列到序列建模的领域,其中模型以一个序列作为输入,并产生另一个可能不同长度的序列作为输出。序列对序列问题的例子随处可见。例如,给定一封电子邮件,我们可能希望预测响应。给出一个法语句子,预测它的英语翻译。或者,给定一篇文章,写一篇摘要。我们还讨论了序列模型的结构变体,特别是双向模型。为了最大限度地利用序列表示,我们介绍了注意机制并对其进行了深入讨论。最后,本章以实现本章描述的概念的神经机器翻译的详细演练结束。

## Sequence-to-Sequence Models, Encoder–Decoder Models, and Conditioned Generation
## 序列到序列模型,编码器-解码器模型,和条件生成

序列到序列(S2S)模型是一种称为编码器-解码器模型的一般模型家族的特殊情况。编码器-解码器模型是两个模型(图 8-1)的组合,一个是“编码器”模型,另一个是“解码器”模型,这两个模型通常是联合训练的。编码器模型需要输入并产生一个编码或表示ϕ的输入,通常一个向量。编码器的目标是捕获与当前任务相关的输入的重要属性。解码器的目标是获取编码输入并产生所需的输出。通过对编码器和解码器的理解,我们将 S2S 模型定义为编码器-解码器模型,其中编码器和解码器是序列模型,输入和输出都是序列,可能长度不同。

Expand All @@ -36,7 +36,7 @@

![example3](img/d9e36aa0f27f4c63020a354160813b95.jpg)

## Capturing More from a Sequence: Bidirectional Recurrent Models
## 从序列中捕获更多:双向循环模型

理解递归模型的一种方法是把它看作一个将序列编码为向量的黑盒子。在建模序列时,不仅要观察过去的单词,而且还要观察将来出现的单词。考虑以下句子:`The man who hunts ducks out on the weekends.`。 如果模型只从左到右观察,那么`duck`的表示将不同于从右到左观察单词的模型。人类一直在做这种回溯性的更新。

Expand All @@ -48,7 +48,7 @@

![Attention2](img/d6df8a4d46a3f6a19896d574f58dbbb2.jpg)

## Capturing More from a Sequence: Attention
## 从序列中捕获更多:注意力

“序列到序列模型,编码器 - 解码器模型和条件生成”中引入的 S2S 模型公式的一个问题是它将整个输入句子变成单个矢量(“编码”)`φ`并使用该编码生成输出,如图 8-7 所示。虽然这可能适用于非常短的句子,但对于长句,这样的模型无法捕获整个输入中的信息;例如,见 Bengio 等。 (1994)和 Le 和 Zuidema(2016)。这是仅使用最终隐藏状态作为编码的限制。长输入的另一个问题是,当长时间输入反向传播时,梯度消失,使训练变得困难。

Expand All @@ -60,7 +60,7 @@

![example4](img/6fcf2d19b01740d36c409edb3500f7a3.jpg)

### Attention in Deep Neural Networks
### 深度神经网络中的注意力

注意力是一种通用的机制,可以用于本书前面讨论过的任何一种模型。但我们在这里用编码器-解码器模型来描述它,因为这些模型是注意力机制真正发挥作用的地方。考虑一个 S2S 模型。回想一下,在一个典型的 S2S 模型中,每个时间步生成一个隐藏的状态表示,表示`ϕ[w]`,特定于该时间步的编码器。(如图 8-6 所示。)为了引起注意,我们不仅要考虑编码器的最终隐藏状态,还要考虑每个中间步骤的隐藏状态。这些编码器隐藏状态,在某种程度上是非信息性的,称为值。在某些情况下,编码器的隐藏状态也称为键。注意力还取决于调用查询的解码器的前一个隐藏状态。图 8-9 说明了时间步骤 0 的所有这些。时间步长`t=0`的查询向量是一个固定的超参数。注意由一个向量来表示,这个向量的维数与它所关注的值的维数相同。这被称为注意力向量,或注意力权重,有时也称为对齐。注意力权重与编码器状态(“值”)相结合,生成一个有时也称为瞥见的上下文向量。这个上下文向量成为解码器的输入,而不是完整的句子编码。使用兼容性函数更新下一个时间步骤的注意向量。相容函数的确切性质取决于所使用的注意机制。

Expand All @@ -74,7 +74,7 @@

当输入是多模式时 - 例如,图像和语音 - 可以设计多模式注意力。关于注意力的文献虽然很新,但已经非常广泛,这表明了这一主题的重要性。详细介绍它们的每一个都超出了本书的范围,我们将引导您到 Luong,Pham 和 Manning(2011)以及 Vaswani 等人。 (2017)作为起点。

## Evaluating Sequence Generation Models
## 评估序列生成模型

当生成任务中可以看到多个有效答案时,精度,召回,准确度和 F1 等分类指标无法帮助模型 - 单个法语句子可以有多个英语翻译。序列模型根据称为参考输出的预期输出进行评估。在比较不同的模型时,我们使用分数来表明模型输出的“良好”与参考的接近程度。例如,在像机器翻译这样的任务中,如果一个模型只有一个单词关闭,我们可能不希望像另一个产生完全无法理解的答案的模型那样惩罚该模型。单个输入示例可以有多个参考输出。例如,对于特定的法语句子,可能存在多个有效的英语翻译,使用略微不同的单词。序列生成模型有两种评估:人工评估和自动评估。

Expand All @@ -90,15 +90,15 @@

在下一节中,我们将跟进机器翻译示例,并通过 PyTorch 实现将这些概念巧妙地结合在一起。

## Example: Neural Machine Translation
## 示例:神经机器翻译

在本例中,我们将介绍 S2S 模型最常用的实现:机器翻译。随着深度学习在 2010 年代早期的流行,很明显,使用嵌入词汇和 RNNs 是一种非常强大的两种语言之间的翻译方法——只要有足够的数据。引入“序列生成模型评价”中的注意机制,进一步完善了机器翻译模型。在这一部分,我们描述了一个基于 Luong, Pham, 和 Manning(2015)的实现,它简化了 S2S 模型中的注意方法。

我们首先概述数据集和神经机器翻译所需的特殊记账类型。数据集是一个平行的语料库;它由成对的英语句子和相应的法语翻译组成。因为我们正在处理两个可能不同长度的序列,所以我们需要跟踪输入序列和输出序列的最大长度和词汇。在大多数情况下,这个例子是对完整读者在前几章中所看到的内容的直接扩展。

在覆盖数据集和簿记数据结构之后,我们通过参与源序列中的不同位置来遍历模型以及它如何生成目标序列。我们模型中的编码器使用双向 GRU(bi-GRU)来计算源序列中每个位置的向量,这些向量由序列的所有部分通知。为此,我们使用 PyTorch 的`PackedSequences`数据结构。我们在“NMT 模型中的编码和解码”中更深入地介绍了这一点。在“从序列捕获更多:注意力”中讨论的注意机制应用于 bi-GRU 的输出并用于调节目标序列生成。我们讨论模型的结果以及在“训练常规和结果”中可以改进的方法。

### Machine Translation Dataset
### 机器翻译数据集

对于此示例,我们使用来自 Tatoeba Project 的英语 - 法语句子对的数据集.数据预处理首先将所有句子设为小写,并将 NLTK 的英语和法语标记符应用于每个句子对。接下来,我们应用 NLTK 的特定于语言的单词标记生成器来创建标记列表。即使我们进行了进一步的计算,我们将在下一段中描述,但这个标记列表是一个预处理的数据集。

Expand All @@ -110,7 +110,7 @@ Note

我们用来选择数据子集的句法模式是以`I am``he is``she is``they are``you are``we are`开头的英语句子。数据集从 135,842 个句子对减少到 13,062 个句子对,系数为 10。为了最终确定学习设置,我们将剩余的 13,062 个句子对分为 70% 训练,15% 验证和 15% 测试分裂。从刚刚列出的语法开始的每个句子的比例通过首先按句子开始分组,从这些组创建分割,然后合并每个组的分割来保持不变。

### A Vectorization Pipeline for NMT
### NMT 向量化流水线

对源英语和目标法语句子进行矢量化需要比前面章节中看到的更复杂的管道。复杂性增加有两个原因。首先,源序列和目标序列在模型中具有不同的角色,属于不同的语言,并且以两种不同的方式进行矢量化。其次,作为使用 PyTorch 的`PackedSequences`的先决条件,我们按源句的长度对每个小批量进行排序。为了准备这两个复杂性,`NMTVectorizer`实例化了两个独立的`SequenceVocabulary`对象和两个最大序列长度的测量,如例 8-1 所示。

Expand Down Expand Up @@ -278,7 +278,7 @@ def generate_nmt_batches(dataset, batch_size, shuffle=True,

```

### Encoding and Decoding in the NMT Model
### NMT 模型的编码和解码

在这个例子中,我们从源序列开始 - 一个英语句子 - 我们生成一个目标序列 - 相应的法语翻译。标准方法是使用“序列到序列模型,编码器 - 解码器模型和条件生成”中描述的编码器 - 解码器模型。在示例 8-4 和示例 8-5 中呈现的模型中,编码器首先将每个源序列映射到具有 bi-GRU 的矢量状态序列(参见“从序列中捕获更多:双向递归模型”)。然后,解码器以解码器的隐藏状态作为其初始隐藏状态开始,并使用注意机制(参见“从序列中捕获更多:注意”)来选择源序列中的不同信息以生成输出序列。在本节的其余部分,我们将更详细地解释此过程。

Expand Down Expand Up @@ -642,7 +642,7 @@ class NMTDecoder(nn.Module):

```

### Training Routine and Results
### 训练例程和结果

此示例的训练例程几乎与前面章节中介绍的训练例程相同。对于固定数量的历元,我们在称为小批量的块中迭代数据集。然而,这里的每个小批量由四个张量组成:源序列的整数矩阵,目标序列的两个整数矩阵,以及源序列长度的整数向量。两个靶序列矩阵是靶序列偏移 1 并用`BEGIN-OF-SEQUENCE`标记填充以充当靶序列观察,或`END-OF-SEQUENCE`标记充当靶序列预测标记。该模型将源序列和​​目标序列观察作为输入,以产生目标序列预测。在损失函数中使用目标序列预测标签来计算交叉熵损失,然后将其反向传播到每个模型参数以使其知道其梯度。然后调用优化器并将每个模型参数更新一些与梯度成比例的量。

Expand All @@ -664,7 +664,7 @@ class NMTDecoder(nn.Module):

本章重点介绍了在所谓的条件生成模型的条件上下文中生成序列输出。当条件上下文本身来自另一个序列时,我们将其称为序列到序列或 S2S 模型。我们还讨论了 S2S 模型如何成为编码器 - 解码器模型的特例。为了充分利用序列,我们讨论了第 6 章和第 7 章中讨论的序列模型的结构变体,特别是双向模型。我们还学习了如何结合注意机制来有效捕获更长距离的背景。最后,我们讨论了如何评估序列到序列模型,并使用端到端机器翻译示例进行演示。到目前为止,我们已将本书的每一章专门用于特定的网络架构。在下一章中,我们将前面的所有章节结合在一起,并查看如何使用各种模型体系结构的综合构建许多真实系统的示例。

## References
## 参考

1. `Yoshua Bengio, Patrice Simard, and Paolo Frasconi. (1994). "Learning long-term dependencies with gradient descent is difficult." IEEE transactions on neural networks.`

Expand Down
Loading

0 comments on commit a6749ce

Please sign in to comment.