机器学习和神经网络 - 页 50

 

什么是深度学习? (DL 01)



什么是深度学习? (DL 01)

欢迎来到深度学习!我是 Bryce,很高兴能帮助您了解计算机科学中的这个热门话题。深度学习在我们的日常生活中无处不在。在你最喜欢的平台上识别你的脸、理解你的演讲和推荐内容的算法都是基于深度学习的。

但深度学习到底是什么?它涉及使用神经网络和可微编程进行机器学习。神经网络是受大脑神经元行为启发的计算模型。它们由代表神经元的节点和代表它们之间连接的有向边组成,每条边都有一个表示其强度的权重。神经元可以总结来自其邻居的加权输入以确定它们是否激活。

机器学习位于人工智能和数据科学的交叉点,是关于从数据中自动进行智能推理。与旨在直接解决问题的算法的传统计算机科学不同,机器学习让数据示例定义问题的输入和输出。然后我们实施从数据集中推断解决方案的算法。

机器学习问题可以归类为回归或分类。回归涉及推断将连续输入映射到连续输出的函数,例如线性回归。另一方面,分类将离散标签分配给输入点,例如推断决策边界。

深度学习使我们能够解决结合回归和分类方面的复杂问题。例如,对象识别涉及学习一个函数,该函数将图像作为输入并输出图像中对象的边界框和标签。

为了训练神经网络,我们使用梯度下降,这是一种通过遵循函数的梯度来最小化函数的技术。这需要区分神经网络的激活。像阶跃函数这样的激活函数不适合微分,所以我们使用像 sigmoid 函数这样的平滑近似。

训练神经网络和可微分编程的原理超越了深度学习。我们可以将神经元视为计算执行加权和并应用激活函数的简单程序。这引出了可微分编程的概念,其中可以将可以数学运算和微分的函数合并到深度学习模型中。

在本课程中,我们将从简单的神经网络开始,以了解机器学习和随机梯度下降的基础知识。我们将逐渐增加复杂性,探索深度神经网络和通用可微分编程。在此过程中,我们将练习使用深度学习库,讨论局限性和缺点,并为您设计、应用、评估和批评深度学习模型以解决现实世界问题做好准备。

到学期结束时,您将有能力通过深度学习应对激动人心的挑战,并全面了解其应用和影响。

 

深度学习先决条件 (DL 02)




深度学习先决条件 (DL 02)

要在深度学习课程中取得成功,您需要具备计算机科学和数学背景。具体来说,您应该学习过数据结构、线性代数和多元微积分方面的课程。让我们更详细地探讨每个先决条件的重要性。

拥有编程背景对于这门高级本科计算机科学课程至关重要。数据结构是确保您具有足够编程经验的先决条件。理解与数据结构中遇到的算法效率相关的概念也会有所帮助。

在本课程中,我的视频主要使用伪代码或数学表达计算。但是,这些作业需要同时使用 Python 和 Julia 进行编程。 Python 广泛用于 TensorFlow 和 PyTorch 等深度学习库,因此您将获得对这些工具的练习。另一方面,Julia 非常适合弥合数学与计算之间的鸿沟,从而更容易理解神经网络的内部工作原理。

从数学的角度来看,我们将利用线性代数和多元微积分的概念。但是,我们将重点关注的具体概念只是这些课程中通常教授的内容的一小部分。如果您只上过其中一门课程,您应该能够相对较快地从另一门课程中掌握必要的概念。

在线性代数中,熟悉矩阵符号是必不可少的。深度学习涉及对向量、矩阵和高维数组(张量)的运算。精通矩阵-向量积,将函数应用于矩阵和向量,以及点积和范数等运算将是必要的。

多变量微积分对于理解梯度至关重要,梯度是整个课程中使用的一个关键概念。您应该能够使用在基本微积分中学到的规则(例如乘积规则和商规则)评估梯度和求偏导数。

如果您不确定自己在线性代数或多变量微积分方面的知识,我将提供 Grant Sanderson 的视频播放列表,以帮助您复习这些主题。播放列表中突出显示的视频涵盖了我们将在课程中使用的特定概念。

