From 7d5c77bf40ff30e235ac7c0d55464e8d0efedabb Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Mon, 4 Jan 2021 13:28:41 +0800 Subject: [PATCH] 2021-01-04 13:28:41 --- docs/4.md | 2 +- docs/6.md | 32 ++++++++++++++++---------------- docs/7.md | 2 +- docs/8.md | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/4.md b/docs/4.md index 5131230..c037cae 100644 --- a/docs/4.md +++ b/docs/4.md @@ -18,7 +18,7 @@ 本章研究的第二种前馈神经网络,卷积神经网络,在处理数字信号时深受窗口滤波器的启发。通过这种窗口特性,卷积神经网络能够在输入中学习局部化模式,这不仅使其成为计算机视觉的主轴,而且是检测单词和句子等序列数据中的子结构的理想候选。我们在“卷积神经网络”中概述了卷积神经网络,并在“示例:使用 CNN 对姓氏进行分类”中演示了它们的使用。 -在本章中,多层感知器和卷积神经网络被分组在一起,因为它们都是前馈神经网络,并且与另一类神经网络——递归神经网络(RNNs)形成对比,递归神经网络(RNNs)允许反馈(或循环),这样每次计算都可以从之前的计算中获得信息。在第 6 章和第 7 章中,我们将介绍 RNNs 以及为什么允许网络结构中的循环是有益的。 +在本章中,多层感知器和卷积神经网络被分组在一起,因为它们都是前馈神经网络,并且与另一类神经网络——循环神经网络(RNNs)形成对比,循环神经网络(RNNs)允许反馈(或循环),这样每次计算都可以从之前的计算中获得信息。在第 6 章和第 7 章中,我们将介绍 RNNs 以及为什么允许网络结构中的循环是有益的。 在我们介绍这些不同的模型时,确保您理解事物如何工作的一个有用方法是在计算数据张量时注意它们的大小和形状。每种类型的神经网络层对它所计算的数据张量的大小和形状都有特定的影响,理解这种影响可以极大地有助于对这些模型的深入理解。 diff --git a/docs/6.md b/docs/6.md index a73902d..af6f2ee 100644 --- a/docs/6.md +++ b/docs/6.md @@ -12,37 +12,37 @@ > > 许可协议: [署名-非商业性使用-禁止演绎 4.0 国际](https://creativecommons.org/licenses/by-nc-nd/4.0/) 转载请保留原文链接及作者。 -序列是项目的有序集合。传统的机器学习假设数据点是独立的、相同分布的(IID),但在许多情况下,如语言、语音和时间序列数据,一个数据项取决于它之前或之后的数据项。这种数据也称为序列数据。在人类语言中,顺序信息无处不在。例如,语音可以被看作是音素的基本单元序列。在像英语这样的语言中,句子中的单词不是随意的。他们可能会被它之前或之后的词所束缚。例如,在英语中,介词“of”后面可能跟着冠词“the”;例如,“The lion is the king of the jungle.”。例如,在许多语言中,包括英语,动词的数量必须与句子主语的数量一致。这里有一个例子: The book is on the table The books are on the table. 有时这些依赖项或约束可以是任意长的。例如: The book that I got yesterday is on the table. The books read by the second grade children are shelved in the lower rack. 简而言之,理解序列对于理解人类语言至关重要。在前几章中,我们介绍了前馈神经网络,如多层感知器(MLPs)和卷积神经网络(CNNs),以及向量表示的能力。尽管使用这些技术可以完成大量的自然语言处理(NLP)任务,但正如我们将在本章以及第 7 章和第 8 章中学习的那样,它们并不能充分建模序列。 +序列是项目的有序集合。传统的机器学习假设数据点是独立的、相同分布的(IID),但在许多情况下,如语言、语音和时间序列数据,一个数据项取决于它之前或之后的数据项。这种数据也称为序列数据。在人类语言中,顺序信息无处不在。例如,语音可以被看作是音素的基本单元序列。在像英语这样的语言中,句子中的单词不是随意的。他们可能会被它之前或之后的词所束缚。例如,在英语中,介词`of`后面可能跟着冠词`the`;例如,`The lion is the king of the jungle.`。例如,在许多语言中,包括英语,动词的数量必须与句子主语的数量一致。这里有一个例子:`The book is on the table The books are on the table.`。有时这些依赖项或约束可以是任意长的。例如: `The book that I got yesterday is on the table. The books read by the second grade children are shelved in the lower rack.`。 简而言之,理解序列对于理解人类语言至关重要。在前几章中,我们介绍了前馈神经网络,如多层感知器(MLPs)和卷积神经网络(CNNs),以及向量表示的能力。尽管使用这些技术可以完成大量的自然语言处理(NLP)任务,但正如我们将在本章以及第 7 章和第 8 章中学习的那样,它们并不能充分建模序列。 传统的方法,模型序列在 NLP 使用隐马尔科夫模型,条件随机场,和其他类型的概率图形模型,虽然没有讨论在这本书仍然是相关的。我们邀请您(Koller and Friedman, 2009)。 在深度学习中,建模序列涉及到维护隐藏的“状态信息”或隐藏状态。当序列中的每个条目被匹配时——例如,当一个句子中的每个单词被模型看到时——隐藏状态就会被更新。因此,隐藏状态(通常是一个向量)封装了到目前为止序列所看到的一切。这个隐藏的状态向量,也称为序列表示,可以根据我们要解决的任务以无数种方式在许多序列建模任务中使用,从对序列进行分类到预测序列。在本章中,我们将研究序列数据的分类,但是第 7 章将介绍如何使用序列模型来生成序列。 -我们首先介绍最基本的神经网络序列模型:递归神经网络。在此基础上,给出了分类设置中递归神经网络的端到端实例。具体来说,您将看到一个基于字符的 RNN 来将姓氏分类到它们各自的国籍。姓氏示例表明序列模型可以捕获语言中的正字法(子词)模式。这个示例的开发方式使读者能够将模型应用于其他情况,包括建模文本序列,其中数据项是单词而不是字符。 +我们首先介绍最基本的神经网络序列模型:循环神经网络。在此基础上,给出了分类设置中循环神经网络的端到端实例。具体来说,您将看到一个基于字符的 RNN 来将姓氏分类到它们各自的国籍。姓氏示例表明序列模型可以捕获语言中的正字法(子词)模式。这个示例的开发方式使读者能够将模型应用于其他情况,包括建模文本序列,其中数据项是单词而不是字符。 ## Introduction to Recurrent Neural Networks -递归神经网络(RNNs)的目的是建立张量序列的模型。rnn 和前馈网络一样,是一类模型。RNN 家族中有几个不同的成员,但在本章中,我们只讨论最基本的形式,有时称为 Elman RNN。递归网络(基本的 Elman 形式和第 7 章中概述的更复杂的形式)的目标是学习序列的表示。这是通过维护一个隐藏的状态向量来实现的,它捕获了序列的当前状态。隐藏状态向量由当前输入向量和前一个隐藏状态向量计算得到。这些关系如图 6-1 所示,图 6-1 显示了计算依赖项的函数(左)视图和“展开”(右)视图。 +循环神经网络(RNNs)的目的是建立张量序列的模型。rnn 和前馈网络一样,是一类模型。RNN 家族中有几个不同的成员,但在本章中,我们只讨论最基本的形式,有时称为 Elman RNN。循环网络(基本的 Elman 形式和第 7 章中概述的更复杂的形式)的目标是学习序列的表示。这是通过维护一个隐藏的状态向量来实现的,它捕获了序列的当前状态。隐藏状态向量由当前输入向量和前一个隐藏状态向量计算得到。这些关系如图 6-1 所示,图 6-1 显示了计算依赖项的函数(左)视图和“展开”(右)视图。 -![pic1](pic1.png “图 6 - 1。(左)Elman RNN 的函数视图将递归关系显示为隐藏向量的反馈循环。(右)“展开”视图可以清楚地显示计算关系,因为每个时间步的隐藏向量依赖于该时间步的输入和前一个时间步的隐藏向量。 +(左)Elman RNN 的函数视图将递归关系显示为隐藏向量的反馈循环。(右)“展开”视图可以清楚地显示计算关系,因为每个时间步的隐藏向量依赖于该时间步的输入和前一个时间步的隐藏向量。 在每次步骤中使用相同的权重将输入转换为输出是参数共享的另一个例子。在第 4 章中,我们看到了 CNNs 如何跨空间共享参数。CNNs 使用称为内核的参数来计算来自输入数据子区域的输出。卷积核在输入端平移,从每一个可能的位置计算输出,以学习平移不变性。与此相反,rnn 通过依赖一个隐藏的状态向量来捕获序列的状态,从而使用相同的参数来计算每一步的输出。通过这种方式,rnn 的目标是通过计算给定的隐藏状态向量和输入向量的任何输出来学习序列不变性。你可以想象一个 RNN 跨时间共享参数,一个 CNN 跨空间共享参数。 -由于单词和句子可以是可变长度的,因此 rnn 或任何序列模型都应该能够处理可变长度的序列。一种可能的技术是人为地将序列限制在一个固定的长度。在本书中,我们使用另一种技术,称为掩蔽,通过利用序列长度的知识来处理可变长度序列。简而言之,屏蔽允许数据在某些输入不应计入梯度或最终输出时发出信号。PyTorch 提供了处理称为 packedsequence 的可变长度序列的原语,这些序列从这些不太密集的序列中创建密集的张量。“例子:使用字符 RNN 对姓氏国籍进行分类”就是一个例子。 +由于单词和句子可以是可变长度的,因此 rnn 或任何序列模型都应该能够处理可变长度的序列。一种可能的技术是人为地将序列限制在一个固定的长度。在本书中,我们使用另一种技术,称为掩蔽,通过利用序列长度的知识来处理可变长度序列。简而言之,屏蔽允许数据在某些输入不应计入梯度或最终输出时发出信号。PyTorch 提供了处理称为打包的序列的可变长度序列的原语,这些序列从这些不太密集的序列中创建密集的张量。“例子:使用字符 RNN 对姓氏国籍进行分类”就是一个例子。 在这两个图中,输出与隐藏向量相同。这并不总是正确的,但是在 Elman RNN 的例子中,隐藏的向量是被预测的。”) ### Implementing an Elman RNN -为了探究 RNN 的细节,让我们逐步了解 Elman RNN 的一个简单实现。PyTorch 提供了许多有用的类和帮助函数来构建 rnn。PyTorch RNN 类实现了 Elman RNN。在本章中,我们没有直接使用 PyTorch 的 RNN 类,而是使用 RNNCell,它是对 RNN 的单个时间步的抽象,并以此构建 RNN。我们这样做的目的是显式地向您展示 RNN 计算。示例 6-1 中显示的类 ElmanRNN 利用了 RNNCell。RNNCell 创建了“递归神经网络导论”中描述的输入隐藏和隐藏权重矩阵。对 RNNCell 的每次调用都接受一个输入向量矩阵和一个隐藏向量矩阵。它返回一个步骤产生的隐藏向量矩阵。 +为了探究 RNN 的细节,让我们逐步了解 Elman RNN 的一个简单实现。PyTorch 提供了许多有用的类和帮助函数来构建 rnn。PyTorch RNN 类实现了 Elman RNN。在本章中,我们没有直接使用 PyTorch 的 RNN 类,而是使用`RNNCell`,它是对 RNN 的单个时间步的抽象,并以此构建 RNN。我们这样做的目的是显式地向您展示 RNN 计算。示例 6-1 中显示的类`ElmanRNN`利用了`RNNCell`。`RNNCell`创建了“循环神经网络导论”中描述的输入隐藏和隐藏权重矩阵。对`RNNCell`的每次调用都接受一个输入向量矩阵和一个隐藏向量矩阵。它返回一个步骤产生的隐藏向量矩阵。 除了控制 RNN 中的输入和隐藏大小超参数外,还有一个布尔参数用于指定批量维度是否位于第 0 维度。这个标志也出现在所有 PyTorch RNNs 实现中。当设为真时,RNN 交换输入张量的第 0 维和第 1 维。 -在 ElmanRNN 中,forward()方法循环遍历输入张量,以计算每个时间步长的隐藏状态向量。注意,有一个用于指定初始隐藏状态的选项,但如果没有提供,则使用所有 0 的默认隐藏状态向量。当 ElmanRNN 循环遍历输入向量的长度时,它计算一个新的隐藏状态。这些隐藏状态被聚合并最终堆积起来。在返回之前,将再次检查 batch_first 标志。如果为真,则输出隐藏向量进行排列,以便批量再次位于第 0 维上。 +在`ElmanRNN`中,`forward()`方法循环遍历输入张量,以计算每个时间步长的隐藏状态向量。注意,有一个用于指定初始隐藏状态的选项,但如果没有提供,则使用所有 0 的默认隐藏状态向量。当`ElmanRNN`循环遍历输入向量的长度时,它计算一个新的隐藏状态。这些隐藏状态被聚合并最终堆积起来。在返回之前,将再次检查`batch_first`标志。如果为真,则输出隐藏向量进行排列,以便批量再次位于第 0 维上。 -ElmanRNN 的输出是一个三维张量——对于批量维度上的每个数据点和每个时间步长,都有一个隐藏状态向量。根据手头的任务,可以以几种不同的方式使用这些隐藏向量。您可以使用它们的一种方法是将每个时间步骤分类为一些离散的选项集。该方法是通过调整 RNN 权值来跟踪每一步预测的相关信息。另外,您可以使用最后一个向量来对整个序列进行分类。这意味着 RNN 权重将被调整以跟踪对最终分类重要的信息。在本章中,我们只看到分类设置,但在接下来的两章中,我们将更深入地讨论逐步预测。 +`ElmanRNN`的输出是一个三维张量——对于批量维度上的每个数据点和每个时间步长,都有一个隐藏状态向量。根据手头的任务,可以以几种不同的方式使用这些隐藏向量。您可以使用它们的一种方法是将每个时间步骤分类为一些离散的选项集。该方法是通过调整 RNN 权值来跟踪每一步预测的相关信息。另外,您可以使用最后一个向量来对整个序列进行分类。这意味着 RNN 权重将被调整以跟踪对最终分类重要的信息。在本章中,我们只看到分类设置,但在接下来的两章中,我们将更深入地讨论逐步预测。 -Example 6-1\. An implementation of the Elman RNN using PyTorch’s RNNCell +Example 6-1\. An implementation of the Elman RNN using PyTorch's RNNCell ```py class ElmanRNN(nn.Module): @@ -107,7 +107,7 @@ class ElmanRNN(nn.Module): ## Example: Classifying Surname Nationality using a Character RNN -现在我们已经概述了 RNNs 的基本属性,并逐步实现了 ElmanRNN,现在让我们将它应用到任务中。我们将考虑的任务是第 4 章中的姓氏分类任务,在该任务中,字符序列(姓氏)被分类到起源的国籍。 +现在我们已经概述了 RNNs 的基本属性,并逐步实现了`ElmanRNN`,现在让我们将它应用到任务中。我们将考虑的任务是第 4 章中的姓氏分类任务,在该任务中,字符序列(姓氏)被分类到起源的国籍。 ### The Surnames Dataset @@ -159,9 +159,9 @@ class SurnameDataset(Dataset): ### The Vectorization Data Structures -向量化管道的第一阶段是将姓氏中的每个字符标记映射到唯一的整数。为了实现这一点,我们使用了 SequenceVocabulary 数据结构,这是我们在“示例:使用预先训练的嵌入进行文档分类的传输学习”中首次介绍和描述的。回想一下,这个数据结构不仅将 tweet 中的单词映射到整数,而且还使用了四个特殊用途的标记:UNK 标记、MASK 标记、BEGIN-SEQUENCE 标记和 END-SEQUENCE 标记。前两个标记对语言数据至关重要:UNK 标记用于输入中看不到的词汇表外标记,而 MASK 标记允许处理可变长度的输入。第二个标记为模型提供了句子边界特征,并分别作为前缀和追加到序列中。我们请您参阅“示例:使用预先训练的嵌入来进行文档分类的迁移学习”,以获得关于序列表的更长的描述。 +向量化管道的第一阶段是将姓氏中的每个字符标记映射到唯一的整数。为了实现这一点,我们使用了`SequenceVocabulary`数据结构,这是我们在“示例:使用预先训练的嵌入进行文档分类的传输学习”中首次介绍和描述的。回想一下,这个数据结构不仅将推文中的单词映射到整数,而且还使用了四个特殊用途的标记:`UNK`标记、`MASK`标记、`BEGIN-SEQUENCE`标记和`END-SEQUENCE`标记。前两个标记对语言数据至关重要:`UNK`标记用于输入中看不到的词汇表外标记,而`MASK`标记允许处理可变长度的输入。第二个标记为模型提供了句子边界特征,并分别作为前缀和追加到序列中。我们请您参阅“示例:使用预先训练的嵌入来进行文档分类的迁移学习”,以获得关于序列表的更长的描述。 -整个向量化过程由 SurnameVectorizer 管理,它使用序列 evocabulary 来管理姓氏字符和整数之间的映射。示例 6-3 展示了它的实现,看起来应该非常熟悉。在“示例:使用预训练嵌入进行文档分类的迁移学习”中,我们研究了如何将新闻文章的标题分类到特定的类别中,而向量化管道几乎是相同的。 +整个向量化过程由`SurnameVectorizer`管理,它使用序列`evocabulary`来管理姓氏字符和整数之间的映射。示例 6-3 展示了它的实现,看起来应该非常熟悉。在“示例:使用预训练嵌入进行文档分类的迁移学习”中,我们研究了如何将新闻文章的标题分类到特定的类别中,而向量化管道几乎是相同的。 Example 6-3\. A vectorizer for surnames @@ -211,7 +211,7 @@ class SurnameVectorizer(object): ### The SurnameClassifier Model -SurnameClassifier 模型由嵌入层、ElmanRNN 和线性层组成。我们假设模型的输入是在它们被 SequenceVocabulary 映射到整数之后作为一组整数表示的标记。模型首先使用嵌入层嵌入整数。然后,利用 RNN 计算序列表示向量。这些向量表示姓氏中每个字符的隐藏状态。由于目标是对每个姓氏进行分类,因此提取每个姓氏中最终字符位置对应的向量。考虑这个向量的一种方法是,最后的向量是传递整个序列输入的结果,因此是姓氏的汇总向量。这些汇总向量通过线性层来计算预测向量。预测向量用于训练损失,或者我们可以应用 softmax 函数来创建姓氏的概率分布 +`SurnameClassifier`模型由嵌入层、`ElmanRNN`和线性层组成。我们假设模型的输入是在它们被`SequenceVocabulary`映射到整数之后作为一组整数表示的标记。模型首先使用嵌入层嵌入整数。然后,利用 RNN 计算序列表示向量。这些向量表示姓氏中每个字符的隐藏状态。由于目标是对每个姓氏进行分类,因此提取每个姓氏中最终字符位置对应的向量。考虑这个向量的一种方法是,最后的向量是传递整个序列输入的结果,因此是姓氏的汇总向量。这些汇总向量通过线性层来计算预测向量。预测向量用于训练损失,或者我们可以应用 softmax 函数来创建姓氏的概率分布 模型的参数是:嵌入的大小,嵌入的数量(即类的数量,以及 RNN 的隐藏状态大小。其中两个参数——嵌入的数量和类的数量——由数据决定。其余的超参数是嵌入的大小和隐藏状态的大小。尽管这些模型可以具有任何价值,但通常最好从一些小的、可以快速训练以验证模型是否有效的东西开始。 @@ -280,7 +280,7 @@ class SurnameClassifier(nn.Module): ``` -您将注意到,正向函数需要序列的长度。长度用于检索从 RNN 返回的带有名为 column_gather 函数的张量中每个序列的最终向量,如示例 6-5 所示。该函数迭代批量行索引,并检索位于序列相应长度所指示位置的向量。 Example 6-5\. Retrieving the final vector in each sequence using column_gather +您将注意到,正向函数需要序列的长度。长度用于检索从 RNN 返回的带有名为`column_gather`函数的张量中每个序列的最终向量,如示例 6-5 所示。该函数迭代批量行索引,并检索位于序列相应长度所指示位置的向量。 Example 6-5\. Retrieving the final vector in each sequence using column_gather ```py def column_gather(y_out, x_lengths): @@ -308,7 +308,7 @@ def column_gather(y_out, x_lengths): ### The Training Routine and Results -训练程序遵循标准公式。对于单个批数据,应用模型并计算预测向量。利用横熵损失和地面真值来计算损失值。使用损失值和优化器,计算梯度并使用这些梯度更新模型的权重。对训练数据中的每批重复此操作。对验证数据进行类似的处理,但是将模型设置为 eval()模式,以防止在验证数据上反向传播。相反,验证数据仅用于对模型的执行情况给出不那么偏颇的感觉。这个例程在特定的时期重复执行。代码见补充资料我们鼓励您使用超参数来了解影响性能的因素以及影响程度,并将结果制成表格。我们还将为该任务编写合适的基线模型作为练习,让您完成。在“SurnameClassifier 模型”中实现的模型是通用的,并不局限于字符。模型中的嵌入层可以映射出离散项序列中的任意离散项;例如,一个句子是一系列的单词。我们鼓励您在其他序列分类任务(如句子分类)中使用示例 6-6 中的代码。 Example 6-6\. Arguments to the RNN-based Surname Classifier +训练程序遵循标准公式。对于单个批数据,应用模型并计算预测向量。利用横熵损失和地面真值来计算损失值。使用损失值和优化器,计算梯度并使用这些梯度更新模型的权重。对训练数据中的每批重复此操作。对验证数据进行类似的处理,但是将模型设置为`eval()`模式,以防止在验证数据上反向传播。相反,验证数据仅用于对模型的执行情况给出不那么偏颇的感觉。这个例程在特定的时期重复执行。代码见补充资料我们鼓励您使用超参数来了解影响性能的因素以及影响程度,并将结果制成表格。我们还将为该任务编写合适的基线模型作为练习,让您完成。在“`SurnameClassifier`模型”中实现的模型是通用的,并不局限于字符。模型中的嵌入层可以映射出离散项序列中的任意离散项;例如,一个句子是一系列的单词。我们鼓励您在其他序列分类任务(如句子分类)中使用示例 6-6 中的代码。 Example 6-6\. Arguments to the RNN-based Surname Classifier ```py args = Namespace( @@ -333,4 +333,4 @@ args = Namespace( ## 总结 -在本章中,您学习了用于对序列数据建模的递归神经网络,以及最简单的一种递归网络,即 Elman RNNs。我们确定序列建模的目标是学习序列的表示(即向量)。根据任务的不同,可以以不同的方式使用这种学习过的表示。我们考虑了一个示例任务,涉及到将这种隐藏状态表示分类到许多类中的一个。姓氏分类任务展示了一个使用 RNNs 在子词级别捕获信息的示例。 \ No newline at end of file +在本章中,您学习了用于对序列数据建模的循环神经网络,以及最简单的一种循环网络,即 Elman RNNs。我们确定序列建模的目标是学习序列的表示(即向量)。根据任务的不同,可以以不同的方式使用这种学习过的表示。我们考虑了一个示例任务,涉及到将这种隐藏状态表示分类到许多类中的一个。姓氏分类任务展示了一个使用 RNNs 在子词级别捕获信息的示例。 \ No newline at end of file diff --git a/docs/7.md b/docs/7.md index 3621361..0e8b60c 100644 --- a/docs/7.md +++ b/docs/7.md @@ -14,7 +14,7 @@ 本章的目标是序列预测。序列预测任务要求我们对序列中的每一项进行标记。这类任务在自然语言处理(NLP)中很常见。一些例子包括语言建模(参见图 7-1),在语言建模中,我们在每个步骤中给定单词序列预测下一个单词;词性标注的一部分,对每个词的语法词性进行预测;命名实体识别,我们预测每个词是否属于一个命名实体,如人、位置、产品、组织;等等。有时,在 NLP 文献中,序列预测任务也被称为序列标记。 -虽然理论上我们可以使用第六章中介绍的 Elman 递归神经网络(RNNs)进行序列预测任务,但是在实际应用中,它们并不能很好地捕捉到长期的依赖关系,并且表现不佳。在本章中,我们将花一些时间来理解为什么会这样,并学习一种新的 RNN 架构,称为门控网络。 +虽然理论上我们可以使用第六章中介绍的 Elman 循环神经网络(RNNs)进行序列预测任务,但是在实际应用中,它们并不能很好地捕捉到长期的依赖关系,并且表现不佳。在本章中,我们将花一些时间来理解为什么会这样,并学习一种新的 RNN 架构,称为门控网络。 我们还介绍了自然语言生成作为序列预测应用的任务,并探讨了输出序列在某种程度上受到约束的条件生成。 diff --git a/docs/8.md b/docs/8.md index 2b05c79..cfae031 100644 --- a/docs/8.md +++ b/docs/8.md @@ -22,7 +22,7 @@ 在这一章中,我们深入研究了 S2S 模型,并在机器翻译任务的背景下进行了说明。考虑一个“智能”的 iOS/Android 键盘,它可以在你打字时自动将文本转换成表情符号。如果你输入“omg!”房子着火了!,你希望键盘输出类似内联输出的内容。注意,输出的长度(4 个标记)与输入的长度(6 个标记)不同。输出和输入之间的映射称为对齐,如图 8-3 所示。 ![example2](img/b7d81537e2e606730712b8dcdc5eb05f.jpg) 同样,在本例中,输入中的单个标记可以在输出中生成零个或多个标记。传统上,许多解决 S2S 问题的方法都是尝试使用工程和启发式重统计方法。虽然回顾这些方法超出了本章和本书的范围,但是我们建议您阅读 Koehn(2009)并参考 statmt.org 中的参考资料。 -在第 6 章中,我们学习了序列模型如何将任意长度的序列编码成向量。在第 7 章中,我们看到单个向量如何使递归神经网络(RNN)有条件地产生不同的姓氏。S2S 模型是这些概念的自然延伸。 +在第 6 章中,我们学习了序列模型如何将任意长度的序列编码成向量。在第 7 章中,我们看到单个向量如何使循环神经网络(RNN)有条件地产生不同的姓氏。S2S 模型是这些概念的自然延伸。 图 8 - 4 显示了编码器整个输入一个表示“编码”,ϕ,条件解码器生成正确的输出。您可以使用任何 RNN 作为编码器,无论是 Elman RNN, Long - term Memory (LSTM),还是 gate Unit (GRU),。在接下来的两个部分中,我们将介绍现代 S2S 模型的两个重要组件。首先,我们引入了双向递归模型,该模型将向前和向后传递组合在一个序列上,以创建更丰富的表示。然后,在“从序列中获取更多信息:注意力”中,我们介绍并考察了注意力机制,它在关注与任务相关的输入的不同部分时非常有用。这两个部分对于构建基于 S2S 模型的解决方案都非常重要。