提交 f33c7079 编写于 作者: W wizardforcel

2021-01-24 18:36:56

上级 7d97a2be
......@@ -39,7 +39,7 @@
# 比较人类神经元和人工神经元
尽管人类神经元一直是创建人工神经网络的灵感,但它们在多种方式上却有所不同。 研究人员正在尝试通过尝试不同的激活(激励)功能和非线性系统来弥合这些差距。 与我们的大脑具有收集和传输从我们的感官接收到的信息的神经元的方式类似,神经网络也由多层(一组神经元)组成,这些层通过跨层传输信息来学习任务。 在某些情况下,我们可以说人造神经元的工作方式类似于大脑中存在的神经元。 让我们看下图:
尽管人类神经元一直是创建人工神经网络的灵感,但它们在多种方式上却有所不同。 研究人员正在尝试通过尝试不同的激活(激励)函数和非线性系统来弥合这些差距。 与我们的大脑具有收集和传输从我们的感官接收到的信息的神经元的方式类似,神经网络也由多层(一组神经元)组成,这些层通过跨层传输信息来学习任务。 在某些情况下,我们可以说人造神经元的工作方式类似于大脑中存在的神经元。 让我们看下图:
![](img/571d3436-3f5f-46aa-9057-efe3e52dd3c8.png)
......@@ -203,7 +203,7 @@ print (y)
[2 1 2 1 2 0 1 0 0 0 2 1 1 0 0 0 2 2 1 2 1 0 0 1 2 0 0 2 0 0]
```
4. 为了理解我们的功能,我们将尝试以散点图的形式将它们绘制在 3D 中:
4. 为了理解我们的特征,我们将尝试以散点图的形式将它们绘制在 3D 中:
```py
from mpl_toolkits.mplot3d import Axes3D
......
......@@ -55,11 +55,11 @@
![](img/2ea3be34-ced7-4c60-a302-98d1f0c35e3e.jpeg)
因此,例如,如果我们查看花朵与汽车等类别,则初始层的功能就足够了。 但是,如果我们有诸如汽车类型之类的类别,则需要更深层次的模型,因为我们需要提取更复杂的特征,这需要更大的数据集。 问题是,什么决定了模型学习的特征或参数的类型,是否有可能在初始层学习这些重要参数? 在下一部分中,我们将探索连体网络,它是一种神经网络架构,可以通过更改损失函数及其架构设计来学习前几层的复杂功能
因此,例如,如果我们查看花朵与汽车等类别,则初始层的特征就足够了。 但是,如果我们有诸如汽车类型之类的类别,则需要更深层次的模型,因为我们需要提取更复杂的特征,这需要更大的数据集。 问题是,什么决定了模型学习的特征或参数的类型,是否有可能在初始层学习这些重要参数? 在下一部分中,我们将探索连体网络,它是一种神经网络架构,可以通过更改损失函数及其架构设计来学习前几层的复杂特征
# 了解连体网络
顾名思义,连体网络是一种具有两个并行层的架构。 在此架构中,模型学会了在两个给定的输入之间进行区分,而不是学习使用分类损失函数对其输入进行分类的模型。 它根据相似性度量比较两个输入,并检查它们是否相同。 与任何深度学习架构相似,连体网络也有两个阶段-训练和测试阶段。 但是,对于一次学习方法(因为我们没有很多数据点),我们将在一个数据集上训练模型架构,并在另一个数据集上对其进行测试。 为了简单起见,我们使用带监督的基于度量的方法使用连体神经网络来学习图像嵌入,然后将该网络的功能重新用于一次学习,而无需进行微调或重新训练。
顾名思义,连体网络是一种具有两个并行层的架构。 在此架构中,模型学会了在两个给定的输入之间进行区分,而不是学习使用分类损失函数对其输入进行分类的模型。 它根据相似性度量比较两个输入,并检查它们是否相同。 与任何深度学习架构相似,连体网络也有两个阶段-训练和测试阶段。 但是,对于一次学习方法(因为我们没有很多数据点),我们将在一个数据集上训练模型架构,并在另一个数据集上对其进行测试。 为了简单起见,我们使用带监督的基于度量的方法使用连体神经网络来学习图像嵌入,然后将该网络的特征重新用于一次学习,而无需进行微调或重新训练。
机器学习算法的良好特征的提取在确定模型效率方面起着至关重要的作用。 在各种情况下,当可用数据有限时,事实证明它要么计算量大,要么困难。
......@@ -67,7 +67,7 @@
![](img/0d94a582-9d00-4f5b-a28f-7e4df967ea31.png)
关键思想听起来可能类似于转学,但有所不同。 连体网络使用对比损失函数来学习这些功能。 其次,连体网络方法仅适用于相似的域,因为它还需要注意域的适应性,也就是说,它需要尝试确保我们的训练和测试数据集在域方面是紧密的。 例如,如果您要创建一个系统来测试两个手写示例是否属于同一个人,则可以在 MNIST 数据集上训练一个连体网络架构,通过该架构,可以学习特定于手写体的特征(例如曲线) 和给定字符的笔划。 在下一节中,我们将研究连体网络的架构并了解其优化。
关键思想听起来可能类似于转学,但有所不同。 连体网络使用对比损失函数来学习这些特征。 其次,连体网络方法仅适用于相似的域,因为它还需要注意域的适应性,也就是说,它需要尝试确保我们的训练和测试数据集在域方面是紧密的。 例如,如果您要创建一个系统来测试两个手写示例是否属于同一个人,则可以在 MNIST 数据集上训练一个连体网络架构,通过该架构,可以学习特定于手写体的特征(例如曲线) 和给定字符的笔划。 在下一节中,我们将研究连体网络的架构并了解其优化。
# 构建
......
......@@ -282,7 +282,7 @@ class Controller(nn.Module):
![](img/3a4d2e1c-a7df-4316-b1cd-5a67640f0bdf.png)
`address()`函数执行存储器寻址,它由四个功能组成:
`address()`函数执行存储器寻址,它由四个函数组成:
* `similarity`
* `interpolate`
......@@ -718,7 +718,7 @@ class WriteHead(Memory):
# 总结
在本章中,我们探索了用于单次学习的不同形式的基于模型的架构。 我们观察到的最常见的事情是使用外部存储器,这对学习神经网络不同阶段的表示形式有什么帮助。 NMT 方法在一次学习任务中表现良好,但是由于手工设计的内存寻址功能,它们的能力仍然有限,因为它们必须具有差异性。 探索更复杂的功能来处理内存可能很有趣。 在元网络中,我们看到了如何定义一个新网络以实现对原始网络的快速学习,以及如何在元学习器级别上存储有关表示的信息如何在基础级别上微调参数。 尽管基于模型的架构是实现一次学习的好方法,但它们具有外部存储器的先决条件,因此与其他方法相比,实现基于模型的架构的成本昂贵。
在本章中,我们探索了用于单次学习的不同形式的基于模型的架构。 我们观察到的最常见的事情是使用外部存储器,这对学习神经网络不同阶段的表示形式有什么帮助。 NMT 方法在一次学习任务中表现良好,但是由于手工设计的内存寻址函数,它们的能力仍然有限,因为它们必须具有差异性。 探索更复杂的函数来处理内存可能很有趣。 在元网络中,我们看到了如何定义一个新网络以实现对原始网络的快速学习,以及如何在元学习器级别上存储有关表示的信息如何在基础级别上微调参数。 尽管基于模型的架构是实现一次学习的好方法,但它们具有外部存储器的先决条件,因此与其他方法相比,实现基于模型的架构的成本昂贵。
在下一章中,我们将介绍基于优化的方法,例如与模型无关的元学习和 LSTM 元学习。 内存为我们提供了一种方式来存储我们所学到的信息,因此优化策略使我们能够更快地学习事物。 在后面的章节中,我们将探索一些不同形式的优化策略,这些策略可以用来学习目标。
......
# 基于生成建模的方法
当人们对看不见的数据进行推断时,他们会利用有关他们已经看到,听到,触摸或经历过的相关事件的强大先验知识(或归纳偏见)。 例如,与狗一起长大的婴儿可能第一次见到猫,并立即推断出它与家犬的宠物般的性情相似。 当然,猫和狗作为物种和个体是千差万别的。 但是,公平地说,猫比狗更像狗,而不是孩子经历的其他随机事物(例如食物)。 与机器学习模型相反,人类不需要成千上万的猫实例就可以从头开始学习,只要他们已经学会了识别狗就可以识别猫。 人脑具有*元学习*的固有能力,这与机器学习语言中的**迁移学习****多任务学习**有关。 此功能通过利用从相关任务中学到的知识来加速新概念的学习。
当人们对看不见的数据进行推断时,他们会利用有关他们已经看到,听到,触摸或经历过的相关事件的强大先验知识(或归纳偏见)。 例如,与狗一起长大的婴儿可能第一次见到猫,并立即推断出它与家犬的宠物般的性情相似。 当然,猫和狗作为物种和个体是千差万别的。 但是,公平地说,猫比狗更像狗,而不是孩子经历的其他随机事物(例如食物)。 与机器学习模型相反,人类不需要成千上万的猫实例就可以从头开始学习,只要他们已经学会了识别狗就可以识别猫。 人脑具有*元学习*的固有能力,这与机器学习语言中的**迁移学习****多任务学习**有关。 此能力通过利用从相关任务中学到的知识来加速新概念的学习。
生成模型是概率模型,旨在弥合人类学习与机器学习之间的鸿沟。 这些模型旨在从对象的各个部分学习高级抽象特征,并将这些学习的特征应用于新的但相似的对象类别。 在本章中,我们将研究如何生成这些生成模型,拥有先验知识意味着什么,如何用数学术语构筑先验知识,如何从一些对象中学习高级概念(模型的参数学习) ),以及如何将这些新学到的知识与先验知识相结合,以对新对象做出有意义的决策(推断)。
......@@ -76,7 +76,7 @@
首先,人们倾向于仅从一个或几个示例中学习关于对象的有意义的信息,例如对象边界,并对其进行高精度分类(请参见上图中的`i)`部分)。 另一方面,深度学习模型需要大量带标签的数据才能在诸如对象识别之类的任务上达到人类水平的表现。
其次,人类从一个示例中学习了绝大多数功能,例如,创建新字符(参见上图中的`ii)`部分),将对象/字符分解为各个部分和关系(请参见`iii)`部分),并根据有关现有概念的现有知识开发新的,有意义的概念/字符(请参见上图中的`iv)`部分)。 相反,深度学习模型针对每个任务都需要特殊的损失函数和架构,由于该任务可用的标记数据非常有限,因此通常不切实际。
其次,人类从一个示例中学习了绝大多数能力,例如,创建新字符(参见上图中的`ii)`部分),将对象/字符分解为各个部分和关系(请参见`iii)`部分),并根据有关现有概念的现有知识开发新的,有意义的概念/字符(请参见上图中的`iv)`部分)。 相反,深度学习模型针对每个任务都需要特殊的损失函数和架构,由于该任务可用的标记数据非常有限,因此通常不切实际。
*人们如何仅从一个示例中学习对对象和概念的如此丰富,强大的表示?*
......@@ -120,7 +120,7 @@
# 图像生成
使用随机渲染功能生成原始二进制字符图像`I[m]`,该函数将笔划轨迹与灰度墨水映射。 这是通过为每个像素分配独立的伯努利概率来实现的。
使用随机渲染函数生成原始二进制字符图像`I[m]`,该函数将笔划轨迹与灰度墨水映射。 这是通过为每个像素分配独立的伯努利概率来实现的。
BPL 是一种高度直观的模型,可以在贝叶斯框架下使用简单的程序为概念建模。 从训练数据中学习概率分布的参数。 在分类和生成的单次计算机视觉任务上,该模型的表现与人类水平的表现相当,其数据需求远低于某些最新的深度学习模型。 这里研究的概率程序非常基础,适合于相当容易的字符识别任务。 BPL 框架支持设计更复杂的程序,这些程序可以对各种对象的复杂表示进行建模。 例如,可以使用此框架对在零件和关系方面具有清晰直观描述的对象(例如车辆,食品,动物,甚至人脸)进行建模。 为此,BPL 框架甚至支持建模抽象知识,例如自然语言语义和物理理论。 然而,这些概率程序需要对数据及其部分,子部分和关系进行手动标记,这是一个耗时的过程,而深度学习方法则是自己学习这些人类直观特征和深层抽象特征。
......@@ -128,7 +128,7 @@ BPL 是一种高度直观的模型,可以在贝叶斯框架下使用简单的
K 次学习的一种非常常见的方法是训练具有相关任务的大型模型,而我们为此拥有大型数据集。 然后,通过 K 次特定任务对该模型进行微调。 因此,来自大型数据集的知识被*提炼为*到模型中,这仅从几个示例中增加了对新相关任务的学习。 2003 年,Bakker 和 Heskes 提出了一种用于 K 次学习的概率模型,其中所有任务共享一个公共特征提取器,但具有各自的线性分类器,其中仅包含几个特定于任务的参数。
这里讨论的 K 次学习的概率方法与 Bakker 和 Heskes 引入的方法非常相似。 该方法通过从很少的数据中学习概率模型来解决分类任务(针对图像)。 这个想法是使用一个强大的神经网络,该网络从大量监督数据中学习可靠的功能,并将其与概率模型结合起来。 神经网络最后一层的权重充当以贝叶斯方式规范化 K 次子模型权重的数据。
这里讨论的 K 次学习的概率方法与 Bakker 和 Heskes 引入的方法非常相似。 该方法通过从很少的数据中学习概率模型来解决分类任务(针对图像)。 这个想法是使用一个强大的神经网络,该网络从大量监督数据中学习可靠的特征,并将其与概率模型结合起来。 神经网络最后一层的权重充当以贝叶斯方式规范化 K 次子模型权重的数据。
学习框架包括四个阶段:
......
......@@ -14,7 +14,7 @@
基于度量的学习是进行单次学习的较旧方法之一。 尽管该区域较旧,但仍在探索许多方面。 一个很好的例子是关于[《为短时学习重新研究基于局部描述符的图像到类度量》](https://arxiv.org/abs/1903.12290)主题的研究工作。 在本文中,作者提出了一种卷积神经网络架构,称为 **D4N****深度最近邻神经网络**),该架构可提取图像级特征。 它与其他神经网络架构的主要区别是用基于局部描述符的图像到类度量替代了最后一层。
[《通过类别遍历查找与几次任务学习相关的任务相关特征》](https://arxiv.org/abs/1905.11116)也为改进度量学习方法做出了贡献,方法是引入一个插件框架。 在本文中,作者讨论了众所周知的度量学习方法(例如连体网络和匹配网络)如何一次只关注一个任务,而不是整个学习所有任务。 **类别遍历模块****CTM**)插件组件通过完成所有支持任务来学习重要的尺寸特征。 CTM 在集中器和投影仪单元的帮助下,为相似类别提取通用特征嵌入,并在不同类别中提取唯一特征。 使用 CTM 的输出,我们可以在元学习器之前添加一个强大的功能,这可以使我们更快更好地进行优化。 通过使用此框架,他们显示了基于度量的学习方法的显着改进。
[《通过类别遍历查找与几次任务学习相关的任务相关特征》](https://arxiv.org/abs/1905.11116)也为改进度量学习方法做出了贡献,方法是引入一个插件框架。 在本文中,作者讨论了众所周知的度量学习方法(例如连体网络和匹配网络)如何一次只关注一个任务,而不是整个学习所有任务。 **类别遍历模块****CTM**)插件组件通过完成所有支持任务来学习重要的尺寸特征。 CTM 在集中器和投影仪单元的帮助下,为相似类别提取通用特征嵌入,并在不同类别中提取唯一特征。 使用 CTM 的输出,我们可以在元学习器之前添加一个强大的先验,这可以使我们更快更好地进行优化。 通过使用此框架,他们显示了基于度量的学习方法的显着改进。
在对象检测和语义分割领域也有一些显着贡献。 让我们讨论其中的两种方法。
......@@ -28,7 +28,7 @@
研究工作[《CANet:具有迭代细化和专注的小样本学习的类不可知分割网络》](https://arxiv.org/abs/1903.02351)证明了医学影像行业的潜在增长。 在本文中,作者提出了一个用于语义分割的两级框架:**密集比较模块****DCM**)和**迭代优化模块****IOM**)。 DCM 通过使用通用的 ResNet 架构提取特征,在训练集示例和测试集示例之间进行了密集的特征比较,而 IOM 通过残差块加 CNN 和**粗糙的空间金字塔池****ASPP**)模块。
同样, [《PANet:具有原型对齐功能的几次语义分割》](https://arxiv.org/abs/1908.06391)通过以下方式解决了少数镜头分割问题: 度量学习方法。 本文还提出了一种对齐网络,以更好地利用从支持集中提取的信息。 在 PANet 中,最初,网络从特定嵌入空间内的一些支持图像中学习特定于类别的表示,然后通过将每个像素与学习到的特定于类别的表示进行匹配,对查询/目标图像执行分割。 通过使用这种方法,PANet 可以利用支持集中的重要见解,并在几次分割的情况下提供更可靠的概括。
同样, [《PANet:具有原型对齐的几次语义分割》](https://arxiv.org/abs/1908.06391)通过以下方式解决了少数镜头分割问题: 度量学习方法。 本文还提出了一种对齐网络,以更好地利用从支持集中提取的信息。 在 PANet 中,最初,网络从特定嵌入空间内的一些支持图像中学习特定于类别的表示,然后通过将每个像素与学习到的特定于类别的表示进行匹配,对查询/目标图像执行分割。 通过使用这种方法,PANet 可以利用支持集中的重要见解,并在几次分割的情况下提供更可靠的概括。
如我们所见,这些解决方案适用于数据有限的情况。 我们如何量化有限的和足够的? 我们需要查看我们希望训练的模型架构的能力以及希望解决的问题的复杂性。 类似于一次学习,多年来研究人员提出了其他一些方法,也旨在解决数据有限的问题。 在下一节中,我们将学习机器学习的这些领域,以及它们与单次学习相比的效率。
......@@ -63,7 +63,7 @@
# 元学习
元学习最近在研究界引起了很多关注。 本书中讨论的大多数方法都是元学习型方法,例如与模型无关的元学习和元网络。 元学习是一种在不同任务上训练模型,然后针对特定任务使用通常学习的功能的方法。 它帮助模型在许多任务上学习先验,从而帮助模型在有限的数据下达到优化。 用简单的话来说,元学习是一种训练模型以*元学习*任何目标的方法。
元学习最近在研究界引起了很多关注。 本书中讨论的大多数方法都是元学习型方法,例如与模型无关的元学习和元网络。 元学习是一种在不同任务上训练模型,然后针对特定任务使用通常学到的特征的方法。 它帮助模型在许多任务上学习先验,从而帮助模型在有限的数据下达到优化。 用简单的话来说,元学习是一种训练模型以*元学习*任何目标的方法。
# 迁移学习
......@@ -85,8 +85,8 @@
* [《元学习实践》](https://www.packtpub.com/big-data-and-business-intelligence/hands-meta-learning-python)
* [《为小样本学习重新研究基于局部描述符的图像到类度量》](https://arxiv.org/pdf/1903.12290.pdf)
* [《通过类别遍历查找与几项学习相关的任务相关功能](https://arxiv.org/pdf/1905.11116.pdf)
* [《通过类别遍历查找与几项学习相关的任务相关特征](https://arxiv.org/pdf/1905.11116.pdf)
* [《RepMet:基于代表的度量学习,用于分类和几次检测》](https://arxiv.org/abs/1806.04728)
* [《具有共同注意和共同激励的一次对象检测》](https://arxiv.org/pdf/1911.12529.pdf)
* [《CANet:具有迭代细化和专心的几次次学习的类不可知分割网络》](https://arxiv.org/pdf/1903.02351.pdf)
* [《PANet:具有原型对齐功能的几次图像语义分割》](https://arxiv.org/pdf/1908.06391.pdf)
\ No newline at end of file
* [《PANet:具有原型对齐的几次图像语义分割》](https://arxiv.org/pdf/1908.06391.pdf)
\ No newline at end of file
......@@ -42,17 +42,17 @@
给定很多`(X, y)`,请学习`F(X) = y`
您电话号码的输入可以包含任意数量的功能。 我们的简单房价模型仅包含一个功能(**大小**),但我们可能希望添加更多功能以提供更好的预测(例如,卧室数量,花园大小等) 上)。 因此,更具体地说,我们的监督模型学习了一个函数,以便将许多输入映射到输出。 由以下等式给出:
您电话号码的输入可以包含任意数量的特征。 我们的简单房价模型仅包含一个特征(**大小**),但我们可能希望添加更多特征以提供更好的预测(例如,卧室数量,花园大小等) 上)。 因此,更具体地说,我们的监督模型学习了一个函数,以便将许多输入映射到输出。 由以下等式给出:
给定许多`([X0, X1, X2, …, Xn], y)`,学习`f(X0, X1, X2, …, Xn) = y`
在前面的示例中,我们学习的功能如下:
在前面的示例中,我们学习的函数如下:
![](img/Formula_01_001.jpg)
这里,`θ[0]``x`轴截距,``θ[1]``是直线的斜率。
模型可以包含数百万甚至数十亿个输入功能的(尽管当功能空间太大时,您可能会遇到硬件限制)。 模型的输入类型也可能有所不同,模型可以从图像中学习:
模型可以包含数百万甚至数十亿个输入特征的(尽管当特征空间太大时,您可能会遇到硬件限制)。 模型的输入类型也可能有所不同,模型可以从图像中学习:
![Figure 1.4 – Model training ](img/B12365_01_4.jpg)
......@@ -108,7 +108,7 @@
图 1.7 –欠拟合和过拟合的示例
当我们的模型由于缺乏功能,数据不足或模型规格不足而无法很好地拟合数据时,我们将其称为,**欠拟合**。 我们注意到我们数据的梯度越来越大,并怀疑如果使用多项式,则模型可能更合适。 例如`y = θ[0] + θ[1] x + θ[2] x^2`。 稍后我们将看到,由于神经网络的复杂结构,欠拟合很少成为问题:
当我们的模型由于缺乏特征,数据不足或模型规格不足而无法很好地拟合数据时,我们将其称为,**欠拟合**。 我们注意到我们数据的梯度越来越大,并怀疑如果使用多项式,则模型可能更合适。 例如`y = θ[0] + θ[1] x + θ[2] x^2`。 稍后我们将看到,由于神经网络的复杂结构,欠拟合很少成为问题:
考虑以下示例。 在这里,我们使用房价模型拟合的函数不仅适用于房屋的大小(`X`),而且适用于二阶和三阶多项式`(X2, X3)`。 在这里,我们可以看到我们的新模型非常适合我们的数据点。 但是,这不一定会产生良好的模型:
......@@ -142,7 +142,7 @@
# 神经网络
在前面的示例中,我们主要讨论了`y = θ[0] + θ[1] x`形式的回归。 我们接触过使用多项式来拟合更复杂的方程式,例如`y = θ[0] + θ[1] x + θ[2] x`。 但是,随着我们向模型中添加更多功能,何时使用原始功能的转换成为反复试验的案例。 使用**神经网络**,我们可以将更复杂的函数`y = f(x)`拟合到我们的数据中,而无需设计或转换我们现有的功能
在前面的示例中,我们主要讨论了`y = θ[0] + θ[1] x`形式的回归。 我们接触过使用多项式来拟合更复杂的方程式,例如`y = θ[0] + θ[1] x + θ[2] x`。 但是,随着我们向模型中添加更多特征,何时使用原始特征的转换成为反复试验的案例。 使用**神经网络**,我们可以将更复杂的函数`y = f(x)`拟合到我们的数据中,而无需设计或转换我们现有的特征
## 神经网络的结构
......@@ -152,7 +152,7 @@
图 1.10 –一层神经网络
在这里,我们将每个功能`X[i]`作为输入,在此通过**节点**进行说明。 我们希望学习参数`θ[i]`,在此图中将其表示为**连接**。 我们对`X[i]``θ[i]`之间所有乘积的最终总和为我们提供了最终预测`y`
在这里,我们将每个特征`X[i]`作为输入,在此通过**节点**进行说明。 我们希望学习参数`θ[i]`,在此图中将其表示为**连接**。 我们对`X[i]``θ[i]`之间所有乘积的最终总和为我们提供了最终预测`y`
![](img/Formula_01_026.png)
......@@ -162,9 +162,9 @@
图 1.11 –全连接网络
每个输入节点都连接到另一层中的每个节点。 这被称为**全连接层**。 然后,将来自的全连接层的输出乘以其自身的附加权重,以便预测`y`。 因此,我们的预测不再只是`X[i]θ[i]`的函数,而是现在包括针对每个参数的多个学习权重。 功能`X[1]`不再仅受`θ[1]`影响。 现在,它也受到`θ[1,1], θ[2,1], θ[2,2], θ[2,3]`的影响。 参数。
每个输入节点都连接到另一层中的每个节点。 这被称为**全连接层**。 然后,将来自的全连接层的输出乘以其自身的附加权重,以便预测`y`。 因此,我们的预测不再只是`X[i]θ[i]`的函数,而是现在包括针对每个参数的多个学习权重。 特征`X[1]`不再仅受`θ[1]`影响。 现在,它也受到`θ[1,1], θ[2,1], θ[2,2], θ[2,3]`的影响。 参数。
由于全连接层中的每个节点都将`X`的所有值作为输入,因此神经网络能够学习输入特征之间的交互特征。 多个全连接层可以链接在一起,以学习更复杂的功能。 在本书中,我们将看到我们构建的所有神经网络都将使用该概念。 将不同品种的多层链接在一起,以构建更复杂的模型。 但是,在我们完全理解神经网络之前,还有另外一个关键要素要涵盖:激活函数。
由于全连接层中的每个节点都将`X`的所有值作为输入,因此神经网络能够学习输入特征之间的交互特征。 多个全连接层可以链接在一起,以学习更复杂的特征。 在本书中,我们将看到我们构建的所有神经网络都将使用该概念。 将不同品种的多层链接在一起,以构建更复杂的模型。 但是,在我们完全理解神经网络之前,还有另外一个关键要素要涵盖:激活函数。
## 激活函数
......@@ -199,7 +199,7 @@ ReLU 是非常简单的非线性函数,当`x <= 0`,返回`y = 0`;当`x > 0
## 神经网络中的过拟合
我们看到,在回归的情况下,可以添加太多功能,从而有可能使网络过拟合。 这样一来,模型可以很好地拟合训练数据,但不能很好地推广到看不见的测试数据集。 这是神经网络中的一个普遍问题,因为模型复杂性的提高意味着通常有可能将函数拟合到不一定要泛化的数据训练集中。 以下是数据集每次向前和反向传播(称为历元)后训练和测试数据集上的总损失的图:
我们看到,在回归的情况下,可以添加太多特征,从而有可能使网络过拟合。 这样一来,模型可以很好地拟合训练数据,但不能很好地推广到看不见的测试数据集。 这是神经网络中的一个普遍问题,因为模型复杂性的提高意味着通常有可能将函数拟合到不一定要泛化的数据训练集中。 以下是数据集每次向前和反向传播(称为历元)后训练和测试数据集上的总损失的图:
![Figure 1.14 – Test and training epochs ](img/B12365_01_14.jpg)
......
......@@ -569,7 +569,7 @@ for epoch in range(100):
![Figure 2.21 – Predicted output for the updated function ](img/B12365_02_21.jpg)
图 2.21 –更新功能的预测输出
图 2.21 –更新函数的预测输出
在这里,我们可以看到,对于单词`estoy`而言,此参数对西班牙语的预测为正,对英语的预测为负。 这意味着对于我们句子中的每个单词`estoy`,该句子更有可能是西班牙语句子。 类似地,对于`book`一词,我们可以看到这对句子为英语的预测有积极作用。
......
......@@ -624,7 +624,7 @@ This is a small giraffe
![](img/Formula_03_007.jpg)
现在,我们可以演示如何在 Python 中实现此功能并将 TF-IDF 权重应用于我们的嵌入。
现在,我们可以演示如何在 Python 中实现并将 TF-IDF 权重应用于我们的嵌入。
## 实现 TF-IDF
......
......@@ -98,7 +98,7 @@ print('Output: ' + output_text)
这表明标点符号已从输入句子中删除。
在某些情况下,我们可能不希望直接删除标点符号。 一个很好的例子是的使用和号(`&`),在几乎每种情况下,它都与单词`and`互换使用。 因此,与其完全删除“&”号,不如选择直接用`and`一词代替。 我们可以使用`.replace()`函数在 Python 中轻松实现此功能
在某些情况下,我们可能不希望直接删除标点符号。 一个很好的例子是的使用和号(`&`),在几乎每种情况下,它都与单词`and`互换使用。 因此,与其完全删除`&`号,不如选择直接用`and`一词代替。 我们可以使用`.replace()`函数在 Python 中轻松实现它
```py
input_text = "Cats & dogs"
......@@ -321,7 +321,7 @@ print(wordnet_lemmatizer.lemmatize('run', pos='v'))
![Figure 4.13 – Implementing POS in the function ](img/B12365_04_13.jpg)
图 4.13 –在功能中实现 POS
图 4.13 –在函数中实现 POS
这意味着为了返回任何给定句子的正确词形,我们必须首先执行 POS 标记以获得句子中词的上下文,然后将其传递给词形还原器以获取句子中每个词的词形。 我们首先创建一个函数,该函数将为句子中的每个单词返回 POS 标签:
......@@ -356,7 +356,7 @@ get_pos_wordnet('VBG')
图 4.15 –将 NTLK POS 标签映射到 WordNet POS 标签
最后,我们将这些功能组合为一个最终功能,该功能将对整个句子执行词形还原:
最后,我们将这些函数组合为一个最终函数,该函数将对整个句子执行词形还原:
```py
def lemmatize_with_pos(sentence):
......
......@@ -45,7 +45,7 @@ CNN 背后的基本概念是卷积。 **卷积**本质上是一个滑动窗口
在大图像中(对于 NLP,则为复杂的句子),我们还需要实现池化层。 在我们前面的示例中,将`3x3`卷积应用于`5x5`图像会产生`3x3`输出。 但是,如果将`3x3`卷积应用于`100x100`像素的图像,则只会将输出降低到`98x98`。 这还不足以降低图像的尺寸,不足以有效地执行深度学习(因为我们必须在每个卷积层学习`98x98`参数)。 因此,我们应用池化层以进一步减小该层的尺寸。
池化层将函数(通常为`max`函数)应用于卷积层的输出,以减小其维数。 此功能应用于滑动窗口,类似于执行卷积的,但现在卷积不再重叠。 假设卷积层的输出为`4x4`,并且对输出应用`2x2`的最大缓冲功能。 这意味着对于我们层中每个较小的`2x2`网格,我们将应用最大函数并保留结果输出。 我们可以在下图中看到这一点:
池化层将函数(通常为`max`函数)应用于卷积层的输出,以减小其维数。 此函数应用于滑动窗口,类似于执行卷积的,但现在卷积不再重叠。 假设卷积层的输出为`4x4`,并且对输出应用`2x2`的最大值函数。 这意味着对于我们层中每个较小的`2x2`网格,我们将应用最大函数并保留结果输出。 我们可以在下图中看到这一点:
![Figure 6.3 – Pooling layers ](img/B12365_06_03.jpg)
......@@ -55,7 +55,7 @@ CNN 背后的基本概念是卷积。 **卷积**本质上是一个滑动窗口
卷积和池化层的这种结合本质上是 CNN 从图像中学习的方式。 我们可以看到,通过应用许多这些卷积过程(也称为**卷积层**),我们能够捕获有关任何给定像素与其相邻像素的关系的信息。 在 CNN 中,我们旨在学习的参数是卷积内核本身的值。 这意味着我们的模型可以有效地学习如何对图像进行卷积,以便能够提取进行分类所需的必要信息。
在这种情况下,使用卷积有两个主要的优势。 首先,我们能够将一系列低级功能组合成高级功能; 也就是说,我们初始图像上的`3x3`色块是组成的单个值。 这实际上是减少特征的一种形式,仅允许我们从图像中提取相关信息。 使用卷积的另一个优点是它使我们的模型位置不变。 在我们的数字检测器示例中,我们不在乎数字是否出现在图像的右侧或左侧; 我们只是希望能够检测到它。 由于我们的卷积会检测图像中的特定图案(即边缘),因此我们的模型位置不变,因为从理论上讲,无论这些卷积出现在图像中的哪个位置,相同的特征都将被拾取。
在这种情况下,使用卷积有两个主要的优势。 首先,我们能够将一系列低级特征组合成高级特征; 也就是说,我们初始图像上的`3x3`色块是组成的单个值。 这实际上是减少特征的一种形式,仅允许我们从图像中提取相关信息。 使用卷积的另一个优点是它使我们的模型位置不变。 在我们的数字检测器示例中,我们不在乎数字是否出现在图像的右侧或左侧; 我们只是希望能够检测到它。 由于我们的卷积会检测图像中的特定图案(即边缘),因此我们的模型位置不变,因为从理论上讲,无论这些卷积出现在图像中的哪个位置,相同的特征都将被拾取。
尽管这些原理对于理解卷积如何在图像数据中起作用很有用,但它们也可以应用于 NLP 数据。 我们将在下一部分中对此进行讨论。
......@@ -151,7 +151,7 @@ CNN 背后的基本概念是卷积。 **卷积**本质上是一个滑动窗口
labels = data.LabelField(dtype = torch.float)
```
在这里,我们将分词设置为等于`spacy`,以设置输入句子的分词方式。 `TorchText`然后使用`spacy`包自动标记输入的句子。 `spacy`由英语索引组成,因此任何单词都会自动转换为相关标记。 为了使此功能有效,您可能需要安装`spacy`。 可以在命令行中通过键入以下命令来完成:
在这里,我们将分词设置为等于`spacy`,以设置输入句子的分词方式。 `TorchText`然后使用`spacy`包自动标记输入的句子。 `spacy`由英语索引组成,因此任何单词都会自动转换为相关标记。 为了使有效,您可能需要安装`spacy`。 可以在命令行中通过键入以下命令来完成:
```py
pip3 install spacy
......@@ -299,7 +299,7 @@ train_iterator, valid_iterator = data.BucketIterator.splits(
     kernel_size = (3, embedding_dim))
```
在此,滤波器尺寸分别为`2`和`3`。 但是,在单个功能中执行此操作效率更高。 此外,如果我们向函数传递不同的过滤器大小,则将自动生成我们的层,而不是每次添加新层时都必须手动定义每个层。
在此,滤波器尺寸分别为`2`和`3`。 但是,在单个函数中执行此操作效率更高。 此外,如果我们向函数传递不同的过滤器大小,则将自动生成我们的层,而不是每次添加新层时都必须手动定义每个层。
我们还将`out_channels`值定义为我们希望训练的过滤器数;`kernel_size`将包含我们嵌入的长度。 因此,我们可以将`ModuleList`函数的长度传递给我们希望训练的滤波器长度以及每个滤波器的数量,它将自动生成卷积层。 该卷积层如何查找给定变量集的示例如下:
......@@ -392,7 +392,7 @@ def multi_accuracy(preds, y):
    return acc
```
在这里,对于我们的预测,我们的模型使用`torch.max`函数对所有预测返回具有最高预测值的索引。 对于这些预测中的每一个,如果此预测索引与标签的索引相同,则将其视为正确的预测。 然后,我们对所有这些正确的预测进行计数,然后将它们除以预测的总数,以得出多类准确率的度量。 我们可以在训练循环中使用此功能来测量每个时期的准确率。
在这里,对于我们的预测,我们的模型使用`torch.max`函数对所有预测返回具有最高预测值的索引。 对于这些预测中的每一个,如果此预测索引与标签的索引相同,则将其视为正确的预测。 然后,我们对所有这些正确的预测进行计数,然后将它们除以预测的总数,以得出多类准确率的度量。 我们可以在训练循环中使用此函数来测量每个时期的准确率。
接下来,我们定义训练函数。 最初,我们将时间段的损失和准确率设置为`0`,我们将其称为`model.train()`以允许我们在训练模型时更新模型中的参数:
......@@ -436,7 +436,7 @@ for batch in iterator:
return total_epoch_loss, total_epoch_accuracy
```
同样,我们可以定义一个称为`eval`的函数,该函数将在验证数据上调用,以根据尚未训练模型的一组数据来计算训练后的模型表现。 尽管此功能与我们之前定义的训练函数几乎相同,但是我们必须做两个关键的补充:
同样,我们可以定义一个称为`eval`的函数,该函数将在验证数据上调用,以根据尚未训练模型的一组数据来计算训练后的模型表现。 尽管此函数与我们之前定义的训练函数几乎相同,但是我们必须做两个关键的补充:
```py
model.eval()
......@@ -554,4 +554,4 @@ print('Predicted class is: ' + str(pred_class))
在本章中,我们展示了如何使用 CNN 从 NLP 数据中学习以及如何使用 PyTorch 从头开始训练 CNN。 虽然深度学习方法与 RNN 中使用的方法有很大不同,但从概念上讲,CNN 以算法方式使用 n 语法语言模型背后的动机,以便从其邻近单词的上下文中提取有关句子中单词的隐式信息。 现在我们已经掌握了 RNN 和 CNN,我们可以开始扩展这些技术,以构建更高级的模型。
在下一章中,我们将学习如何构建利用卷积神经网络和循环神经网络元素的模型,并在序列上使用它们来执行更高级的功能,例如文本翻译。 这些被称为序列到序列网络。
\ No newline at end of file
在下一章中,我们将学习如何构建利用卷积神经网络和循环神经网络元素的模型,并在序列上使用它们来执行更高级的操作,例如文本翻译。 这些被称为序列到序列网络。
\ No newline at end of file
......@@ -843,7 +843,7 @@ for line in lines[:3]:
return all_tokens, all_scores
```
所有的部分都开始融合在一起。 我们具有已定义的训练和评估功能,因此最后一步是编写一个功能,该功能实际上会将我们的输入作为文本,将其传递给我们的模型,并从模型中获取响应。 这将是我们聊天机器人的“界面”,我们实际上在那里进行对话。
所有的部分都开始融合在一起。 我们具有已定义的训练和评估函数,因此最后一步是编写一个函数,该函数实际上会将我们的输入作为文本,将其传递给我们的模型,并从模型中获取响应。 这将是我们聊天机器人的“界面”,我们实际上在那里进行对话。
5. 我们首先定义一个`evaluate()`函数,它接受我们的输入函数并返回预测的输出词汇。我们首先使用我们的词汇将输入句子转化为指数。然后,我们获得这些句子中每个句子的长度的张量,并对其进行转置。
......@@ -895,11 +895,11 @@ output_words[:] = [x for x in output_words if \
print('Response:', ' '.join(output_words))
```
现在我们已经构建了训练,评估和使用聊天机器人所需的所有功能,现在该开始最后一步了—训练模型并与训练过的聊天机器人进行对话。
现在我们已经构建了训练,评估和使用聊天机器人所需的所有函数,现在该开始最后一步了—训练模型并与训练过的聊天机器人进行对话。
## 训练模型
当我们定义了所有必需的功能时,训练模型就成为一种情况或初始化我们的超参数并调用我们的训练函数:
当我们定义了所有必需的函数时,训练模型就成为一种情况或初始化我们的超参数并调用我们的训练函数:
1. 我们首先初始化我们的超参数。虽然这些只是建议的超参数,但我们的模型已经被设置为允许它们适应任何传递给它们的超参数的方式。用不同的超参数进行实验,看看哪些超参数能带来最佳的模型配置,这是一个很好的做法。在这里,你可以试验增加编码器和解码器的层数,增加或减少隐藏层的大小,或者增加批次大小。所有这些超参数都会对模型的学习效果产生影响,同时也会影响其他一些因素,例如训练模型所需的时间。
......
......@@ -72,15 +72,15 @@
为此,它首先找出代表当前游戏状态的节点,然后以使遭受的损失最小化的方式采取行动。 为此,需要遍历整个游戏树到叶子节点(最终游戏状态)以评估损失。 因此,minimax 算法要求遍历游戏树以评估每一步的损失(最坏的情况),然后选择损失最小的那一步。
DeepBlue 搜索国际象棋的游戏树到最低深度(因为不可能创建整个国际象棋的游戏树)。 然后,它使用评估函数来计算值,该值将替换下面的子树。 此评估功能用于将下面的子树汇总为单个值。 然后,它使用 minimax 算法引导最小的最坏情况,直到达到最大可能深度。
DeepBlue 搜索国际象棋的游戏树到最低深度(因为不可能创建整个国际象棋的游戏树)。 然后,它使用评估函数来计算值,该值将替换下面的子树。 此评估函数用于将下面的子树汇总为单个值。 然后,它使用 minimax 算法引导最小的最坏情况,直到达到最大可能深度。
评估功能依赖于一些试探法。 在 DeepBlue 中,评估功能分为 8000 个部分,专门针对某些特定位置进行设计。 因此,为了更深入地了解游戏树,计算能力应该更高,甚至在此之后,还要根据监督下的不同游戏位置来设计游戏特定评估功能。 因此,由于没有学习,它不能在其他领域(或游戏)上推广。
评估函数依赖于一些试探法。 在 DeepBlue 中,评估函数分为 8000 个部分,专门针对某些特定位置进行设计。 因此,为了更深入地了解游戏树,计算能力应该更高,甚至在此之后,还要根据监督下的不同游戏位置来设计游戏特定评估函数。 因此,由于没有学习,它不能在其他领域(或游戏)上推广。
简而言之,为了解决国际象棋的复杂性,DeepBlue 对设计良好的评估功能的游戏树使用了蛮力方法。
简而言之,为了解决国际象棋的复杂性,DeepBlue 对设计良好的评估函数的游戏树使用了蛮力方法。
# 为什么游戏树方法对围棋不利?
不能以游戏树方式接近。 原因是所使用的更大的复杂性和蛮力方法无法进行任何学习。 它执行的唯一任务是将游戏状态映射到游戏树中的节点。 而且,DeepBlue 中使用的蛮力方法没有通用的评估功能,而是针对不同的游戏位置手工制作的。 因此,先前的方法过于特定于游戏,因此此类方法无法扩大规模以玩围棋。
不能以游戏树方式接近。 原因是所使用的更大的复杂性和蛮力方法无法进行任何学习。 它执行的唯一任务是将游戏状态映射到游戏树中的节点。 而且,DeepBlue 中使用的蛮力方法没有通用的评估函数,而是针对不同的游戏位置手工制作的。 因此,先前的方法过于特定于游戏,因此此类方法无法扩大规模以玩围棋。
# AlphaGo –精通围棋
......@@ -115,16 +115,16 @@ AlphaGo 之前的围棋 AI 程序完全依赖于蒙特卡洛树搜索。 这些
# AlphaGo 的架构和属性
所有方法都依赖于结合某些领域知识和人工干预的树搜索。 AlphaGo 使用树搜索和两种 CNN(策略和值网络)来指导树搜索。 这些 CNN 类似于 DeepBlue 中使用的评估功能,但有一个区别,即 CNN 在手工制作 DeepBlue 中使用的评估功能时学习评估功能
所有方法都依赖于结合某些领域知识和人工干预的树搜索。 AlphaGo 使用树搜索和两种 CNN(策略和值网络)来指导树搜索。 这些 CNN 类似于 DeepBlue 中使用的评估函数,但有一个区别,即 CNN 在手工制作 DeepBlue 中使用的评估函数时学习评估函数
较早使用的树搜索是一种蛮力方法,而 CNN 是一种基于学习的方法,它提供了一种基于直觉的游戏方式。 因此,第一个任务是减少搜索空间(围棋的搜索空间大约为`10^170`)。 这可以通过两种方法来完成:
* 减少*动作候选*,即广度减少(避免在游戏树中探索它们时避免出现不必要的动作)
* 在时间之前减少评估功能,即深度减少(避免遍历整个游戏树来评估所采取的移动并根据当前游戏状态预测获胜状态)
* 在时间之前减少评估函数,即深度减少(避免遍历整个游戏树来评估所采取的移动并根据当前游戏状态预测获胜状态)
策略网络并入当前游戏状态,并输出给定​​状态下每个可能动作的概率。 具有较高概率的动作有较高的获胜机会。 首先,使用专家玩家玩游戏的数据集,通过监督学习来训练策略网络。 输入数据包含游戏板的图像,输出将采取的措施。 来自 160000 个专家游戏的大约 3000 万个棋盘位置的训练数据集最初用于训练 AlphaGo 的策略网络。 在专家数据集上进行训练后,通过自我扮演改进了预测可能学习到的动作的模型,在自我扮演的过程中,它与自身无数次比赛,以使用策略梯度从过去的错误中学习。 因此,策略网络通过提供可能采取行动的可能性来帮助减少候选行动。
值网络提供当前状态的估计值,该值是黑人玩家在当前状态下赢得比赛的概率。 策略和值网络的输入与当前游戏状态(具有当前石头位置的棋盘游戏的图像)相同。 策略网络的输出是获胜的概率。 因此,值网络的作用类似于评估功能,该功能是通过 3000 万个棋盘位置的监督学习集获得的。
值网络提供当前状态的估计值,该值是黑人玩家在当前状态下赢得比赛的概率。 策略和值网络的输入与当前游戏状态(具有当前石头位置的棋盘游戏的图像)相同。 策略网络的输出是获胜的概率。 因此,值网络的作用类似于评估函数,该功能是通过 3000 万个棋盘位置的监督学习集获得的。
因此,值网络输出直觉(赢和输的机会),而策略网络输出反思(训练游戏知识)。 因此,AlphaGo 中直觉和反射的混合使其比任何基于搜索的方法都强大。 但是在 AlphaGo 中,这些网络可根据所开发的直觉和学习的反射来帮助更快,优化树搜索。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册