通过确保您在这些先决条件科目中拥有扎实的背景知识,您将做好充分准备以应对课程第一周的活动和作业,并在深度学习中取得成功。

 

单个神经元可以计算什么? (DL 03)



单个神经元可以计算什么? (DL 03)

神经网络由具有大量连接的众多节点组成。为了更好地理解它们,让我们关注单个神经元并探索它的功能、它可以表示的模型类型以及如何训练这些模型。

神经网络中的节点接收输入并执行简单计算以生成数值输出。这个计算包括两个阶段:首先,将输入乘以相应的权重并求和;然后,加权输入的总和通过激活函数产生输出。

从数学上讲,输出是通过将激活函数(表示为 f)应用于加权输入的总和而获得的。因此,输出是将激活函数应用于每个权重乘以其相应输入加上偏置项的总和的结果。

即使所有输入都为零,偏差也允许总和不为零。我们可以将偏差视为另一个权重,并用进入节点的附加箭头来表示它。每个神经元对其输入执行加权求和,但不同的神经元可能具有不同的激活函数。

对于单个神经元模型,两个值得注意的激活函数是线性函数和阶跃函数。线性激活函数使神经元能够执行回归,而阶跃函数允许它执行分类。

在具有单个输入的神经元的情况下,输入的加权和是通过将输入乘以权重并加上偏差来计算的。选择的线性激活函数 y = x 允许我们使用权重 (w1) 和偏差 (b) 参数来表达 x1 的任何线性函数。因此,该神经元可以计算具有一维输入 (x1) 和一维输出 (y) 的任何线性函数。

如果神经元有更多输入,则映射扩展到多维输入,但仍然是适合回归的线性函数。然而,随着输入维度的增加,可视化函数变得具有挑战性。

在具有两个输入的神经元的情况下,阶跃函数用作激活。仍然计算输入的加权和,当和变为正时,激活从零过渡到一。可以使用分段函数来描述激活,导致 0 或 1 输出的输入之间的决策边界是输入的加权和等于零的位置。此设置适用于分类任务,其中根据神经元的输出将输入标记为 0 或 1。

要使用单个神经元执行回归或分类,我们需要一个由输入-输出对组成的数据集。选择的激活函数取决于输出是二进制(0 或 1)还是连续的。输入示例的维数决定了单个神经元模型中输入的数量和权重。

训练神经网络或单个神经元涉及定义一个损失函数,用于量化模型与数据的偏差。对于回归任务,可以使用误差平方和,而具有二进制输出的分类任务可以使用其他合适的损失函数。

训练的目标是以最小化损失和提高模型准确性的方式更新参数(权重和偏差)。梯度下降是一种常用的优化技术,用于更新参数和减少损失。

在下一个视频中,我们将深入探讨梯度下降的概念,以及它如何促进参数更新以提高模型的性能。

 

如何训练你的神经元(DL 04)



如何训练你的神经元(DL 04)

在我们之前的视频中,我们探讨了单个神经元的计算。我们了解到,神经元通过对输入进行加权求和、添加偏差并应用激活函数来进行计算。使用阶跃函数进行激活为我们提供了一个二元分类器,而线性函数为我们提供了一个回归器。

我们还讨论了使用误差平方和来衡量模型在其数据集上的损失,以及使用损失函数的梯度来训练模型。损失函数取决于模型的参数,即权重和偏差。均方误差通常用作计算中的损失函数。

为了理解损失函数如何依赖于参数以及我们如何修改它们以减少损失,我们计算了一个小型回归数据集的损失。通过将正确输出和预测输出之间的平方差相加,我们得到了损失值。

接下来,我们专注于寻找损失函数的梯度。我们推导出损失关于每个参数的偏导数。这些偏导数形成梯度,指导我们减少损失。通过在梯度的相反方向更新参数,我们可以最小化损失并改进我们的模型对数据集的表示。

我们将损失函数可视化为参数空间中的一个曲面,并讨论了梯度如何指示损失增加最快的方向。通过在梯度的相反方向上采取小步骤,我们可以迭代地减少损失并改进我们的模型。

