Matlab 机器学习第二版(二)
原文:
annas-archive.org/md5/35b100e1a62ae767cfb628ba7d257d7c译者:飞龙
第五章:介绍人工神经网络建模
人工神经网络(ANNs)包括用于学习和分类数据的数据结构和算法。通过神经网络技术,程序可以通过示例学习并创建一个内部规则结构来分类不同的输入。MATLAB 提供了算法、预训练模型和应用程序来创建、训练、可视化和模拟 ANNs。在本章中,我们将了解如何使用 MATLAB 构建基于 ANNs 的模型来预测值和分类数据。
在本章中,我们将涵盖以下主要内容:
-
开始学习 ANNs
-
在 MATLAB 中训练和测试 ANNs 模型
-
使用 ANNs 理解数据拟合
-
使用 ANNs 发现模式识别
-
使用 ANNs 构建聚类应用程序
-
探索高级优化技术
技术要求
在本章中,我们将介绍与机器学习相关的基本概念。为了理解这些主题,需要具备代数和数学建模的基本知识。您还需要熟悉 MATLAB 环境。
要使用本章中的 MATLAB 代码,您需要以下文件(可在 GitHub 上找到:github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):
-
ANNFitting.m -
ANNPatReg.m
开始学习 ANNs
串行计算机及其程序在执行涉及重复、定义明确的操作的任务时表现出非凡的能力,优先考虑准确性、可靠性和速度。虽然这些信息处理系统非常有价值,但它们缺乏真正的智能。唯一的智能元素在于理解任务并制定程序的程序员。为了实现真正的人工智能(AI),系统必须具备解决人类认为简单、琐碎和直观的问题的能力。
与 ANNs 相关的基本概念
ANNs(人工神经网络)旨在模拟生物神经系统的复杂运作,由大量相互连接的神经元组成,这些神经元在复杂的网络中交织在一起。通常,每个神经元与其他成千上万的神经元建立连接,从而产生数百亿个连接。智能行为的出现源于这些相互连接单元之间无数的交互。
在这个网络中,特定的单元执行不同的功能。一些单元作为从环境中接收信息的接收器,而其他单元则对环境中的刺激做出反应。某些单元被称为隐藏单元,它们仅在网络内部进行通信,不与外部环境直接交互。总体而言,神经网络的结构涉及输入单元、输出单元和隐藏单元协同工作以处理信息和展示智能行为。
神经网络中的每个单元执行一个简单的操作:当累积接收到的信号超过激活阈值时,它会被激活。一旦激活,该单元将通过通信通道向其他连接的单元发送信号。这些连接充当过滤器,将消息转换为兴奋或抑制信号,并根据个体特征调整其强度。值得注意的是,网络的输入-输出链接,或传递函数,不是通过显式编程获得的,而是通过使用经验数据的学习过程获得的,这个过程可以是监督学习、无监督学习或强化学习。
神经网络(ANNs)是一种可以从经验中学习的 AI 类型。这种学习之所以可能,是因为它们的结构类似于人脑。像人脑一样,神经网络由大量节点组成,这些节点通过连接相互连接。节点处理信息,连接决定了信息如何从一个节点传输到另一个节点。神经网络通过称为监督学习的过程从经验中学习。在这个过程中,神经网络被提供了一组期望的输入和输出示例的数据集。然后,神经网络使用这些数据来学习将输入映射到期望的输出。例如,需要学习识别狗的图像的神经网络被提供了一组狗的图像和其他动物的图像数据集。神经网络使用这些图像来学习区分狗和其他动物。
神经网络并行运行,这使得它们能够同时处理多个数据,与逐个且按顺序处理数据的串行计算机相比。尽管单个神经元可能相对较慢,但神经网络的并行特性解释了在处理需要同时处理大量数据点的任务时,如视觉物体识别,大脑的高处理速度。这个非凡的系统表现出强大的抗噪声能力,类似于复杂的统计模型。即使在某些单元出现故障的情况下,整体网络性能可能会下降,但完全的系统关闭不太可能发生。
然而,最新一代的神经网络软件需要具备扎实的统计学知识。尽管它们看起来具有即时的可用性,但用户不应被欺骗,因为它们可以在某些限制内快速做出预测或分类。从工业角度来看,当有历史数据可用并使用神经网络算法进行处理时,这些网络证明是有效的。这种能力在生产环境中尤其有价值,因为它促进了数据提取和模型创建。
必须注意的是,虽然神经网络生成的模型非常高效,但它们缺乏人类符号语言中的解释。结果必须按原样接受,这导致神经网络被描述为黑盒。
与任何建模算法一样,神经网络的效率在很大程度上依赖于预测变量的谨慎选择。这些网络需要一个训练阶段来建立单个神经元的权重,当处理大量记录和变量时,这个过程可能会很耗时。与传统的模型不同,神经网络缺乏定理或明确的指导方针,这使得网络的成功高度依赖于创造者的经验。
神经网络在数据可能部分不准确或分析模型不可用于解决问题的场景中找到其用途。它们通常用于光学字符识别(OCR)软件、面部识别系统和其他处理易出错或噪声数据的应用程序。此外,它们在数据挖掘分析和作为金融和气象领域预测工具的广泛使用。近年来,它们在生物信息学领域的意义显著增加,在那里它们在识别核酸和蛋白质中的功能和结构模式方面发挥着关键作用。通过提供一套全面的输入数据,网络可以产生最可能的输出。
理解感知器的工作原理
神经网络的基本单元是感知器,它模拟了生物神经的基本功能。它评估每个输入的强度,累积这些输入,然后将总和与一个特定的阈值进行比较。基于这个比较,感知器确定输出值。神经元的基本结构已被充分理解,研究人员已经确定了控制其活动的主要生化反应。因此,神经元可以被视为大脑的基本计算单元。在人类大脑中,已经确定了大约 100 种不同的神经元类别,每种类别都为负责我们认知过程和能力的复杂神经网络做出贡献。
图 5.1 – 理解感知器方案
生物神经元的根本功能是在神经元细胞体的电活动超过特定阈值时,在其轴突(神经元输出)上产生一个电势。神经元的输入通过称为树突的一组纤维接收,这些树突接触其他神经元的轴突,从它们那里传递电势。一个神经元的轴突与另一个神经元的树突之间的连接点被称为突触。
突触具有调节从轴突发出的电脉冲的能力。神经元产生的电势基本上是二元的:开/关状态。如果神经元的电活动超过特定阈值,就会产生一个脉冲;否则,不会产生脉冲。
值得注意的是,生成的脉冲强度在不同神经元之间保持一致。当潜力沿着轴突传播并达到连接到另一个神经元树突的突触时,突触后电位依赖于突触的生化特性。尽管具有相同的突触前电位,两个不同的突触可能会产生不同的突触后电位。换句话说,突触在传输之前调节并权衡输入电位。
突触后电位通过神经元的树突继续传播并在细胞体水平积累。只有当这些潜力的总和超过某个特定阈值时,神经元才会触发潜力通过其轴突传播。生物神经元和人工神经元都通过树突接收多个输入。人工神经元将这些各种输入值聚合并计算结果。
如果计算值超过特定阈值,人工神经元会产生输出信号或潜力;否则,它保持不活跃。
人工神经元最初实现的功能是其输入的代数和,这有助于构建系统的响应。在模拟现象时,系统可能会遇到错误,需要适当的纠正。为了实现这一点,每个输入都被分配了一个权重,这是一个数值,它调节其对总和的影响,从而确定神经元的潜力。
换句话说,每个输入对确定阈值值和触发潜力的贡献各不相同,类似于涉及一个神经元轴突与另一个神经元树突之间突触的生物神经元特性。
从突触后神经元的视角来看,输入包括来自其他神经元的潜力,这些神经元的轴突与它们的树突形成突触,并且这些输入被突触精确调节。一些输入可能对总和产生更强的影响,而其他输入甚至可能是抑制性的,减少总和并因此降低超过阈值并触发潜力的概率。
这种生物系统的基本特性在连接系统中使用权重概念进行数学建模。每个连接都被分配一个数值作为其权重,该数值乘以输入值。因此,输入对总和的影响由其权重的幅度决定。
激活函数用于引入非线性
在我们之前的讨论中,我们探讨了通过引入权重概念引入的加权求和函数。现在,让我们深入探讨人工神经元的一个特性,这个特性再次受到了生物神经元行为的启发。如前所述,生物神经元在树突水平上对其突触后电位进行求和。然而,这种求和并不是这些电位的简单代数加和。各种因素,如神经元膜的无被动电阻,都会发挥作用,使得实际的求和通常是非线性的函数。
同样,人工神经元计算加权输入,然后使用一个特定的函数修改结果。这个函数被称为激活函数,它应用于神经元的输出以确定其真实潜力。激活函数在塑造神经元行为和最终影响神经网络计算结果方面起着至关重要的作用。
激活函数对输入的加权总和以及一个额外的偏置项应用特定的数学运算以产生神经元的输出。这个输出,通常被称为激活或后激活值,然后作为输入传递到神经网络后续的层。
神经网络中使用了不同类型的激活函数,每种都有其独特的特性和应用。常见的激活函数包括以下几种:
- 如果输入大于或等于一个阈值,则为
1,否则为0:
f(x) = 0 if x < 0, 1 if x ≥ 0
0和1。它过去常用,但由于梯度消失问题,在更深层的网络中不再受欢迎:
f(x) = 1 / (1 + e^(-x))
0。它有助于减轻梯度消失问题,并加速深层网络的收敛:
f(x) = 0 if x < 0, x if x ≥ 0
-1和1。它在原点周围是对称的,与 sigmoid 函数相比,提供了更好的梯度范围:
f(x) = tanh(x)
1:
f(x) = e^(-x_i) * ∑(i=1 to k) e^(-x_i)
- 指数线性单元(ELU):ELU 是一种在人工神经网络中使用的激活函数。它是一个平滑、非饱和函数,可以处理正负输入。ELU 比 ReLU 更晚出现,ReLU 也是一种广泛使用的激活函数:
f(x) = x if x > 0
alpha * (exp(x) - 1) if x < 0
在这里,x 是 ELU 函数的输入,α 是一个控制负斜率陡度的超参数。α 的默认值是 1.0。
ELU 函数是一个平滑、非饱和函数,可以处理正负输入。这使得它对于涉及这两种类型输入的任务(如图像识别和自然语言处理)是一个很好的选择。
激活函数的选择会影响神经网络的性能、训练速度以及捕捉数据中复杂关系的能力。根据具体问题和架构考虑,网络的不同层可能会使用不同的激活函数。
ANN 架构解释
在讨论了人工神经元的特性之后,我们现在将深入研究神经网络的架构。这包括网络结构的物理说明以及确定每个神经元在这个框架中的作用。考虑一个有多个输入和节点的场景,其中每个输入都与每个节点相连。同样,每个输出节点也接收来自所有输入的连接。每个输出节点具有前面描述的特性,并与其他节点一起执行计算。在引入输入模式后,输出值要么受输入值本身的影响,要么受网络权重的影响。在网络中,节点集合通常被称为层。
神经网络被组织成层,每一层在信息处理中都有其特定的作用。神经网络中的主要层类型包括以下几种:
-
输入层:接收输入数据并将其传递给后续层的初始层。
-
隐藏层:位于输入层和输出层之间的中间层。这些层通过复杂的转换处理数据并提取相关特征。
-
输出层:产生网络输出或预测的最终层,基于从隐藏层处理过的信息。
隐藏层的数量以及其中的节点数,以及激活函数和权重的选择,构成了神经网络的架构。架构(图 5*.2*)显著影响了网络从数据中学习、泛化到新示例以及高效执行特定任务的能力。
图 5.2 – 带权重和激活函数的 ANN 架构
神经网络可以由多层组成,每增加一层都会增强网络的计算能力。输入是数值,通过与第一层节点(称为隐藏层)的连接权重进行评估。在这个隐藏层中,每个节点按照前面描述的方式进行计算,从而生成潜在的输出,然后传播到输出层的节点。输出节点产生的潜在值共同代表了神经网络计算出的最终输出。
神经网络的架构指的是节点相互连接的具体方式。在前面图表中显示的前馈神经网络的情况下,输入节点的激活通过隐藏层向前传播,进一步传播到输出层。改变节点之间的连接会改变网络的架构。这不仅对网络的计算能力产生实际影响,而且与学习概念相关的理论意义也非常重大。网络中节点的排列会影响其从数据中学习以及执行特定任务的能力,使架构设计成为神经网络开发的一个关键方面。
在分析了 ANN 的基本概念之后,我们现在需要关注这些算法是如何被训练的。
在 MATLAB 中训练和测试 ANN 模型
在上一节中,我们看到了 ANN 的架构。它强加了两个层,输入层和输出层,这些层不能改变。因此,关键因素在于我们考虑的隐藏层数量。神经网络的大小由隐藏神经元的数量定义。确定网络的最佳大小仍然是一个持续性的挑战,因为迄今为止还没有发现解析解决方案。解决这个问题的方法之一是采用启发式方法:创建具有递增复杂性的各种网络,使用训练数据的一个子集,并同时在验证子集上监控错误。完成训练过程后,选择具有最低验证错误的网络作为首选。
如何训练 ANN
让我们讨论选择层数的过程。输入节点的数量基于输入数据中的特征数量是固定的,而输出节点的数量则由要建模的结果数量或结果中的类别级别决定。真正的挑战在于确定隐藏层中适当神经元数量。不幸的是,没有解析方法来完成这项任务。最佳神经元数量取决于各种因素,例如输入节点的数量、训练数据量以及学习算法的复杂性等。
隐藏层中拥有更多神经元将导致一个更好地拟合训练数据的模型,但这也伴随着过拟合的风险,可能导致对未来数据的泛化能力较差。此外,具有许多节点的神经网络可能在计算上昂贵且训练缓慢。
为了解决这个问题,可以采用启发式方法,通过实验不同的配置来找到最佳平衡。这种试错方法使我们能够在模型复杂性、准确性和计算效率之间取得平衡。
神经网络由简单的元素组成,这些元素并行操作。这些元素之间的连接起着至关重要的作用,因为它们决定了网络的功能。这些连接通过各自的权重影响输出,这些权重在神经网络训练阶段进行调整。
在训练过程中,通过修改连接权重来微调网络,使特定的输入产生期望的输出。例如,可以通过将网络的实际输出与我们要达到的目标输出进行比较来校准网络。这个过程会持续迭代,直到网络的输出与期望的目标相一致。
为了获得可靠的结果,需要大量的输入/目标对来适当地塑造网络。这个过程确保神经网络能够准确地产生各种输入的期望输出,使其成为各种任务的可靠工具。
这些权重的调整取决于我们选择的特定算法。在以下实际示例中,我们将讨论和参考各种控制权重调整过程的算法。
介绍 MATLAB 神经网络工具箱
神经网络工具箱提供了一系列算法、预训练模型和应用程序,使用户能够创建、训练、可视化和模拟神经网络。它支持浅层神经网络(含一个隐藏层)和深层神经网络(含多个隐藏层)。使用这些工具,可以执行各种任务,如分类、回归、聚类、降维、时间序列预测以及动态系统建模和控制。
利用神经网络工具箱有四种主要方式:
-
nnstart命令,提供对自动任务(如函数拟合nftool)、模式识别nprtool)、数据聚类nctool)和时间序列分析ntstool)的访问。 -
基本命令行操作:为了提高灵活性,用户可以利用命令行操作。虽然需要更多的知识,但这种方法允许用户完全控制过程,而无需依赖于 GUI 中通常找到的菜单和图标。
-
定制工具箱:用户可以通过创建自己的具有任意连接的神经网络来自定义工具箱。现有的工具箱训练功能在 GUI 中可以使用,以继续训练这些自定义网络。
-
修改工具箱功能:工具箱中的所有计算组件都使用 MATLAB 代码编写,并且完全可访问,使用户能够根据特定需求修改和定制它们。
这个工具箱适用于所有级别的用户,从初学者到专家。它提供了简单的工具,引导新用户通过特定应用,以及更复杂的工具,使专家能够自定义网络并尝试新的架构。
无论选择哪种方法,使用神经网络进行适当的分析应包括以下步骤:
-
数据收集
-
网络创建
-
网络配置
-
权重和偏置初始化
-
网络训练
-
网络验证
-
网络测试
通过遵循这些步骤,用户可以有效地将神经网络应用于各种问题和任务。这些步骤的详细解释如下:
-
过程的第一步涉及收集要分析的数据,这通常在 MATLAB 环境之外完成。数据收集阶段至关重要,因为数据的质量将显著影响最终结果和提取有意义的见解的能力。
-
接下来,我们使用工具箱中提供的各种函数来创建神经网络。这些函数允许我们通过选择的算法构建网络,从而创建一个神经网络对象。该对象存储了定义神经网络特性的所有必要信息,例如其架构、子对象结构、函数以及权重和偏置值。
-
第三步是网络配置,其中我们检查输入和输出数据,设置网络的维度以适应数据,并选择合适的输入和输出处理设置以增强网络性能。此配置步骤通常在调用训练函数时自动执行,但也可以使用配置函数手动完成。
-
配置之后,第四步涉及初始化权重和偏置。我们设置初始值,网络将从这些值开始其训练过程。这种初始化通常基于选择的训练算法自动完成,但用户如果需要也可以设置自定义值。
-
第五步是网络训练,这是过程中的关键阶段。在训练过程中,权重和偏置被微调以优化网络性能。这一阶段对于网络能够很好地泛化新、未见数据至关重要。通常,收集到的数据(大约为可用案例的 70%)用于训练。
-
接下来,在第六步,进行网络验证。在这里,将随机选择的一部分数据(通常为可用案例的约 15%)通过网络来估计模型训练的效果。这一阶段获得的结果有助于确定所选模型是否充分反映了初始期望,或者是否需要调整。
-
最后,在最后一步,我们利用训练好的网络。收集到的数据的一部分(大约为可用案例的 15%)用于测试网络性能。然后,训练好的神经网络对象可以被保存并多次使用,以便在需要时用新数据进行分析。这允许重复使用网络进行预测或分析各种数据集。
神经网络设计的流程涉及将收集到的数据分为三组:训练集、验证集和测试集。让我们详细描述每一组:
-
训练集(通常为可用案例的 70%):训练集是一组示例,用于训练神经网络并调整其参数。在训练过程中,网络从训练集中的输入-输出对中学习,以优化其内部权重和偏差。目标是找到最佳参数集,以最好地捕捉数据中的潜在模式和关系。神经网络通过训练阶段的迭代调整来提高其性能。
-
验证集(通常为可用案例的 15%):验证集是一组独立的示例,用于微调网络的参数并在训练期间评估其性能。它作为验证机制,防止过拟合,即网络在训练数据上表现良好,但在新的、未见过的数据上表现较差。通过监控网络在验证集上的性能,我们可以做出关于模型复杂性的决定,例如确定隐藏单元的最佳数量或确定训练算法的合适停止点。基于验证集的调整有助于确保网络对新数据具有良好的泛化能力。
-
测试集(通常为可用案例的 15%):测试集是一组独立且独立的示例,仅用于评估完全训练好的神经网络的性能。在训练和验证阶段之后,使用测试集评估最终模型,以估计其错误率并验证其泛化能力。至关重要的一点是,在基于测试集评估的基础上避免对模型进行任何进一步的调整,以避免偏差或过拟合。测试集提供了对神经网络在新、真实世界数据上可能表现如何的无偏度量。
通过将数据分为这三个不同的集合,神经网络设计工作流程确保模型以受控和可靠的方式进行训练、验证和测试,从而允许对其性能和泛化能力进行准确评估。
对这一过程有了清晰的理解后,我们现在可以继续我们的工作,分析 MATLAB 中人工神经网络实现的实际示例。
使用人工神经网络理解数据拟合
数据拟合是指构建一个曲线或数学函数,使其与给定的数据点集最佳匹配的过程。这种曲线拟合可能涉及插值,其中精确地拟合数据点,或者平滑,其中平滑函数近似数据。在回归分析中,曲线拟合与统计推断密切相关,考虑到来自观察数据随机误差的不确定性。
通过数据拟合获得的大致曲线具有多种应用。它们可以用于可视化并显示数据,预测无可用数据区域中的函数值,以及总结多个变量之间的关系。这个过程对于理解和解释复杂数据集、进行预测以及从收集到的信息中获得见解非常有价值。
使用数学公式预测特定分布的趋势可能具有挑战性,这些公式可能并不总是能准确代表所有数据或涵盖存在的整个范围。为了解决这类情况,机器学习算法应运而生。这些算法可以构建模型,而不依赖于复杂的数学公式。
神经网络非常适合数据拟合和趋势预测任务。它们可以从给定的一组输入及其相关的目标输出中适应和学习。函数拟合是通过训练神经网络使用这样的输入-输出对来进行的,使其能够形成底层输入-输出关系的泛化。一旦训练完成,神经网络就可以为它在训练期间未遇到的输入生成输出。
神经网络的灵活性使它们能够捕捉数据中的复杂模式和关系,成为数据拟合和预测任务的有力工具。通过利用如神经网络这样的机器学习算法,我们可以克服传统数学公式的局限性,并在各种数据集和场景中实现准确的预测。
基于机器学习的算法的性能强烈依赖于正在处理的数据质量。数据收集过程通常发生在 MATLAB 环境之外,这意味着您需要准备好一个正确收集的数据文件,以便在 MATLAB 中启动分析。然而,如果您还没有访问数据,并且在这里学习,无需担心,因为 MATLAB 有解决方案。
神经网络工具箱软件提供了几个样本数据集,您可以使用这些数据集来实验工具箱的功能。这些样本数据集随时可用,可以作为您分析的开端。要探索可用的数据集,您可以使用以下命令:
help nndatasets
将按应用类型排序的数据集列表将返回。有了这些样本数据集,您就可以开始学习之旅,并在 MATLAB 的神经网络工具箱中获得实践经验。现在,我们将通过 MATLAB 中的数据拟合示例来操作:
-
让我们集中关注数据拟合的数据集,特别是
abalone_dataset,它包含鲍鱼壳环数据集。要将数据集加载到 MATLAB 工作空间中,让我们使用以下命令:load abalone_dataset [Input,Target] = abalone_dataset;执行此命令将数据加载到名为
Input和Target的数组中。该模型的目标是估计鲍鱼年龄,通过使用物理测量来实现这一预测。帮助文档:abalone_dataset提供了关于数据集的全面描述,包括属性数量、项目总数以及变量列表等详细信息。此外,描述还提供了关于数据集潜在用例的宝贵见解。
-
现在我们有了数据,我们必须选择训练算法并设置网络架构。在 MATLAB 中,有各种函数可用于训练。要获取可用训练算法的列表,我们可以使用以下命令:
help nntrain TFunc = 'trainlm';LM 反向传播是一种用于训练人工神经网络的优化算法。它是标准反向传播算法的扩展,提高了收敛性和鲁棒性,尤其是在非线性和不稳定问题中。在标准反向传播中,算法通过使用权重相对于误差的梯度来调整神经网络的权重。然而,在某些情况下,这个过程可能很慢,算法可能会陷入局部最小值。LM 反向传播通过结合 LM 优化方法来解决此问题,该方法常用于非线性最小二乘拟合问题。LM 算法结合了梯度下降和高斯-牛顿方法的思想。
下面是 LM 反向传播的基本工作原理概述:
-
使用标准反向传播算法计算误差函数相对于权重的梯度
-
计算表示误差表面相对于权重的曲率的 Hessian 矩阵
-
使用梯度下降和 LM 优化方法的组合来调整权重
LM 反向传播算法在训练过程中调整学习率。当误差表面陡峭时,它表现得更像梯度下降,这有助于避免过冲。当误差表面相对平坦时,它表现得更像高斯-牛顿方法,这可以加快收敛速度。这种技术的组合使得 LM 反向传播成为训练神经网络的一种高效且有效的算法,尤其是在标准反向传播可能遇到收敛问题或学习率较慢的情况下。它常用于各种应用,包括模式识别、函数逼近和非线性回归任务。
之后,我们必须设置隐藏层中的节点数:
HLNodesNum =10; -
-
最后,我们必须使用
fitnet()函数创建我们的 ANN,如下所示:AbaFitNet = fitnet(HLNodesNum, TFunc);fitnet()函数是一个内置的 MATLAB 函数,用于创建和训练具有单个隐藏层的前馈神经网络,用于函数拟合、模式识别和回归任务。以下参数被传递:-
LnodesNum:这是一个向量,指定了每个隐藏层中的神经元数量。 -
Tfunc:此参数指定用于训练神经网络的训练函数。它代表在训练过程中更新网络权重的优化算法。一些常用的训练函数包括trainlm(LM)、trainbfg(BFGS Quasi-Newton)和traingd(梯度下降)。
-
-
在探索数据整理部分,我们在探索 MATLAB 机器学习章节中展示了训练算法是必要的,以预处理数据。在这种情况下,我们可以使用神经网络工具箱中可用的神经网络处理函数。要打印所有可用的通用数据预处理函数,我们可以使用以下命令:
help nnprocess以下函数被列出:
-
removerows:根据指定的索引从矩阵中消除行 -
mapminmax:将每个矩阵行的最小值和最大值映射到范围[-1, 1] -
processpca:对矩阵行执行主成分分析 -
mapstd:将矩阵的行平均值和偏差映射到标准值 -
fixunknowns:使用特定程序处理具有未知值的矩阵行
前两个代表应用于前馈多层网络的默认函数,因此我们将将其应用于我们的案例:
AbaFitNet.input.processFcns = {'removeconstantrows','mapminmax'}; AbaFitNet.output.processFcns = {'removeconstantrows','mapminmax'};如前所述,这些是应用于输入和输出的默认处理函数。第一个移除常数记录,因为它们不会为数据适应带来任何内容,而第二个则将矩阵或向量的元素从其原始范围映射到指定的目标范围。
-
-
然后需要对数据进行预处理以进行数据划分。这是机器学习和数据分析中常用的技术,用于将数据集划分为用于不同目的的单独子集。数据划分的主要原因是为了拥有用于训练、验证和测试的不同数据部分,这允许评估和改进机器学习模型。有几种数据划分技术;在这种情况下,数据集被划分为三个部分:训练集、验证集和测试集。训练集用于模型训练,验证集用于调整超参数和优化模型,测试集用于最终评估:
AbaFitNet.divideFcn = 'dividerand'; AbaFitNet.divideMode = 'sample';此属性决定了在调用数据划分函数时目标数据的维度。对于静态网络,默认值为
sample,对于动态网络,默认值为time。或者,它可以设置为sampletime以根据样本和时间步长划分目标,all以在每个标量值处划分目标,或者none以保持数据未划分(意味着所有数据用于训练,没有用于验证或测试)。让我们现在设置用于不同阶段的数据百分比:
AbaFitNet.divideParam.trainRatio = 70/100; AbaFitNet.divideParam.valRatio = 15/100; AbaFitNet.divideParam.testRatio = 15/100; help nndivision仔细执行数据划分对于避免数据泄露等问题以及确保可靠的模型评估至关重要。
-
在训练人工神经网络(ANN)之前,选择某些内容是必要的。首先,我们必须选择评估指标来检查我们设置的模型的性能。评估指标是用于评估模型、算法、系统或过程性能和有效性的定量度量。在各个领域,如机器学习、数据科学和信息检索中,评估指标对于比较不同方法、调整参数以及理解特定解决方案的优缺点至关重要。评估指标的选择取决于要解决的问题和分析的目标。适当指标的选择取决于问题的性质和分析的目标。选择与当前任务的具体目标和要求相一致的评估指标是至关重要的。我们可以使用如下命令:
AbaFitNet.performFcn = 'mse'; help nnperformance将评估指标列表及其简要说明打印出来。
-
最后,我们必须选择绘图函数以获得结果的视觉表示。为此,我们可以使用
plotFcns()函数,它包含一个一维字符串单元数组,定义了与网络关联的绘图函数。通过train()函数可访问的神经网络训练窗口显示每个绘图函数的按钮。只需在训练过程中或训练过程之后点击相应的按钮即可打开所需的绘图:AbaFitNet.plotFcns = {'plottrainstate','plotperform', 'ploterrhist', 'plotregression'}; help nnplot将返回一个 ANN 可用绘图列表及其简要说明。
-
现在,我们可以训练已经设置的 ANN;为此,我们可以使用如下
train()函数:[AbaFitNet,Trs] = train(AbaFitNet,Input,Target);此函数训练一个浅层神经网络,并传递三个参数:
-
AbaFitNet:神经网络模型对象。 -
Input:用于训练神经网络的输入数据。它应该是一个矩阵,其中每一行代表一个单独的输入模式。鲍鱼数据集是一组描述鲍鱼物理尺寸的特征集合。此数据集包含八个特征:性别、长度、直径、高度、总重量、去壳重量、内脏重量和壳重量。 -
Target:与输入模式相对应的目标数据。它应该是一个矩阵,行数与输入矩阵相同,其中每一行包含相应的目标值。目标是鲍鱼的年龄,以环数的形式衡量。
train()函数使用指定的输入数据和目标数据执行训练过程。所使用的训练算法类型取决于特定的神经网络模型及其设置。训练完成后,返回的对象将包含训练好的神经网络,可用于使用与训练网络相关的任务对新数据进行预测。在训练阶段,将打开一个新窗口(如图5**.3所示)。
-
图 5.3 – 训练结果窗口
在图 5.3中,我们可以检查训练进度,它显示了诸如Epoch、Elapsed Time、Performance、Gradient、Mu和Validation Checks等信息。此外,总结了之前步骤中设置的属性。最后,有几个与绘图集相关的按钮可用。
通过点击此窗口底部的按钮,我们可以绘制特定的图表。
-
在训练好 ANN 之后,是时候测试网络了。测试神经网络涉及评估它在训练阶段未见过的一个单独的测试数据集上的性能。这一步骤有助于评估训练网络的泛化能力,并确保它可以在未见过的数据上做出准确的预测。为了测试我们训练的 ANN,我们可以将网络应用于未见过的数据,如下所示:
SimTarget = AbaFitNet(Input); Diff = gsubtract(Target, SimTarget); Performance = perform(AbaFitNet, Target, SimTarget)在这段代码中,我们开始对所有数据进行网络评估,获得一个性能值以与其他值进行比较。
以下性能值被返回:
Performance = 4.1539 -
现在,我们必须按照以下方式重新计算训练、验证和测试性能:
trainTargets =Target.* Trs.trainMask{1}; valTargets =Target.* Trs.valMask{1}; testTargets =TargetB.* Trs.testMask{1}; trainPerformance = perform(AbaFitNet,trainTargets, SimTarget) valPerformance = perform(AbaFitNet,valTargets, SimTarget) testPerformance = perform(AbaFitNet,testTargets, SimTarget)以下性能值被返回:
trainPerformance = 3.9470 valPerformance = 5.1255 testPerformance = 4.1468 view(AbaFitNet)最后,为了展示这些图表,我们可以使用以下命令:
figure,plotperform(Trs) figure,plottrainstate(Trs)plottrainstate()函数绘制了train()函数返回的训练状态。figure,ploterrhist(Diff) figure,plotregression(Target, SimTarget)最后,为了评估网络估计模型目标的能力,我们使用了
plotregression()函数。此函数绘制了相对于输出的目标线性回归图。以下图表将被打印:
图 5.4 – ANN 图表
这样,我们就能通过逐期评估训练参数的趋势。此外,我们还将有一个误差分布的统计,最后,通过回归图,我们可以得到预测值与真实值位置的指示。
在图 5.4中,我们可以分析模型的回归线。回归线是统计数据分析中的一个关键元素,提供了有关模型预测数据能力的宝贵信息。这条直线代表了自变量和因变量之间的数学关系,试图最小化观察值与模型预测值之间的差异。线的斜率反映了自变量每单位变化时因变量的平均变化。如果斜率接近1,则模型可以准确地预测数据。此外,截距表示当自变量为 0 时因变量的值。
模型的拟合优度是通过相关系数 R 来衡量的,它衡量了两个变量之间关联的强度。高 R 值表示良好的预测能力。需要注意的是,如果数据具有复杂或非线性模式,回归线在预测能力上可能存在局限性。在这种情况下,可能需要更高级的模型。
在详细分析了数据拟合的例子之后,我们现在将看到如何处理分类问题。
使用人工神经网络发现模式识别
模式识别是机器学习和人工智能的一个分支,它专注于识别数据中的模式或规律。它涉及从数据集中自动发现和提取有意义的信息,目的是将数据分类或归类到不同的类别或组中。总的来说,模式识别在自动化识别模式和基于数据做出决策的过程中发挥着至关重要的作用,使其成为许多现代人工智能系统的基本组成部分。
模式识别在自动化决策处理复杂数据方面提供了许多好处。然而,它也带来了与数据质量、可解释性和计算需求相关的挑战。为了有效地利用其优势,从业者需要精心设计和训练模型,同时意识到数据和方法中可能存在的局限性和偏差。
经典的图案识别方法使用传感器收集的数据作为分类系统的输入。这些数据通常代表典型的测量值,如运动分析系统中的运动学和动力学数据。这些测量值通常要经过预处理阶段。这样做是为了改善信号特性。后续的特征提取为后续分类提供特征向量。这个向量描述了特征空间中的输入测量值。在监督分类中,标记的特征向量被呈现给分类器进行训练。用于训练分类器的向量形成训练集。这些标签将特征向量分配给几个可能的类别之一。在识别阶段,训练好的分类器使用这个决策规则并自动将特征向量分配给一个类别。可以使用不同的分类器,使用不同的学习策略。
现在我们将分析一个使用 MATLAB 的图案识别的实际例子。在本节中,我们的目标是开发一个分类模型,可以根据各种患者数据对甲状腺疾病进行分类。涉及的步骤如下:
-
要启动这个过程,我们首先获取用于分析的数据。对于这项研究,我们将使用一个预装了 MATLAB 的现有数据集。如前所述,MATLAB 提供了几个易于导入工作区的数据库,可以使用
load命令后跟特定数据库名称来实现。在这个例子中,我们将使用thyroid_dataset作为我们的选择数据集:[Input,Target] = thyroid_dataset;在 MATLAB 工作区中,我们现在有两个变量:
Target变量,类别由第一行、第二行或第三行中的1表示。第一行中的1表示患者被分类为正常(非甲状腺功能亢进),第二行中的1表示功能亢进(甲状腺功能亢进),第三行中的1表示亚正常功能(甲状腺功能减退)。
当前具体问题是确定被转诊到诊所的患者是否患有甲状腺功能减退。需要注意的是,由于许多患者并非甲状腺功能亢进(92%),一个成功的分类器必须达到比 92%显著更高的准确率才能被认为是有效的。
-
现在,是时候选择适合神经网络的适当训练函数了。为了为网络设置特定的训练算法,您可以使用
trainFcn属性并分配所需函数的名称。在多种可用的算法中,我们将选择缩放共轭梯度(SCG)反向传播方法。这种方法是一种优化算法,常用于训练人工神经网络,尤其是在解决训练过程中权重更新问题。它是梯度下降、随机梯度下降(SGD)和各种反向传播变体的替代方案。SCG 以其在收敛到损失函数最小值时的效率和速度而闻名。SCG 算法的优点包括在许多情况下能够快速有效地收敛,使其成为训练相对较小到中等规模数据集的神经网络的不错选择。然而,它可能并不总是优于其他优化方法,尤其是在大型数据集或更复杂的网络架构中。优化算法的选择通常取决于具体问题、数据集大小和可用的计算资源:trainFcn = 'trainscg' -
在选择训练算法之后,下一步是构建神经网络。为了实现这一点,我们需要确定隐藏层中的节点数。在这种情况下,我们决定构建一个包含 10 个节点的单隐藏层函数拟合神经网络:
hiddenLayerSize = 10; -
我们可以使用
patternnet()函数构建一个模式识别网络。模式识别网络是设计用于根据目标类别对输入进行分类的前馈网络。这些网络的目标数据应包含所有值为0的向量,除了对应于它们所代表的类别的元素为1。patternnet()函数接受以下参数:-
hiddenSizes:指定一个或多个隐藏层大小的行向量。如果没有提供值,默认为10。 -
trainFcn:要使用的训练函数。默认为trainscg(SCG 反向传播)。 -
performFcn:训练期间使用的性能函数。默认为crossentropy。
该函数返回具有指定架构和设置的图案识别神经网络:
TyroidPatNet = patternnet(hiddenLayerSize, trainFcn); -
-
一旦构建了网络并预处理了数据,下一步是将数据划分为单独的训练、验证和测试集。
为了实现这一点,我们通常将可用的数据集划分为三个不同的子集:
-
训练集:这个子集用于训练神经网络。网络在训练过程中从输入数据和相应的目标输出中学习。
-
验证集:验证集用于微调网络的超参数并防止过拟合。它通过在训练过程中评估其未见过数据上的性能来帮助优化网络性能。
-
测试集:这个集用于评估训练后网络的最终性能。它提供了对网络在未见数据上泛化能力的无偏估计。
可以使用各种技术来划分数据,例如随机抽样、分层抽样或基于时间的分割,具体取决于数据的性质和特定问题:
TyroidPatNet.divideFcn = 'dividerand'; TyroidPatNet.divideMode = 'sample'; TyroidPatNet.divideParam.trainRatio = 70/100; TyroidPatNet.divideParam.valRatio = 15/100; TyroidPatNet.divideParam.testRatio = 15/100;在网络构建和数据预处理步骤中操作的重要性以及所使用的函数类型之前已经进行了广泛讨论。如果有任何疑问,建议您回顾该段落以获得更详细的理解。
-
-
在衡量网络性能方面,我们将选择交叉熵性能函数。这个特定的性能函数非常适合分类和模式识别任务。它通过计算交叉熵来量化网络的性能,交叉熵衡量的是估计和实际类别成员之间的差异。
通过使用交叉熵性能函数,我们可以有效地评估神经网络在分类输入方面的表现,并就其在给定模式识别问题上的有效性做出明智的决策。
通过将这些数据划分为这些单独的集,我们可以确保神经网络的性能不仅是在训练数据上衡量,而且还在未见数据上验证,从而使评估更加可靠,更能反映网络的真正能力:
TyroidPatNet.performFcn = 'crossentropy'; -
最后,我们现在可以设置绘图函数来可视化模拟的结果:
TyroidPatNet.plotFcns = {'plotperform','plottrainstate','ploterrhist', 'plotconfusion', 'plotroc'}; -
现在,我们准备使用
train()函数开始网络的训练过程:[TyroidPatNet,Trs] = train(TyroidPatNet,Input,Target);在训练神经网络时,将显示神经网络训练窗口。这个窗口包含四个部分,每个部分在整个训练过程中都提供有价值的信息:
-
神经网络:本节提供了神经网络架构和配置的摘要,包括层数、每层的节点数以及选择的训练算法。
-
算法:在此区域,展示了正在使用的训练算法的详细信息,例如特定的优化技术和收敛标准。
-
进度:进度部分显示了训练过程的实时更新,例如当前周期、训练错误和验证性能。它允许监控网络在连续周期中的性能改进。
-
图表:本节显示了各种图表,如训练和验证错误随周期的变化,这有助于对网络的学习进度和潜在的过拟合进行视觉评估。
神经网络训练窗口(图 5*.5*)提供了对训练过程的全面视图,提供了关于网络在不同阶段的运行和行为性能的见解。这些见解有助于微调网络,并做出明智的决定以优化其在当前模式识别任务中的性能。
-
图 5.5 – 用于模式识别的神经网络训练窗口
-
网络训练完成后,我们可以使用训练好的模型来测试它在训练阶段使用的相同输入数据上的性能。通过这样做,我们可以获得结果并利用它们进行评估。
在相同的数据上测试网络有助于我们评估模型对熟悉输入的泛化能力,并提供了关于其在处理现实世界场景中的有效性的见解。从这个过程中获得的评价结果有助于理解网络的准确性、精确度、召回率和其他相关指标,使我们能够就其整体性能和适用于预期模式识别任务的可适用性做出明智的决定:
SimData = TyroidPatNet(Input); Diff = gsubtract(Target, SimData); performance = perform(TyroidPatNet, Target, SimData); TargetInd = vec2ind(Target); SimDataInd = vec2ind(SimData); percentErrors = sum(TargetInd ~= SimDataInd)/numel(TargetInd);vec2ind()函数用于将向量转换为索引。它允许索引直接表示为自身,或者表示为包含一个1的行,该行对应于它们所代表的索引。在此问题中,TargetInd和SimDataInd是包含值1、2或3的向量,代表目标和输出所属的类别。这些向量的最后一行包含错误发生的百分比。获得了以下值:
percentErrors = 0.0742 -
现在,让我们继续进行网络的评估。以下命令提取了与训练、验证和测试子集相关的输出和目标。这些提取的数据将在后续步骤中用于构建混淆矩阵,这将有助于进一步评估网络在每个子集上的性能:
trOut = SimData(:,Trs.trainInd); vOut = SimData (:,Trs.valInd); tsOut = SimData (:,Trs.testInd); trTarg = Target(:,Trs.trainInd); vTarg = Target (:,Trs.valInd); tsTarg = Target (:,Trs.testInd); figure, plotconfusion(trTarg, trOut, 'Train', vTarg, vOut, 'Validation', tsTarg, tsOut, 'Testing', Target,SimData,'All')混淆矩阵是一个有价值的工具,它允许我们比较我们模型的分类结果与真实数据。它提供了对分类错误性质和数量的洞察。矩阵由单元格组成,其中对角线元素表示正确分类的案例数量,而离对角线元素表示错误分类的案例。
在理想情况下,机器学习算法应该完美地区分两个不重叠(互斥)的群体(例如健康和患病群体)。然而,在现实场景中,这两个群体往往在一定程度上重叠,导致算法产生一些错误阳性和错误阴性预测。
图 5.6显示了训练、测试和验证阶段的混淆矩阵,以及考虑所有三组数据一起的综合矩阵。
图 5.6 – 训练、测试和验证阶段的混淆矩阵,以及三种数据组合
这种视觉表示将帮助我们了解模型在不同阶段的表现以及考虑所有数据子集的整体分类性能。混淆矩阵已经计算了训练、测试和验证阶段,以及所有三个数据子集的组合。这个综合矩阵提供了模型在各个评估阶段的分类性能的详细概述,并给出了其在处理不同数据集方面的有效性的完整图景。
在图 5.6中,位于右下角的蓝色单元格代表正确分类案例的总百分比,这些案例通过位于对角线上的绿色单元格表示。矩阵中的红色单元格表示位于其他单元格中的错误分类案例的总百分比。混淆矩阵通过行表示实际值,列表示预测值来组织数据。例如,在图象的右上角,第一行表示 85 个案例被正确分类为1(正常),5 个案例被错误分类为2(过度功能),8 个案例被错误分类为3(亚正常)。通过观察混淆矩阵中每个图象右下角的蓝色单元格,我们可以推断出分类精度始终很高,超过 92%。这些结果证明了出色的识别能力。如果需要更高的精度,可以考虑重新训练数据。需要注意的是,起始数据集在所有类别之间并不正确平衡。这可能导致一个类别的性能值很高,而另一个类别的性能值很低。因此,始终建议在所有类别都正确平衡的数据集上工作。
评估网络性能的另一种方法是通过受试者工作特征(ROC)。ROC 曲线是评估模型在各个分类阈值下灵敏度和特异性的宝贵工具。后续命令生成每个评估阶段和整个过程的 ROC 图:
figure, plotroc(trTarg, trOut, 'Train', vTarg, vOut, 'Validation', tsTarg, tsOut, 'Testing', Target,SimData,'All')
ROC 是用于评估分类器性能的指标。它通过在区间 [0, 1] 上应用阈值值来评估每个类的分类器的质量。
在以下图中,显示了训练、测试和验证阶段的 ROC 图,以及来自所有三个子集的合并数据的 ROC 曲线。这些 ROC 曲线使我们能够分析分类器在不同分类阈值下每个类的灵敏度特异度,从而为它的判别能力和整体性能提供宝贵的见解。
图 5.7 – 训练、测试和验证以及三种数据组合的 ROC 曲线
在图中,每个轴上的彩色线条代表 ROC 曲线。ROC 曲线说明了随着分类阈值的改变,真正例率(TPR,或灵敏度)和假正例率(FPR)之间的关系。TPR 衡量的是分类器正确识别为正例的实际正例的比例。
TPR = TP / (TP + FN)
在这里,我们有以下内容:
-
TP = 真正例
-
FN = 假阴性
换句话说,它计算模型检测数据集中所有正例的能力。FPR 衡量的是分类器错误地将实际负例分类为正例的比例。它量化了模型产生的误报或假正例的比率。
FPR = FP / (FP + TN)
在这里,我们有以下内容:
-
FP 是假正例的数量,即被错误地分类为正例的负例数量
-
TN 是真负例的数量,即被正确分类为负例的负例数量
一个理想的测试应该显示出位于左上角的数据点,这表明 100%的灵敏度和 100%的特异性。线条越接近左上角,网络的性能就越好,这表明它能够在保持低 FPR 的同时实现更高的灵敏度,从而提高分类的准确性。
在使用 MATLAB 中可用的工具解决模式识别问题之后,在下一个实际例子中,我们将看到如何借助神经网络工具解决聚类问题。
使用 ANN 构建聚类应用程序
聚类是一种流行的无监督机器学习技术,用于在数据集中将相似的数据点分组在一起。聚类的目标是将数据划分为簇,使得同一簇内的数据点比其他簇内的数据点更相似。我们在第四章**,聚类分析和降维中深入探讨了这一主题。
在本节中,我们将了解如何在 MATLAB 环境中使用 ANN 解决聚类问题。到目前为止,为了在 MATLAB 环境中训练神经网络,我们使用了命令行中可用的命令,或者更简单地说,通过.m扩展名的脚本实现,以便我们可以在任何时候重现算法。但是,MATLAB 提供了现成的应用程序,允许我们使用向导来训练 ANN。我们将这样做来解决以下聚类问题:
-
要了解神经网络工具提供的应用程序概述,我们可以在命令行中键入以下内容:
nnstart将打开以下窗口:
图 5.8 – 神经网络启动窗口
有四个应用程序可供使用:nftool命令用于启动nprtool命令以打开模式识别应用程序。
在本例中,我们将使用聚类应用程序,它可以通过以下命令启动:
nctool
将打开以下窗口:
图 5.9 – 使用 ANN 进行聚类的 MATLAB 应用程序
在此应用程序中,我们可以使用向导来训练 ANN。让我们看看如何操作。
-
要开始,我们必须导入数据。对于本例,我们将使用 MATLAB 环境中已可用的数据集来解释使用 ANN 的聚类应用程序。为了在 MATLAB 工作空间中导入该数据集,我们使用以下命令:
[Input,Target] = simplecluster_dataset;现在,我们在 MATLAB 工作空间中有两个矩阵(
Input和Target)。我们将仅使用第一个(wx1,000 double)进行聚类问题,这是具有两个变量和 1,000 条记录的Input矩阵。通过检查Target(4x1,000 double)矩阵的结构,我们意识到有四个类别可用,因此数据有4组数据,这将有助于证明结果的有效性。现在,我们必须在应用程序中导入数据。为此,我们可以在图 5.9中显示的窗口中点击导入按钮。将打开图 5.10中显示的窗口:
图 5.10 – 在聚类应用程序中导入数据
已经检测到正确的矩阵用于预测器;如果您想更改数据,可以使用预测器字段旁边的浏览按钮选择正确的矩阵。在这种情况下,我们必须将观测值设置为列,因此我们将有 1,000 个观测值和 2 个特征。让我们点击确定按钮来导入数据。
-
我们已经在应用中设置了 ANN 架构,因此我们可以确定输入的数量和网络拓扑。输出将是一个具有 10x10 节点(100 个节点)的网络。
nctool通过使用自组织映射(SOM)来指导你解决聚类问题。此图创建了对输入空间的浓缩表示,捕捉了该空间中输入向量的密度模式以及输入空间拓扑的压缩、二维表示。SOMs,也称为Kohonen 图,是一种属于无监督学习算法家族的 ANN(人工神经网络)。它们由芬兰教授 Teuvo Kohonen 在 20 世纪 80 年代提出。SOMs 用于诸如降维、数据可视化、聚类和特征提取等任务。
SOM(自组织映射)背后的主要思想是将高维输入数据映射到一个低维网格或晶格上,使得相似的输入数据点被映射到附近的网格单元。这导致了对输入数据的拓扑表示,在地图上相似的数据点彼此靠近,从而便于可视化和解释。
SOMs 由两个基本层组成:输入层和输出层,通常被称为特征图。输入层是 SOM 的初始阶段。数据集中的每个数据点都竞争表示以识别其自身特征。过程从权重向量初始化开始,启动 SOM 的映射过程。
随后仔细检查映射向量,以识别使用随机选择的样本向量最佳代表所选样本的权重向量。考虑每个加权向量的邻近权重,所选权重演变成随机样本的向量,促进地图的增长和新模式的产生。在二维特征空间中,这些模式通常呈六边形或方形。整个过程重复 1000 次。
从本质上讲,学习过程如下:
-
分析每个节点以确定其权重是否与输入向量相似。与输入向量最佳匹配的节点被称为最佳匹配单元(BMU)。
-
然后确定 BMU 的邻域值,随着时间的推移,邻居的数量往往会减少。
-
BMU(最佳匹配单元)的权重向量进一步适应以类似于样本向量,导致周围区域发生相似的变化。节点越接近 BMU,其权重变化越大;越远离邻居,其权重变化越小。
-
重复步骤 2 N 次迭代。
这个迭代过程允许 SOM 细化其对输入数据的表示,最终导致一个更有组织和压缩的表示,能够捕捉数据的潜在结构。
现在,我们只需点击应用中的训练按钮就可以训练网络。几秒钟后,ANN 将被训练并准备好使用。
-
-
最后,我们可以使用应用窗口顶部的图表来查看结果。我们首先使用邻域距离,接下来的图表将绘制:
图 5.11 – SOM 邻域权重距离
这是一个图形表示,展示了 SOM(自组织映射)中相邻节点权重向量之间的距离。这个图有助于可视化学习过程中相邻节点权重的变化,从而深入了解 SOM 的拓扑结构和组织方式。我们可以使用Target矩阵中可用的类别来识别更多分离四个区域的彩色细胞。
蓝色六边形代表神经元。红色线条连接相邻的神经元。包含红色线条的区域中的颜色表示神经元之间的距离。较深的颜色代表较大的距离,较浅的颜色代表较小的距离。
SOM 的一个可视化工具是权重距离矩阵(也称为 U 矩阵)。要查看 U 矩阵,请在训练窗口中点击SOM 邻域距离。
这表明算法正确检测到了数据中的四个潜在簇。为了确认这一指示,我们可以绘制权重位置图:
图 5.12 – SOM 权重位置
在图 5.12中,四个簇可以很容易地识别。在这个图中,输入向量被描绘为绿色点,它通过显示代表每个神经元权重向量的蓝色灰色点来展示 SOM 对输入空间的分类。此外,相邻的神经元通过红色线条相关联,提供了 SOM 组织结构的视觉表示。
在分析了 ANNs(人工神经网络)的一个聚类案例之后,为了完成这个主题,我们将看到如何优化获得的结果。
探索高级优化技术
高级优化技术是用于提高优化算法效率和效果的有效方法。这些技术旨在克服传统优化方法的局限性,尤其是在复杂、高维或非凸优化问题中。
在机器学习中,高级优化技术对于有效地训练复杂模型、提高收敛速度、避免过拟合和处理高维数据至关重要。在下一个小节中,将列出机器学习中常用的一些高级优化技术。
理解随机梯度下降(SGD)
SGD 是一种在机器学习中用于训练模型的基本且流行的优化算法,特别是在大规模和复杂的环境中。它是传统梯度下降方法的一种变体,旨在解决处理大数据集时的效率和收敛问题。SGD 的随机性源于它使用随机的小批量进行每次迭代,这使得优化过程比使用整个数据集进行每次更新的常规梯度下降的确定性性质更加随机(随机化)。这种随机性将噪声引入梯度估计中,这有助于算法逃离局部最小值,更快地收敛,并更好地泛化。
任何优化算法的主要目标是使模型预测值与数据中观察到的实际值之间的差异最小化。观察值与预测值之间的误差越小,算法在模拟现实世界场景方面的效果就越好。最小化这种差异等同于优化基于模型构建的目标函数。
下降法是一种迭代技术,从初始点 x_0 ∈ R^n 开始,根据以下方程生成一系列点 {x_n} ∈ N:
x_{n+1} = x_n + γ_n * g_n
在下降法中,向量 g_n 表示搜索方向,标量 γ_n 作为步长参数,是一个已知的正参数,它决定了在 g_n 方向上的移动距离。这些 g_n 和 γ_n 的选择是为了确保在每次迭代中减少目标函数 f,遵循以下原则:
f(x_{n+1}) < f(x_n) ∀ n ≥ 0
我们选择向量 g_n 作为下降方向,确保直线 x = x_n + γ_n * g_n 与梯度向量 ∇f(x_n) 形成钝角。只要 γ_n 的值足够小,这保证了目标函数 f 的减少。这种方法允许有各种下降法,这取决于 g_n 的具体选择。
梯度是一个产生向量的函数,表示函数图形切线的斜率。它指向函数增加最快的方向。让我们考察以下图中所示的双曲函数:
图 5.13 – 梯度下降算法如何搜索全局最优解
梯度下降算法的主要目标是找到函数的谷底,即最低点。更精确地说,梯度充当导数,指示目标函数的倾斜或陡峭程度。
为了提供一个更清晰的类比,让我们想象我们在夜晚在山中迷路,能见度有限。我们的感知仅限于感知脚下地形的坡度。目标是到达山的最底部。实现这一目标涉及在最陡坡度的方向上连续迈步。我们迭代地进行,一步一步前进,直到最终到达山谷。
我们将考察一个有两个变量的函数,记为 f(x, y),其梯度由包含 f 的偏导数的向量表示。一阶导数与 x 相关,而二阶导数与 y 相关。计算这些偏导数后,结果如下:
δf/δx , δf/δy
初始表达式对应于关于 x 的偏导数,而后续表达式对应于关于 y 的偏导数。梯度由以下向量表示:
∇ f(x, y) = ⎡⎢⎣ δf/δx δf/δy ⎤⎥⎦
给定的方程表示二维空间中的一个函数,有效地形成了一个二维向量。这个向量的每个分量都表示相应函数变量的最陡上升方向。因此,梯度指向函数增长最显著的方向。
同样,如果我们考虑一个有五个变量的函数,结果梯度向量将包含五个偏导数。一般来说,一个有 n 个变量的函数会产生一个 n-维梯度向量,如下所示:
∇ f(x, y, … .z) = ⎡⎢⎣ δf/δx δf/δy … … δf/δz ⎤⎥⎦
当使用梯度下降时,我们的目标不是尽可能快地最大化 f;相反,我们旨在最小化它——具体来说,是要找到使函数最小化的最小点。
考虑一个函数 y = f(x)。梯度下降的基础在于观察,当函数 f 在 x 的邻域内定义良好且可微时,它会在与负梯度相反的方向上经历更快的下降。从初始值 x 开始,我们可以表示如下:
x**n + 1 = x**n - γ *∇ *f(xn)
其中,gamma (γ) 是学习率,delta (∇) 是梯度。
在这个背景下,我们有以下内容:
-
γ 代表学习率
-
∇ 表示梯度
当使用足够小的 γ 值时,算法在有限次数的迭代中收敛到函数 f 的最小值。本质上,当梯度为负时,它表明在该点目标函数在减少,意味着参数应该向更大的值移动以接近最小点。相反,当梯度为正时,参数应该向较小的值移动以达到目标函数的较低值。
探索 Adam 优化
自适应矩估计(Adam)是一种高级优化算法,常用于训练深度学习模型,尤其是在神经网络中。它是 SGD 优化方法的扩展,为每个参数单独调整学习率。
此梯度下降算法旨在通过迭代方法找到目标函数的最小值。在每一步中,计算梯度的近似值以引导下降,朝着有效减少目标函数的方向移动。在这个过程中,学习率参数的选择具有重要意义。此参数控制我们接近最佳目标函数值的速度:
-
如果学习率过小,则需要大量的迭代才能收敛到最佳值
-
相反,过高的学习率可能会导致我们忽略最佳解
Adam 根据梯度的第一阶矩(均值)和第二阶矩(未中心化方差)调整每个参数的学习率。这种适应性有助于算法更有效地收敛,尤其是在梯度幅度变化的高维空间中。
此方法通过纠正矩来解决初始矩偏差的问题。在训练的早期阶段,矩的估计可能偏向于 0,而 Adam 补偿了这种偏差,尤其是在学习率较低时。
Adam 结合了动量(累积过去梯度的部分以增强收敛)和RMSProp(根据最近梯度的幅度缩放学习率)的概念,在广泛的优化问题上表现良好。
Adam 优化算法在每次迭代中涉及以下计算:
-
计算损失相对于模型参数的梯度
-
使用移动平均更新梯度的第一和第二矩(均值和未中心化方差)
-
修正矩(尤其是在早期迭代中)的偏差
-
使用修正后的矩和学习率更新参数
总体而言,Adam 在许多深度学习场景中都很有效,通常比手动调整学习率的标准 SGD 收敛得更快。由于其自适应特性和强大的性能,它已成为训练神经网络的热门选择,并在许多深度学习框架中成为标准的优化算法。
引入二阶方法
二阶优化方法,也称为牛顿法,是用于解决优化问题的先进技术。与主要依赖梯度的第一阶方法(如梯度下降)不同,二阶方法利用了目标函数的梯度和二阶导数(Hessian 矩阵)。这些额外的信息可以导致更快收敛和更精确的解,尤其是在复杂和非凸优化景观中。
二阶方法不仅考虑函数的一阶导数(梯度),还考虑其二阶导数(Hessian 矩阵)。Hessian 矩阵捕捉曲率信息,并提供了关于目标函数表面形状的见解。这些方法通常使用目标函数在当前点周围的二次近似。这些近似考虑了一阶和二阶导数,并提供了对函数局部行为的更准确表示。
使用 Hessian 矩阵的曲率信息可以比一阶方法更快地收敛,尤其是在目标函数表现良好且平滑时。二阶方法对学习率或步长选择的选择具有更强的鲁棒性,因为它们本质上会根据函数的曲率调整步长。
二阶方法是优化中的宝贵工具,尤其是在计算资源允许计算二阶导数时。然而,它们的应用可能取决于所解决问题的具体特征。
二阶方法的一个例子是牛顿法。这种方法直接最小化目标函数的二次近似,使用 Hessian 矩阵。牛顿法是一种经典的优化算法,用于寻找函数的最小值或最大值。以艾萨克·牛顿爵士命名,这种方法利用了函数的梯度(一阶导数)和二阶导数(Hessian 矩阵)来迭代地接近最优解。
这种方法采用了牛顿法的结构,牛顿法通常用于找到函数的根,但在此情况下,它应用于函数 f 的导数。这样做的原因是,识别函数 f 的最小点等同于找到其第一导数 f′ 的根。在这种情况下,更新后的公式可以表示如下:
x n+1 = x n − f ′ ( x n) _ f ″ (x n)
在给定的方程中,我们有以下内容:
-
f′ (xn) 表示函数 f 的第一导数
-
f″ (xn) 表示函数 f 的第二导数
由于一阶和二阶导数的解析表达式都可用,通常优先考虑二阶方法而不是梯度下降,因为它们的收敛速度更快。然而,这些方法无论接近极小值还是极大值都会收敛。存在这种方法的变化形式,可以确保全局收敛,并通过避免使用直接方法求解确定搜索方向的系统来降低计算成本。
摘要
在本章中,我们了解了使用人工神经网络模拟典型人类大脑活动的方法。我们掌握了人工神经网络背后的基本概念,深入研究了基本神经网络架构的创建。这次探索包括输入层、隐藏层和输出层、连接权重和激活函数等元素。我们的理解扩展到了关于隐藏层数量、每层节点数量和网络训练算法的关键决策。
然后我们专注于使用神经网络进行数据拟合和模式识别。我们通过脚本分析来掌握通过命令行使用神经网络函数的方法。随后,我们进入了神经网络工具箱,它包含算法、预训练模型和应用程序,用于构建、训练、可视化和模拟浅层和深层神经网络。神经网络工具箱提供了一个易于使用的界面——神经网络入门 GUI,它作为神经网络拟合、模式识别、聚类和时间序列分析等任务的启动平台。
最后,我们介绍了一些常用的先进优化技术。这些方法是用来增强优化算法效率和效果的有效技术。它们的目的在于克服传统优化方法提出的限制,特别是在复杂、高维或非凸优化场景中。
在下一章中,我们将了解深度学习的基本概念。我们还将了解不同类型的深度学习,并理解卷积神经网络(CNNs)。此外,我们将学习如何使用 MATLAB 构建 CNN,并了解循环神经网络、长短期记忆网络和转换器模型。
第六章:深度学习和卷积神经网络
深度学习(DL)是一种基于多层人工神经网络(ANNs)的机器学习(ML)技术,它使许多应用达到了高精度。深度神经网络(DNNs)能够建模,并具有捕捉输入和输出信息之间复杂联系的能力。在高度有效的应用中,计算机视觉(CV)尤为突出,包括分类、图像回归和物体识别等活动。例如,一个高级神经网络可以产生实体的分层描绘,其中每个实体都由一组特征组成,这些特征以视觉基础的形式出现,如特定的轮廓、有向线条、表面细节和重复图案。卷积****网络(CNNs)的特点是具有卷积层,这些层使用过滤器在局部区域分析数据并生成激活图。然后,这些激活图由池化层处理,池化层将低分辨率数据聚合起来,以降低表示的维度并使处理更加计算高效。卷积层和池化层交替多次,直到图像由低分辨率的激活图表示。在本章中,我们将学习深度学习的基本概念,并了解如何在 MATLAB 环境中实现基于 CNN 的算法。
在本章中,我们将涵盖以下主要主题:
-
理解深度学习基本概念
-
探索深度学习模型
-
接近 CNNs
-
在 MATLAB 中构建 CNN
-
探索模型的结果
-
发现深度学习架构
如往常一样,我要感谢技术审稿人为我章节提供的有益建议。我将尝试按照他们给我的建议来应用。
技术要求
在本章中,我们将介绍机器学习的基本概念。要理解这些主题,需要具备代数和数学建模的基本知识。同时,也需要熟悉 MATLAB 环境。
要使用本章中的 MATLAB 代码,您需要以下文件(可在 GitHub 上找到:github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):
-
CNNPistachioClassification.m -
PistachioShort.zip
理解深度学习基本概念
DL是机器学习的一个分支,它基于使用算法来建模关于数据的高级抽象。这个学科是旨在学习数据表示方法的一系列方法之一。例如,一个观察结果,如图像,可以用不同的方式描述:作为每个像素强度值的向量,或者更抽象地,作为一组具有形状或显著特征的边缘或区域集合。这些可能的表示中,一些可能比其他表示更有效地促进训练另一个机器学习系统的过程。
对于从原始数据自动识别和提取相关特征,我们可以使用自动特征提取来消除手动特征工程(FE)的需求。这个过程简化了机器学习任务并提高了模型性能。
自动特征提取
在这个背景下,深度学习(DL)的一个核心方面是开发专门从数据集中自动提取显著特征的算法,这些特征随后可用于训练机器学习(ML)系统。考虑到如果没有这些技术,这些特征在训练之前必须手动生成并验证,这是一个重要的贡献。深度学习的基本概念是对输入数据进行不同级别的连续处理,其结果是特征的出现。考虑一张猫的图片。自动特征提取可以识别出猫的眼睛、耳朵和胡须等特征。
在神经网络(NN)领域,深度学习的概念随着所谓的深度神经网络(DNN)的创建而引入。其工作原理类似于传统的神经网络,但有一个明显的区别:隐藏神经元中间层的数量显著增加。与经典神经网络一样,DNN 能够模拟输入和输出数据之间的复杂关系。
最成功的应用领域之一是计算机视觉(CV),包括分类、图像回归和目标检测等任务。在目标检测任务中,DNN 可以构建一个分层表示对象,其中每个对象由一组以原始视觉元素(如特定边缘、方向线、纹理和重复模式)的形式出现的特征来识别。这种建模能力源于大量隐藏层中的神经元。
训练深度神经网络(DNN)
就训练阶段而言,仍然可以使用成熟的反向传播算法。与传统的神经网络一样,DNN 可能会遭受古老的过拟合问题。为了减轻这种情况,通常采用正则化技术,这些技术会在训练阶段的优化过程中介入。最常用的方法包括以下几种:
-
L2 正则化(权重衰减),通过向损失函数中添加网络权重的L2 范数(也称为欧几里得范数),乘以一个特定的常数,来影响优化器的操作。L2 范数是一个数学函数,用于衡量向量的长度。它定义为向量各分量平方和的平方根。L2 范数在机器学习和统计学中常用于衡量两个向量之间的距离。
向量 x 的 L2 范数公式如下:
||x||2 = sqrt(∑ (x _ i) ^ 2)
请按以下方式参考:
-
||x||_2 是 x 的 L2 范数
-
x_i 是 x 的第 i 个分量
-
-
L1 正则化(稀疏性),与之前的功能类似,但使用L1 范数。L1 范数常用于机器学习和统计学中,用于衡量两个向量之间的距离。它也被称为曼哈顿范数或出租车范数,因为它对应于出租车在城市街道上行驶的距离。向量 x 的 L1 范数公式为:
||x||1 = ∑ |x _ i|
这里:
-
||x||_1 是 x 的 L1 范数
-
x_i 是 x 的第 i 个分量
-
-
Dropout,在每次训练步骤中,隐藏层中随机选择的一组神经元被关闭,防止它们的输出影响后续神经元。
所有这些技术都是为了减少网络和训练数据样本之间的相互依赖性,有效地遏制过拟合。尽管反向传播训练由于其简单性和相对于其他方法更倾向于收敛到更好的局部最小值,提供了一个可靠的解决方案,但它可以在深层网络的实际计算中带来相当大的挑战。实际上,在深度神经网络中必须考虑一系列超参数,包括维度(就层计数和每层的单元数而言)、学习率、初始权重以及这些参数的优化——这个过程在时间和计算资源方面可能会变得难以控制。
在这个背景下已经提出了各种解决方案,包括使用数据的小批量来加速训练。然而,近年来 GPU 计算能力的显著提升是一个重大的突破。在网络操作中,主要的计算任务涉及矩阵和向量运算,这非常适合在 GPU 硬件上并行实现。
另一个由基于梯度下降的技术引起的问题,由于深层网络的复杂结构而加剧,是梯度消失问题。这个挑战源于链中的梯度计算和网络的大量层。通常使用的激活函数倾向于生成具有微小值的梯度,通常在[-1, 1]的范围内。由于链式计算,当在n-级网络的初始层计算梯度时,这会导致许多小值的乘积。因此,梯度随着n呈指数级下降,导致初始层的学习速度缓慢。
另一种解决方案是逐级以无监督方式对网络进行初步训练,然后通过反向传播进行最终完整训练。近年来,随着 GPU 的发展,另一种解决方法,即使用更快的硬件来对抗问题的主要症状——即训练过程的缓慢。在监督学习(SL)的情况下,反对深度神经网络(DNNs)的另一个观点是,网络在训练结束时达到所需结果所需的非常大的样本数据量(包括期望的输出)。这代表了一个重大障碍,因为对于某些任务来说,为每个示例生成期望的输出是一个可能需要非常长时间的操作。
在介绍了深度学习之后,现在让我们看看可用的不同类型的深度学习。
探索深度学习模型
为了应对不同的任务和挑战,已经开发出各种类型的深度学习架构和技术。以下是一些例子:
-
卷积神经网络(CNNs):主要用于图像和视频分析,CNNs 被设计来自动和自适应地从输入数据中学习特征的空间层次结构。它们在图像分类、目标检测和图像分割等任务中取得了高度成功。
-
循环神经网络(RNNs):RNNs 非常适合涉及序列的任务,如自然语言处理(NLP)和语音识别。它们具有内部记忆,能够保持关于先前输入的信息,这使得它们在处理序列数据时非常有效。
-
长短期记忆(LSTM)网络:作为一种循环神经网络(RNN),LSTMs 被设计用来克服训练深度网络时的梯度消失问题。它们特别适用于捕捉序列数据中的长距离依赖关系,因此在语言建模和机器翻译等任务中非常受欢迎。
-
生成对抗网络(GANs):GANs 由两个神经网络组成——生成器和判别器,它们在一种类似游戏的设置中进行互动。GANs 用于生成与给定数据集类似的新数据样本。它们已被用于图像生成、风格迁移和数据增强。
-
自编码器(AEs):AEs 用于无监督学习(UL)和数据压缩。它们由一个编码器组成,该编码器将输入数据映射到潜在空间,以及一个解码器,该解码器从潜在表示中重建输入。AEs 在降维、去噪和异常检测中找到应用。
-
Transformer 网络:Transformer 在自然语言处理任务中获得了流行。它们利用自注意力机制并行处理输入数据,这使得它们在处理序列中的长距离依赖关系时效率很高。从 Transformer 中获得的双向编码器表示(BERT)模型是一个突出的例子。
-
胶囊网络:胶囊网络旨在提高神经网络(NNs)对物体姿态和视角变化的鲁棒性。它们使用胶囊来表示物体的不同方面,允许它们捕获特征之间的层次关系。
-
神经图灵机(NTMs):这些架构将神经网络与外部内存相结合,使它们能够执行算法任务。它们被设计来学习算法过程,并已被用于排序和关联回忆等任务。
-
图神经网络(GNNs):GNNs 在图结构数据上运行,使它们适用于节点分类、链接预测和图级分类等任务。它们在社交网络分析、分子化学和推荐系统中都有应用。
这些只是深度学习(DL)架构和技术的多样性的几个例子,每个都是针对特定任务和数据类型定制的。例如,卷积神经网络(CNNs)旨在通过卷积层自动从图像中学习层次特征和模式,用于图像和空间数据分析。其典型应用包括图像分类、目标检测和图像分割。循环神经网络(RNNs)适用于序列和时间数据分析,通过循环连接保持先前输入的记忆,使它们能够捕获序列模式。典型应用包括自然语言处理(NLP)、语音识别和时间序列预测。长短期记忆网络(LSTM)是 RNNs 的改进版本,用于解决梯度消失问题,通过引入记忆单元在长序列中选择性保留和更新信息。这些技术的应用包括语言建模、机器翻译和情感分析(SA)。生成对抗网络(GANs)使用生成器和判别器网络来生成与给定数据集相似的新数据样本,这两个网络在最小-最大游戏中竞争。这种类型的深度学习特别适合图像生成、风格迁移和数据增强。最后,作为数据压缩和特征提取的通用学习(UL)的自动编码器(AEs)包括一个编码器将输入数据映射到低维潜在空间,以及一个解码器来重建输入数据。降维、去噪和异常检测是这些算法的代表性应用。
深度学习领域持续发展,新的架构和方法不断涌现,以解决不同领域中的各种挑战。
在这一点上,我们可以深入探讨深度学习的主要技术——即卷积神经网络(CNNs)。
接近 CNNs
如第五章中概述的,介绍人工神经网络建模,人工神经网络(ANNs)从生物神经网络中汲取灵感。这些 ANN 旨在通过模拟自然神经网络中观察到的机制来复制人类的认知过程。它们旨在估计或近似可能依赖于众多输入的函数,其中许多可能是陌生的。ANNs 通常被构想为相互连接的神经元网络,促进信息的交换。每个连接都有一个相关的权重,其值可以通过从经验中学习进行调整。这种适应性特征使神经网络能够适应不同的输入类型,并促进它们的学习能力(图 6*.1*):
图 6.1 – 带有隐藏层的 ANN 架构
ANNs 将神经元定义为执行数学运算以从一组输入值产生单个输出的中央处理单元(CPU)。神经元的输出由输入的加权和以及一个附加的偏置决定。每个神经元执行一个简单的任务:如果累积信号超过一个指定的激活阈值,则发生激活。前面的图示展示了基本的 ANN 结构,这基本上代表了 CNN。确实,就像后者一样,CNN 由通过加权分支(权重)相互连接的神经元组成;网络的训练参数是权重和偏置。
在 CNN 中,神经元之间的连接模式受到了动物世界视觉皮层中观察到的排列的启发。大脑的这一部分(视觉皮层)中的神经元对称为感受野的有限观察区域内的特定刺激做出反应。这些区域部分重叠,以涵盖整个视野。单个神经元对其感受野内刺激的反应可以通过卷积运算进行数学近似。
所有与 NN 训练相关的内容,包括前向/反向传播和权重更新,在此情况下都适用。此外,整个 CNN 使用一个单一的可微成本函数。然而,CNN 基于一个特定的假设:它们的输入具有特定的数据结构,例如图像。这一特性使它们能够结合定制的架构元素,以增强此类数据的处理。
CNN 采用全连接(FC)架构,其中每一层的每个神经元都与前一层的所有神经元连接(不包括偏置神经元)。通常,当面临输入数据大小的扩展时,这些架构无法有效地进行扩展。
在 CNN 中最常见的层是:
-
卷积层
-
池化层
-
修正线性 单元 (ReLUs)
-
FC 层
每个层的功能将在以下小节中详细说明。
通常,CNN 由多个连续的卷积和子采样(池化)层组成,随后是 1 个或多个 FC 最终层,特别是在分类任务的情况下。
为了应对现实世界的挑战,这些程序可以根据需要合并和重复。例如,你可以包含两层、三层甚至更多层的卷积。此外,你还可以灵活地多次应用池化操作以减小数据维度。如前所述,CNN 中通常使用多种级别。某些层包含可调整的训练参数(权重和偏差),而其他层则设计为执行预定义的功能。
卷积层
在 CNN 中,主要层类型是卷积层,在 CNN 中包含一个或多个这些层是必不可少的。从实际的角度来看,卷积层的参数与一系列可适应的滤波器相关联。与 CNN 不同,卷积层在三个维度上结构化,包括宽度、高度和深度。
每个滤波器占据一个小的空间区域(沿宽度和高度维度),同时跨越它所应用的输入体积的完整深度。在正向传播中,每个滤波器在输入体积的宽度和高度上移动——更准确地说,是卷积——生成一个特定于该滤波器的二维激活图(也称为特征图)。当滤波器穿越输入区域时,滤波器值与相应输入部分的值之间发生标量积操作。
从概念上讲,网络的目的是学习激活滤波器,这些滤波器可以检测输入的不同空间区域中的特定功能。将这些特征图(对于每个滤波器)沿深度维度组合形成卷积层的输出体积。这个体积中的每个元素可以解释为观察有限输入区域的神经元的输出,并且它与同一特征图中的其他神经元共享其参数。这种共享源于它们的共同起源——应用相同的滤波器。
过滤的数学步骤如下:
-
对齐滤波器和图像块。
-
将每个图像像素乘以相应的特征像素。
-
求这些乘积的和。
-
将每个和除以特征中像素的总数。
这里是卷积层输出的公式:
输出 = ∑ F(k, l) * I(i + k, j + l)) / S(k, l)
这里:
-
F(k, l)是(k, l)位置的特征图元素
-
I(i + k, j + l)) ) 是在(i + k, j + l)位置的图像元素
-
S(k, l)是特征像素的和
总结来说,需要强调的关键点包括:
-
局部感受野:层中的神经元连接到输入的一个小段,称为局部感受野。每个连接学习一个权重。
-
共享权重:由于显著特征(如边缘或块)可以出现在图像的任何位置,同一层的神经元共享权重。这意味着即使它们位于不同的输入点,层中的所有神经元也能识别出相同的特征。
-
卷积:在各个位置使用相同的权重模式。卷积的结果被称为特征图。
每个过滤器从前一层捕获特定的特征。因此,需要训练多个卷积过滤器来提取不同的特征。每个过滤器生成一个突出显示独特特性的特征图。
池化层
这些层系统地集成到网络中,以定期减少网络特定阶段的表示和体积的空间维度(宽度和高度)。这起到了双重作用:最小化参数数量,减少计算时间,并监控过拟合。池化层的作用是对输入体积的每个深度切片独立操作,以在空间上调整其大小。
在卷积过程中获得的每个特征,都会构建一个矩阵,并识别每个选定矩阵中的最大值,以压缩整个输入。步骤如下:
-
选择窗口大小(通常是
2或3)。 -
选择像素移动的步距(通常是
2)。在 CNN 中,池化层的步距决定了池化操作在输入特征图上滑动的程度。较大的步距意味着池化操作会跳过更多像素,导致输出特征图更小。较小的步距意味着池化操作会在输入特征图上更仔细地滑动,导致输出特征图更大。 -
将窗口滑动到过滤后的图像上。
-
对于每个窗口,确定最大值。
举例来说,这种方法将输入图像分割成方块组,并对每个生成的片段,提取最高值作为输出。CNN 还包含池化层,这些层被巧妙地放置在卷积层之后。池化层将输入分割成部分,并选择一个代表性值,采用最大池化或平均池化等方法。最大池化层捕获了先前卷积层检测到的最高特征。输出层评估前一层区域中潜在特征的存在,尽管没有精确的空间坐标。目标是使后续层能够处理更大的数据部分。最大池化加速了收敛速度,从而能够选择高度不变的特征,以增强泛化性能。
池化层的集成提供了以下好处:
-
减少了后续层的计算量
-
增强了关于空间定位的特征鲁棒性
-
在识别特定特征后,其相对于输入的精确位置不如其相对于其他特征的一般位置重要。
平均池化是一种下采样操作,它将特征图中的特征表示在特征图块中整合。通常,它是在 2x2 的特征图块中实现的,步长为(2, 2)。这个过程包括计算特征图每个块的平均值,这意味着特征图中的每个 2x2 正方形都被下采样到其平均值。为了说明,考虑前一小节中讨论的线检测卷积滤波器产生的 6x6 特征图。我们可以手动探索平均池化操作对该特征图第一行的应用。
在典型的 CNN 架构中,卷积层和池化层以重复的模式交替出现。
ReLUs
ReLUs作为神经网络中的关键激活函数,在单个网络中频繁使用,通常在每个卷积层之后出现多次。ReLU 层由执行函数*f(x) = max(0, x)*的神经元组成。引入这些层增强了网络的非线性,同时保持卷积层的感受野不变。
ReLUs 比双曲正切或 Sigmoid 等替代函数更受欢迎,主要是因为它们能够显著加速训练过程,同时不会大幅降低泛化精度。通过使用 ReLU 层,网络训练变得非常快,同时保持相似的性能。
这些层类型没有可调整的参数,因此执行固定函数。此外,它们也不具备任何可适应的参数。没有可调整参数的层简化了反向传播过程:到该点为止计算出的错误,源于后续层,被反向传播到前一层。
FC 层
这种层类型与具有 FC 架构的传统 ANN 中发现的任何层的结构相似。在FC 层中,每个神经元都与前一层的所有神经元建立连接,特别是与它们的激活进行交互。
与迄今为止在 CNN 中观察到的不同,这种层类型不遵循局部连接原则。FC 层建立跨越整个输入体积的连接,这自然导致大量连接。这种层类型中唯一的可调整参数是该层由多少个神经元K组成。FC 层的基本特征可以总结如下:将其 K 个神经元与整个输入体积相连接,并计算这些 K 个神经元中的每个神经元的激活。
在实践中,结果将是一个单一的 1 x 1 x K 向量,封装了计算的激活值。从三维组织输入体积到实现 FC 层后的一维单一输出向量(1 x 1 x K),这表明使用额外的卷积层变得不可行。在 CNN 领域,FC 层主要起到整合到目前为止收集到的信息的作用,将其呈现为单一值(其神经元之一的活动)。这个单一值随后成为最终分类过程中后续计算的基础。
在彻底检查了 CNN 的每个元素之后,现在适合深入研究一个完整 CNN 的整体结构。
在 MATLAB 中构建 CNN
在本节中,我们将看到如何从图像作为输入层开始训练 CNN 进行图像分类。CNN 的整体架构通常包括一系列卷积层,穿插着 ReLU 层,以及适当的标准化和池化层。最终,网络以一系列 FC 层结束,这些层通向输出层。
CNN 由两种主要类型的神经元组成:
-
处理神经元:这些神经元负责通过卷积函数处理输入图像的特定部分。它们的主要作用是从输入数据中提取独特特征。
-
聚合或池化神经元:这些神经元通过子采样聚合输入数据并减少其维度,提高了后续层处理效率。
通过组合给定层的输出值,可以重建一个中间图像,该图像作为后续层操作的起点:
图 6.2 – CNN 架构
基本概念涉及从一个大图像开始,通过逐步的增量步骤逐渐压缩数据,直到达到单一的结果。随着卷积通道数量的增加,神经网络理解和处理复杂函数的能力增强。
基本 CNN 的配置可以通过以下组件简要描述:
-
负责获取输入元素(如图像)的输入层
-
一系列卷积层,偶尔被 ReLU 层打断,并在适当的时候使用池化层
-
一系列 FC 层
-
提供最终结果的输出层
最近的研究表明,FC 层的重要性可能较小。然而,在当前背景下,概述的结构代表了 CNN 的典型架构。
目标识别指的是在一系列图像或视频中定位特定对象的能力。人类在图像中轻松识别各种对象,即使这些对象以不同的方式出现。此外,即使只看到对象的一部分,也可以区分对象。然而,这仍然是计算机视觉领域的挑战性任务。
在每张图像中,每个对象都拥有许多引人入胜的特征,可以从中提取出来以描绘该对象。这种描绘随后用于在测试图像中的多个对象中识别该对象时进行区分。确保从参考图像中提取的特征不受图像尺度、干扰、光照变化和畸变的影响,对于建立可靠的识别至关重要。
卷积神经网络(CNNs)特别适合这项任务,提供了在对象识别方面表现出色的算法。这是因为它们能够从图像中学习到对平移、尺度和旋转不变的特性。这是由于使用了卷积层,它们将过滤器应用于输入图像的小区域,然后将过滤器在图像上滑动。这使得网络能够学习到特定于图像不同部分的特征,而不管它们位于何处。此外,还使用了池化层来降低特征图的维度,这使得网络在训练和运行时更加高效。
对于 CNN 训练,我们将使用 Pistachio 图像数据集。该数据集提供了一组大量照片,用于分析开心果的品种。
它包含总共 2,148 张图像,分为 2 个类别——Kirmizi 和 Siirt:
-
首先,我们必须在 MATLAB 工作空间中加载数据集。数据集以 ZIP 格式存储在“技术要求”部分链接的网站上。为了方便读者工作,图像已根据类别划分到文件夹中,并按类别命名,同时调整大小以减轻数据重量。这些文件夹可在本书的 GitHub 网站上下载。一旦文件下载并解压,只需定义根文件夹的路径即可。此时,就可以按照以下方式将数据上传到 MATLAB 工作空间:
Data = imageDatastore('C:\MatlabScript\PistachioShort', 'IncludeSubfolders',true,'LabelSource','foldernames');为了加载数据,我们使用了
imageDatastore()函数,该函数使用ImageDatastore实体来管理一系列图像文件,尽管每个单独的图像可以适应内存,但整个图像集合可能不行。构建ImageDatastore实体涉及使用imageDatastore函数,其中可以定义其属性。随后,可以使用与实体关联的函数导入和处理数据。使用了三个参数,如下所示:-
Location= 'C:\MatlabScript\PistachioShort':这是数据集的位置。为了复制示例,读者只需简单地替换存储数据集的文件夹的路径。 -
IncludeSubfolders:可以通过IncludeSubfolders名称-值参数控制子文件夹的包含,该参数接受true或false。选择true以包含每个主文件夹内的所有文件和子文件夹,或选择false以仅包含每个主文件夹内的文件。当未明确指定IncludeSubfolders时,默认值为false。 -
LabelSource:标签数据的来源通过LabelSource名称-值参数确定,该参数接受none或foldernames。通过指定none,Labels属性将保持无标签状态。另一方面,指定foldernames会导致根据文件夹名称分配标签,这些标签随后存储在Labels属性中。可以通过直接访问Labels属性来对标签进行后续调整。需要注意的是,当FileSet对象作为文件或文件夹位置时,不能使用LabelSource名称-值参数。
我们现在可以通过随机过程查看一些加载的图像:
figure; RandId = randperm(2148,9); for i = 1:9 subplot(3,3,i); imshow(Data.Files{RandId(i)}); end在这段代码中,我们使用了
randperm()函数,该函数生成一个包含9个从1到2148范围内选取的不同随机整数的行向量。每个生成的数字都被用作索引,以识别存储在Data.Files属性中的图像文件路径。以下输出已返回:
-
图 6.3 – PistachioShort 数据集的图像样本
我们现在能够确定每个类别的图像数量。ClassItemsNumber变量代表一个包含标签及其各自相关联的图像数量的表格:
ClassItemsNumber = countEachLabel(Data)
我们使用了countEachLabel()函数,该函数生成一个汇总表,显示Data数据集中的标签及其各自关联文件的计数。
以下表格已打印:
ClassItemsNumber =
2×2 table
Label Count
_______ _____
Kirmizi 1232
Siirt 916
如我们所见,有两个类别,并且每个类别中都有足够的图像。
-
首先,有必要将我们可用的数据分为两个子集;第一个将用于训练,第二个用于算法验证。数据拆分是机器学习和数据分析中的一个关键步骤,其中将数据集分为两个或多个子集,用于模型的训练、验证和测试。我们有
2148个样本,分为1232个 Kirmizi 物种和916个 Siirt 物种。通常,数据会被分成 80%用于训练,20%用于验证。为此,我们决定使用 700 个样本进行训练,其余用于验证:TrainSamples = 0.8; [DataTrain,DataValidation] = splitEachLabel(Data,TrainSamples,'randomize');为了做到这一点,使用了
splitEachLabel()函数:这个函数将数据集中的图像文件分为两个不同的数据存储——即DataTrain和DataValidation。新创建的DataTrain数据存储包含了每个类别的初始TrainSamples值,而DataValidation数据存储则包含了每个类别的剩余文件。TrainSamples可以是一个介于0和1之间的分数值,表示分配给DataTrain的文件比例,或者是一个整数,表示每个类别要放入DataTrain的确切文件数。 -
现在,我们可以开始构建我们的 CNN。正如预期的那样,CNN 是由一系列相互连接的层组成的。要开始,你需要使用一个层来导入你的输入数据:
layers = [ imageInputLayer([64, 64, 3])layers变量是一个包含 CNN 层列表的数组,它定义了用于深度学习的神经网络架构。作为第一层,我们设置了imageInputLayer层:这个层作为图像输入,将 2D 图像输入到神经网络中,同时实现数据归一化。这个层提供了一个图像输入层,并定义了不可更改的InputSize属性。InputSize属性是输入数据维度的表示,表示为一个整数数组[h w c],其中h、w和c分别表示高度、宽度和通道数。在这种情况下,我们有一个高度和宽度均为 64 的 RGB 图像。在输入层之后,我们按顺序设置了第一个由三个层组成的块:
convolution2dLayer(3,8,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2)以 2:1 的比例下采样和步长 = 2 表示在池化操作中移动 2 列和 2 行。一个 2D 最大池化层通过将输入划分为矩形池化区域并随后确定每个区域内的最大值来实现下采样。
-
现在,我们将应用第二个与第一个相似的层块,改变参数:
convolution2dLayer(3,16,'Padding','same') batchNormalizationLayer reluLayer -
之后,应用了一个新的池化层:
maxPooling2dLayer(2,'Stride',2) -
最后,第三个层块:
convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer fullyConnectedLayer(2)在全连接层(FC layer)中,输入被乘以一个权重矩阵,然后通过一个偏置向量进行增强。偏置向量是一组在应用激活函数之前添加到神经元加权输入中的值。它在调整神经元激活阈值和使网络能够表示数据中的复杂关系方面起着至关重要的作用。
Size参数输出指定了输出大小;我们正在对两种类型的开心果进行分类,所以大小是2。这个层类别复制了在采用全连接设计的传统人工神经网络中通常存在的层的配置。在全连接层中,每个神经元与前一层的每个神经元建立连接,直接参与它们的激活。softmaxLayer是神经网络中使用的层类型,专门设计用于对输入应用softmax函数。softmax函数通常用于分类任务,将原始分数或 logits 转换为多个类别的概率分布。此层通常用作神经网络的多类分类的最终层,其中输出值被转换为概率,这些概率之和为1,使得模型的预测更容易解释。classificationLayer];分类层计算标准分类任务和涉及互斥类的加权分类任务的交叉熵损失。该层根据前一层的输出维度自动确定类别的数量。
现在,我们必须设置 CNN 的选项:
options = trainingOptions('sgdm', ... 'InitialLearnRate',0.01, ... 'MaxEpochs',50, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsValidation, ... 'ValidationFrequency',30, ... 'Verbose',false, ... 'Plots','training-progress');使用了
trainingOptions()函数来设置与网络训练相关的几个选项。以下选项被设置:-
sdm: 用于训练神经网络的求解器;我们使用了InitialLearnRate:训练中使用的初始学习率是一个正数值。当学习率过低时,训练过程可能会变得漫长。相反,如果学习率过高,训练可能会产生次优结果或发散。 -
MaxEpochs: 最大训练周期的数量定义为正整数。在梯度下降优化中使用小批量时,一个迭代表示旨在最小化损失函数的单步。一个周期是指训练算法在整个训练数据集上的完整迭代。 -
Shuffle: 数据洗牌选项。为此,我们在每个训练周期之前对训练数据进行洗牌,同样,在每次神经网络验证之前对验证数据进行洗牌。 -
ValidationData: 在训练期间要使用的验证数据定义为数据存储、表或包含预测因子和验证响应的单元格数组。 -
ValidationFrequency: 神经网络的验证率用正整数表示,表示交互次数。ValidationFrequency表示验证指标评估的迭代间隔。 -
Verbose: 用于显示训练进度信息。 -
Plots: 在配置trainingOptions中的training-progress训练选项并使用trainNetwork()启动网络训练后,将生成一个图表。此图表展示了每个迭代的训练指标。每个迭代涉及梯度的估计和网络参数的调整。如果你在trainingOptions中提供了验证数据,图表将还会在trainNetwork过程进行网络验证时,额外展示验证指标。
-
-
最后,我们必须训练网络:
Cnnet = trainNetwork(DataTrain,layers,options);trainNetwork()函数简化了深度神经网络(DNN)的训练过程。这种训练可以在 CPU 或 GPU 上执行。对于图像分类和图像回归等任务,可以使用多个 GPU 或本地/远程并行池同时训练单个神经网络。然而,使用 GPU 或并行处理需要 Parallel Computing Toolbox。此外,使用 GPU 进行深度学习(DL)需要兼容的 GPU 设备。下面的情节被返回到
trainNetwork()函数:
图 6.4 – 训练过程
图 6*.4* 中的情节将在整个训练过程中逐步更新。这样,就可以检查算法如何调整权重以达到收敛。图 6*.4* 中的情节由三条曲线组成:
-
训练误差:此曲线显示了网络在训练数据上的平均误差作为训练轮次数量的函数。轮次是网络在整个训练数据集上训练的次数。低训练误差表明网络正在很好地从训练数据中学习。
-
验证误差:此曲线显示了网络在验证数据上的平均误差作为训练轮次数量的函数。验证数据是网络未训练过的数据,用于评估网络对未见数据的泛化能力。低验证误差表明网络正在学习很好地泛化到新数据。
-
网络权重:此曲线显示了网络权重的大小作为训练轮次数量的函数。权重是网络从训练数据中学习的参数。稳定的权重曲线表明网络没有过度拟合训练数据。
在了解了如何在 MATLAB 中训练 CNN 之后,我们现在需要学习如何解释结果并正确使用验证指标。
探索模型的结果
评估结果是任何卷积神经网络(CNN)实现过程中的一个重要部分。当然,这对于任何基于机器学习的算法来说也是正确的。评估指标是用于评估模型、算法或系统在不同任务(如机器学习、数据分析、优化)中的性能和质量的定量度量。这些指标提供了一种客观量化模型表现好坏的方法,并比较不同的模型或方法。
采用的指标类型显然取决于我们正在实现的算法类型;在前一节中,我们实现了一个用于开心果物种分类的 CNN。因此,让我们看看这种类型算法可用的指标。
对于分类任务,我们可以使用以下指标:
-
准确率:正确分类的实例占总实例的比例
-
精确率:真正阳性预测与总阳性预测数之比,表明阳性预测的准确性
-
召回率(灵敏度):真正阳性预测与实际阳性总数之比,表明模型识别阳性病例的能力
-
F1 分数:精确率和召回率的调和平均数,提供两者之间的平衡
-
接收者操作特征(ROC)曲线:显示在不同阈值下真正阳性率和假阳性率之间的权衡
-
ROC 曲线下的面积(AUC-ROC):一个量化二元分类模型整体性能的指标
让我们尝试深化准确率的概念。准确率是分类任务中用于衡量数据集中正确预测实例比例的基本评估指标,提供了对分类模型性能的整体看法。准确率公式是:
准确率 = 正确预测数 / 总预测数
例如,如果你有一个包含 100 个实例的二进制分类问题,并且你的模型正确预测了其中的 90 个,那么准确率将是:
准确率 = 90 / 100 = 0.90,或 90%
虽然准确率是一个简单直观的指标,但在类别不平衡的情况下可能不适用,其中一类显著多于另一类。在这种情况下,如果模型在多数类上表现良好而在少数类上表现不佳,高准确率可能会产生误导。在这些情况下,精确率、召回率、F1 分数和其他指标可能更能准确地反映模型的性能。此外,在这种情况下,重要的是指出,当数据集在类别之间不平衡时,分类结果可能不适用于所有类别。
因此,让我们尝试将此指标应用于上一节中分析的案例研究,用于杏仁种类的分类。我们已经训练了网络,在这个阶段,我们可以使用它来对算法从未见过的数据进行分类:
-
为了进行验证,我们首先对
DataValidation子集中的收集到的图像进行分类:CNNPredLabel = classify(CNnet,DataValidation);此函数使用训练好的深度神经网络(DNN)对数据进行分类。可以使用训练好的网络在 CPU 或 GPU 上生成预测。使用 GPU 需要并行计算工具箱™许可证和兼容的 GPU 设备。传递了两个参数:训练好的卷积神经网络(
CNnet)和输入数据集(DataValidation)。 -
之后,我们必须提取输入数据的标签;此信息包含在图像数据存储中。我们只需使用
labels参数,如下所示:DataValLabel = DataValidation.Labels; -
让我们使用之前引入的公式来计算准确率:
ACC = sum(CNNPredLabel == DataValLabel)/numel(DataValLabel)返回以下结果:
ACC = 0.8695获得了 86.95%的准确率;这告诉我们,基于 CNN 的算法可以正确分类我们传递给它的 86.95%的开心果图像。我们还记得这些图像从未被网络训练算法使用过。
-
为了更好地理解模型的性能,我们可以绘制一个混淆矩阵。混淆矩阵是机器学习和统计学领域中用于评估分类模型性能的表格表示。它提供了一个全面的视角,展示了模型的预测与数据集中实际类别之间的匹配程度。
混淆矩阵分为四个类别:
-
真正例 (TP): 被正确预测为正例的实例
-
真负例 (TN): 被正确预测为负例的实例
-
假正例 (FP): 实际为负例但被错误预测为正例的实例(I 型错误)
-
假负例 (FN): 实际为正例但被错误预测为负例的实例(II 型错误)
矩阵格式如下所示:
预测正例 预测负例 实际正例 真正例 假正例 实际负例 假正例 真负例 -
图 6.5 – 混淆矩阵术语的含义
在 MATLAB 中,我们可以使用以下命令:
ConfMatrix=confusionchart((DataValLabel,CNNPredLabel))
此函数使用存储在DataValLabel中的真实标签和存储在CNNPredLabel中的预测标签生成混淆矩阵图表。然后它返回一个ConfusionMatrixChart对象。
打印以下结果:
ConfMatrix =
ConfusionMatrixChart with properties:
NormalizedValues: [2×2 double]
ClassLabels: [2×1 categorical]
返回以下输出:
图 6.6 – 混淆矩阵
在那个矩阵中,行对应于真实类别,列对应于预测类别。对角线上的单元格代表正确分类的实例,而对角线外的单元格代表被错误分类的实例。
我们还可以从混淆矩阵表中展示准确率的计算如下:
(TP + TN) / (Totalvalidationdata) = (204 + 169) / 916 = 0.8695
在*图 6**.6 中,我们可以注意到假负例的数量大于假正例。在某些应用中,假负例可能比假正例更严重。例如,在医疗诊断的背景下,避免漏诊疾病通常比错误地将健康人标记为患病更重要。然而,在其他应用中,假正例可能更严重。例如,在欺诈检测的背景下,避免错误地将无辜的人指控为欺诈通常比错过欺诈交易更重要。
在了解了如何实现 CNN 和正确解释结果之后,我们现在可以探索许多可用的深度学习架构。
发现深度学习架构
DL 模型本质上是由多层神经网络组成的,这指的是由多个隐藏层(至少两层)以层次结构排列的神经网络。这种层次结构安排促进了信息的共享和重用。在这个层次结构中,可以在忽略不必要的复杂性同时定位特征,从而增强不变性。在多级机器学习的领域内,更深层的层级从先前层的输出获取输入,并执行更复杂的转换和抽象。这种学习分层方法是从哺乳动物大脑的信息处理和学习方法中汲取灵感,使它们能够对外部刺激做出反应。
DL 架构是构建深度神经网络的基本蓝图,使它们能够有效地从数据中学习并表示复杂的模式和特征。这些架构定义了网络中的布局、连接和信息流,决定了数据在各个层如何被转换和特征如何被提取。多年来已经开发出几种显著的 DL 架构,每个架构都是为了解决特定类型的任务和数据而设计的。在接下来的章节中,我们将讨论最常用的架构。
理解 RNN
前馈神经网络(FNNs)通过向网络提供输入数据,然后将其转换为输出而运行。在监督学习场景中,输出通常代表与输入相对应的标签。这些算法本质上通过识别潜在模式将原始数据与特定类别相联系。相比之下,循环网络不仅包含被输入到网络中的当前数据,还包括它们随时间积累的信息。
RNN 体现了一个具有双向信息流的神经网络模型。与信号传播仅从输入到输出单向移动的前馈网络不同,RNN 表现出不同的行为。在 RNN 中,信号传播可以在神经网络层之间穿越,从一个先前层到后续层,在同一层内的神经元之间,甚至从一个神经元到它自己。RNN 在某一时刻做出的决策会影响其后续决策。因此,RNN 有两个输入来源——当前和近期过去——结合以确定对新数据的响应,这与人们在日常生活中做出决策的方式相似。
循环网络和前馈网络之间的关键区别在于连接 RNN 到其过去决策的反馈循环,暂时利用其输出作为输入。这一点强调了 RNN 的记忆方面。在神经网络中包含记忆有其目的:序列本身具有内在信息,RNN 利用这些信息执行前馈网络无法完成的任务。
访问此内存是基于内容而非特定的地址或位置。一种方法是将内存内容视为 RNN(递归神经网络)中节点上的激活模式。该概念涉及使用部分或噪声地表示所需内存内容的激活模式来初始化网络,从而使网络围绕所需内容稳定。RNN 属于 NNs(神经网络)的范畴,其中至少存在一个神经元之间的反馈连接,在网络的内部结构中形成一个有向循环。
图 6*.7* 展示了一个标准的 RNN,其中连接将隐藏层与输出层相连:
图 6.7 – RNN 架构
在前面表示循环网络的图中,隐藏层的权重使用输入层和输出层共同定义。本质上,我们可以将 RNN 视为 ANNs 的一种变体,它们在隐藏层的数量和数据模式流动方面有所不同。由于神经元之间的循环连接,RNNs 表现出独特的数据流动模式。与前馈网络不同,RNNs 可以在计算过程中利用内部记忆。RNNs 属于一类 ANNs,它们包含隐藏层之间的连接,这些连接随时间传递以促进序列的学习。
RNNs 从其独特的机制中获得了力量和有效性,该机制可以在不同的时间间隔存储和流动数据。这些网络擅长识别数据序列中的模式,使它们成为预测和预测的有价值工具。它们的适用性跨越多个领域,包括文本、图像、语音和时间序列数据。作为 ANN 家族中强大的成员之一,RNNs 体现了生物大脑的复杂性,包括记忆和计算能力。
分析 LSTM 网络
RNN 的一种特定形式是 LSTM(长短期记忆)网络,最初由 Hochreiter 和 Schmidhuber 在 1997 年提出。由于其对梯度消失问题的免疫性以及其在实际结果和性能方面的证明优势,这种架构在深度学习领域重新引起了关注。
梯度消失问题在通过基于梯度的学习技术训练 ANNs(人工神经网络)时提出了挑战。例如,反向传播方法根据误差梯度调整权重。然而,这些梯度在传播到网络深处时会呈指数级减小,有时变得极其微小,从而阻止权重的调整。在极端情况下,这甚至可能完全停止网络训练。
LSTM 网络为预测和分类序列数据提供了一个理想的解决方案,优于许多传统的 ML 方法。一个显著的例子是,谷歌在 2012 年从隐马尔可夫模型(HMMs)转向 DNN 进行语音识别。到 2015 年,谷歌已经采用了基于 LSTM 的 RNN,并结合连接主义时序分类(CTC)来提高语音识别。
CTC 作为训练 RNN 的输出和评分函数。LSTM 网络的优势在于其捕捉数据长期依赖关系的能力,增强了其在语音识别等场景中的实用性,在这些场景中理解句子上下文至关重要。
一个 LSTM 网络由相互连接的 LSTM 单元组成,每个单元都有输入、输出和遗忘门。这些门使得在单元内存上执行写入、读取和重置功能成为可能。与二进制不同,这些门是模拟的,通常由 sigmoid 激活函数管理,将值映射到范围(0,1)。这种乘性特性使单元能够在较长的时间内保留信息。输入门控制当前状态是否与传入的输入结合,而遗忘门在值降至零时重置单元的状态。输出门确定是否检索单元的内容,影响网络的总体输出。
下图解释了 LSTM 单元:
图 6.8 – LSTM 架构
基于 NN 的方法具有显著的潜力,能够提取内在数据特征和关系。值得注意的是,LSTM 网络已经展示了令人印象深刻的实际效果,拥有显著的识别率。然而,一个缺点是 NNs 作为黑盒模型。这意味着它们的行为缺乏可预测性,无法解码它们处理数据的基本逻辑。
介绍转换器模型
转换器模型是 NLP 领域乃至更广泛的领域的革命性架构。2017 年推出以来,转换器已经成为了从语言翻译到图像生成等一系列任务的基石框架。转换器模型的关键创新是自注意力机制。传统模型以线性方式处理序列,这限制了它们捕捉长距离依赖的能力。相比之下,转换器使用自注意力来衡量序列中不同单词相对于彼此的重要性,使它们能够考虑全局上下文和依赖关系。
转换器架构由一个编码器和一个解码器组成,每个都包含多个层。编码器处理输入数据,而解码器生成输出。这些层中的注意力机制允许模型关注输入或输出序列的相关部分。
转换器在各种应用中都可以成功应用:
-
机器翻译:例如 transformers 和 BERT 这样的模型在机器翻译领域设定了新的基准,使得翻译更加准确和具有语境意义
-
语言理解:BERT 捕获双向上下文,显著提高了语言理解任务的效果
-
文本生成:生成预训练 Transformer(GPT)模型生成连贯且具有语境相关性的文本,在聊天机器人、内容生成等领域得到应用
-
图像生成:视觉 Transformer(ViT)将 transformers 扩展到图像领域,在图像分类和生成任务中取得了有竞争力的性能
变压器成功的原因之一是其可并行化的结构,这加快了训练速度。此外,注意力机制使得能够捕捉关系,而无需显式地定义序列长度。
尽管变压器具有巨大的能力,但它们也面临一些挑战,例如大型模型的高计算成本以及生成有偏见或不适当内容的潜在可能性。研究人员继续改进和调整变压器架构,以解决这些问题并推动人工智能能力的边界。
摘要
在本章中,我们学习了深度学习(DL)的基本概念,并发现了如何在 MATLAB 环境中实现 CNN 算法。首先,我们探讨了深度学习如何实现自动特征提取,然后我们探讨了如何训练深度网络,接着我们体验了最受欢迎的深度学习架构。
然后,我们专注于 CNN 并对其进行了详细分析。我们了解了构成这个网络的不同层以及这些层执行的功能。然后,我们看到了如何在 MATLAB 环境中实现 CNN 以进行开心果的图像分类。我们学习了如何正确导入图像数据库,如何依次绘制网络的不同层架构,以及如何设置网络参数。最后,我们看到了如何使用评估指标来正确解释结果。
在最后一节中,我们介绍了最常用的网络,这些网络将在接下来的章节中更详细地研究和应用。
在下一章中,我们将了解自然语言处理(NLP)的基本概念,如何使用语料库和单词及句子分词,以及如何构建一个用于标注句子的模型,最后,我们将使用 MATLAB 实现梯度提升技术。
第三部分:机器学习实践
在本部分,我们将探索 MATLAB 应用领域的专业领域,揭示该软件在各个领域的巨大潜力。
使用 MATLAB 探索自然语言处理的迷人世界,在这里语言的复杂性被解码,使机器能够理解和回应人类的交流。过渡到视觉领域,第八章为我们打开了操作和理解视觉数据的大门,通过复杂的算法使像素变得生动。深入第九章的复杂模式,历史数据为明智的预测和战略决策铺平了道路。然后,见证第十章的力量,其中个性化的建议和推荐从复杂的算法中产生,增强了用户体验。在探索的结尾,沉浸在第十一章的领域中,揭示数据模式中的微妙偏差,为识别异常和潜在威胁提供了关键优势。加入我们,我们将导航这些多样化的应用,解锁 MATLAB 在塑造数据分析与决策支持未来中的作用。
本部分包含以下章节:
-
第七章, 使用 MATLAB 进行自然语言处理
-
第八章, MATLAB 图像处理和计算机视觉
-
第九章, 使用 MATLAB 进行时间序列分析和预测
-
第十章, MATLAB 推荐系统工具
-
第十一章, MATLAB 中的异常检测
第七章:使用 MATLAB 进行自然语言处理
自然语言处理(NLP)自动处理通过口语或书面语言传达的信息。这项任务充满困难和复杂性,很大程度上是由于人类语言的固有歧义。为了使机器学习(ML)和以人类典型方式与世界互动,不仅需要存储数据,还需要教会机器如何将数据同时转换为有意义的概念。随着自然语言与环境的互动,它会产生预测性知识。在本章中,我们将学习 NLP 的基本概念以及如何构建一个用于标记句子的模型。
在本章中,我们将介绍以下主要主题:
-
解释 NLP
-
探索语料库和单词及句子分词
-
实现一个用于标记句子的 MATLAB 模型
-
理解梯度提升技术
技术要求
在本章中,我们将介绍基本的机器学习概念。为了理解这些主题,需要具备代数和数学建模的基本知识。你还需要熟悉 MATLAB 环境。
要使用本章中的 MATLAB 代码,你需要以下文件(可在 GitHub 上找到:github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):
-
IMDBSentimentClassification.m -
ImdbDataset.xlsx
解释 NLP
自然语言处理(NLP)是一个致力于开发使计算机能够以模仿自然人类交流的方式与人类语言进行交互、理解和生成技术的领域。这涉及到各种技术和方法,旨在处理和分析自然语言的复杂性,如英语、中文、阿拉伯语等。目标是弥合人类语言和计算机语言之间的差距,使计算机能够理解并生成文本,就像它们在与人类对话者进行对话一样(图 7.1.1*):
图 7.1 – NLP 任务
NLP 致力于开发分析、理解和创建文本的信息技术工具,这些工具与人类理解产生共鸣,模仿与另一人类的互动,而不是与机器的互动。自然语言,无论是口语还是书面语,都是最本能和最普遍的交流方式。与正式语言相比,它具有更高的复杂性,经常携带隐含意义和不确定性,这使得其处理相当具有挑战性。
NLP 包括一系列任务,包括但不限于以下内容:
-
文本理解:这涉及到从文本中提取意义和信息。它包括诸如情感分析(确定文本的情感基调)、命名实体识别(识别人名、地点、组织等名称)和文本分类(将文本分类到预定义的类别)等任务。
-
语言生成:这一方面专注于生成连贯且符合上下文的类似人类的文本。它包括诸如机器翻译(将文本从一种语言翻译成另一种语言)、文本摘要(创建较长的文本的简洁摘要)和对话生成(构建自然的对话回应)等任务。
-
语音识别:NLP 也扩展到口语领域。语音识别技术将口语转换为文本,使得语音助手和转录服务等应用成为可能。
-
语言模型:NLP 的最近进展导致了大型语言模型如 GPT-3 的开发,这些模型可以根据接收到的输入生成非常类似人类的文本。这些模型在大量文本数据上训练,并且可以根据各种 NLP 任务进行微调。
-
聊天机器人和虚拟助手:NLP 是聊天机器人和虚拟助手的基础,它们可以与用户进行基于文本或语音的对话,提供信息、协助和回应。
NLP 领域是跨学科的,从计算机科学、语言学、认知心理学等领域汲取知识。它涉及到处理语言结构、统计模型、机器学习算法以及深度学习(DL)技术来处理、理解和生成人类语言。虽然已经取得了重大进展,但 NLP 仍然面临挑战,如处理上下文、理解细微差别以及真正理解人类交流的复杂性:
图 7.2 – NLP 中的文本分析和文本生成
这个领域的追求包括两个主要目标:文本分析和文本生成。这些原则导致了后续学科的产生,即自然语言分析(NLA)和自然语言生成(NLG)。我们将深入探讨这两个领域。
NLA
这个领域集中在增强机器对自然语言的理解能力。它涉及到将自然语言文本转换成结构化和明确的表现形式。NLA 包括使机器能够理解和解释人类语言的过程。其首要目标是弥合自然语言的无结构性质与计算机可以处理的结构化表示之间的差距。NLA 包括几个任务:
-
句法分析:这涉及到解析句子的语法结构,以理解词语之间的关系及其角色(主语、宾语、动词等)。它有助于识别词语是如何组织起来传达意义的。
-
语义理解:NLA 旨在理解词语和短语在上下文中的含义。它涉及从文本中使用的词语中提取潜在的概念和意图。
-
命名实体识别(NER):NER 是识别和分类文本中命名实体的过程,例如人名、组织、地点、日期等。
-
情感分析:情感分析旨在确定文本中表达的情感基调,将其分类为正面、负面、中性,甚至更细微的情感。
-
指代消解:指代是指文本中不同词语或短语指代同一实体的情况。指代消解识别并连接这些引用,以提供对文本的连贯理解。
-
文本分类:文本分类是指根据文本内容将其归类到预定义的类别或类别中。这用于诸如垃圾邮件检测、主题分类和内容标记等任务。
-
信息提取:这涉及到从非结构化文本中提取特定信息或结构化数据。一个例子是从新闻文章中提取日期、事件、关系或数值数据。
-
依存句法分析:依存句法分析分析句子中词语之间的语法关系,通常表示为树状结构,显示词语如何相互依赖。
-
语言模型:语言模型通常使用机器学习技术训练,用于根据周围文本的上下文预测词语或短语出现的可能性。这些模型在理解语言的概率和模式方面发挥着关键作用。
-
解析歧义:语言往往包含可以以多种方式解释的模糊结构。NLA 旨在解决这些歧义,以达到句子的预期含义。
NLA 从语言学理论、计算语言学和机器学习(ML)中汲取灵感。它是一个复杂的领域,随着技术的进步和对机器在多样化应用中理解和处理人类语言需求的增加而不断发展,包括搜索引擎、聊天机器人、情感分析工具等。
NLG
在这里,重点是使机器能够用自然语言构造句子。这涉及到开发能够产生特定语言中准确句子的应用程序。NLG 是 NLP 的一个关键方面,围绕计算机创建类似人类的文本。NLG 的主要目标是使机器能够生成连贯、上下文适当和语言准确的文本内容,模仿人类的交流方式。NLG 包含各种技术和过程,将结构化数据或信息转换为可读和可理解的语言。以下是关于 NLG 的几个要点:
-
机器翻译:机器翻译是 NLG 的最早形式之一,涉及将文本从一种语言翻译成另一种语言,同时保留其意义和上下文。现代机器翻译系统通常利用基于神经网络的途径以提高准确性。
-
文本摘要:NLG 用于总结较长的文本,如文章或文档,通过将主要思想和相关信息压缩成一个简洁且连贯的摘要。
-
对话生成:NLG 为聊天机器人、虚拟助手和其他对话代理提供动力。它涉及在对话中构建自然响亮的回应,考虑持续的上下文和用户输入。
-
数据到文本生成:NLG 用于将结构化数据,如统计数据或数据库条目,转换为人类可读的叙述。例如,从天气数据生成天气预报。
-
内容创作:NLG 系统可以根据预定义的模板或提示创建文章、报告和其他内容。这对于生成常规报告或新闻更新特别有用。
-
个性化信息:NLG 可以用于生成针对个人用户的个性化信息或推荐,例如,根据用户的浏览历史创建产品推荐。
-
故事讲述和创意写作:一些自然语言生成(NLG)系统可以生成虚构故事、诗歌或创意写作作品。虽然这些可能不如人类生成的内容先进,但它们展示了 NLG 在创意领域的潜力。
-
自动代码生成:在编程中,NLG 可以用于根据高级描述或规范生成代码片段或文档。
-
医疗报告:NLG 可以根据电子健康记录和医疗数据协助生成医疗报告或患者摘要。
NLG 技术可以从基于规则的途径到更高级的机器学习(ML)方法,如循环神经网络(RNNs)和生成预训练转换器(GPT)等转换器模型。这些模型从大量文本数据中学习模式和结构,以产生连贯且上下文相关的语言。
在需要以人类可读格式传达信息的应用中,NLG 是必不可少的,这使得技术更加易于访问和用户友好。尽管 NLG 系统已经取得了重大进展,但仍然存在挑战,包括在较长的文本中保持连贯性、确保准确性和避免生成内容中的偏见。
分析 NLP 任务
自然语言处理(NLP)包含一系列文本分析任务,形成一个分层结构。以下概述了句子分析所依赖的基础层:
-
形态分析:这一阶段的目标是将输入的语言字符串分解成一系列标记,这些标记对应于离散的单词、子单词和标点符号元素。通过标记化过程,文本被分割,形成一系列标记,每个标记代表文本中的一个单词。在这一阶段,有两个概念具有重要意义:词干和词元。词干是单词的基础形式,通过从其变化形式中去除屈折(如动词变形或名词复数)来获得。相反,词元代表单词的标准形式,通常选择以包含其所有屈折变化。这一阶段涉及识别每个单词的词干和词元,这可以通过两种不同的操作来完成:分别进行词干提取和词元还原。这些信息在后续分析阶段变得非常有用。这种方法的合理性在于对内存的高效利用——基于词成分及其组合形成的特定屈折形式的规则比管理大量库存中的每个单词作为独立元素要资源有效得多。
-
语法分析:要理解一个句子的含义,仅仅理解其构成单词的定义是不够的;同样重要的是要辨别这些单词之间的关系。这一阶段涉及对提供的文本进行句法检查。所有语言成分都被识别,包括动词、名词、形容词、副词、介词和代词。将每个单词标注为其相应词性的过程被称为词性标注。这个过程分为两个子过程:首先,浅层解析生成一个二叉树,其中识别出基本段——即名词部分(NP)和动词部分(VP)。其次,完全解析生成一个句法树,指定句子中每个单词的句法角色。
-
语义分析:语义分析阶段利用先前分析阶段获得的见解,包括单个词语的意义及其相互关系,以解释句子的整体意义。该过程使用命名实体识别来检测和分类由多个词语组成的实体组,这些实体可能包括人名、国家、事件等。语义处理旨在推断句子的潜在解释,特别关注句子中被检查的词语之间的意义互动。这种处理水平可能包括对具有多种意义的词语进行语义消歧,类似于对可以采用多种句法角色的词语进行的消歧。可以采用多种方法进行消歧,其中一些方法涉及评估特定语料库中每种意义的频率,而另一些方法则考虑上下文线索。此外,某些方法利用文档领域的语用知识来帮助消歧。
-
语用分析:这一阶段围绕识别文本所处的语境及其后续利用。具体来说,语用学深入探讨语境如何影响意义的解释。在这个语境中,“语境”指的是周围的环境,包括一系列非语言因素(如社会动态、环境线索和心理因素),这些因素影响语言表达。确实,人类语言不仅仅根植于其形态学、句法和语义属性;它还与句子嵌入的情境相关的外部知识紧密相连。在语用分析中,通常区分话语的字面意义和说话者的意图意义。字面意义是指对表达的直接解释,而说话者的意图是指说话者旨在传达的潜在概念。为了准确解释交流,可能需要几个因素。以下包括以下内容:
-
理解对话参与者的角色和地位
-
识别情境的时空背景
-
了解所讨论主题的知识
-
从另一个人说话中理解隐含意义的本领被称为语用能力。尽管这种分析很重要,但在文献中仍未得到充分详细地阐述,这主要是因为它所提出的巨大挑战。
引入自动处理
从自动处理的角度来看,句法层面呈现的挑战较少。复杂的句子可以被分析,其语法准确性可以被识别,其句法结构可以无缝重建。然而,语义层面则证明要复杂得多。在简单的情况下,以下方法可行:
-
一旦句子的句法结构被识别,句子意义就可以从单个词的意义中推断出来。
-
单个词的意义可以通过自动化手段从易于获取的词典中得出。
然而,出现了许多问题,如下所述:
-
首先,同一个词在不同的语境中可以有不同的含义。
-
其次,句子的句法结构可能是模糊的,有时会赋予同一序列的词不同的结构。
-
最后,某些习语短语具有与从其构成词的意义组合中得出的字面解释不同的含义。
人工智能通过利用语言处理程序可以访问的适当知识库来应对这些挑战。
话语层面引入了一个更加复杂的领域。主要的挑战来自于我们在对话中预测对话者心理状态的能力。本质上,有效的沟通需要表达对话者的意图,而这些意图只在他们的话语中部分显现。
现在我们已经介绍了 NLP 的基本概念,让我们分析一下那些能让我们从实际角度接近问题的具体内容。
探索语料库和单词及句子分词器
语料库、单词和句子分词的分析构成了全面语言理解的基础。语料库提供了用于分析的现实世界语言数据,单词构成了表达元素,句子分词将文本结构化为有意义的单元以供进一步研究。这三个概念在推进语言研究和增强 NLP 能力方面发挥着核心作用。
语料库
在语言学和 NLP 中,语料库指的是大量书面或口语文本的集合,这些文本是语言学分析和语言相关研究的有价值的数据来源。语料库提供了多样化的语言样本,使研究人员能够检查不同语境和体裁中语言使用、句法和语义的规律、趋势和变化。
语言学语料库代表大量口语或书面文本的集合,通常源自真实的交流语境(包括演讲或报纸文章)。这些集合被数字化,并经常伴随着计算机化工具以便于访问:
图 7.3 – 语料库基本关键概念的词云。单词以不同的大小显示,最频繁的单词最大。词云通常用于识别语料库中的关键概念
语料库的作用是检查语言的实际应用情况,并通过统计分析验证总体趋势。它们在当代词典学中扮演着关键角色,有助于诸如根据使用频率选择词元、识别涉及特定单词的典型语言结构以及理解不同语境中意义的细微差别等任务。
此外,语料库在语言技术(如自动翻译和语音识别)的发展中发挥着重要作用。在这些应用中,语料库被用来构建统计语言模型。它们在语言教育中也很有用,支持教学资源的创建。特别是对于高级学习者来说,通过观察其语境应用,语料库能够帮助他们推导出词的性质和语言结构。
语料库的例子有很多;以下是最常用的几个:
-
《布朗语料库》:英语中最早和最著名的语料库之一,它包含来自各种来源的超过一百万个单词的文本
-
《纽约时报语料库》:一个包含从 1987 年到 2007 年纽约时报新闻文章的大型语料库
-
《古腾堡语料库》:一个包含 60,000 多本公共领域免费电子书的集合
-
《语言数据联盟》(LDC)语料库:一个包含各种语料库的仓库,包括不同语言和领域的语料库
MATLAB 提供了各种工具来访问和处理语料库。以下是一些最常用的工具:
-
《文本分析工具箱》:一个全面的文本处理工具箱,包括分词、词干提取、词形还原和情感分析等功能
-
《自然语言处理工具箱》:一个用于自然语言处理任务的工具箱,如命名实体识别、词性标注和依存句法分析
-
《网络服务工具箱》:一个用于访问和交互网络服务的工具箱,包括那些提供访问语料库的服务
词
词是语言的基础单位,承载着意义并传达思想。对词的分析包括研究它们的形态、意义、关系和用法模式。这种研究可以包括诸如形态结构、词性分类、频率分布和语义关联等方面。研究词可以帮助语言学家理解语言的结构以及如何通过词汇传达意义。
在机器学习(ML)和深度学习(DL)任务中,单词被表示为数字向量。这样做是因为机器学习算法只能处理数值数据。将单词转换为向量的过程称为词嵌入。
存在两种主要的词嵌入类型:
-
词袋模型(BoW):在BoW中,语料库中的每个唯一单词被分配一个唯一的索引。然后,文档被表示为文档中每个单词计数的向量。假设词汇量大小为 4;在这里,一个表示“我喜欢猫”的样本文档被表示为[1 1 1 0]。在 BoW 中,我们简单地通过每个单词的频率来表示文档。例如,如果我们有一个包含 1,000 个单词的词汇表,那么整个文档由一个 1,000 维向量表示,其中向量的第i个条目表示文档中第i个词汇词的频率。
-
Word2vec:Word2vec 是一种更复杂的词嵌入方法,它考虑了单词出现的环境。Word2vec 学习两种类型的嵌入:词嵌入和上下文嵌入。词嵌入是表示单个单词的向量,而上下文嵌入是表示给定单词周围单词的向量。例如,“猫”的词嵌入可能是[0.1, 0.2, 0.3],而“猫”的上下文嵌入可能是[0.4, 0.5, 0.6]。
句子分词
在句子分词过程中,我们在每个句子中识别称为标记的原子元素。这些标记是分析评估句子本身的基础。因此,在分词阶段,我们不仅识别评估这些元素,而且偶尔还会转换否定结构。这导致文本被分割成标记,这些标记可以被视为不可分割的单位。对于使用空格分隔单词的语言来说,这项任务相对简单,但对于具有连续拼写系统的语言来说,它变得相当复杂。专注于像英语这样的语言,它属于前者,一个标记可以定义为任何由空格包围的字符序列。然而,值得注意的是,这个定义允许有多个例外。在单词边界在书面文本中未明确表示的语言中,这个过程被称为词分割:
图 7.4 – 单词分词过程
在分词的更广泛背景下,需要解决几个挑战:
-
缺乏分隔单词与前后标点符号的空间
-
字符序列未用空格分隔的实例应被视为两个单独的标记
-
字符序列用空格分隔的场合应被视为一个单独的标记
-
管理大小写变化
-
导航拼写习惯的变化
最终,在这个过程的最后,我们识别出一个具有指定意义的字符串,我们称之为标记。每个标记都由一个标记名称和一个可选的标记值组成的对构成。
现在我们已经详细研究了 NLP 的基础知识,我们可以继续分析在 MATLAB 中实现句子分类器的实现。
实现 MATLAB 模型以标记句子
在本节中,我们将讨论一个在当今社会非常受欢迎的非常有趣的话题。我指的是评论在影响顾客做出正确决策的兴趣方面的重要性。
介绍情感分析
情感分析,一种利用 NLP 的技术,从文本中提取和分析主观信息。分析大量数据集揭示了影响各个领域的集体意见。虽然手动情感分析具有挑战性,但自动方法已经出现。然而,由于人类语言的细微差别,自动化语言建模既复杂又昂贵。此外,方法论在不同语言之间有所不同,增加了复杂性。
一个主要挑战在于确定意见的极性。极性分类是主观的,因为不同的人根据他们的价值观对同一句话有不同的理解。社交媒体的兴起提高了对情感分析的兴趣。随着在线表达的增多,这个领域对商业来说已经成为推广产品、识别机会和保护声誉的有价值工具。情感分析算法中使用简单术语来传达意见引发了挑战。文化影响、语言差异和上下文因素使得将书面文本转换为二元积极或消极情感变得非常复杂:
图 7.5 – 情感分析极性
高级情感分析旨在确定特定的情绪,如快乐、悲伤或愤怒。例如,它可以涉及将歌曲评论不仅分类为正面或负面,还可以预测数值评分,对酒店评论进行全面分析,并为舒适度、噪音水平和设计等方面提供评分。
此外,将给定的文本分类为两类之一:客观或主观是可行的。文本可能包含客观信息,如新闻文章中所示,或者它可以是主观的,例如采访中表达的政治观点。句子的主观性通常取决于其上下文,甚至一份客观文件也可能包含主观短语,如引语。区分主观性和客观性可能比分类极性更具挑战性,因为它在很大程度上依赖于周围的文本上下文。
情感分析提供了几种方法,其中最常用的方法可以分为四个广泛的类别:
-
基于词典的算法:这些技术识别文本中的情感关键词,并赋予它们预定的亲和力以代表特定的情感。
-
基于规则的算法:这种方法根据明确的情感类别对文本进行分类,依赖于诸如快乐、悲伤或无聊等明确的情感词的存在。
-
统计方法:在这个类别中,目标是确定情感来源(主题)和目标(被评估的对象)。为了在上下文中衡量意见并识别被评估的属性,通过广泛分析文本中的词语之间的语法关系。
-
机器学习算法:这些方法使用各种学习算法来推断情感,通常利用具有预定义分类的数据集(监督方法)。学习过程是迭代的,需要构建将极性与不同类型的评论关联起来的模型,并在必要时进行主题分析以获得更全面的理解。
表情符号和表情符号的使用正在增加。人们不再仅仅依赖文字,而是经常使用小小的圆形面孔和其他符号来表达他们的情感。这些视觉元素被证明是迅速而愉快地传达信息的宝贵工具。使用 DL 架构,可以学习表情符号和情感之间的关系。例如,一种 DL 方法可能在一个包含大量文本和表情符号的语料库上训练,以学习表情符号的特征,这些特征最能够预测情感。
让我们学习如何应用 DL 提供的工具来解决情感分析的实际案例。
电影评论情感分析
评论已成为企业繁荣发展的关键要素,它们提供了来自客户的宝贵反馈,并推动购买决策。评论作为潜在买家可靠的信息来源,为卖家提供改进产品和服务的洞察。此外,评论促进了用户参与度,放大了口碑营销的力量,对公司的在线声誉产生重大影响。对于所有规模的企业来说,确保获得正面评论对于维持盈利至关重要。
社交媒体和互联网的兴起极大地改变了消费者的购买行为。潜在买家现在在做出购买决策之前会积极寻找在线评论和信息,对传统口碑推荐的依赖减少。他们变得更加独立和挑剔,仔细考虑他们的选择。
在过去,影评人在塑造消费者偏好方面扮演着主导角色,影响电影选择并培养批判性思维。然而,随着消费者生成评论的出现,这一范式发生了转变,消费者意见现在在影响购买决策方面具有更大的影响力。这种意见民主化赋予了消费者分享他们的经验和塑造文化景观的权力。
对于将电影评论分类为正面或负面情感的任务,我们将使用 IMDb 电影评论数据集的简短版本。该数据集专门设计用于二元情感分类,并包含 748 条恰当地标记的评论。在这个例子中,数据集仅使用两个特征:评论和类别进行了充分回顾。
让我们学习如何使用 RNN 构建用于分类句子的模型。
使用 LSTM 模型进行句子标记
LSTM 模型是循环神经网络(RNN)的一种高级形式,能够在序列中学习长期依赖关系,使其成为处理序列数据(如文本、语音和时间序列数据)的强大工具。这使得它在诸如标签句子分类等任务中非常理想,这些任务的目的是根据句子的整体情感为其分配标签。LSTM 已经在包括情感分析、机器翻译、语音识别和自然语言生成在内的各种任务中得到了成功应用。
要学习如何在 MATLAB 中实现用于标记句子的模型,我们将使用大量在线用户制作的电影评论:。
-
首先,我们需要将数据集导入 MATLAB 工作空间。您可以在项目的 GitHub 页面(
ImdbDataset.xlsx)上找到.xlsx格式的数据集。为了简化此任务,数据集已被适当裁剪。一旦您下载了文件,您只需指定根文件夹的路径。然后,您可以像这样将数据加载到 MATLAB 工作空间中:ImdbData = readtable("ImdbDataset.xlsx",'TextType','string'); ImdbData.Class = categorical(ImdbData.Class);在加载数据后,我们需要通过创建直方图来可视化数据集中类别的分布。这将帮助我们评估数据是否均匀分布:
figure histogram(ImdbData.Class); xlabel("Class") ylabel("Frequency") title("Class Distribution")将绘制如图图 7**.6所示的图表:
图 7.6 – 电影评论的类别分布:0 表示负面,1 表示正面
-
接下来的步骤是将数据分为训练集和验证集。将数据分为训练集和用于验证和测试的单独保留集:
DataSplitting = cvpartition(ImdbData.Class,'Holdout',0.3); -
cvpartition()函数建立了一个随机数据集分区。您可以使用此分区创建用于通过交叉验证评估统计模型的训练集和测试集。将保留百分比设置为 30%;这意味着 70%的数据将用于训练,而剩余的 30%将保留用于验证。现在,我们将使用训练选项来获取交叉验证的训练索引,以及测试选项来获取测试索引:
TrainDataset = ImdbData (training(DataSplitting),:); TestDataset = ImdbData (test(DataSplitting),:);然后,我们将从分割的表中检索评论数据和相应的类别:
TrainReview = TrainDataset.Review; TestReview = TestDataset.Review; TrainClass = TrainDataset.Class; TestClass = TestDataset.Class; -
到目前为止,我们的数据已经准备好使用,我们可以开始预处理评论数据。我们将使用一个名为
preprocessText的函数,该函数用于标记化和文本预处理。此函数执行以下任务:-
使用
tokenizedDocument对文本进行标记化。 -
使用
lower将文本转换为小写。 -
使用
erasePunctuation移除标点符号。
我们将应用
preprocessText函数对训练数据和验证数据进行预处理:TrainDoc = preprocessText(TrainReview); TestDoc = preprocessText(TestReview);之后,我们必须应用单词编码技术。这种方法涉及将人类语言(如英语)中的单词转换成适合广泛计算任务的数值或符号格式,特别关注在自然语言处理(NLP)和机器学习(ML)中的应用。
-
-
为了将文档转换为数值索引序列,我们将使用
wordEncoding()函数,如下所示:EncText = wordEncoding(TrainDoc);此函数将词汇表中的单词与数值索引关联起来。
要将评论作为 LSTM 的输入,所有输入必须具有相同的长度。然而,数据集中的评论长度各不相同。一种解决方案是截断较长的评论并填充较短的评论,以确保它们的长度相同。为了截断和填充评论,首先选择一个目标长度。然后,截断较长的文档并填充较短的文档。为了达到最佳效果,目标长度应该足够短,以避免丢弃大量数据。
-
为了找到一个合适的目标长度,我们可以可视化训练文档长度的直方图:
NumDoc = doclength(TrainDoc); figure histogram(NumDoc) xlabel("Number of tokens") ylabel("Number of Reviews")首先,我们计算了每条评论的长度。然后,我们绘制了分布的直方图。以下图表被打印出来:
图 7.7 – 电影评论的标记分布
通过分析电影评论的标记分布,我们会注意到大多数评论在 0 到 30 之间有几个标记。因此,我们可以选择这个数字作为目标长度:
TokNum = 30;
-
现在,我们需要将评论转换为数值索引序列:
RewTrain = doc2sequence(EncText,TrainDoc,'Length',TokNum); RewTest = doc2sequence(EncText,TestDoc,'Length',TokNum);为了做到这一点,我们使用了
doc2sequence()函数,该函数将文档转换为适合深度学习的序列。此函数提供了一个包含文档中单词的数值索引的单元格数组,这些索引由提供的单词编码确定。序列数组中的每个元素都是一个向量,由表示相应文档中单词的索引组成。 -
现在,我们将继续定义 LSTM 网络的架构:
inputSize = 1; embeddingDimension = 150; numHiddenUnits = 50; numWords = EncText.NumWords; numClasses = numel(categories(TrainClass)); layers = [ ... sequenceInputLayer(inputSize) wordEmbeddingLayer(embeddingDimension,numWords) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]要将序列数据输入网络,包含一个输入大小为 1 的序列输入层。一个具有 1 维的序列输入意味着每个数值编码的标记由一个 1x1 标量表示。随后,引入一个维度为 150 的词嵌入层,这应该与单词编码中指定的单词数量相匹配。词嵌入层学会将单词映射到向量中,以捕捉单词的意义。随后,包含一个具有 50 个隐藏单元的 LSTM 层。对于使用 LSTM 层的序列到标签分类任务,最后配置
OutputMode。最后,添加一个与类别数量相同的全连接层,然后是 softmax 层和分类层。已定义的 LSTM 架构如下所示:
layers = 6×1 Layer array with layers: 1 '' Sequence Input Sequence input with 1 dimensions 2 '' Word Embedding Layer Word embedding layer with 150 dimensions and 2410 unique words 3 '' LSTM LSTM with 50 hidden units 4 '' Fully Connected 2 fully connected layer 5 '' Softmax softmax 6 '' Classification Output crossentropyex -
现在,我们必须指定训练选项:
options = trainingOptions('adam', ... 'MiniBatchSize',16, ... 'GradientThreshold',2, ... 'Shuffle','every-epoch', ... 'ValidationData',{RewTest,TestClass}, ... 'Plots','training-progress', ... 'Verbose',false);设置了以下选项:
-
adam solver: Adam,源于自适应矩估计,是机器学习和深度学习领域广泛采用的优化算法。其主要作用是在模型训练过程中调整参数,同时包含权重和偏差。Adam 因其训练神经网络的有效性而特别闻名。 -
MiniBatchSize: 这是一个超参数,决定了在执行 Adam 或类似优化算法的每个训练迭代中使用的示例数量,这些示例是单个数据点或样本。 -
GradientThreshold: 这指定了训练过程中的梯度阈值。它用于使训练模型更加稳定和高效,尤其是在处理 RNN 或深度架构时。 -
Shuffle: 此选项在每个 epoch 中对数据进行洗牌,以增加算法中的随机程度。 -
ValidationData: 此选项指定用于验证过程的数据。 -
Plots: 使用此选项,训练过程将通过一个升级过程进化的图表进行检查。 -
Verbose: 训练过程的输出将被隐藏。
-
-
最后,我们可以开始训练过程:
LSTMNet = trainNetwork(RewTrain,TrainClass,layers,options);将打印以下图表:
图 7.8 – LSTM 的训练过程
训练过程通过构建一个能够返回 75.89%验证准确率的网络来处理数据。鉴于可用数据量较小,这个结果可以被认为是令人满意的。
为了提高模型的性能,我们可以尝试使用稍大的 LSTM 单元数量(100 而不是 50)进行模拟。然而,将嵌入维度(从 150 变为 100)可以提高验证准确率至至少 85%。
现在我们已经分析了如何构建用于分类电影评论的 LSTM,让我们学习如何使用集成方法提高预测的准确性。
理解梯度提升技术
为了提高算法的性能,我们可以执行一系列步骤并使用不同的技术,具体取决于算法的类型和要解决的问题。第一种方法涉及对数据进行彻底分析,以识别可能的不准确或不足之处。此外,许多算法都有可以调整以实现更好性能的参数——更不用说特征缩放或特征选择等技术。一种流行的技术是结合不同算法提供的功能,以实现更好的整体性能。
接近集成学习方法
集成学习的概念涉及使用多个模型以最大化性能的方式组合,通过利用它们的优点并减轻它们的相对弱点。这些集成学习方法基于弱学习模型,这些模型本身不能达到高水平的准确性,但结合在一起可以产生稳健的预测。在集成学习的背景下,弱学习器是一个可以产生略好于随机结果的模型,而强学习器则接近理想模型,可以克服传统模型典型的问题,如过拟合。
每个使用的模型都会返回可能正确或错误的预测。在监督学习问题中,预测误差的计算如下:
误差 = 偏差² + 方差
误差的两个基本组成部分是精确度和方差。使用集成方法的目标是通过尝试减少方差和偏差来获得可靠的预测。方差是模型对给定数据点的预测的变异性。具有高方差的模型被称为过拟合,这意味着它在学习训练数据中的噪声而不是潜在的模式。这也可能导致较差的泛化性能。偏差是模型的平均预测值与正确值之间的差异。具有高偏差的模型被称为欠拟合,这意味着它没有学习数据中的潜在模式。这可能导致模型在未见过的数据上表现不佳。这两个组成部分之间通常存在权衡:低精度的分类器往往具有高方差,反之亦然。机器学习的目标是找到一个具有良好偏差和方差平衡的分类器。这被称为偏差-方差权衡。一般来说,很难找到一个既具有低偏差又具有低方差的分类器。然而,可以使用一些技术来减少偏差和方差,例如特征选择、正则化和交叉验证。
为了提高模型的准确性,假设不同的分类器可以在每个样本上犯不同的错误,但会在正确的分类上达成一致。通过平均分类器的输出,通过平均误差成分来降低整体误差。通过模型组合输出并不一定保证比其他模型有显著更好的分类性能,但它有助于降低选择表现不佳的分类器的可能性。
有几种集成方法。它们主要在处理数据的方式上有所不同。最常见的是以下几种:
-
Bagging
-
随机森林
-
Boosting
最早的集成模型是在 1990 年代开发的,但在撰写本文时,没有具体的研究可以帮助用户选择最合适的元分类器。这些方法被广泛用于解决各种学习问题,包括特征选择。在接下来的章节中,我们将分析每种集成技术的基本原理。
Bagging 定义和意义
Bagging 是一种集成学习方法,它收集弱学习器(基本模型)的预测,比较它们,并将它们组合成一个单一预测。bagging 的独特之处在于每个决策树的训练集是如何选择的。
为了创建每个训练集,bagging 使用了原始数据集上的有放回抽样,这被称为 bootstrapping。Bootstrapping 是一种统计重抽样技术,用于近似估计量的样本分布。这意味着数据是从原始训练集中随机选择的,有些数据可能会被多次选择。这种程序增加了产生的决策树的多样性。
这种方法的一个特殊之处在于,当基本学习器(弱学习器)不太稳定且因此对训练数据的变动非常敏感时,它效果最好。在存在稳定的基本学习器的情况下,整体性能甚至可能恶化。
bagging 的基本概念是结合多个不稳定但偏差低的模型,以产生一个整体方差低的模型。bagging 的逻辑基于这样一个想法:同分布随机变量的期望值等于单个随机变量的期望值。
bagging 方程如下:
y _ predicted = 1 / T Σ _ t = 1 ^ T f _ t(x)
这里,我们有以下内容:
-
T 是集成中的模型数量
-
f_t(x) 是第 t 个模型的预测
因此,目标是利用这种平均操作来降低方差。
通常,决策树是这种方法的一个合适选择,因为尽管它很简单,但它可以有效地捕捉变量之间的非线性关系和交互。
调整袋装法的关键参数是树的数量。然而,模拟研究和实证证据表明,该模型的性能并不过度受此参数选择的影响。因此,选择足够多的树以获得满意的结果就足够了。
总结来说,袋装法是一种基于反复采样训练数据并组合弱学习器预测的集成学习方法,当与对数据变化敏感的基本模型一起使用时尤其有效。
发现随机森林
随机森林是袋装法的一种特殊情况,其基本目的是通过平均多个模型来减少方差。再次强调,基于决策树的模型通常是理想的选择,因为它们可以有效地捕捉数据中的复杂交互结构,这与其他方法难以实现。通过生成大量树,偏差往往较低。
尽管这两种技术的概念基础相似,但通过正确调整模型参数,随机森林可以产生更优的结果。这得益于其集成学习方法以及有效调整超参数的能力。这是因为,尽管树存在误差,但使用袋装法允许从相同的分布中生成树,使得每棵树的期望值等于生成的 N 棵树的平均值的期望值。
袋装模型的偏差与单个树相似,因此改进的重点在于降低方差。这是随机森林模型的特点,旨在通过减少树之间的相关性来提高袋装法的方差。
对于 N 个具有方差 σ2 的相同分布的随机变量,当 N 个变量的平均方差等于 *(1/N)σ2 时,如果变量是相同分布但不必定独立的,并且假设存在正的成对相关系数 ρ,则平均方差的表示如下:
平均方差 = (1 / N) σ2 + [(N - 1) / N]ρ σ2
在这个公式中,第一项表示单个随机变量的方差除以 N,代表当变量独立时的平均方差。第二项考虑了随机变量之间的成对相关性,根据它们的关联程度增加平均方差。
随机森林使用的技术是减少树之间的相关性,因此通过随机选择输入变量来生长树,从而降低方差。与袋装法的主要区别在于,随机森林选择的分区候选变量数量少于可用的变量总数。
随机森林是一种结合一系列决策树以产生更精确结果的方法。在构建这些随机决策树时,考虑了两个关键概念:
-
训练数据的随机抽样:在训练阶段,随机森林中的每一棵树都通过仅关注原始数据的一个随机样本来学习。这些样本是通过替换技术提取的,称为重抽样,这意味着某些数据可以在同一棵树中多次使用。虽然从理论上讲,与在特定数据集上训练相比,这会在每棵树中产生较高的方差,但整体森林(即树集)的方差往往较低,而偏差的增加并不显著。
-
随机特征集用于分区选择:在随机森林中,仅考虑可用特征的一个子集来对每个决策树中的节点进行分区。通常,这个子集是特征总数的平方根。例如,如果有 16 个特征,每个决策树中的每个节点只考虑四个随机特征来进行分区。当然,也可以通过在每个节点考虑所有特征来训练树,就像在回归中通常所做的那样。
总结来说,随机森林结合了数百或数千棵决策树,每棵树都在略微不同的数据集上训练,并且仅使用有限数量的特征进行细分。随机森林的最终预测是通过平均每棵决策树的预测得到的,这意味着每棵树对最终决策的贡献是相等的。
提升算法解释
提升法是另一种可以应用于决策树以增强其预测能力的方法。与袋装法类似,提升法可以应用于回归和分类统计模型。
袋装和提升都可以应用于决策树以预测其能力。然而,它们之间有一些差异。在袋装法中,关键要关注的是由子集生成的每棵树与其他树的独立性。
然而,提升法采取了不同的方法。它不是像袋装法那样生成完全独立的树,而是迭代地训练一系列树。每一棵后续的树都试图纠正前一棵树的错误。换句话说,用于训练后续树的子数据集是根据前一棵树的错误预测进行加权的。这个持续的过程旨在逐步提高整体模型的表现。
总结来说,虽然袋装法基于从数据子集中创建独立的树,但提升法侧重于迭代训练的树来纠正其前驱的错误。两者都用于提高决策树的预测能力,但它们采用不同的方法。
提升法的特殊之处在于决策树的顺序构建——也就是说,每一棵树都是基于从上一棵树处理和获得的信息构建的。
与试图在整个数据集或至少是训练集上建模决策树的其他技术不同,提升的目标是获得具有增量学习的预测模型。我们称之为逐步学习,因为第一个模型是基于训练集的数据构建的。然后构建第二个模型,试图纠正第一个模型的错误。而不是基于之前的Y预测建立新的模型,方法是通过尽可能好地建模获得的错误来构建下一个树。这个想法是在创建序列弱学习器(弱模型),每个都试图纠正前一个模型的错误。在提升中,集成中的每个后续树都是基于前一个树的残差进行训练的,这些残差是实际值和预测值之间的差异。这种方法允许每棵树专注于纠正前一个树的错误,从而提高整体准确性。
即使初始数据集很大,这些树中的每一个也可能有尽可能少的最终节点。这可能是由于算法的参数,也可能是由于较小的树可能在纠正前一个树的错误方面表现更好。
目标是逐棵树地改进模型在表现不佳的领域的最终模型。
提升提供了三个可以操作的参数,可以用来优化决策树的建模:
-
树的数量(T):与袋装技术一样,增加树的数量(T)通常会导致更高的预测准确性。然而,需要注意的是,T的值过高会增加模型过拟合的风险。例如,与随机森林相比,提升在T值较高时更容易过拟合。
-
学习率(λ):这个参数表示树的 学习率,通常具有很低的值,通常在 0.01 和 0.001 之间。λ的值对模型的结果有巨大的影响。非常低的λ值需要更多的树(T)来获得一个表现良好的模型。λ最佳值的选取可以显著影响模型的行为。
-
分割数(s):s表示分割数,默认值为 1,这意味着你得到“树桩”或只有一个父节点和两个叶节点的树。虽然通常使用 1 作为s的值来加快计算速度,但改变它可以显著影响模型结果。通过改变s的值,可以获得具有不同结构和复杂性的树。
有几种提升技术,每种技术都有不同的构建树或加权的变体,以提高整体预测能力。以下是一些主要的提升技术:
-
自适应提升(AdaBoost):AdaBoost 是最早的提升算法之一,也是最流行的之一。在这种方法中,每个训练样本被赋予一个初始权重,后续迭代专注于纠正前一次迭代中犯的错误。基于这些权重构建弱学习树,通常是树桩。AdaBoost 给予过去的错误更多的权重,使后续的树能够专注于改进先前错误分类的示例的预测。
-
梯度提升:梯度提升是一种通用的提升框架,可以以不同的方式实现。在梯度提升中,树是顺序构建的,但与 AdaBoost 不同,每一棵树都试图减少损失函数的梯度。这意味着每一棵后续的树都专注于模型错误分类或错误预测的示例,逐渐提高性能。
-
极端梯度提升(XGBoost):XGBoost 是梯度提升的高级实现,在机器学习竞赛中获得了流行。它引入了几个优化和正则化来提高模型性能和稳定性。XGBoost 以其速度著称,可用于分类和回归问题。
这些提升技术各有其特点,针对不同数据类型和机器学习问题有特定的适应方法。提升算法的选择将取决于你问题的具体需求和期望的性能。
摘要
在本章中,我们研究了自然语言处理(NLP),它自动处理通过口语或书面语言传输的信息。首先,我们通过识别可以解决的问题分析了 NLP 的基本概念,然后转向涉及文本分析和文本生成的主要方法。然后,我们转向分析语料库、单词和句子分词。语料库提供了用于检查的真实语言数据,单词作为表达的基本组成部分,句子分词将文本组织成连贯的单位以进行深入分析。
在本章的第二部分,我们分析了使用 NLP 对电影评论进行标注的实际案例。这是一个旨在自动识别文本评论极性的情感分析问题。在这个例子中,我们实际上学习了在 MATLAB 中执行此类分析应使用哪些工具。在本章的最后部分,我们分析了集成学习方法以改进算法的性能。我们理解了提升和袋装之间的差异,并发现了不同的提升技术。
在下一章中,我们将了解图像处理和计算机视觉的基本概念。我们将发现计算机视觉的 MATLAB 工具以及如何实现用于物体识别的 MATLAB 模型。我们还将了解迁移学习、领域自适应、多任务学习和显著性图、特征重要性分数以及基于梯度的归因方法。
第八章:MATLAB 图像处理和计算机视觉
计算机视觉是一个探索处理、分析和理解视觉数据方法的学科。在图像内容分析领域,众多计算机视觉算法被用于深入理解图像中描绘的对象。涵盖图像分析的各个方面,计算机视觉处理诸如对象识别、形状分析、姿态估计、3D 建模、视觉搜索等任务。虽然人类在识别和识别周围环境中的对象方面表现出色,但计算机视觉的目标是使用计算方法忠实复制人类视觉系统(HVS)的能力。在本章中,我们将了解计算机视觉的基本概念以及如何使用 MATLAB 实现对象识别模型。
在本章中,我们将涵盖以下主要主题:
-
介绍图像处理和计算机视觉
-
探索 MATLAB 计算机视觉工具
-
构建 MATLAB 对象识别模型
-
在 MATLAB 中训练和微调预训练的深度学习模型
-
解释和说明机器学习模型
技术要求
在本章中,我们将介绍基本的机器学习概念。为了理解这些主题,需要具备代数和数学建模的基本知识。您还需要具备 MATLAB 的实际操作能力。
要使用本章中的 MATLAB 代码,您需要 GitHub 上提供的文件,网址为github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition。
介绍图像处理和计算机视觉
通过五种感官,人类从外部世界收集信息并处理它,做出决策以执行塑造他们日常生活的行动。计算机科学中最引人入胜的挑战之一是复制这一系列事件,识别和利用新的信息来源。通过模拟人类感官系统来获取和解释信息的能力被称为机器感知,这是人工智能领域的基本内容。
通过编码和信息处理等技术,能够从外部世界解释和获取信息成为可能。通过数字图像编码技术,可以将人类可以感知的内容以比特的形式表示出来。根据使用的方法,可以选择要表示的信息的数量和质量。另一方面,通过处理方法,可以解释图像中包含的信息,并尝试复制人类决策机制。其中一种人类能力是通过视觉识别场景中存在的物体类型,从而识别每个物体的独特特征。从图像中可以提取的最高水平信息是通过识别和识别场景中的单个物体来完成的。这些信息可以用来根据它们包含的物体对图像进行分类和分组。
理解图像处理
对于人类来说,一个基本的感觉是视觉。通过数字图像,可以以数值形式表示 HVS 在瞬间捕获的内容。图像是视觉感知的二维表示;它以电磁波的形式被感知,这些电磁波进入眼睛并影响视网膜。视网膜的组成元素捕获信息,如亮度和光谱特性。这些被转换成神经信号,通过视神经发送到负责视觉解释的大脑结构。
在数字领域,图像通常被表示为按顺序排列的点集和像素,这些点集和像素以行和列的形式排列。这种表示方式被称为光栅或位图。本质上,它涉及在两个维度上对连续信号进行二维采样:
图 8.1 – 以像素序列表示的图像表示。每个像素的值从 0(黑色)到 255(白色)
表示的最简单技术是使用灰度。在这种类型的表示中,像素包含亮度值。亮度是视觉场中的基本量,表示到达观察者眼睛的光量。像素值从无(黑色)到最大光亮度(白色),而中间状态则被感知为不同灰度的阴影。
在计算机图形学中,像素是数字图像表面的最小传统单位。图像中像素的数量越多,它包含的信息就越多,因此我们注意到其中的细节的能力也增加。信息量可以通过测量分辨率来表示,无论是以绝对值(像素)还是关于物理测量(每英寸点数(dpi))来表示。
当决定改变图像的分辨率时,可能出现两种情况:
-
像素尺寸不变:组成图像的像素数量减少,导致图像尺寸缩小。
-
像素尺寸增加:像素(dpi)的尺寸减小,而图像的整体尺寸保持不变,导致单个像素尺寸增加。
数字图像的一个重要方面是如何表示其像素中包含的信息。在灰度图的情况下,它表示亮度,需要通过在有限数量的比特中表示来进行量化。比特数越多,量化噪声越低。使用b比特,有 2b 种可能的值。通常,8 比特是最常见的值,允许表示总共 256 级的亮度。已经证明,8 比特在大多数应用中可以提供可接受的灰度梯度表示。这个数量有效地适应了人视觉系统区分图像中不同亮度级别的能力。
这也适用于只包含每个像素亮度信息的灰度图像。引入颜色增加了表示的复杂性,因为它需要使用一个模型来表示它。这个模型必须能够捕捉对人视觉系统有意义的颜色信息并将其转换为数字。目标是获得一个数字向量,它“总结”了每个像素中电磁波包含的频率。
在数字领域,最常用的模型无疑是 RGB。它基于三种不同强度的颜色成分的组合:红色、绿色和蓝色。
这些组件大致对应于人视网膜中的三种锥体细胞。因此,没有必要表示现实世界中存在的所有颜色信息,而只需表示人视觉系统敏感的信息。这种电磁波携带的信息对应于击中视网膜内部器官的光线;因此,颜色对应于电磁信号的频谱。因此,为了表示信号,只需要与红色、绿色和蓝色三种颜色相关的三个成分,这三种颜色被称为原色,它们与三个不同的频率带中的亮度相对应。RGB 模型表示与原色对应的频谱带中存在的能量量,并以三个不同的值或成分的形式提供这些信息。
一旦你理解了如何将数字图像以数值形式表示,就必须知道如何处理它,以便于其表示和提取相关信息。图像处理技术可以利用数字转换算法来修改原始图像的像素,从而生成一个新的图像。然而,它们还包括从图像中提取数值或表格值的技术,代表图像的特定特征。根据它们的复杂性,这些技术可以被归入不同的类别。
最简单的处理方法是与单个像素的转换相关:
- 灰度转换:这是一种允许你从 RGB 模型过渡到灰度的转换类型。亮度与 RGB 模型的三个色度成分之间存在线性关系。这种转换使我们能够在后续操作中管理并处理更简单的像素。每个像素将只有一个值,对应于亮度,而不是三个值,每个色度成分(R、G、B)一个值(图 8*.2*):
图 8.2 – 弗拉维安竞技场的灰度转换
-
阈值化:这是一种在图像分割阶段非常有用的转换,其目标是隔离感兴趣的对象与背景。想法是将高于某个阈值值的像素设置为最大亮度强度值,而将低于阈值的像素设置为最小强度值。
-
混叠:这是一种在采样期间使两个不同的信号在采样时无法区分的效果。混叠发生在采样或插值产生图像的较低分辨率时,与原始信号相比,输出被扭曲。可以使用抗混叠滤波器来纠正这个问题。在数字图像的情况下,混叠表现为摩尔纹或波浪状图案。
然后,还有直接比较和特征提取方法。第一组技术用于逐像素比较两个图像,获得一个衡量它们之间差异的值。另一方面,第二组技术允许创建初始图像的摘要,并使用一个更小的数据集,该数据集仍然可以充分描述原始集。让我们看看一些例子:
-
直接比较方法:从图像中可以得出许多有趣的信息之一是它们的相似度。人脑可以处理通过视网膜到达的视觉感知中的信息。有专门的神经元用于解释视觉信息(形状、颜色、运动、空间、线条等)。例如,识别面部和物体只有在提取这些信息并访问记忆之后才会发生。一种识别方法是直接方法。这种比较图像的方法也称为暴力方法,因为它涉及比较两个图像中的每个像素。这些方法应用代数公式并计算一个差异度指数,该指数表示两个图像之间的相似度。如果我们有两个图像称为image1和image2,我们可以使用以下公式计算差异度指数:
差异度指数 = 1 − sum(sum(abs(image1 − image2))) / sum(sum(image1))
-
均方误差(MSE):这是一个表示两个图像在绝对意义上相似程度的值。该指数逐像素比较图像,并代表这些值的平均差异。MSE 值越接近 0,分析图像之间的相似度就越大。
-
结构相似性指数度量(SSIM):另一种直接比较的方法是 SSIM。与 MSE 相比,后者使用绝对误差进行估计。而 SSIM 则是一个基于感知的模型,它将图像退化视为结构信息感知的变化。该算法不是逐像素比较图像,而是将图像划分为 N x N 像素的网格。在每个网格内,计算像素的平均值,从而考虑相邻像素之间的关系,而不是单个像素的绝对值。
直接比较方法伴随着与处理数据量相关的显著成本,因为它们考虑了图像中包含的所有信息。通过一些技术,可以降低维度。当处理的数据量过多且存在冗余的可能性时,可以应用一种转换,采用数据的简化表示。这种简化表示不过是特征集。将输入数据转换为特征集的过程称为特征提取。
所选特征涵盖了输入数据的相关细节,通过利用这种浓缩的表示方法而不是原始数据的全部,使得预期的任务得以完成。这种方法最小化了准确描述大量数据集所需的成本和资源。在处理复杂的数据分析时,一个主要挑战是减少在游戏中变量的数量。分析大量变量通常意味着高内存使用和计算能力需求。此外,在应用分类算法时,存在过拟合的风险。在这种情况下,模型过于紧密地适应用于学习的数据集,无法泛化,从而失去有效性。特征提取是一个广泛的概念,用于描述创建变量组合的方法,旨在解决这些问题,同时保持对数据描述的足够准确性。现在我们已经介绍了最广泛使用的图像处理方法,我们可以专注于如何从图像中提取知识。
解释计算机视觉
计算机视觉是计算机科学和人工智能的一个跨学科领域,涉及开发算法、模型和计算机系统,这些系统能够从图像或视频中解释、理解和分析视觉信息。计算机视觉的主要目标是复制人眼视觉系统(HVS)的一些能力,使计算机能够通过视觉数据感知和理解周围的世界。
该研究领域关注广泛的任务,包括物体识别、运动检测、模式识别、从图像中提取信息、图像分割、3D 重建等。计算机视觉在众多行业中都有应用,包括医疗、汽车、安全、制造、零售、娱乐和机器人技术,仅举几例。
计算机视觉的最近发展是由深度神经网络的运用驱动的,特别是卷积神经网络(CNNs),它们在许多视觉识别任务中取得了卓越的结果。这些进步从根本上改变了机器与视觉世界互动的方式,为自动驾驶、医疗诊断、增强现实等领域开辟了新的可能性。
在抽象方面,这项任务是最复杂的。这个类别最常见的用途是物体识别。从概念上讲,这个过程可以分为两个步骤。第一步涉及使用特征提取技术根据模型定义一个感兴趣的物体。在第二步中,在图像中搜索该物体。这类变换需要使用机器学习和数据挖掘算法,通过数据集,允许为要搜索的物体构建一个模型。随后,可以确定图像中是否有像素与先前创建的模型匹配。对此有不同方法:
- 形状匹配:这是一种涉及搜索轮廓的方法。这种方法允许你测量形状之间的相似性,并识别属于正在搜索的物体轮廓的点之间的对应关系。基本思想是在轮廓上选择 n 个点。对于每个点,考虑连接它到所有其他点的 n - 1 个向量。所有这些向量的集合形成了一个在该点局部化的轮廓的复杂描述符。这个向量集是通过形状提取过程获得的,它是特征提取的一部分。想法是使用这些向量获得一个描述符,并使用它来识别其他图像中的相似形状并执行分类:
图 8.3 – 形状匹配
-
模式匹配:这是一种涉及在大型数据集中识别特定序列或数据(称为模式)的规律性的技术。模式识别领域涉及使用计算机算法和模式自动在数据中搜索规律性,以执行将数据分类到不同类别等操作。在数字图像中,识别过程涉及准备一个模式和对应于描述特定感兴趣物体或其一部分的一组像素。然后,在图像内执行像素分类过程,以确定是否存在与正在搜索的模式相媲美的像素组。
-
基于特征的物体识别:通过这项技术,可以创建代表物体典型特征的描述符。每个物体都有描述其自身的独特特征。如果我们能在数据集中识别出所有这些特征,我们可以假设该物体存在。例如,人脸可以根据特定的解剖特征进行建模,如眼睛的位置、鼻孔、嘴唇形成的角度等。这些解剖元素及其连接的向量的组合形成了一个补丁模型。这个模型代表了一组有序的元素,这些元素足以准确描述一个物体。
了解图像中对象识别技术是如何演变以及它对社会产生的影响是非常有趣的。其中最引人入胜的案例之一就是利用图像处理技术的面部识别。直到不久前,这项技术还常被视为科幻小说中的东西。然而,在过去的十年里,它不仅成为现实,而且被广泛使用。
现在我们已经分析了与图像处理和计算机视觉相关的基本概念,让我们分析解决这些问题的 MATLAB 所需工具。
探索 MATLAB 计算机视觉工具
计算机视觉包括开发算法、技术和系统,使计算机能够从图像和视频中获取、处理、分析和基于视觉数据做出决策。计算机视觉的主要目标是使机器能够执行通常需要人类视觉感知和理解的任务。
计算机视觉可以自动化各种任务,这些任务对于人类来说可能耗时或甚至无法持续和大规模地执行。这包括对象检测、图像分类和跟踪等任务。当经过适当训练和配置时,计算机视觉算法可以在图像识别和分割等任务中实现高水平的准确性。它们不会受到疲劳或分心的困扰,从而产生一致的结果。这些算法可以实时或接近实时地处理图像和视频,使其适用于需要快速分析和决策的应用。
计算机视觉也可以应用于广泛的行业和应用,从医疗保健和汽车行业到农业和制造业。它可以通过适当的训练适应各种领域。这些系统可以轻松扩展以处理大量数据和图像,使其适合大数据应用。在医疗成像等应用中,计算机视觉提供了一种非侵入性的诊断和监测条件的方法,无需进行侵入性程序。
相比之下,这些算法在训练时严重依赖于大量数据集。训练数据不足或存在偏差可能导致性能不佳和结果不准确。开发和微调计算机视觉模型可能很复杂且耗时。这通常需要机器学习、深度学习和图像处理方面的专业知识。在计算机视觉中使用的深度学习模型可能计算密集,需要强大的硬件,如 GPU,进行训练和推理。深度学习模型,尤其是卷积神经网络(CNNs),通常被视为黑盒,这给解释其特定决策背后的理由带来了挑战。
计算机视觉系统可能在恶劣条件下难以表现良好,例如光线不足、遮挡或相机角度变化。在监控和面部识别中应用计算机视觉引发了关于隐私和潜在滥用的担忧。这些算法可能采用其训练数据中嵌入的偏见,导致不公正或歧视性的结果。确保公平性和减轻偏见仍然是一个持续的挑战。虽然计算机视觉可以识别和分类对象,但它通常缺乏对那些对象出现背景的深入理解,这可能在某些场景中限制其有用性。
总体而言,计算机视觉是一个强大且快速发展的领域,具有改变许多行业的潜力。然而,了解其局限性和挑战,并负责任、道德地应用它,解决与数据质量、隐私和偏见相关的问题,是至关重要的。
MATLAB 为计算机视觉任务提供了各种工具和函数。这些工具可以在计算机视觉工具箱、图像处理工具箱和其他相关工具箱中找到。以下是 MATLAB 在计算机视觉中的关键工具和功能:
-
计算机视觉工具箱:这个工具箱专门为计算机视觉任务设计。它包括广泛的图像处理、特征提取、目标检测和识别、3D 视觉、相机标定等功能和算法。
-
图像处理工具箱:虽然这个工具箱不仅仅用于计算机视觉,但它通常与计算机视觉工具箱一起使用。它提供了基本的图像处理函数,如滤波、形态学操作和图像增强。
-
相机标定:MATLAB 提供相机标定工具,这对于将 2D 图像点映射到 3D 世界坐标至关重要。这对于 3D 重建和目标跟踪等任务至关重要。
-
目标检测和识别:MATLAB 提供用于目标检测和识别的函数和预训练模型。您可以使用 YOLO、SSD 和 Faster R-CNN 等流行的深度学习模型来完成这些任务。
-
特征提取:MATLAB 支持特征提取技术,如尺度不变特征变换(SIFT)、加速鲁棒特征(SURF)和方向梯度直方图(HOG),用于目标检测和匹配。
-
立体视觉:MATLAB 支持立体视觉技术,用于从立体相机设置中进行深度估计和 3D 重建。
-
运动分析:您可以使用 MATLAB 函数执行运动分析任务,例如光流估计、跟踪和运动分割。
-
机器学习和深度学习:MATLAB 与各种机器学习和深度学习框架集成,使其适合为计算机视觉任务训练自定义模型。
-
语义分割:MATLAB 包含用于语义分割的工具,这是一个将图像中的每个像素标记为其所属类别的过程。
-
点云处理:对于 3D 点云数据,MATLAB 提供了用于可视化、操作和分析的工具。
-
应用:MATLAB 提供了用于图像标记、相机校准和对象训练等任务的交互式应用,这些应用简化了开发工作流程。
-
并行计算:MATLAB 支持并行计算,允许您通过利用多个 CPU 核心或 GPU 来加速计算密集型计算机视觉任务。
这些工具和函数使 MATLAB 成为开发原型计算机视觉应用的强大环境,无论您是在进行图像分析、对象检测、3D 重建还是其他相关任务。现在,让我们学习如何使用 MATLAB 和 CNN 识别对象。
构建用于物体识别的 MATLAB 模型
在计算机视觉领域,一个持续的挑战是在图像中确定特定对象(物体识别)或活动的存在。对于在预定义条件下(如识别特定的几何形状,如多面体或识别面部和手写字符)的对象,这个问题可以有效地解决,且没有重大障碍。然而,当处理不受限制场景中的任意对象时,复杂性会急剧增加。
物体识别涉及在一系列图像或视频中检测特定对象的能力。人类具有在图像中轻松识别各种对象的能力,即使这些对象的形状可能有所不同。此外,即使对象部分被遮挡,也可以识别对象。然而,这仍然是计算机视觉中的一个巨大挑战。
图像中的每个对象都表现出多种引人入胜的特征,这些特征可以提取出来,构建一个关于该对象的全面描述。这个描述有助于在包含多个对象的测试图像中寻找对象时识别该对象。关键的是,从参考图像中提取的特征必须对图像尺度、干扰、光照条件和几何畸变的变化具有鲁棒性,以确保可靠的识别。卷积神经网络(CNN)在这方面表现出色,提供了具有卓越物体识别性能的算法。
介绍手写识别(HWR)
手写识别(HWR)包括计算机接收和理解手写输入的能力,将其转换为可读文本。这种输入可以来自各种来源,包括纸质文件、照片和触摸屏。通过光学扫描可以实现文本检测,这涉及光学字符识别(OCR),或通过智能文字识别技术。
我们长期以来一直清醒地意识到自动化 HWR 以促进人与机器之间更顺畅互动的挑战。近年来,这一挑战见证了引人入胜的进步和越来越有效的解决方案,这主要得益于巨大的经济利益和现代计算机计算能力的增长。值得注意的是,某些国家,如日本和亚洲的其他国家,在研究和财务资源方面进行了重大投资,以开创尖端 OCR 技术。
这些国家在这个研究领域热情洋溢背后的原因非常明显。他们的目标是开发能够解读各自文化中特有的复杂象形文字的设备,从而提高与机器互动的便捷性。鉴于目前尚无能够表示数千个字符的输入设备,如键盘,因此重点在于直接从手写文稿通过数字化扫描获取这些信息。
尽管如此,即使在西方国家,也投入了大量精力研究光学 HWR 领域。存在许多可以从自动文本识别中受益的应用程序。例如,自动解析预印模板或识别信封上的地址和邮政编码,这只是 OCR 技术在几个实例中证明其价值的地方。
手写识别(HWR)是通过多种技术实现的,通常涉及 OCR 技术。然而,一个全面的脚本识别系统不仅超越了 OCR,还包括格式化、精确字符分割和识别最可能的单词等任务。
为了更好地理解如何使用机器学习方法来处理 HWR,我们将使用一个在社区中广泛使用的非常流行的数据集来解决这个问题。这是修改后的国家标准与技术研究院(MNIST)数据集,一个包含大量手写数字的大型数据库。这个数据集包含 70,000 个数据示例,这是 NIST 维护的更大数据集的一个子集。这些示例代表数字,以 28 x 28 像素分辨率的格式呈现,组织成一个有 70,000 行和 785 列的矩阵。在每一行中,有 784 列对应于 28 x 28 矩阵中的像素值,还有一列包含实际的数字标签。这些数字已经被尺寸归一化,并放置在固定大小图像的中心。
MNIST 数据集中的数字图像最初是由 Chris Burges 和 Corinna Cortes 选择的,他们采用了边界框归一化和居中技术。另一方面,Yann LeCun 的数据集版本使用的是基于更大窗口内质心的居中技术。
这个数据集已经在 MATLAB 环境中可用,是一个简短版本,只有 10,000 张图像,均匀分布在 10 个数字(0-9)上。让我们开始吧:
-
首先,我们将数据集导入 MATLAB 工作空间。该数据集包含在带有深度学习工具箱的标准 MATLAB 安装中。在我们的 MATLAB 安装文件夹下,我们将找到
toolbox\nnet\nndemos\nndatasets\DigitDataset路径。DigitDataset文件夹包含 10 个子文件夹,每个子文件夹包含单个数字的 1,000 张图像;每个文件夹都是以它包含的数字命名的。为了以自动化的方式找到路径,我们可以使用以下命令:FolderPath = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset'); DigitData = imageDatastore(FolderPath, 'IncludeSubfolders',true,'LabelSource','foldernames');imageDatastore()函数通过包含数据集路径来生成一个数据存储,用于指定的图像数据集合。我们传递了三个参数:-
FolderPath:包含图像的文件夹路径 -
IncludeSubfolders:包括主文件夹中所有子文件夹的可能性 -
LabelSource:我们使用文件夹名称来标记数据
将创建一个具有一些属性的
ImageDatastore对象。这些属性描述了数据的特征,并提供了从数据存储中检索数据的说明。在创建数据存储对象时,您可以使用名称值对作为参数来设置这些属性。如果您希望在对象创建后检查或调整属性,可以使用点符号来完成。让我们看看这些属性中的一些:
-
Files:这是一个单元数组,用于存储数据存储中所有图像的文件路径。您可以通过访问此属性来获取文件路径列表。 -
Labels:这是一个数组或单元数组,将标签或类别与数据存储中的每个图像关联起来。此属性通常用于图像分类任务。 -
ReadSize:这指定了在数据迭代过程中一次读取的图像数量。这可能会影响内存使用和性能。
现在,我们可以通过随机选择过程显示一些已加载的图像:
figure; RandId = randperm(10000,9); for i = 1:9 subplot(3,3,i); imshow(DigitData.Files{RandId(i)}); end在这里,我们使用了
randperm()函数,该函数生成一个包含从 1 到 10,000 范围内选择的九个不同随机整数的行向量。生成的每个数字都被用作索引,以识别存储在Data.Files属性中的图像文件路径。图 8*.4*显示了从数据库中提取的九张图像的拼贴: -
图 8.4 – MNIST 数据集
现在,我们可以检查图像在类别上的分布:
ClassDist = countEachLabel(DigitData)
返回以下结果:
ClassDist =
10×2 table
Label Count
_____ _____
0 1000
1 1000
2 1000
3 1000
4 1000
5 1000
6 1000
7 1000
8 1000
9 1000
通过这种方式,我们有证据表明图像在 10 个数字(0-9)之间均匀分布。
-
在我们开始构建机器学习算法之前,将可用的数据分成两个不同的子集至关重要。第一个子集将作为训练数据,而第二个子集将用于算法验证。数据分区在机器学习和数据分析中起着关键作用,因为它涉及将数据集分割成多个子集进行训练、验证和模型测试。在我们的案例中,我们有 10,000 个样本,每个样本包含 1,000 张特定数字的图像。我们选择的方法是将数据分成 70% 用于训练和 30% 用于验证的部分。这个分割率被使用是因为大部分数据必须用于训练网络。因此,我们将使用 7,000 个样本进行训练,并将剩余的部分保留用于验证:
SplitRate = 0.7; [TrainDat,ValDat] = splitEachLabel(DigitData,SplitRate,'randomize');为了实现这一点,我们使用了
splitEachLabel()函数。这个函数有效地将Data数据集中的图像文件分成两个独立的数据存储:TrainDat和ValDat。TrainDat数据存储包含每个类别由SplitRate确定的初始部分,而ValDat数据存储包含每个类别的剩余图像。SplitRate可以是 0 到 1 之间的分数值,表示分配给TrainDat的图像比例,或者它可以是一个整数,表示每个类别分配给TrainDat的确切图像数量。 -
让我们开始构建我们的卷积网络。正如预期的那样,CNN 由一系列相互连接的层组成。首先,你需要使用一个层来导入你的输入数据:
layers = [ imageInputLayer([28, 28, 1])layers变量是一个数组,包含我们 CNN 的层列表,定义了用于深度学习的神经网络架构。为了启动这个架构,我们首先使用imageInputLayer。这个层作为图像的输入,将 2D 图像数据输入到神经网络中,并执行数据归一化。此外,这个层还指定了不可修改的InputSize属性。该属性分别包含高度、宽度和通道数。在这种情况下,我们正在处理高度和宽度均为 28 的灰度图像。在输入层之后,我们建立了三个连续层的初始块:convolution2dLayer(3,8,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2)通过 2D 最大池化层实现下采样,该层将输入分成矩形池化区域,并随后在每个这些区域中识别最大值。
-
接下来,我们将介绍第二组层,类似于第一组,但参数已调整:
convolution2dLayer(1,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2)然后,我们添加第三个层块,以完成架构:
convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer fullyConnectedLayer(10)在一个全连接层(FC layer)中,输入与权重矩阵相乘,随后由偏置向量调整。在此上下文中,“参数”指定了期望的输出大小,在我们的案例中,由于我们要对
10个不同的数字进行分类,所以是 10。这种类型的层与在传统softmaxLayer中常见的层配置相类似。softmaxLayer是一个专门用于神经网络中的层,旨在对其输入实现softmax函数。softmax函数在分类任务中得到了广泛的应用,因为它将原始分数或 logits 转换为跨越多个类别的概率分布。通常,此层作为设计用于多类分类的神经网络中的最后一个组件。它将网络的输出值转换为概率,这些概率的总和为1,简化了对模型预测的解释。 classificationLayer];分类层计算与不同且互斥类别相关的常规和加权分类任务的交叉熵损失。它通过检查前一层的输出维度来自动推断类别的数量。
-
在训练 CNN 之前,我们需要配置设置:
options = trainingOptions('sgdm', ... 'InitialLearnRate',0.01, ... 'MaxEpochs',50, ... 'Shuffle','every-epoch', ... 'ValidationData',ValDat, ... 'ValidationFrequency',30, ... 'Verbose',false, ... 'Plots','training-progress');要了解更多关于各种训练选项的信息,请阅读第六章,深度学习和卷积神经网络。
-
是时候训练网络了:
CNNnet = trainNetwork(TrainDat,layers,options);以下图在屏幕上打印出来(图 8*.5*):
图 8.5 – 手写数字识别 CNN 的训练过程
随着训练的进行,此图将不断更新,使我们能够监控算法如何调整权重以实现收敛。我们可以看到准确率为 84.1%的结果,这表明效果良好。
自然地会问,是否有可能提高手写数字识别模型的性能。在下一节中,我们将看到如何使用迁移学习来提高模型的准确率。
在 MATLAB 中训练和微调预训练的深度学习模型
迁移学习是一种机器学习方法,其中为特定任务创建的模型被重新用于作为解决第二个任务的模型的初始基础。这种技术涉及利用从一个问题中获得的知识并将其应用于一个不同但相关的问题。迁移学习在深度学习和神经网络中特别有用,其中预训练模型可以被微调或用作新任务的特征提取器。
在预训练模型中,你从一个已经针对特定任务(如图像分类、自然语言处理或语音识别)在大数据集上训练过的预训练模型开始。这些预训练模型通常是具有许多层的复杂神经网络。在许多情况下,你可以使用预训练模型的层作为特征提取器。你移除最终的分类层(们),并使用早期层的激活作为新任务的特性。这在计算机视觉任务中尤为常见。你可以选择性地通过使用自己的数据集进一步训练预训练模型来微调预训练模型,以针对特定任务进行训练。这涉及到更新一些或所有层的权重,同时保留从原始任务中学到的知识。
迁移学习可以显著减少训练新任务模型所需的数据量和时间,尤其是在数据集有限的情况下。预训练模型已经从大型和多样化的数据集中学习到了有用的特征,这对于相关任务非常有价值。它可以帮助提高模型性能,当你拥有有限的计算资源或有限的标记数据时。
迁移学习在各个领域都得到了广泛应用,包括计算机视觉、自然语言处理和音频处理,并且在推进机器学习应用领域的技术前沿中发挥了关键作用。
引入 ResNet 预训练网络
ResNet 代表残差网络,这是一种由 Kaiming He、Xiangyu Zhang、Shaoqing Ren 和 Jian Sun 在 2015 年发表的论文《用于图像识别的深度残差学习》中引入的深刻 CNN 架构。这一开创性的架构对计算机视觉和深度学习领域产生了重大影响。
ResNet 的关键创新在于使用了残差块。在传统的深度神经网络中,随着网络的加深,训练变得越来越困难。这是因为梯度消失问题,在训练过程中,随着梯度通过网络反向传播,其值变得极其小。因此,随着深度的增加,深度网络往往会遭受性能下降的问题。
ResNet 通过引入残差块来解决这一问题,这些残差块包含跳过或快捷连接,允许梯度更容易地通过网络流动。这些快捷连接绕过一层或多层,使得训练非常深的网络变得更容易。跳过连接本质上学习了层输出和输入之间的残差(差异),因此得名“残差网络”。
我们可以总结 ResNet 的以下关键特性:
-
深度架构:由于使用了残差块,ResNet 可以非常深,拥有数百甚至数千层。
-
跳过连接:跳过连接允许梯度有效地传播,减轻了梯度消失问题。
-
高精度:ResNet 在各种图像分类任务上实现了最先进的性能,包括 ImageNet 大规模视觉识别挑战赛。
-
迁移学习:预训练的 ResNet 模型通过迁移学习广泛用作特征提取器或各种计算机视觉任务的起点。
-
架构变体:有几个不同深度的 ResNet 架构,例如 ResNet-18、ResNet-34、ResNet-50 以及更深的变体。
ResNet 已成为深度学习的基础架构,其跳跃连接和残差学习的原理影响了众多后续神经网络架构的设计。它不仅应用于图像分类,还应用于各种其他计算机视觉任务,包括目标检测、语义分割等。
MATLAB 深度网络设计器应用程序
MATLAB 深度网络设计器应用程序是 MATLAB 提供的用于设计、训练和分析深度神经网络的图形用户界面(GUI)工具。它是 MATLAB 深度学习工具箱的一部分,该工具箱提供了一套全面的工具和函数,用于处理人工神经网络和深度学习。您可以通过添加层、连接它们并指定它们的属性和参数来直观地设计神经网络架构。这使得您能够轻松创建自定义网络架构。
该应用程序提供了一系列预定义层,您可以将它们拖放到网络设计中。这些层包括常见的类型,如卷积层、全连接层等。深度网络设计器应用程序简化了设计和训练深度神经网络的过程,使得对于可能不熟悉深度学习概念和编程的用户来说更加易于使用。它是研究人员、工程师和数据科学家在 MATLAB 上进行机器学习和深度学习项目时的宝贵工具。让我们更深入地了解一下:
-
要打开深度网络设计器应用程序,只需单击 MATLAB 界面顶部的应用标签页中的深度学习部分。在深度学习部分,您将找到深度网络设计器图标。单击此图标即可打开深度网络设计器应用程序。或者,您可以在 MATLAB 命令窗口中输入以下命令来打开深度网络设计器应用程序:
deepNetworkDesigner此命令将启动应用程序,允许您使用 GUI 创建、设计和训练深度神经网络。您需要安装 MATLAB 深度学习工具箱才能使用深度网络设计器应用程序。如果尚未安装,您可能需要从 MATLAB 安装中单独安装它。
将打开以下窗口(图 8*.6*):
图 8.6 – 深度网络设计器起始页面
如果您找不到网络,可以使用以下命令:
deepNetworkDesigner(resnet18)
在预训练的网络图像中,我们将找到 ResNet-18。ResNet-18 由 18 层组成,包括卷积层、残差块和全连接层。与更深层的变体(如 ResNet-50 或 ResNet-101)相比,它被认为相对较浅。像所有 ResNet 架构一样,ResNet-18 使用残差块。这些块包含跳跃连接(或快捷连接),允许在训练期间更有效地流动梯度,解决梯度消失问题。由于其在模型复杂性和性能之间的平衡,ResNet-18 在深度学习社区中得到广泛应用。它常用于图像分类、目标检测以及各种计算机视觉应用中的特征提取。其架构原则,如残差学习,影响了后续许多神经网络架构的设计。要导入 ResNet-18,需要安装相应的工具箱。
- 导入后,我们可以导入我们将训练网络的数据库。为此,我们可以切换到应用程序的数据标签。点击导入数据图标后,将打开以下窗口(图 8*.7*):
图 8.7 – 导入图像数据窗口
在数据源下,我们可以选择工作空间中的 ImageDatastore来选择已经导入到 MATLAB 工作空间中的数据,如前所述。MNIST 数据集将按图 8**.8所示导入:
图 8.8 – 导入到深度网络设计器应用程序中的 MNIST 数据集
在图 8**.8中,我们可以看到图像在 10 个类别中分布良好,每个类别有 700 个图像。我们将使用 70%的数据进行训练,其余的用于验证。
-
在这一点上,我们可以通过切换到“设计器”标签来设置预训练网络(ResNet-18)。我们将使用 ResNet-18 处理另一种类型的图像(一个大小为 227 x 227 x 3 的 RGB 图像)。为此,我们必须更改定义输入数据大小的第一层。点击第一层(ImageInput),然后点击Canc按钮来删除此层。
-
之后,我们可以点击标签左侧的ImageInputLayer图标在层库中,此时我们必须将此层与下一层连接。
-
之后,我们必须将位于“设计器”标签右侧的“属性”窗口中的
28,28,1更改为(图 8*.9*)。 -
之后,我们必须更改第一层卷积。首先,我们必须删除它,然后放下一个
Convolution2Dlayer并将其连接到另一层。然后,我们必须在“设计器”标签右侧的“属性”窗口中设置3,3和64(图 8*.9*):
图 8.9 – 修改 ResNet-18 的前两层以适应新的输入数据
- 现在,我们必须继续到 ResNet-18 的最后一部分,这涉及到设置分类选项。为了做到这一点,我们必须替换 FC 层和分类层,如图图 8**.10所示:
图 8.10 – 修改 ResNet-18 的最后一层以适应新的分类
为了检查层是否已正确修改,我们可以通过点击设计师标签页顶部的分析图标来测试它。
- 现在我们已经准备好训练模型,我们可以转到 Deep Network Designer 应用程序的训练标签页。我们可以通过点击训练标签页顶部的训练选项图标来检查训练选项。之后,我们可以在标签页顶部点击训练按钮。训练过程将开始;我们将在训练进度窗口中检查其进度(图 8*.11*):
图 8.11 – 训练进度窗口
在训练过程结束时,我们将能够通过读取验证过程中获得的确切值来验证模型的性能。正如我们所看到的,我们获得了 90.27%的准确率。
现在,让我们尝试收集一些关于如何根据机器学习模型获得的结果进行解释的有用信息。
解释和说明机器学习模型
解释和说明机器学习模型对于理解它们的预测、使它们更加透明和可信至关重要,尤其是在解释性至关重要的应用中。这是一个需要数据科学家、领域专家和利益相关者之间协作的持续过程。解释技术选择取决于模型类型、问题域和应用程序所需的透明度水平。根据具体用例,在模型复杂性和可解释性之间取得平衡很重要。
理解显著性图
显著性图是一种可视化技术,用于计算机视觉和深度学习,以理解和解释神经网络预测,特别是在图像分类和对象识别任务中。显著性图有助于识别输入图像或特征图中哪些区域与模型的预测最相关。它们特别有助于深入了解神经网络为何做出特定决策。
显著性图是通过基于梯度的方法生成的,通常是反向传播。其思路是计算模型输出相对于输入图像像素的梯度。通过计算这些梯度,您可以确定输入图像中哪些像素对模型的预测影响最大。换句话说,显著性图突出了模型在做出决策时关注的区域。显著性图通常以热图的形式叠加在原始输入图像上。在热图中,颜色的强度对应于每个像素的重要性。高强度的区域表示对模型输出有强烈影响的区域:
图 8.12 – 显著性图作为热图
显著性图提供了对神经网络预测的解释性。通过检查显著性图,您可以查看图像的哪些部分与特定特征相似并有助于决策。这些图可用于模型调试和改进。如果模型的预测看起来不正确,检查显著性图可以揭示模型是否关注正确的或错误的功能。显著性图有几种变体,例如特定类别的显著性图(突出显示特定类别的特定特征)和基于梯度的方法,如引导反向传播和 SmoothGrad,这些方法提高了显著性图的可解释性。
重要的是要注意,显著性图提供了对模型行为的洞察,但并不一定以人类可理解的方式解释为什么神经网络做出了特定的决策。它们只是解释工具箱中的一个工具,通常与其他技术结合使用,以更全面地理解模型决策。
理解特征重要性分数
特征重要性分数是一组指标或值,表示不同输入特征(也称为变量或属性)在机器学习模型预测中的相对重要性。这些分数有助于数据科学家和分析人员了解哪些特征对模型输出的影响最大。特征重要性分数对于特征选择、模型解释和调试特别有价值。
存在一些常见的方法和技术用于计算特征重要性分数:
-
Gini 重要性:在决策树和随机森林中,Gini 重要性衡量特征在树节点上分割数据时的使用频率。较高的值表示更重要的特征。
-
杂质减少的平均值:与 Gini 重要性相似,此指标计算在特定特征用于分割时,杂质(或杂质减少)减少的程度。
-
系数幅度:在线性模型中,系数的幅度(绝对值)表示特征的重要性。较大的系数表示更大的重要性。
-
置换特征重要性:这种方法涉及随机置换单个特征的价值,同时保持其他特征不变,并测量模型性能下降的程度。性能的显著下降表明这是一个重要的特征。
-
递归特征消除 (RFE):RFE 是一种迭代方法,从所有特征开始,根据模型性能逐渐移除最不重要的特征。特征被移除的顺序表明了它们的重要性。
-
SHapley Additive exPlanations (SHAP):SHAP 值通过考虑所有可能的特征组合,提供了一个统一的特征重要性度量。它们可以应用于各种模型,包括深度学习模型。
特征重要性计算方法的选择取决于所使用的机器学习算法、数据集和实际问题。不同的算法可能提供不同的特征重要性排名,因此考虑多种方法并使用领域知识来有效解释结果至关重要。特征重要性分数有助于识别相关特征、降低维度并提高模型的可解释性。
发现基于梯度的属性方法
基于梯度的属性方法,也称为基于梯度的属性技术,是用于理解和归因于机器学习模型输出中单个特征或输入元素贡献的方法。这些方法依赖于梯度,梯度表示模型输出对输入特征变化的敏感性。以下是一些在机器学习中常用到的基于梯度的属性方法:
-
梯度显著性:显著性图强调影响模型预测的输入图像中最相关的区域。这些图是通过计算模型输出关于输入图像像素的梯度来创建的。梯度高的区域对应于具有显著相关性的区域。
-
集成梯度:集成梯度通过计算从参考输入(通常是全零)到实际输入的路径上关于输入的累积积分,为每个输入特征分配属性分数。这种方法提供了对特征重要性的更全面的理解。
-
引导反向传播:引导反向传播是一种修改后的反向传播算法,在反向传播过程中仅保留正梯度。这有助于突出输入特征对预测的积极贡献,并抑制消极贡献。
-
SmoothGrad:SmoothGrad 通过在多个扰动的输入版本上平均梯度并可视化平滑后的梯度值,减少了显著性图中的噪声。
-
层级相关性传播(LRP):LRP 是一种归因方法,它为网络隐藏层中的每个神经元分配相关性分数,并将它们反向传播到输入特征。它提供了细粒度的特征相关性信息。
-
反卷积网络(DeconvNets):DeconvNets 旨在逆转神经网络中卷积层的效果。它们有助于可视化网络不同层的特征图,以了解每个层学到了什么。
-
梯度类激活映射(GradientCAM):GradientCAM 结合了梯度信息与类激活映射技术,以突出显示对特定类别预测重要的输入图像区域。
基于梯度的归因方法对于模型可解释性和调试非常有价值。它们有助于识别哪些特征或输入的部分对驱动模型决策有影响。选择正确的归因方法取决于模型架构、数据集和解释的具体目标。这些方法提供了对模型行为的洞察,并有助于在 AI 系统中建立信任。
摘要
在本章中,我们了解了计算机视觉的基本概念以及如何使用 MATLAB 实现对象识别模型。我们首先介绍了图像处理和计算机视觉。我们学习了有哪些工具可以处理图像,以及计算机视觉如何用于对象识别、运动检测和模式识别。然后,我们探讨了 MATLAB 的计算机视觉工具,以及 MATLAB 提供的功能和功能如何为计算机视觉应用的开发和原型设计创建一个强大的环境。无论你的重点是图像分析、对象检测、3D 重建或任何相关应用,MATLAB 都提供了必要的工具和功能来有效地支持你的工作。
之后,我们学习了如何使用 CNN 和 MNIST 数据集在 MATLAB 中构建对象识别模型。我们了解了如何将图像数据导入 MATLAB 工作空间,以及如何使用图像来训练 CNN。然后,我们学习了如何在 MATLAB 中使用预训练的深度学习模型来提高对象识别模型的表现。最后,我们介绍了一些用于解释和说明深度学习模型的工具。
在下一章中,我们将深入探讨与序列数据相关的根本概念,并探讨构建模型以捕捉时间序列或任何一般序列中模式的过程。我们将学习时间序列数据的基本概念,如何从序列数据中提取统计信息,以及如何实现预测股票市场数据的模型。最后,我们将了解过采样、欠采样和成本敏感学习。