对于分类任务,我们在对阶跃函数激活求导时遇到了挑战。为了克服这个问题,我们用称为 sigmoid 函数的平滑近似替换了阶跃函数。我们解释了 sigmoid 函数的行为及其产生介于 0 和 1 之间的概率输出的能力。

我们将 sigmoid 函数应用于分类示例,并演示了如何使用新的激活来计算损失和梯度。更新参数和改进模型的过程与回归相同。

最后,我们强调,通过将相同的公式应用于多个权重和数据点,可以将所讨论的概念扩展到更高的维度。计算损失、计算梯度和更新参数的一般原则与输入的维度无关。

总的来说,了解单个神经元的计算、损失函数和梯度为训练神经网络和提高其性能提供了基础。

 

数据分析管道 (DL 05)



数据分析管道 (DL 05)

在我们的深度学习课程中,我们将深入研究神经网络。但是,请务必记住,神经网络或任何机器学习模型只是更大系统的一部分。在将数据输入神经网络之前,需要收集数据并将其处理成网络可以理解的格式。同样,神经网络的输出通常需要进行后处理或进一步分析。

在整个学期中,记住数据分析管道的比喻会很有帮助。这个类比强调了我们在机器学习中的目标是将对世界的观察转化为对世界的预测,而神经网络只是这个过程中的一个步骤。管道提醒我们考虑数据经过的阶段以及每个阶段如何为下一个阶段做出贡献。

不同的问题需要管道中的不同阶段。虽然标准化或模拟数据集可能允许我们跳过某些阶段,但深度学习的实际应用要求我们考虑数据分析的实际方面。

让我们更详细地讨论数据分析管道的一些重要方面。第一阶段是数据收集。虽然在某些情况下可以使用预先存在的数据集,但如果我们想用深度学习解决一个新问题,我们必须确定哪些数据适合训练我们的模型。在收集数据时,考虑到深度学习最近的成功依赖于大型数据集,我们需要确保我们有足够的数量。但是,也存在数据过多的情况,尤其是在计算资源有限的情况下。在某些情况下,使用有限数量的数据可能是有益的,尤其是在探索和发现问题期间。确保我们用于训练的数据集能够代表我们要解决的问题至关重要。这涉及考虑因素,例如分类任务中所有所需类别的表示,而不是忽略模型应该识别的重要异常值。

另一个挑战是识别数据集中的系统偏差。偏差可能以各种方式出现,例如在晴天拍摄的图像过多,导致图像分类器在多云条件下出现困难。偏见还会影响与健康或教育相关的预测,将个体因素归因于更广泛的社会结构。在数据收集过程中必须注意潜在的偏差。然而,解决和纠正偏见是一个复杂的问题,需要持续进行深度学习研究。

收集数据后,我们通常需要在应用机器学习或其他处理技术之前对其进行清理。此步骤涉及处理缺失数据,确定数据的哪些维度是相关的,以及处理示例中的不同维度。正确标记数据对于监督学习至关重要。获得适当的标签可能具有挑战性,特别是在转录手语或处理语音到文本的不一致时。标签应该准确地代表我们希望模型学习的数据的各个方面。

接下来,我们必须将数据转换为适合训练我们的神经网络或机器学习模型的数字格式。神经网络期望以向量或矩阵的形式输入数字。数字编码过程的难度因问题而异。例如,由于计算机已经使用基于像素的表示,因此处理图像数据相对简单。但是,处理以 ASCII 格式编码的文本数据需要替代表示法。随着问题变得越来越复杂,转换数据表示甚至维度变得越来越重要。

此外,规范化数据可能是有益的,尤其是当神经网络倾向于输出 0 到 1 范围内的值时。归一化涉及缩放数据值的范围,确保神经网络的输入更接近。在神经网络的输出之后,我们可能需要执行后处理步骤。这包括将网络的输出解码为所需的预测格式、传达预测置信度以及考虑将使用模型预测的应用程序或算法。

一旦我们处理了数据并训练了我们的神经网络,我们就可以进入评估和调整阶段。这是我们评估模型性能并进行改进的地方。评估涉及使用我们之前预留的测试集。通过将经过训练的神经网络应用于这些未见过的数据,我们可以衡量它对新示例的泛化能力。我们通常使用准确性、精确度、召回率和 F1 分数等指标来评估我们模型的性能。这些指标提供了有关神经网络进行预测的有效性的见解。

根据评估结果,我们可以确定模型可能表现不佳或存在局限性的区域。这些信息指导我们进行必要的调整和改进。我们可以迭代模型架构、超参数,甚至可以在需要时收集额外的数据。目标是改进模型的性能并确保它达到所需的准确性和可靠性。

在调整过程中,我们尝试不同的配置和设置来优化模型的性能。这包括调整超参数,例如学习率、批量大小和正则化技术。通过系统的探索和实验,我们的目标是找到能够最大化神经网络有效性的最佳设置组合。

除了对模型本身进行微调外,我们还考虑了其应用的更广泛背景。我们考虑了我们试图解决的具体问题以及模型预测对现实世界的影响。这涉及检查在实践中部署模型的社会、道德和法律方面。确保模型公平、公正并符合问题领域的价值观和要求至关重要。

作为深度学习从业者,我们的责任不仅仅是开发准确的模型。我们必须批判性地分析和解释结果,同时考虑到任何潜在的偏见或局限性。有必要定期重新审视和重新评估模型的性能,以随着时间的推移保持其有效性。

在深度学习课程中学习神经网络需要了解它们是更大系统的一部分。数据分析管道,从数据收集到预处理、训练和评估,包含需要仔细考虑的多个阶段。通过关注整个过程并不断改进我们的模型,我们可以有效地利用深度学习的力量做出准确的预测并解决现实世界的问题。

 

样本外验证 (DL 06)



样本外验证 (DL 06)

在机器学习中,评估模型涉及做出新的预测并在看不见的数据上对其进行测试。在本次讨论中,我们将探索如何有效地使用我们的数据来验证和改进我们的机器学习模型。

模型选择过程从确定解决给定问题的可用选项开始。这引出了模型假设空间的概念,它定义了模型可以表示的函数类型。假设空间受到诸如所选输入表示和所需输出类型等因素的限制。

一旦我们选择了特定的模型或机器学习算法,就可以对模型的各个方面进行调整。这包括调整模型的参数,例如使用数据训练的权重和偏差。此外,其他方面,如学习率或迭代次数,可以被视为影响模型性能的超参数。

为了有效地探索和测试不同的选项,我们依赖于实验验证。这涉及将我们的数据集划分为训练集和测试集。训练集用于训练模型,而测试集用于评估其在未见数据上的性能。通过比较测试集上的不同模型或超参数,我们可以确定哪些模型或超参数在泛化到新数据方面更有效。

泛化是机器学习的一个重要方面,因为我们的目标是开发能够对新的、看不见的数据做出准确预测的模型。过度拟合,即模型对训练数据过于具体,是实现良好泛化的常见挑战。通过分离一部分数据进行样本外验证,我们可以评估模型是否过度拟合或成功泛化。

在探索多个超参数时,我们可以系统地改变它们的值或从合理范围内随机抽样。随机化使我们能够有效地探索更广泛的价值。但是,如果大量实验导致测试集过度拟合,则可能需要将数据进一步分为训练集、验证集和测试集,或者使用交叉验证。

交叉验证涉及将数据划分为多个子集,并在这些子集的不同组合上迭代训练和测试模型。这种方法对模型的性能和泛化能力提供了更稳健的估计。

机器学习的关键思想是通过分离训练和测试数据来实验验证我们的模型。这使我们能够评估它们在未见过的示例上的性能,并就模型选择和超参数调整做出明智的决策。

 

前馈神经网络(DL 07)



前馈神经网络(DL 07)

与单个神经元不同,神经网络由多层组成并通过节点执行计算。每个节点计算输入的加权和并应用激活函数。在神经网络中,节点的输入可以来自先前的节点激活,并且其计算的激活可以传递给后面的节点。

例如,网络中的神经元 8 接收来自神经元 5、6 和 7 的输入。神经元 8 执行的输入的加权和是这些神经元的激活乘以相应权重的总和,再加上偏差。然后将激活函数应用于加权和。神经元 8 的输出用作节点 11 和 12 的输入。神经网络中可以使用不同的激活函数,例如双曲正切和整流器线性单元 (ReLU)。

为了使用神经网络进行计算以进行预测,我们首先根据输入数据设置输入层节点的激活。输入层节点仅存储输入向量的值。输入层和输出层的大小取决于数据的维度和所需的预测。网络中的隐藏神经元组织成层,在输入和输出之间执行计算。通过计算每一层的激活,我们可以将输入传递给下一层,参考之前的激活。在权重更新期间,梯度下降也需要这些激活。神经网络中隐藏层的存在提供了使用非线性激活函数的能力。线性激活在多层网络中没有优势。非线性激活函数,例如 sigmoid 函数,可以表示各种函数。

可以使用阶跃函数分类器构造表示逻辑运算(如 AND、OR 和 NOT)的神经元。通过使用 sigmoid 激活来近似这些逻辑运算,神经网络可以表示任何布尔函数。为了训练神经网络,我们使用梯度下降来更新权重和偏差。网络的参数包括整个网络中的所有权重和偏差。具有多个输出神经元的网络中的损失函数可以是对所有输出神经元求和的均方误差。目标是通过迭代更新参数来减少损失。

梯度下降是通过计算关于参数的损失梯度来执行的,在梯度的相反方向上采取步骤以最小化损失。这个过程被称为反向传播,它允许网络学习和改进它的预测。在下一个视频中,我们将深入研究反向传播算法的细节,该算法用于在神经网络上执行梯度下降更新。反向传播可以有效计算关于网络参数的损失梯度。

该过程首先计算损失函数相对于输出激活的梯度。该梯度表示损失对输出激活变化的敏感性。它可以通过应用链式法则获得,因为损失取决于通过激活函数的输出激活和与目标值的平方差。一旦计算出关于输出激活的损失梯度,它就会通过网络向后传播。在每一层,梯度乘以激活函数相对于输入加权和的导数。该导数捕获激活对加权和变化的敏感性。

通过向后传播梯度,我们可以计算损失相对于前一层激活的梯度。这些梯度表明前一层中的每个激活对损失的贡献有多大。使用关于激活的损失梯度,我们可以计算每层中关于权重和偏差的损失梯度。这些梯度是通过将前一层的激活乘以相应的激活函数梯度得到的。最后,利用关于参数的损失梯度,我们可以使用梯度下降算法更新权重和偏差。通过在与梯度相反的方向上采取步骤,我们逐渐优化网络参数以最小化损失。

这种前向传播、后向传播和参数更新的迭代过程重复一定数量的 epoch 或直到损失收敛到一个令人满意的值。通过这个训练过程,神经网络通过根据提供的训练数据调整其权重和偏差来学习做出更好的预测。

神经网络利用多层和非线性激活函数来执行复杂的计算和做出预测。通过采用反向传播算法和梯度下降,神经网络可以从数据中学习并优化其参数以提高其预测能力。

 

神经网络反向传播(DL 08)



神经网络反向传播(DL 08)

在本视频中,我们将推导反向传播算法,该算法用于通过随机梯度下降步骤训练神经网络。该算法包括三个主要步骤。

首先,我们执行前馈传递以对数据点进行预测。这些预测决定了损失,它表示预测输出与实际输出之间的误差。接下来,我们执行反向传递来计算损失的偏导数。我们为输出层和隐藏层中的每个神经元计算一个称为“delta”的量。 Delta 表示损失相对于该神经元输入的加权和的偏导数。通过应用链式法则,我们可以通过考虑每个神经元对损失的影响来计算它的增量。

为了计算输出层神经元的增量,我们使用激活函数的导数以及目标和激活之间的差异。该计算考虑了损失与输入的加权和之间的关系。对于隐藏层神经元,我们考虑它们对下一层神经元的影响,并通过将下一层节点的贡献相加,乘以权重和激活导数来递归计算 delta。一旦我们计算了所有神经元的增量,我们就可以使用它们来计算权重和偏差的偏导数。

每个权重的偏导数是相应的 delta 和前一层神经元激活的乘积。类似地,每个偏差的偏导数等于其对应的增量。

为了执行梯度下降,我们对数据点的一个子集(称为批次)求偏导数的平均值。这种方法被称为随机梯度下降。通过用平均偏导数乘以学习率来更新权重和偏差,我们将参数朝最小化损失的方向移动。

在实践中,我们通常使用随机批次的随机梯度下降,而不是计算每个数据点的增量和偏导数。我们随机抽取数据的一个子集,计算该子集的平均损失及其梯度,并相应地执行参数更新。这加快了训练过程,尤其是对于大型数据集。

反向传播算法结合前向和反向传递来计算增量和偏导数,然后将其用于随机梯度下降更新。通过迭代更新参数,神经网络学会最小化损失并改进其预测。

 

更好的分类激活和损失:Softmax 和分类交叉熵 (DL 09)



更好的分类激活和损失:Softmax 和分类交叉熵 (DL 09)

使用具有 S 形神经元的神经网络执行多类分类时,会出现某些限制。以前,当只处理两个类别时,单个神经元可以输出 0 或 1。但是,当涉及多个标签时,例如将手写数字从 0 分类到 9,则需要不同的表示。

一种常见的方法是将标签编码为单热向量,其中每个标签都有自己的维度,并且一次只激活一个维度。例如,一个五维向量可能表示五个可能的标签,激活第四个维度来表示第四个标签。虽然基于 sigmoid 神经元的输出层可能会产生这种类型的输出,但存在实际问题。

第一个问题是 sigmoid 层可能会为多个标签输出相对较大的值,从而难以解释预测。理想情况下,我们希望输出层产生 0 和 1 或反映对不同可能标签的信心的东西。第二个问题出现在 sigmoid 输出层的训练过程中。当目标是 one-hot 向量时,梯度下降用于将正确标签的激活推向 1,而其他标签则推向 0。然而,由于 sigmoid 函数的性质,具有较大误差的神经元可能具有较小的增量,这使得自信地纠正错误预测变得具有挑战性。

当对隐藏神经元使用 sigmoid 激活时,也会出现类似的问题,称为梯度消失问题。然而,在本视频中,我们关注输出激活和损失函数的替代组合来解决这些问题。我们为输出层引入 softmax 激活,而不是 sigmoid 激活。 Softmax 激活在整个层上计算,放大输入之间的差异并将激活归一化以加起来为 1。这导致输出更易于解释为预测,并且可以被视为网络对每个可能标签的置信度。

为了有效地使用 softmax 激活,我们将它们与分类交叉熵损失函数配对。交叉熵损失计算目标神经元激活的负对数,这在使用单热向量时简化为激活的对数。这种组合可以实现有效的梯度下降更新。为了计算输出层的增量,我们推导出损失相对于激活的偏导数。对于目标神经元,导数是 -1 除以激活。对于其他神经元,导数为零。由于 softmax 激活的相互依赖性,即使只有目标神经元具有非零导数,也会为所有输入获得非零增量。

通过使用这些公式,我们可以计算目标神经元和输出层中其他神经元的增量。目标神经元的增量很容易计算,因为它是激活减一。其他神经元的增量简化为负激活本身。

通过 softmax 激活和分类交叉熵损失的这种组合,我们为分类问题实现了有意义的输出,并获得了有效地将输出推向正确预测的梯度。使用 softmax 激活和分类交叉熵损失为我们提供了一个强大的多类分类框架。让我们更深入地研究这些组件如何协同工作以实现神经网络的有效训练。

一旦我们计算出输出层的增量,这些增量就作为反向传播的起点,我们通过网络向后传播误差梯度以更新权重。要更新连接输出层和前一层的权重,我们可以使用增量值并应用梯度下降算法。权重更新是通过将每个输出神经元的增量乘以相应权重的输入激活并通过学习率调整权重来确定的。

通过在网络中反向传播增量,还可以计算隐藏层中权重的梯度。这使我们能够相应地更新隐藏层中的权重,进一步改进网络的性能。需要注意的是,在使用 softmax 激活和分类交叉熵损失时,我们需要确保 softmax 仅应用于输出层。对于隐藏层,建议使用 ReLU(整流线性单元)或 tanh 等激活函数。 Softmax 激活使我们能够获得可解释为每个类别的概率或置信度分数的输出。输出向量中的值总和为 1,使我们能够衡量网络对其预测的置信度。较高的值表示对特定类别的置信度较高。

分类交叉熵损失通过有效测量预测概率和真实标签之间的差异来补充 softmax 激活。它鼓励网络最小化预测概率和单热编码目标向量之间的差异,从而推动网络朝着更准确的预测方向发展。

通过结合 softmax 激活和分类交叉熵损失,我们获得了几个好处。我们获得了有意义且可解释的输出,使我们能够了解网络对不同类别的预测和置信度。从分类交叉熵损失中导出的梯度以一种导致更有效学习和提高准确性的方式指导权重更新。值得一提的是,还有其他可用的激活函数和损失函数,每种都适用于不同类型的问题。然而,具有分类交叉熵损失的 softmax 激活已被证明是多类分类任务的成功组合,提供可解释性和有效的训练动力。

总之,在多类分类神经网络中使用 softmax 激活和分类交叉熵损失使我们能够获得有意义的预测、解释置信度并执行有效的梯度下降更新。这种组合对于在各种分类任务中获得准确可靠的结果起着至关重要的作用。

 

通过矢量化加快神经网络速度(DL 10)



通过矢量化加快神经网络速度(DL 10)

要了解神经网络的内部工作原理,深入研究单个神经元的水平并考虑神经元之间的连接是有益的。在计算激活的前向传递和计算增量的反向传递中,从节点和边的角度思考可以帮助建立直觉。然而,深度学习实际上并不是这样工作的。为了构建可以有效训练的大规模神经网络,我们需要转向更高的抽象层次,并从向量、矩阵和张量的角度进行思考。

迈向更高层次抽象的第一步是将层的激活表示为向量。如果我们的神经网络被组织成层,我们可以将层的激活收集到一个向量中。例如,向量 A^l 存储第 l 层的所有激活,其条目数与该层中的节点数一样多。类似地,我们可以在反向传播期间将层的增量收集到向量中。我们还可以使用向量来表示层的偏差或输入。

为了用这种矢量化表示法表达计算,让我们首先考虑节点如何计算其输入的加权和。进入节点 5 的激活函数的输入 X^5 计算为前一层激活的加权和加上偏差。通过将前一层的激活收集到向量 A^K 中并将权重向量输入节点 5,输入的加权和可以表示为这两个向量之间的点积。另一种写点积的方法是转置第一个向量并在行向量和列向量之间进行矩阵乘法。因此,我们可以将节点 5 的输入表示为进入节点 5(转置)的权重向量乘以前一层的激活向量,再加上节点 5 的偏差。

这种向量化符号可以更进一步,让我们可以一次计算第 l 层的整个输入向量。通过将节点 5 的权重行向量与该层中其他神经元的权重行向量相结合,我们获得了一个包含从第 K 层到第 l 层的所有权重的矩阵。该权重矩阵的行数与第 l 层中的节点数一样多(每行代表第 l 层神经元之一的权重向量),列数与前一层 K 中的节点数一样多(每列代表一个向量来自层 K 节点之一的权重)。将此权重矩阵乘以第 K 层的激活向量会得到一个向量,其中每个元素表示第 l 层节点之一的输入的加权和。为了获得激活函数输入,我们将偏差添加到该向量中,这些偏差已收集到一个向量中。

现在,使用矩阵向量乘法、向量加法和逐元素函数,我们可以表达计算一个层的所有输入的操作。以前,这些计算需要嵌套循环,但现在我们可以以矢量化的方式高效地执行它们。

展望未来,我们也可以将这种矢量化方法扩展到反向传递。不是一次只考虑一个神经元,我们可以计算第 K 层节点的增量,作为下一层所有增量的加权和乘以该节点激活函数的导数。同样,我们可以将这个加权和表示为点积。通过将来自节点 3 的权重行向量乘以层 l 的增量向量,然后乘以激活导数,我们可以计算层 K 的增量向量。通过使用收集层所有权重的权重矩阵l 个神经元并将其乘以第 l 层的增量向量,我们可以得到一个维度与权重矩阵匹配的矩阵。

通过利用矩阵运算,我们可以在计算前馈密集连接神经网络时实现显着的性能提升。这是特别有利的,因为矩阵运算可以在图形处理器 (GPU) 等专用硬件上高效执行,从而大大加速这些计算。

当我们使用矩阵表示我们的神经网络计算时,我们可以以高效和并行的方式执行前向传递、反向传递和权重更新。让我们回顾一下关键步骤:

  1. Forward Pass:我们可以通过执行矩阵向量乘法和逐元素激活函数应用来计算整批数据的每一层的激活。通过将激活组织成一个矩阵,其中每一列代表不同数据点的激活,我们可以有效地计算整个批次的激活。

  2. Backward Pass:类似地,我们可以以矢量化的方式计算每一层的增量(误差梯度)。通过将增量表示为矩阵,其中每一列对应于特定数据点的增量,我们可以执行矩阵向量乘法和与激活导数的逐元素乘法,以有效地计算整个批次的增量。

  3. 权重更新:为了更新权重和偏差,我们可以使用矩阵运算来计算增量矩阵与权重矩阵的转置之间的点积。此操作产生一个权重更新矩阵,其中每个条目代表特定权重的更新。通过将点积除以批量大小,我们得到平均更新,然后我们可以通过减去学习率乘以平均更新来更新权重。偏差更新的计算方法是取各列的增量向量的平均值,然后从偏差中减去学习率乘以平均值。

通过矢量化这些计算并利用矩阵运算,我们可以实现显着的计算效率并利用硬件加速进行并行处理。这种方法使我们能够有效地训练大规模神经网络,使深度学习在广泛的任务和数据集上变得可行。

值得注意的是,虽然文本提供了向量化和利用矩阵运算的高级概述,但实际的实现细节可能会因所使用的编程语言或框架而异。不同的语言和框架可能有自己针对矩阵运算优化的函数和库,进一步提高性能。

除了性能优势外,在深度学习中利用矩阵运算还有其他优势:

  1. 简单性和代码可读性:通过使用矩阵运算,神经网络计算的代码变得更加简洁和易于理解。我们可以使用矩阵运算以更紧凑和直观的形式表达计算,而不是为单个数据点编写显式循环。

  2. 软件兼容性:许多流行的深度学习框架和库,例如 TensorFlow 和 PyTorch,都提供了矩阵运算的高效实现。这些框架通常利用优化的线性代数库,例如 BLAS(基本线性代数子程序)或 cuBLAS(CUDA 基本线性代数子程序),以加速 CPU 或 GPU 上的矩阵计算。通过利用这些框架,我们可以从它们的优化实施中受益,并确保与深度学习管道的其他组件兼容。

  3. 泛化到其他层类型:矩阵运算不仅可以应用于密集连接层,还可以应用于其他层类型,例如卷积层和循环层。通过以矩阵形式表示计算,我们可以在不同层类型之间利用相同高效的矩阵运算和优化,从而简化实现并提高整体性能。

  4. 与硬件加速集成:GPU 或张量处理单元 (TPU) 等专用硬件旨在加速矩阵计算。这些硬件加速器擅长执行大规模并行矩阵运算,是深度学习工作负载的理想选择。通过利用矩阵运算,我们可以与这些硬件加速器无缝集成并充分利用它们的功能,从而显着加快训练和推理时间。

总之,在深度学习中利用矩阵运算可提供性能优势、代码简单性、软件兼容性以及与硬件加速器的集成。通过以矩阵形式表达神经网络计算并利用优化的矩阵运算,我们可以在各种任务和平台上高效地训练和部署深度学习模型。