文:城主
(注:这不是面向初学者的文章。您需要一点基础知识来理解本文内容。)
感谢粉丝的热心推荐。本文对于任何想要准备深度学习面试的人来说都是非常有帮助的。
本文对应视频的中英完整版B站传送门:
【深度学习AI面试问答50题-哔哩哔哩】 https://b23.tv/m1osqBp
=以下是基于视频信息重写的中文书面版=
本文回答50个最常见的深度学习问题,这些问题是你在参加数据科学、机器学习工程、人工智能工程和研究科学家访谈时可能遇到的。
深度学习是当今最热门的话题之一,它构成了大型语言模型和生成式人工智能等主题的基础。深度学习包含许多复杂的概念,结合了线性代数、数学、微分理论以及先进的算法,它们共同构成了人工智能的这个领域。因此,如果你想在大型语言模型或人工智能方面找到一份工作,那么一定要为此类面试做好准备,因为深度学习将成为面试者测试你的一个重要概念。
首先,本文将讨论的前50个问题中的前10个是基本概念。从深度学习的基本概念开始,探讨深度学习和机器学习的区别,讨论神经网络的概念,研究其架构,以及神经元背后的概念。讨论反向传播的概念,它是如何工作的,与梯度下降(GD)有何不同,以及什么是GD。此外,介绍不同的优化器和激活函数,详细解释饱和度的概念,以及这是如何导致梯度消失问题的。涵盖神经网络训练和测试过程的各个方面。
然后,这将是接下来的10个问题。更详细地介绍反向传播的概念、与梯度下降的关系,介绍梯度消失和爆炸问题。涵盖您在面试过程中会被问到的各种具体问题和与深度学习模型相关的问题。介绍损失函数和各种类型的流行损失函数,您在深度学习面试中可能会遇到这些问题。
在接下来的10个问题中,介绍SGD算法,这是GD的更高级版本。介绍GD的不同版本和变体,这些内容在深度学习面试中会一次又一次地出现,例如批量GD、小批量GD和SGD。将探讨它们之间的区别,以及批量大小的作用。介绍Hessian的概念,将Hessian用作不同优化算法的一部分。以及介绍什么是RMS属性以及什么是臭名昭著的Adam算法。
接下来10个问题,讨论一些更复杂的主题,介绍Adam W的概念,介绍批量归一化。探讨批量归一化和层归一化的区别,如何将层归一化用作Transformer的一部分。讨论什么是剩余连接,以及剩余连接的作用。讨论梯度裁剪、cavier初始化,以及解决梯度消失问题和梯度爆炸问题的方法。介绍过度拟合的概念,这是您在深度学习面试中可能会遇到的问题。
最后10个问题介绍神经网络中的dropout和去正则化的概念。探讨过度拟合问题以及如何在神经网络中解决它。此外,讨论dropout和随机森林的区别。讨论训练与测试的概念,以及退出时的调整。介绍L1正则化、L2正则化,它们之间的区别,以及它们对权重的影响、惩罚的影响以及它们对道德表现影响的严重程度。介绍维度准确性的概念以及深度学习如何解决这个问题。然后将介绍生成模型的概念。
1 什么是深度学习?
在这个问题中,面试官想了解您是否了解深度学习与机器学习、人工智能相比的优势。您可以简要提及神经网络的概念以及它与人脑的关系。深度学习是机器学习的一个子集,而机器学习又是人工智能的一个子集。这是人工智能的一个分支,涉及训练人工神经网络在大量数据上,以识别和学习数据中的隐藏模式、非线性关系,这是传统机器学习模型(如线性回归或逻辑回归或随机森林和XGBoost)无法做到的。深度学习的核心是层的概念,因为人工神经网络和一般而言,深度学习试图复制人类大脑的工作方式以及当我们看到、听到或闻到某些东西时拦截和获取来自外界的输入信号的方式。他们利用这些信息进行学习,并据此决定是否得出结论或采取行动。这正是深度学习试图实现的目标。深度学习尝试采用神经网络的思想,神经网络是深度学习模型的一种,以便在输入层中获取输入数据,然后通过激活函数对其进行转换以激活这些神经元,接着将其转换为激活状态。这一过程将在我们的隐藏层中进行。深度学习模型的神奇之处在于,它能够识别输入数据中的非线性关系,然后产生输出。这是一个非常高级的过程。
面试官并不希望你解释权重和参数的概念,这些我们稍后会讲。但是,面试官希望了解你是否对深度学习有较高的理解,也许还希望你能提供深度学习模型的例子。在讲述这些时,你肯定要提到人类大脑和神经网络之间的关系,以及输入数据、输入信号、激活和隐藏层的概念。不要过多讨论神经网络架构的细节,而是简要提及这些深度学习模型。深度学习模型的示例包括人工神经网络、循环神经网络、长短期记忆网络(LSTM)、以及更高级的架构,例如变分自动编码器。这些模型都基于神经网络。
因此,如果我要非常简短地回答这个问题,我会说深度学习模型是人工智能分支上的机器学习模型的子集,它试图学习复杂的数据和大量数据,并发现隐藏的模式和复杂的数据结构。这种模式的结构适用于各种类型的任务,包括计算机视觉,机器翻译任务,以及许多自然语言处理模型,如臭名昭著的ChatGPT,GPT模型或T5等大型语言模型,它们都是基于神经网络的深度学习模型。
2 深度学习与传统的机器学习模型有何不同?
在这里,面试官希望了解你是否知道深度学习模型相对于机器学习模型的主要优势。因此,请先提及一些传统机器学习模型的示例,然后再提及一些深度学习模型的示例,并尝试将重点放在深度学习模型的一两个优点上。机器学习模型的一些例子包括线性回归、逻辑回归、支持向量机、朴素贝叶斯算法、k均值或聚类以及无监督学习模型DBSCAN。还可以提到一些boosting算法,例如GBM、XGBoost,以及随机森林,这在任务的进展和分类类型中非常流行。
然后,我们要提到深度学习模型,它与机器学习模型有根本的不同。并提及人工神经网络(ANN)、循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)和自动编码器等示例,所有这些都基于神经网络。还要提到卷积神经网络(CNN),它在计算机视觉领域非常流行。然后指出,第一个最大的区别是传统的机器学习模型依赖于手动特征提取,而在深度学习模型中,它们会自动执行此操作,并自动按原样获取输入数据。我们不需要执行特征选择,我们不需要担心这一点,因为我们的模型由神经网络表示,特别是具有这些深层的模型,能够识别所有这些数据中的这些模式,然后为自己提取描述我们的数据的最重要的特征,然后使用它对于不同类型的任务,无论是回归还是分类。它实际上表现非常好。
因此,深度学习模型在大数据上表现得非常好,而我们已经看到机器学习模型受到了影响。众所周知,当数据量增加时,机器学习模型的性能会变得更差。当特征数量增加时,它们开始过度拟合,并且也开始变得不稳定并且无法准确预测输出。当我们增加数据中的观察数量时,我们也会在数据中包含复杂的特征。这无疑有助于深度学习模型超越传统的机器学习模型,特别是在计算机视觉或语音识别、机器翻译和深度学习模型的思想等任务中。您可以通过观察不同技术领域中最新的各种应用程序,来理解为什么它们优于机器学习模型。在这些应用程序中,大多数都是基于神经网络的算法,而非机器学习模型。这主要归因于深度学习模型的多种能力,包括处理大数据、处理复杂特征以及自我进行特征提取,而不是在模型之外进行,或者受到各种影响,如传统机器学习模型所面临的问题。
3 什么是神经网络?
在这里,面试官希望了解您对神经网络与人类学习方式之间的关系的理解,以及您是否了解这些组件以及组件如何运作。在训练过程中,您是否知道什么是权重和参数?您是否知道隐藏层是什么,以及它们是一个还是多个?您是否了解深度神经网络的概念,以及这种信息流如何发生,以及您是否提到了神经网络的所有这些元素?
作为这个问题的回答,我想说,神经网络是深度学习领域和人工智能领域的基本概念。它是一个受生物人脑启发的计算模型,试图复制人类学习、解释信息、获取输入数据并处理信息的方式。因此,神经网络对输入数据进行训练,并不断更新这些信息,学习新的东西,添加新的信息,然后更新可能的结果。最终的目标是最大限度地减少我们在学习过程中所犯的错误。
神经网络的核心是由神经元组成,就像我们人脑中的神经元一样。这些神经元一起形成层,包括输入层(代表我们的输入数据)和权重(展示了我们需要对不同输入信号赋予多少重要性)。这些权重就是我们在模型中所说的参数,我们在执行训练和学习过程时需要不断更新它们。这些层还包括一个或多个隐藏层,这是我们神经网络的中间部分。隐藏层可以帮助我们学习这些不同的模式,理解、激活某些神经元并停用或激活较少的其他输入神经元,然后转换这些信息。
在隐藏层之后,我们可以有另一个隐藏层,它将接收来自前一个隐藏层的信息,然后继续学习过程。反过来,它将能够学习和理解先前的隐藏层信息。例如,在输入中,我们有图像的这些不同像素,我们想要学习这些图像。为了让神经网络学习,它应该能够首先学习输入数据中的某种对象。因此,在第一个隐藏层中,它可能会发现某些信号、某些边缘和某些信息。然后在下一个隐藏层,它将能够识别特定的物体,比如说猫的耳朵,如果我们想要识别图像是猫还是狗,然后把这个信息传递到下一层,传递到下一层,然后我们继续到最后一层,当我们产生输出。
假设您熟悉机器学习,并且正在阅读本教程,那么您应该熟悉分类、回归、监督学习的概念。对于传统的神经网络,我们会产生输出,例如,它可以识别概率,即 0 到 1 之间的值,比如说我们的分类任务。然后这个值应该与实际的类进行比较。例如,如果我们有概率,并将其转换为类别,那么我们可以更新相应的类别。因此,我们有每个时期神经网络的输出,然后我们使用这些信息与监督学习过程中的真实标签进行比较,然后计算误差。我们试图了解我们的预测效果如何,然后使用这些信息来了解模型预测结果的准确度。这就是我们所说的损失。然后,我们使用这个损失函数来了解我们需要改变权重多少,我们对神经元的重视程度,我们需要更新这些权重以及模型中的其他参数多少,以便减少我们的模型所犯的错误量。神经网络的基本思想在于获取输入,将其放入隐藏层以从输入数据中学习。这个过程涉及到激活神经元,并可能包含一个或多个隐藏层。通过不断激活这些神经元,我们可以获得输出。我们需要了解模型造成的损失,以及总体成本函数,然后计算我们所说的梯度。虽然我在这里简单地提到了梯度的概念,但并没有过多讨论它的细节。然后,我们使用这些梯度来了解需要更新多少权重才能改进模型参数。因为最终,我们关心的是这个模型,它具有参数、权重参数、偏差参数,最终将为我们生成最准确的预测。为了达到这个目标,我们需要不断学习,经历这个循环,以便正确学习,并生成一个误差最小的模型,以便能够正确地从输入数据中学习。
4 解释深度学习中神经元的概念
在这个问题中,面试官想了解权重的概念,偏差因子的概念,如何使用它们来获得所谓的 Z 分数,以及如何激活,激活函数用于获取激活,以及这些权重和偏差因素以及与学习过程的关系的意义是什么。深度学习中的神经元有时被称为人工神经元,它模仿人脑神经元的功能,但以一种自动且简单的方式实现。在神经网络中,模型获得不同的输入。这些输入信号我们称之为神经元,它接受输入数据,我们将其表示为 x。我们用这个x来乘以权重,因为这些权重可以告诉我们这个神经元应该有多少重要性,我们需要对这个神经元给予多少关注。然后这些权重乘以这个输入数据,你称之为x,这些就是我们添加一个偏差因子,因为当我们执行学习过程时总是会引入偏差。权重乘以输入数据 x,然后在其上添加偏差因子,这将是我们的 Z 分数。但在下一阶段,在接近隐藏层之前,我们使用所谓的激活函数。激活函数,比如 sigmoid 函数、整流线性单元或 Leaky ReLU,所有这些激活函数,它们所做的就是在数学上将非线性引入到我们的神经网络中。这些激活函数基于权重、输入数据和偏差因子应用于所有这些不同的 Z 分数,以便了解每个神经元应该被激活多少。在某些情况下,我们可能希望在查看对象并尝试根据像素了解该图像中的对象是什么时,我们可能需要激活与该特定区域或该特定对象相关的某些神经元,并且我们不应该激活其他神经元。这正是我们对这些神经元的激活所做的事情。因此,在这里,我们使用这些激活为神经网络引入非线性,以学习输入数据中的这些复杂结构。
5 用简单的方式解释神经网络的架构
鉴于我们已经回答了前面的问题,都提到了神经网络的架构和训练过程的某些部分,这个问题很容易回答,我将在这里使用一个简单的可视化来表示简单的神经网络,该神经网络仅包含一个隐藏层只是总结我们在之前的面试问题中提到的所有内容。神经网络就是这种多层结构的模型,每一层都在一步一步地对输入数据进行变换。把它想象成一条装配线。装配线的每个阶段都会比前一个阶段增加更多的复杂性,而细节和复杂性会为模型执行预测的能力增加更多的价值。一开始,模型有这些输入层。正如您在这里所看到的,输入层由 Z1、Z2、Z3 直到 Zn 表示。在这里,您可以将这个元素、这个输入视为输入层的一部分,作为描述数据的特征。例如,我们可能想使用神经网络来估计房屋的价格。我们需要具有某些特征来估算该价格。我们需要学习才能了解如何区分不同的房屋以及这些特征如何影响房价。例如,Z1 可以是这所房子的卧室数量。Z2可以是这所房子的层数。Z3可以是房子是否有游泳池。另一个可能的特征是房子是否已经建成。这栋房子是在哪一年建造的?房子的年龄是多少?所有这些特征描述了房子的某个元素或某个特征。这将帮助我们,也将帮助模型从这个特征中学习并理解。这栋房子的准确价格是多少?
接着,我们就有了这些不同的权重。如你所见,我们有权重1,1,权重1,2,权重1,3。然后我们就有了第二个输入对应的权重,第三个特征对应的权重,所以对应于Z3,比如W3,1,W3,2,W3,3等。如你所见,这些权重显示了一堆正在移动的箭头,箭头指向下一层,即我们的隐藏层。
在这个简单的架构中,我们只有一个隐藏层,但也可以有更多隐藏层,这通常是传统深度神经网络的情况,因此也被称为“深度”。这些权重的作用是帮助我们理解这个输入特征应该对第一隐藏单元、第二隐藏单元和第三隐藏单元贡献多少。
如你所见,在我们的隐藏层中,我们有三个圆圈。这三个圆圈描述了隐藏层中的隐藏单元。我们有这个简单的结构,所以我们只有三个隐藏单元。但这是你在训练模型时可以自己决定的事情。这也是我们所说的可以调整的超参数。
在这里你可以看到 W1,1 从 Z1 到 H1。这是重要的权重,它告诉我们并告诉神经网络输入层应该得到多少关注,什么时候它应该变得重要,什么时候它可以帮助你学习第一个隐藏单元。那么对于H1,我们需要在Z1上施加的权重是多少,所以我们的第一个特征。然后我们有 W1, 2,它描述了我们需要施加在第一个输入特征上的权重,当识别这一点时,当学习并将信息放入我们的第二个隐藏单元 H2 时。
这些权重和相应的偏差因子以及输入数据可以帮助我们计算我们所说的 Z 分数。Z 分数可以表示为权重(W)乘以前面的输入数据(X),加上偏差因子(B)。
一旦我们有了 Z 分数,我们就准备添加非线性,即激活,这将帮助我们理解如何执行聚合。当涉及到第一个隐藏单元 H1 时,有四个不同的路径,即箭头指向 H1。分别是 W11、W21、W31 和 WN1。这基本上意味着我们有这些不同的输入特征,并且每个输入特征都有相应的权重。这有助于我们了解当我们获得 H1 时,我们需要对这些不同的输入特征给予多少关注,即我们的隐藏层,我们的第一个隐藏单元。
我们可以根据不同的权重、不同的输入信号聚合这些不同的 Z 分数,并且该激活函数可以显着改变我们在 H1 中计算激活的方式。这正是激活的作用,所以激活函数起作用。
一旦我们获得了这些信息,我们就计算了激活,准备好计算输出,并且在计算 H1、H2 和 H3 后完成输出。这些隐藏单元已经根据权重、偏差因子和激活函数学习了上一层输入数据中的信息。然后我们使用最终的权重,即 WH1、WH2、WH3,以便了解每个隐藏单元需要对输出层做出多少贡献。
在这个输出层中,我们所做的就是以所需的格式获得输出。所以可能我们在进行分类时想要得到一个概率,因此我们需要得到一个0到1之间的值。然后在这个输出层中,我们将得到这个值,我们将它转换为一个类。我们将其与实际的标签(例如 0 和 1)进行比较,以了解我们的简单神经网络的执行情况。
6 什么是神经网络中的激活函数?
激活函数在神经网络中起着至关重要的作用,其选择将决定神经网络的性能。到目前为止,我们已经讨论了很多关于权重的内容,以及如何使用权重、输入数据或前一层的输入、前一层的输出来计算Z分数。我们添加偏差向量以获得Z分数,然后我们需要应用激活函数以获得激活。这就是激活函数的作用,它决定了在计算下一层时,每个神经元应该被激活多少。
在神经网络中,激活函数引入了非线性的概念。如果我们不使用特定类型的激活函数,我们的模型将类似于线性回归模型。我们将拥有一个简单的线性类型的模型,它将能够揭示线性模式,但无法发现数据中这些复杂的隐藏模式。我们已经看到,在现实世界中,数据大多数时候都包含非线性关系。
因此,我们引入激活函数,这有助于我们将非线性引入神经网络。它们就像聚合函数一样,帮助我们理解如何组合这些不同的输入、这些不同神经元相应的Z分数,以获得最终的单个激活量。如果你看这个图,你可以看到我们正在使用x1、x2直到xn,它们是我们的输入点。然后我们就有了相应的权重,它告诉我们每个输入需要激活多少。然后我们需要聚合这些值。我们需要获得一个单一的激活,然后该激活将基于激活函数。它基本上定义了在计算我们之前看到的隐藏单元的体积时,我们需要添加多少与特定输入相对应的值。
有不同种类的激活函数。我简单提一下,四种流行的激活函数是sigmoid激活函数、双曲Tang函数,简称为Tang函数。另外,我肯定会提到整流器线性单元激活函数,即ReLU。我还提到了Leaky ReLU,即整流器线性单元激活函数的Leaky版本。你也可以,如果你有时间,你也可以指定激活函数,它们就像看门人一样。因此,他们决定需要从该状态使用多少信息才能传递到下一个状态。这基本上就是激活函数背后的想法,它使神经网络能够正确学习数据中的非线性关系。
7 列出几个流行的激活函数并描述它们
我们在第六个问题中简单讨论了激活函数。因此,在这里我将更详细地介绍这些不同的激活函数,并且我们还将对它们进行分类。当你被问到这个问题时,你不需要给出所有这些不同类型的例子。仅举这四个示例中的一个,然后提供此特定激活函数的详细说明。但在这种情况下,我会做的是,我将为您提供业界广泛使用的所有四种流行的激活函数,然后由您决定以哪一种作为示例。
所以我倾向于在这四个激活函数后面进行这样的分类。所以sigmoid激活函数,Tang激活函数,整流线性单元或短ReLU激活函数,以及Leaky整流线性单元,ReLU激活函数。所以我倾向于说sigmoid函数和Tang函数,它们可以形成一个单一的类别。然后修正的线性单元及其调整版本Leaky ReLU,它们可以形成第二类激活函数。我们很快就会明白原因。
现在让我们从sigmoid激活函数开始。如果您熟悉逻辑回归,那么您很可能会认识这个激活函数,因为当我们尝试生成类似概率的值(即0到1之间的值)时,逻辑回归中也会使用sigmoid函数。正如您所看到的,在sigmoid激活函数的情况下,当涉及到描述激活函数的图表时,我们会得到这条S形曲线。那么,激活函数包含哪些内容呢?
在计算过程中,我们首先计算出z分数,然后根据前一层的数据进行输出。例如,我们可以用x来表示这个过程。我们将x乘以权重(假设为w),然后添加偏差因子(假设为b),这样就可以得到z分数。接下来,我们需要将z分数作为激活函数的输入。这就是为什么我们需要将z分数转换为激活函数的原因。
在这个例子中,我们使用的是sigmoid激活函数。sigmoid激活函数接受输入(假设为z),然后将其转换为一个值,这个值等于1除以1加上e的负z次方。这与我们在逻辑回归中所做的非常相似。
如你所见,这张图代表的是一个sigmoid函数,x轴代表所有的z分数,y轴代表相应的激活。你可以看到,对于x的所有值(从负无穷大到正无穷大),相应的z分数(即y轴上的激活)的值都在0和1之间。所以最小值为0,最大值为1。你可以看到,曲线的拐点,也就是我们翻转曲线时到达的点,是0.5。
从这个激活函数中,你可以看到,每当我们有负值时,相应的激活就会在0到0.5之间。每当我们有正的z分数时,相应的激活将在0.5到1之间。
在回答面试问题时,需要记住和提及的一个重要问题是sigmoid函数可能会遭受我们所说的饱和问题。那么,什么是饱和度呢?当我们采用非常大的负值或非常大的正值时,就会发生饱和,然后激活或值(在这种情况下是函数)收敛到相应函数的极值。这就是这里发生的情况。如果我们假设x等于负1,000,那么相应的y值很可能非常接近0,即最小值,因此它是该激活函数的极值。如果我们将x视为一个非常大的正数,例如加1,000,那么相应的激活值将非常接近1,这就是该函数的全局最大值。这就是我们所说的饱和度。
这意味着,如果我们为z分数取非常大的负数或非常大的正数,那么该激活函数将为我们提供一个输出,一个非常接近极值的值,即0和1的相应激活函数。稍后,我们将讨论如果我们使用此函数作为隐藏层激活的一部分,为什么会出现问题。但是,当涉及到获取一个值(0到1之间的输出)时,sigmoid函数是首选的激活函数。
接下来我们要讲的激活函数是双曲正切激活函数,简称tanh函数。如你所见,双曲正切函数的形状与sigmoid激活函数非常相似。唯一的区别是,它将所有值转换为-1和1之间的值,而不是像sigmoid函数那样转换为0和1。因此,正如其名称所示,tang函数是基于几何主题的概念。如果您对正弦、余弦、正切和余切的概念有所了解,那么您对tang函数也会有所了解,因为这个函数正是基于这些概念。tang函数的作用是将所有的z分数转换为-1到1之间的值。
代表此激活函数的fz是一个等于的函数,其分母是e的z次方减去e的负z次方,除以e的z次方加上e的负z次方。它的基本作用是进行转换,获取z分数,如果z分数为负,则将其转换为-1到0之间的值。然后,如果z分数是从0到正无穷大的正数,则相应的激活将在0和1之间。与sigmoid函数一样,tang函数也是S形的,只有膨胀点,所以它改变其模式的点,即图形的行为方式,不是在0.5点,而是在0点。与sigmoid函数一样,tang函数也存在饱和问题。因此,对于大负数和大正数,相应的激活将非常接近极值点,因此该函数的-1和+1可能会出现问题,就像sigmoid函数的情况一样。因此,不建议将这两个函数用于隐藏层,而是将它们用于输出层。
我们将这两个函数用于输出层,是因为我们可以非常方便地将从这两个函数获得的值转换为相应的值,无论是分类情况,因为如果我们获得0和1之间的值,例如,在sigmoid激活函数的情况下,我们可以将其解释为概率,然后可以使用该概率来获取类别,例如类别0或1。然后,可以通过将模型与实际类别进行比较来评估我们的模型,并计算交叉熵,或者可以基于此计算任何其他评估指标。
稍后,我们将讨论为什么这两个激活函数不应该在层中实际使用,特别是对于具有许多隐藏层的深度神经网络。但现在,由于这超出了这个问题的范围,我不想透露细节,因为我们已经涵盖了很多内容。所以在回答这个问题时你可以提到接下来的两个激活函数:整流器线性单元和漏整流器线性单元激活函数。两者非常相似,尤其是在正z分数方面,但在负z分数方面却有些不同。
当我们查看整流器线性单元时,实际上是激活函数,您可以看到它看起来像这样。所以它适用于z时的所有情况,所以激活,如果z分数小于0,那么它是负数,那么相应的激活将为0。所以基本上,这个激活函数不会激活任何负神经元。而对于z分数为正的情况,则相应的激活将完全等于z分数。因此,名称为线性。因此,如果您查看y等于x的线,并且可视化该线,您可以看到正数部分,因此对于x从0到无穷大为正数的部分,您可以看到y等于x线与我们这里的完全一样。这就是“线性”这个词的由来。它类似于线性函数的表示,但只适用于正数。对于正数,我们将得到z分数,并根据其确切数量进行激活。然而,如果z分数为负或神经元为负,则相应的激活不会发生,我们也不会激活这些负值。在所有这些情况下,激活函数会将激活值设置为0。因此,当我们确实想要输出、我们确实想要考虑这些负值、并且我们想要考虑这些负值并基于它们进行预测时,这可能会出现问题。在这些情况下,我们需要调整这个ReLU,这样我们就可以更好地使用我们所说的Leaky ReLU。
Leaky ReLU激活函数的作用是,它不仅激活正分数,还激活负分数。当然,与z为正数的情况相比,它是在不太极端的情况下实现的。正如您从消极的一面看到的那样,从我们图表的第三季度来看,但它仍然如此。而且从函数本身也可以看出,因为Leaky ReLU对应的激活函数可以用它的f-set来表示,f-set等于0.01。如果z小于0,则如果z大于或等于0,则等于z。因此,对于所有正数,Leaky ReLU的行为与ReLU完全相同,如您在此处看到的,但对于负值,相应的激活值只是等于0.01。所以你可以看到就是图中的这一部分。因此,这两个激活函数都不会受到饱和的影响,这与sigmoid和Tank函数相比绝对不同。这就是为什么推荐它,并且已经证明,当我们将这两个激活函数用作隐藏层激活的一部分时,它们的性能要好得多,并且当涉及到输出层时,它们的使用并不多。因此,可以考虑将Leaky ReLU和ReLU用于隐藏层,但不要将它们用于输出层,反之亦然,用于sigmoid函数和Tank函数。将它们用于输出层,但不能用于隐藏层。
8 如果在神经网络中不使用任何激活函数会发生什么?
这个问题的答案可能很短,因为它非常明显。缺乏激活函数会将神经网络简化为常见的机器学习模型,例如线性回归,这从一开始就消除了使用神经网络的整个想法。因此,为了能够利用神经网络的架构并能够发现数据中的隐藏模式、非线性模式,我们可以使用激活函数和非线性激活函数。
9 描述基本神经网络的训练如何工作
在这种情况下,面试官想知道您是否了解前向传播、后向传播的概念,什么是反向传播,这些过程如何相互连接,以及神经网络如何利用这些层来学习这些复杂的模式在你的数据中。
你可以从描述神经网络的训练过程开始,一个非常基本的过程,通过我们所说的前向传递的过程。前向传递获取输入数据并通过我们之前看到的神经元进行处理,并使用此加权和和激活函数来产生输出。我们获取输入数据,将其乘以相应的权重,然后添加偏差因子。这些就是我们的z分数。然后,我们应用激活函数来引入非线性,当我们将信息传递到下一层时,就会使用这些激活值(即激活分数),因为我们将使用它作为输入。我们将其乘以相应的权重。我们添加偏差因子,然后使用该隐藏层的激活函数,以便从这些复杂性中学习。这个过程一直持续到我们到达计算输出的输出层。然后使用该输出将其与我们的数据的真实值进行比较。例如,我们在处理分类问题时,会观察到的实际标签。接着,我们会计算所谓的损失函数或成本函数。例如,对于回归类型的问题,我们可能会使用均方根误差(RMSE)或均方误差(MSE)。对于分类类型的问题,我们可能会使用交叉熵。然后,我们利用这个损失函数进行所谓的反向传播。
反向传播是计算梯度的过程,也就是损失函数相对于权重和偏差因子的一阶导数,以及我们希望改进的模型参数的影响。一旦我们计算出这个梯度,它就会告诉我们,如果我们对权重和参数做出一定的改变,损失函数将会改变多少。然后,我们可以利用这个梯度来更新模型中的参数。我们通过反向传播的过程来实现这一点,这与我们在前向传播中所做的正好相反。
在前向传播中,我们从左到右直到模型末尾以获得输出。而在反向传播中,我们做的是相反的事情,也就是说,我们正在倒退。我们通过反向传播来识别梯度,然后利用这些梯度。我们将其作为优化技术的输入,这可以是随机梯度下降(SGD)、梯度下降(GD)、带动量的 SGD、均方根(RMS)、探针、Adam等。然后,我们使用这种方法逐层更新我们的权重和偏差因子。
我们基本上要做的就是获取梯度,然后采用我们将使用的优化算法,例如 Adam,然后我们更新最后一层对应的权重。我们已经计算过了。然后我们继续之前的下一层。这样,我们从右边,从很深层到左边。因此,使用权重之间的乘法。通过这种方式,我们可以使用梯度,并更新权重和偏差因子,这样我们就可以调整权重,然后减少损失函数。
这一点非常重要,要向面试官展示你的理解,为什么我们要更新权重以及为什么我们要更新偏差因子。因为从数学上讲,梯度显示了当我们将某个权重或某个偏置因子改变一定量时,损失函数会发生多大的变化。这就是我们正在使用的东西,梯度,为了更新之前的权重参数和偏差参数,这样我们就可以减少模型造成的损失。因为这意味着我们离拥有更准确的模型又近了一步。我们犯的错误越小,损失就越小,神经网络的性能就越好。这就是神经网络训练背后的想法。
这个过程一直持续下去。我们有前向传播、反向传播、后向传播,等等,直到我们达到某种结束标准,即停止标准。这可能是迭代次数、纪元数或其他一些停止标准。
10 什么是梯度下降?
梯度下降是我们在机器学习和深度学习中使用的一种优化算法,目的是最小化模型的损失函数。这意味着我们正在迭代改进模型参数,以最小化成本函数并最终得到一组模型参数,这将优化我们的模型。该模型将产生高度准确的预测。
为了理解梯度下降,我们需要理解什么是损失函数,什么是成本函数,这是损失函数的另一种说法。我们还需要了解神经网络的流程、训练过程如何工作,我们已经将其视为之前问题的一部分。然后我们需要理解迭代改进模型的想法以及我们这样做的原因。
让我们从头开始。在神经网络的训练过程中,我们首先进行前向传递,这意味着我们正在迭代计算我们的激活。因此,我们获取输入数据,然后将其与相应的权重参数和偏差向量一起通过隐藏层传递,然后使用激活函数激活这些神经元。然后我们将遍历这些多个隐藏层,直到我们最终计算出该特定前向传递的输出。
一旦我们在训练神经网络的最初迭代中执行此操作,我们需要有一组模型参数,我们可以首先开始训练过程。因此,我们需要在模型中初始化这些参数。我们在神经网络中特别有两种类型的模型参数。正如我们在前面的讨论中所提到的,我们需要考虑权重和偏差因素。那么,如果我们使用这组特定的权重和偏差向量,我们会犯多少错误?这些权重和偏差是我们可以调整的参数,以提高模型的准确性。
再次提出问题,如果我们使用这个模型参数的初始版本,也就是权重和偏差向量,我们计算出的输出(即 y 帽子),那么我们需要了解根据这组模型参数做出的模型有多少误差。这就是我们所说的损失函数,也被称为成本函数,它表示我们使用这些权重和偏差因子进行预测时产生的平均误差。
在机器学习中,我们知道有回归类型的任务和分类类型的任务。根据您要解决的问题,您可以选择使用哪种损失函数来衡量模型的表现。神经网络训练的基本思想是,您希望通过迭代改进模型参数,即权重和偏差向量,最终得到一组最佳和最优的权重和偏差因子。这将使模型产生的误差最小,这意味着您已经找到了一种能够产生高度准确预测的算法和神经网络,这是我们使用神经网络的整个目标。
因此,如果您正在处理分类类型的问题,损失函数可以是交叉熵,这通常是处理分类任务时的首选。但您也可以使用 F1 分数,即 F beta 分数。您可以使用精确率、召回率。此外,如果您有回归类型的任务,您可以使用均方误差(MSE)、RMSE 或 MAA。这些都是您在每次更改模型参数时可以用来衡量模型性能的方法。
在神经网络训练的过程中,我们需要使用一种基本算法,我们称之为反向传播。我们使用它来了解当我们对参数进行微小更改时,损失函数会发生多少变化。这就是我们所说的梯度,它来自数学。在反向传播的过程中,我们计算损失函数关于每个模型参数的一阶偏导数,以了解我们可以改变每个参数多少以减少损失函数。
那么,梯度下降是如何执行优化的呢?在训练过程中,梯度下降在每次传递和迭代时都会使用全部的训练数据。因此,对于每次参数的更新,也就是每次更新权重因子和偏差因子时,它都会使用全部的训练数据。这意味着,在一次前向传递中,我们使用所有的训练观察结果来计算预测,然后计算损失函数,然后执行反向传播,计算损失函数相对于每个模型参数的一阶导数,然后使用这些导数来更新参数。
梯度下降执行优化的方式是,更新模型参数,获取反向传播的输出,这是损失函数相对于模型参数的一阶偏导数,然后乘以学习率或步长,然后从原始模型参数和当前模型参数中减去该量以获得模型参数的更新版本。
在这个过程中,我们从反向传播中获取梯度,然后我们使用这个 dv,它是损失函数相对于权重参数的一阶梯度,然后将其乘以步长 eta,然后我们从 v 中减去这个,即当前的权重参数,从而得到新的更新后的权重参数。我们也对第二个参数(即偏差因子)执行同样的操作。
值得注意的是,我们在这里使用的步长,即学习率,也可以被视为一个单独的主题。我们可以深入探讨这背后的细节。但现在,将学习率视为一个步长,它决定了我们执行更新时步长的大小,因为我们确切地知道当我们对参数进行一定的更改时,损失函数将会发生多大的变化。所以我们知道梯度的大小。首先,我们需要了解我们需要应用的更改的内容有多少。我们是否希望实现一个大的跳跃,还是我们希望在迭代改进模型参数时做出较小的跳跃?如果我们把学习率设定得很大,那就意味着我们将应用更大的变化,这意味着算法在走向全局最优时将迈出更大的一步。然而,我们也需要注意,当我们进行太大的跳跃时,尤其是如果这些跳跃不准确时,可能会出现问题。
因此,我们需要确保优化这个学习参数,这是一个超参数。我们可以对其进行调整,以找到最佳学习率,从而最小化损失函数并优化我们的神经网络。当涉及到梯度下降时,这个算法的质量非常高。它被认为是一个很好的优化器,因为它在执行梯度时使用整个训练数据,因此执行反向传播,然后利用它来更新模型参数。我们根据整个训练数据得到的梯度代表真实的梯度。所以我们不对其进行估计,我们没有犯错误。相反,我们在计算这些梯度时使用整个训练数据,这意味着我们拥有一个优秀的优化器,能够采取准确的步骤来寻找全局最优值。因此,梯度下降也被称为良好的优化器,它能够以更高的可能性找到损失函数的全局最优值。
然而,梯度下降的问题是,当它每次更新模型参数时都使用整个训练数据,这在计算上可能不可行或者非常昂贵,因为训练了大量的观察,使用整个训练数据对模型参数执行一次更新,每次将大量数据存储到内存中,对这些大数据执行这些迭代,这意味着当你有非常大的数据时,使用此算法可能需要几个小时才能优化。在某些情况下,甚至可能需要几天或几年,特别是当涉及使用非常大的数据或使用非常复杂的数据时。因此,虽然梯度下降被认为是一个很好的优化器,但在某些情况下,使用它是不可行的,因为它效率不高。
11 优化器在深度学习中的作用是什么?
当我们谈到训练神经网络时,我们想要找到什么是超参数集以及什么是参数集,我们可以将其用作模型的一部分,这最终会产生最少的错误。因为当我们的算法产生最小的错误时,这意味着我们的预测很可能是准确的。当将其用于新的未见过的数据时,它也会以更好的方式表现。因此,这意味着我们可以依赖该算法,并且可以将其应用于不同的应用程序,而不必担心它会产生太大的错误。
为了执行此优化,我们正在利用不同的优化算法。我们刚刚讨论的梯度下降就是用于更新模型参数的算法之一,以尽量减少模型产生的误差。在这种情况下,费用金额或模型通过最小化损失函数而产生的损失。因此,这基本上不仅是深度学习中优化器的主要目标,而且也是机器学习和深度学习模型中的优化器的主要目标。
我们的想法是,我们将迭代调整模型参数,在这种情况下,我们模型中的权重参数和偏差参数,为了最终得到场景和模型,其中算法产生的错误量最小。或者在某些情况下,它可以是目标函数具有应该最大化的性质,意味着我们需要提出一组模型参数,这将使目标函数最大化。所以取决于目标的类型,作为算法的一部分,然后您需要决定如何应用优化算法。您需要最小化或最大化您的目标函数。
当谈到优化算法时,我们有非常原始的优化算法,但多年来也开发了许多其他梯度下降的变体,以克服梯度下降的一些缺点,但同时,也要尝试复制梯度下降的好处。例如,除了梯度下降之外,我们还有随机梯度下降(SGD)和小批量梯度下降。当引入动量来改进SGD等优化算法时,我们还有带动量的SGD。我们拥有基于自适应学习的优化技术,例如 RMSProp、Adam、AdamW 和 AdaGrad。这些都是在深度学习中使用的不同类型的优化算法,它们的目标是优化算法。因此,我们需要记住的另一个重要方面是,优化算法的目标是迭代地改进模型参数,以便我们最终找到全局最优值。
在解释梯度下降和其他优化器的方差时,我将继续使用“全局最优”这个术语。全局最优是指我们用来衡量模型误差的目标函数的实际最小值或实际最大值。我们需要注意的是,我们可能会遇到局部最小值或局部最大值,而不是全局最小值或全局最大值。这意味着,在一个由许多值组成的区域中,可能会出现错误。在某些情况下,优化算法可能会误导我们,使我们找到局部最小值或局部最大值,而不是全局最小值或全局最大值。
当优化算法正在移动以了解如何改进其方向以识别最小值时,它可能会发现,这就是我们正在寻找的最小值。因此,算法会收敛,并决定这是我们需要使用的一组超参数和参数以优化我们的模型。但实际上,它可能混淆了全局最小值和局部最小值,并错误地宣称算法已经收敛并找到了实际的最小值。然而,这实际上是局部最小值,而不是全局最小值。局部最小值可能看起来像是损失函数的最小值,但实际上它只是一个值,它比周围的值小得多,但并不是整组值中最小的一个。
因此,我们的目标是找到全局最小值而不是局部最小值。理想情况下,我们希望最终实现收敛,并找到所有权重和偏差因素的模型状态,它们导致损失函数的实际最小值,而不仅仅是对于特定一组值来说似乎是最小值的值。
12 什么是反向传播以及为什么它在深度学习中很重要?
反向传播是神经网络训练的基本组成部分。它可以帮助我们从模型在每次迭代中所犯的错误中学习,以便理解模型的某些参数(例如权重因子和偏差因子)如何变化,从而导致损失函数发生变化。
反向传播算法是整个训练过程的中间部分。我们首先执行前向传播,将输入数据输入我们的网络。然后基于这些转换,我们最终得到最终的输出层,然后我们就可以执行我们的预测。我们计算预测值,一旦计算出预测值,我们就可以计算该特定迭代的损失函数。一旦我们有了损失函数,我们就可以理解我们需要如何改变我们的权重和偏差因子,以便我们可以减少模型在当前迭代中犯的错误。
模型所产生的误差,即平均误差,我们通过损失函数来测量。下一步是该算法的一部分,就是为了获得当我们对权重参数和偏差参数进行微小改变时,损失函数的具体变化量。这就是我们所说的梯度。计算这些梯度的整个过程称为反向传播。
反向传播基本上是指计算损失函数相对于我们每个模型参数(包括各种权重参数和偏差参数)的一阶偏导数的过程。这种反向传播是基础,因为它有助于算法理解改变每个不同的权重参数会导致损失函数中的多少变化。这是我们需要将这些信息提供给优化算法(例如 GADM)的方式。为了使优化算法能够更新模型参数,我们需要利用反向传播的输出,这是梯度下降(GD)、随机梯度下降(SGD)、Adam等优化算法的输入。以我们之前研究过的一个具体示例来看,这是一个非常简单的神经网络,它有少量的隐藏层和隐藏单元,只有几个输入信号。
在前向传播的过程中,我们执行所有转换,激活神经元,然后得到预测的响应变量,即y帽。一旦我们得到了y帽,我们也会缓存我们的最终结果,即z分数值。z分数等于输入x乘以权重参数,再加上偏置参数。有了这个之后,我们可以应用各种微分规则,特别是链式法则,同时我们也可以利用求和的微分规则和应用于常数的微分规则,以更新损失函数相对于激活的梯度,即dA。
然后我们可以利用dA来获得损失函数相对于z的梯度。进一步,我们可以利用dA和dZ来获得损失函数相对于权重的梯度,即dV。最后,以类似的方式,我们可以利用dA和dZ来获得损失函数相对于偏置的梯度,即我们的偏差因子。
重要的是要记住,为了更新模型参数,我们需要知道损失函数相对于权重参数dV的梯度,以及偏置因子的梯度,这是损失函数的一阶偏导数。但为了计算dV和dB,我们还需要首先计算激活的梯度和z分数的梯度,因为权重因素和偏差因素是z分数的一部分。所以我们应用了一系列变换,这意味着当我们执行微分时,我们还需要执行这一微分链,以便能够首先获得权重的梯度和偏置因子的梯度。
具体来说,z等于权重矩阵的转置乘以激活矩阵,然后我们添加偏差因素,形成了我们的z。为了计算损失函数相对于权重的梯度,即dV,我们首先需要对损失函数J求偏导数,关于z分数,然后我们需要乘以z分数相对于权重矩阵的偏导数,以便能够计算这个偏导数dV。这简单地等于dz乘以激活矩阵的转置。我们也在执行类似的操作来获取偏差因子的梯度。
我不会过多讨论这些梯度的数学推导的细节,因为您需要深入研究这些不同的偏导数。当涉及到使用链式规则时,我们还需要刷新我们的记忆,当涉及到值的总和时,当涉及到常数与目标值相乘时,微分规则。当您学习深度学习主题时,我肯定会建议您刷新这些内容。但为了留在面试问题的范围内,我只是想分享这个只是为了刷新你的记忆,在每次我们尝试优化算法时,我们都在执行反向传播。为了计算所有这些不同的梯度,我们首先需要计算相对于权重的梯度和相对于偏差因子的梯度。此外,我们还需要计算关于激活的梯度和关于z分数的梯度。然后,我们使用这些计算结果来计算权重的梯度和偏置因子的梯度。最后,反向传播就是计算损失函数相对于权重和偏置因子的偏导数的过程,以便将这些结果作为输入提供给我们的优化算法。这实际上引出了我们的下一个问题。
13 反向传播与梯度下降有何不同?
在深度学习面试中,您可能会遇到有关反向传播和梯度下降之间差异的问题。这通常是一个棘手的问题,因为描述训练过程并不总是直观的。我们首先执行前向传播,然后计算损失函数,以了解模型的训练效果以及平均误差量。接着,我们计算梯度以了解当我们改变各种参数时,损失函数会发生多大的变化。然后我们使用这些信息来不断更新模型参数,直到前面的层,以便最终得到一个表现更好的模型。这个过程是通过从较深层到较早的层进行的。
那么梯度下降与反向传播有何不同?当涉及到反向传播和梯度下降时,具体有什么区别?这个问题的答案其实很简单。在我看来,这只是一个欺骗受访者的问题。反向传播是计算梯度的实际过程,了解当我们改变模型参数时损失函数有多大变化。然后反向传播的输出简单地用作梯度下降或任何其他优化算法的输入,以便更新模型参数。所以梯度下降只是使用反向传播的输出作为输入,因为它采用计算出的梯度来自反向传播作为输入,以便更新模型参数。所以反向传播发生在中间,一旦我们完成前传。然后反向传播就完成了。然后我们执行向后传递。因此,我们使用反向传播,然后不断迭代地将模型参数从较深层更新到较早层。这就是优化算法所做的事情。
14 描述什么是梯度消失问题及其对神经网络的影响
当网络的梯度(即损失函数)相对于模型参数(例如权重和偏差参数)时,就会发生梯度消失,它们变得很小。在某些情况下,它们变得完全接近于零,这意味着它们开始消失,因为它们通过非常深的层传播回较早的层。这种梯度消失的结果是网络不再能够有效地学习数据中的依赖关系。并且模型不再能够有效地更新模型,这意味着算法最终不会被优化。我们最终将得到一个无法也无法学习数据中实际依赖关系的模型。
当然,这是我们想要避免的事情。我们希望拥有适量的梯度,将其用作梯度下降等优化算法的一部分,以获得模型参数,然后不断迭代地执行此操作,这样我们最终将最小化我们的损失函数。我们的模型将处于提供高度准确预测的状态。那么我们如何解决梯度消失问题呢?其原因何在?
作为神经网络训练的一部分,我们看到在每次训练迭代中,例如,作为梯度下降算法的一部分,我们将使用整个训练数据训练我们的网络,然后从最早期的层到最后的输出层执行这些不同的转换,获取激活值,然后将其与权重指标相乘,然后添加偏差参数,以这种方式计算z分数,然后应用激活函数来激活这些神经元。然后这一切完成之后,在该特定的隐藏层中,网络能够学习数据中的不同依赖关系,然后学习结构,然后进入下一层,然后进入下一层,直到到达输出层。然后当我们有了输出层时,我们就可以计算我们的预测。因此,我们首先计算预测值 y hat,然后将其与真实标签或真实值进行比较。接着,我们需要了解损失函数的性质,以及模型在使用这组参数时产生的平均误差是多少。然后,我们执行反向传播来计算梯度,并将其提供给优化算法,以便更新模型参数。优化算法的工作方式与前向路径相反。它计算并获取梯度,计算相应的更新,然后更新权重以及从深层到较早层的偏差因素。
问题在于,我们正在执行所有这些转换,并且每次都将这些值相乘。这意味着什么呢?在某些情况下,特别是当我们有深层网络,有很多隐藏层时,当网络从深层、中间层、然后更早的层接近时,许多这些权重相乘之后,这些梯度开始变得非常接近于零。当梯度变得非常接近零时,这意味着我们除了更新权重之外别无他法,并更新我们的偏差参数。当我们无法再更新模型中的权重时,这意味着网络不再能够正确学习,尤其是当梯度消失时从较早的层学习。
这就是一个问题,因为我们希望我们的模型能够不断学习并不断更新这些权重,这样我们最终会得到权重和偏差因子的最佳参数集,以最小化损失函数,然后提供高度准确的预测。因此,理想情况下,我们希望确保这些梯度不会消失。所以我们要解决梯度消失问题,我们的网络能够正确学习并理解数据中的这些依赖关系,无论是在深层还是在较早的层中都是独立的。
因此,在描述这个问题时,请尝试关注权重,因为当权重的梯度开始消失时,这是最大的挑战,特别是对于深度神经网络中的早期层。这是我们想要避免的,因为模型会出现梯度消失问题,无法有效学习。作为答案的一部分,您可以提到的另一件重要的事情是,某些架构本质上都受到这个问题的影响。尤其是 RNN、递归神经网络,以及 LSTM、GRU,它们本质上都是深刻的,因为不像人工神经网络这样原始的神经网络具有单个输入层,它们提供输入,然后神经元被激活并提供单一输出。和隐藏层,它们并不相互关联。所以它们不像 RNN 那样接受输入,然后为每个输入提供相应的输出。然后这个隐藏层,然后隐藏单元将被用作下一步和下一步的一部分。所以它们不像 RNN 那样基于顺序,那么它们比 RNN 更不容易出现梯度消失问题。
由于 RNN 是另一种序列类型的神经网络,因此它们本质上很深,这意味着它们具有多层,基于他们拥有的时间步长,这使得这些算法更容易出现梯度消失问题。
15 各种激活函数和梯度消失问题之间有什么联系?
因此,梯度消失问题与激活函数的选择高度相关,因为某些激活函数由于其固有的特性,会自动导致梯度消失问题。还有一些已知不会导致梯度消失问题的激活函数。当然,我们希望了解这样的激活函数,然后当我们意识到可能存在梯度消失问题时就不要使用它们。所以在这里我倾向于区分 sigmoid 激活函数和坦克激活函数与 ReLU,所以整流器线性单元,和 Leaky-ReLU 激活函数。其原因在于它们的固有属性,即我们所说的饱和度。这意味着,例如,在 sigmoid 激活函数的情况下,当激活 fz 等于 1 加 e 次方减 z 时,这意味着只要 z 或 z 分数是一个非常大的负数,比如说负 1000,然后进行相应的激活。然后,fz将非常接近零,正如您所看到的,这被认为是sigmoid函数的最小值。当z为本例中的z分数时,x将是非常大的正数,因此它将在1000左右。接下来是相应的函数,即激活函数,其值约为1,非常接近1。正如您所看到的,在达到x的某个水平时,对于正值,无论x的大小如何,相应的激活值将非常接近1。而到了某个时候,这个领域甚至不会发生任何变化。
这就是我们所说的饱和度,意味着当我们有非常大的负数或非常大的正数时,相应的激活就不再有任何变化。我们最终将接近该函数的最大值或最小值。在这种情况下,对于非常大的正x,y将约为1,对于非常大的负数,相应的激活值将在0左右。因此,在sigmoid激活的情况下,我们说sigmoid激活函数遭遇饱和,并且容易造成梯度消失问题。所以它会导致梯度消失,特别是当我们有非常大的z平方值时。所以它可以是大正值,也可以是大负值。
实际上,同样的情况也适用于tang激活函数,因为就像你在这里看到的那样,tang激活函数和sigmoid激活函数一样,都是这种s形的激活函数。与sigmoid函数一样,tang也存在饱和问题。在这里,你可以看到当我们有x,这是一个非常大的正数,比方说1,000,那么相应的激活值将在1左右。如果我们改变这个x并将其设为2,000或3,000,同样的情况也会成立。
无论x这个大数增加多少,相应的激活将是相同的。它将接近1,这是该函数的最大值。对于该激活函数的非常大的负数也是如此。假设x约为负1,000,那么相应的激活值将在负1左右。但当x约为负2,000或负10k时,同样成立。
所以这意味着在tang激活函数的情况下,就像在sigmoid激活函数的情况下一样,当我们有非常大的正值或非常大的负值时,我们想看看使用这个激活函数可以激活它们多少,那么相应的激活值就在该函数的极值附近。所以在tang函数的情况下负1和1,以及sigmoid激活函数情况下的0和1。因此,就像sigmoid激活函数的情况一样,我们说tang激活函数遇到了饱和。这意味着tang激活函数本质上会导致梯度消失问题,因为它导致梯度消失。这是我们想要避免的事情。
所以我们要记住的一件事是,当涉及到输出层时,sigmoid激活函数和tang激活函数非常有用,因为它们在某些范围之间转换值时具有这些很好的属性。就像sigmoid函数一样,它会转换值,0到1之间的任何值,当我们想要以概率形式输出时,这非常有用。问题的分类非常适合。然而,当我们谈论将激活函数用于隐藏层时,这是我们想要避免的。因此,我建议使用 Sigmoid 激活函数或双曲 Tang 激活函数于输出层,但不要将其用于隐藏层,因为它们容易出现梯度消失问题。
我们今天要讨论的下一组激活函数是修正线性单元(ReLU)和泄漏修正线性单元(Leaky ReLU)。与 Sigmoid 激活函数和 Tang 激活函数不同,ReLU 或 Leaky ReLU 不会饱和,这意味着它们不会导致梯度消失问题,非常适合作为隐藏层的一部分。
您可以看到,当我们取非常大的正 x 值时,相应的激活会发生变化。当我们从 1000 到 2000,从 2000 到 10k,相应的激活量也会有很大的变化,这意味着激活函数不会导致梯度非常接近于零,这就是我们所说的梯度消失。因此,ReLU 不会导致梯度消失问题,这是很棒的事情,特别是当我们将它们用作隐藏层的一部分时。
这同样适用于 Leaky ReLU,我们可以在这里看到这一点,因为两者非常相似。唯一的区别是,Leaky ReLU 在某种程度上确实考虑了负神经元的激活,这意味着当 x 为负值时,从负无穷大到零,您可以看到相应的激活不是零,而是等于 0.01。因此,与 Sigmoid 和 Tang 激活函数不同,这两个函数没有饱和,它们的激活值会改变,并且不会接近函数的同一个极值。当我们提供非常大的正值或非常大的负值作为输入时,这意味着它们非常适合用作隐藏层的一部分,使网络能够持续有效地学习数据中隐藏的依赖关系。因此,我们建议使用 ReLU 和 Leaky ReLU 作为隐藏层的一部分来激活这些神经元,并且每当接近输出层时,对于输出层,请使用 Sigmoid 函数或 Tang 激活函数。
16 隐藏层中有一个神经元总是会导致反向传播产生很大的误差,可能的原因是什么?
作为神经网络反向传播的一部分,可能有很多原因导致该特定神经元或某些神经元始终产生较大误差。第一个可能的原因是权重初始化不当。这意味着在开始训练过程时,我们需要初始化权重参数和偏差参数,以便网络可以采用这些初始值,然后执行前向传递计算,然后将其用作梯度下降(GD)、随机梯度下降(SGD)等优化算法的输入,以便迭代更新这些权重参数。但是,如果我们没有以正确的方式初始化权重,这意味着我们没有使用正确的分布从中随机采样,或者我们只是为此权重和偏差参数提供了错误或不正确的值,这将从一开始就改变那些特定神经元的学习过程。
如果我们从一开始就以不正确的方式进行学习过程,我们正在扭曲那些学习过程,在每次迭代中,这意味着下一次迭代将基于从第一次传递错误开始的第一次迭代,它也会以错误的方式完成。然后下一次、下一次,这个过程每次都会继续下去,在不正确的学习中,并在误差较大时作为损失的一部分进行计算然后反向传播。
另一个可能的原因是梯度消失或爆炸。如果梯度变得非常小,并且神经元的权重,特别是在深层网络中,不再开始更新那些不同的参数,这意味着,我们可能会在特定神经元中持续犯大错误,因为我们无法有效地学习模型中的依赖关系。这个特定神经元将无法被正确激活,相应的权重也无法得到更新,从而无法提高对这些特定神经元预测的准确性。同样,这也适用于梯度爆炸问题。如果我们进行过多的更新,而神经元没有被正确激活,那么相应的权重也无法得到正确的更新,这将导致我们在这些神经元上持续犯大错误。
另一个可能导致这种情况的原因是学习率不适当。如果我们的学习率过高或过低,我们可能会在训练过程中超出或低于最佳值,因此无法充分更新权重参数和偏差参数。因此,优化模型中的这些超参数非常重要,以使模型能够持续更新并改进参数,从而改善学习过程。
另一个可能的原因是激活函数选择不当,因为激活函数可以显著影响学习过程。我们激活神经元的方式将是一个决定性因素,它决定了神经网络是否能正确学习数据中的依赖关系,以及权重参数和偏差参数需要如何更新,以便优化学习。
17 你对计算图的理解是什么
计算图是一种可视化复杂操作的方法,我们在训练模型的过程中使用它,作为各种类型的优化过程的一部分。它是展示我们从非常简单的变量或对象开始,应用各种变换,然后得到非常复杂函数的好方法。我们使用计算图的一种方式是可视化神经网络。
在计算图中,我们通常有代表对象或变量的节点,然后边通常代表我们正在应用的操作或转换的类型。在这种情况下,你可以看到我们有输入信号 x1、x2、x3,它们只是变量,这些是初始层的节点。然后我们展示我们正在应用的边缘,这些箭头进入我们的第一个隐藏层。
在这个隐藏层中,你可以看到我们有每个隐藏单元的z分数,然后我们就有相应的激活。所以z1, a1对应于第一个隐藏层的第一个隐藏单元。然后我们就有了z2、a2,然后是z3、a3,z4、a4,因为我们有四个不同的隐藏单元作为单个隐藏层的一部分。然后我们应用另一个变换,当我们从第一个隐藏层到输出层时。
你可以看到,我们有这些箭头展示了我们如何从x1、x2、x3输入数据到z分数,然后我们对z分数应用激活来计算我们的激活分数。然后我们使用这个激活分数从最后一层开始,为了继续我们的预测,即y帽子。你可以看到我们正在使用最终输出层来计算y帽。
我们正在做的事情是为了可视化首先计算基于xi的z分数的过程,输入数据乘以权重矩阵w加b的转置。然后y-hat就等于ai等于sigma zi。我们在这里所做的是计算z分数,然后在z分数之后我们应用这个西格玛函数,这是我们得到的激活函数。首先,我们将激活函数应用于 z 分数,然后计算并获取激活分数。接着,我们使用这个激活分数来计算我们的预测值 yi-hat。一旦我们得到了 yi-hat,我们将其与真实值 yi 进行比较,然后计算损失,即模型产生的误差量。
你可以看到我们正在采取的步骤。当我们的神经网络有更多的隐藏层时,不仅仅是一层,而是三层、四层或数十亿层,我们最终将很难理解这些不同的步骤,更不用说将其可视化或展示我们有多少层了。每次我们都会使用不同的指数,执行相同的转换,从输入数据到 z 分数,然后到激活函数,从激活函数之后我们得到激活分数。
因此,使用计算图来展示所有这些计算会更简单。我们不再使用所有这些复杂的变换和矩阵,而是使用计算图来简化过程并将其可视化,展示我们如何从输入变量出发,应用所有这些转换,然后得到预测。
然而,通过展示故事的另一面,计算图可能会变得更加复杂。我们首先获得预测,然后应用反向传播,然后从反向传播到实际的梯度计算,然后更新参数。但为了简单起见,我想我会用一个简单的神经网络来展示这一点。计算图背后的想法不仅仅是展示前向传递,还展示整个网络,包括反向传播,即梯度的计算。
18 谈谈梯度裁剪及其对神经网络的影响
我们刚刚看到了残差连接,特别是对于深度神经网络,特别是像 RNN、LSTM 这样的情况,当我们具有太多层的顺序性质时,我们可能会遇到梯度消失的问题,而残差连接可以帮助解决这个问题。
现在,梯度裁剪正在解决相反的问题,即梯度爆炸问题。每当我们有某些深度神经网络,如 RNN、LSTM,我们每次都使用这些变换,并且我们使用累积性质并将所有这些权重相互相乘。通过这个过程,我们正在使用之前的隐藏状态更新新的隐藏状态,因此下一个隐藏状态和下一个隐藏状态。这也意味着当我们遍历这些层时,在优化过程中,反向传播完成后,我们需要执行所有这些转换。当我们完成前面的几层时,我们可能会遇到梯度爆炸的问题。
梯度爆炸意味着我们的神经网络不稳定,这也意味着权重的更新会太大,这将导致神经网络表现不佳且训练不当。为了避免所有这些问题,我们解决梯度爆炸问题的方法是使用梯度裁剪。梯度裁剪的作用是基本上裁剪梯度在一定水平上。所以有一个阈值,这是我们用于梯度裁剪的参数,每当梯度变得太大,高于阈值时,我们就会裁剪该梯度,以确保该梯度不会太大,并且我们不会过度更新权重参数或偏差因素。
通过这种方式,我们正在稳定我们的神经网络,这对于 LSTM、RNN、GRU 等架构尤其重要,其具有太多层的数据的顺序性质。通过这种方式,我们将确保我们不会出现这些不稳定的跳跃,在我们的神经网络优化过程中,我们最终将得到一个能够正确学习相互依赖关系的稳定网络。
19 什么是交叉熵损失函数
交叉熵,也称为对数损失,它衡量分类模型的性能。具有概率输出的值介于0和1之间。因此,每当你处理分类问题时,例如,你可能想要对图像进行分类,判断它是否是猫,或者是狗,或者是房子,而房子又可以进一步分类为新房子和旧房子。在所有这些情况下,当你拥有这些标签并且想要模型提供一个概率,即每个观察到的类别的概率,你就会得到模型的输出。例如,房子A有50%的概率被分类为新的,50%的概率被分类为旧的,或者一张图片有70%的概率是猫,30%的概率是狗。在处理这类问题时,你可以应用交叉熵作为损失函数。
交叉熵被测量为这个负值:y log p 加上 (1 - y) log (1 - p) 的总和,其中y是实际标签。例如,在二元分类中,这可以是1和0,而p是预测概率。所以在这种情况下,p将是0到1之间的值,而y就是对应的标签。因此,当你处理猫图像时,假设标签为0;当你处理狗图像时,假设标签为1。这个公式背后的数学解释超出了这个问题的范围,所以我不会讨论这个细节。但如果你对此感兴趣,你可以查看逻辑回归模型,这是我在机器学习基础手册中的一部分内容。
我们如何从应用对数函数后将乘积求和,这样我们就得到了对数似然函数,然后我们将它与负号相乘,因为这是负数。假设我们希望理想地最小化损失函数,则计算似然函数。这与似然函数相反。在这种情况下,这表明我们最终会得到一个值,这表明模型在分类方面的表现如何。因此,交叉熵将告诉我们模型在将观察结果分类到某个类别方面是否做得很好。
20 为什么交叉熵优先作为多类分类问题的代价函数
当我们处理多类分类时,我们可以应用什么样的损失函数呢?在处理多类分类时,我们可以使用多类交叉熵,这通常被称为softmax函数。softmax损失函数是衡量模型性能的好方法,尤其是当你想要将观察结果分类为多个类别之一时。这意味着我们不再处理二元分类,而是处理多类分类。例如,当我们想要将图像分类为夏季主题,春季主题,或冬季主题时。鉴于我们有三个不同的可能类别,我们需要有一种适当的方法来衡量执行此分类的模型的性能,而softmax正是这样做的。
因此,我们不会将配对观测值设置为不同的值,这会说明该观测值属于第一类或第二类的概率是多少,而是我们将拥有一个更大的向量,取决于你将要处理的类别数量。在这个具体示例中,我们最终将得到三个不同的值,因此一个向量具有三个不同的条目,说明这张图片来自冬季主题的概率是多少,来自夏季主题的概率是多少,以及来自春季主题的概率是多少。然后我们将得到具有相应概率的所有类别。在交叉熵的情况下,当我们的softmax值很小时,这意味着该模型在将观察结果分类为不同类别方面表现出色,我们得到的类别分离度也很好。
需要记住的一点是,当我们比较交叉熵和多类交叉熵或softmax时,这些都是在我们有超过两个类别的情况下使用的。您可能还记得在论文“Attention is All You Need”中介绍的Transformer模型,其中作为Transformer架构的一部分,还应用了softmax层,作为多类分类的一部分。因此,当我们计算激活分数时,最后,当我们想要将我们的输出转换为一个有意义的值并测量Transformer的性能时,我们会使用这些方法。
21 什么是随机梯度下降(SGD)?为什么我们要用它来训练神经网络?
SGD,就像梯度下降(GD)一样,是深度学习中使用的一种优化算法,其目的是优化深度学习模型的性能,并找到一组可以最小化损失函数的模型参数。通过迭代改进模型的参数,包括权重参数和偏差参数。SGD的执行方式是通过使用随机选择的单个或几个训练观察值来更新模型参数。这与GD不同,GD在一次迭代中使用了整个训练数据来更新模型参数,而SGD仅使用单个或几个随机选择的训练观察来执行更新。
这基本上意味着,SGD在每次训练观察中进行模型参数的更新,而不是使用整个训练数据进行每次更新。这个随机成分在算法中也很重要,因此该算法中的随机元素也被称为随机梯度下降。因为SGD是从训练观察中随机采样单个或几个训练数据点,然后使用它来执行前向传递。它计算z分数,然后在应用激活函数后计算激活分数,然后到达前向传播和网络的末端,计算输出,即y帽,然后计算损失。然后我们仅对这几个数据点执行反向传播。
在SGD中,考虑到我们正在使用仅随机选择的几个数据点或单个数据点,而不是实际的梯度,我们正在估计这些真实梯度,因为真实梯度基于整个训练数据。对于此优化,我们仅使用很少的数据点。这意味着作为反向传播的一部分,我们对这些梯度的估计不完美,这意味着梯度将包含这种噪声。
这样做的结果是我们使优化过程更加高效,因为我们仅使用几个数据点就可以基于传递非常快速地更新这些参数。仅在几个数据点上训练神经网络要快得多,并且比使用整个训练数据进行一次更新更容易。但这是以牺牲SGD的质量为代价的,因为当我们只使用几个数据点来训练模型,然后计算梯度,这是真实梯度的估计,那么这些梯度将会非常嘈杂。他们将是不完美的,并且很可能远离实际梯度,这也意味着我们将对模型参数进行不太准确的更新。
这意味着每次优化算法试图找到全局最优值并在每次迭代中进行这些移动时,向最佳状态更近一步,大多数时候,它最终会做出错误的决定,并且会选择错误的方向,因为梯度是它需要采取的方向选择的来源。每次它都会产生这些振荡,这会非常不稳定,大多数时候它最终会发现局部最优而不是全局最优,因为每次它只使用训练数据的一小部分,它正在估计梯度,这些都是有噪音的,这意味着它所采取的方向很可能也是错误的。当你每次都做出错误的方向和错误的举动时,你会开始摇摆不定。这正是SGD正在做的事情。在讨论优化方向时,该算法可能会做出错误的决策选择,最终找到的是局部最优而非全局最优。因此,随机梯度下降(SGD)有时被认为是一个不佳的优化器。然而,它在收敛时间上表现出色,且在内存使用上也相当有效,因为存储模型基于非常小的数据,并将这些小数据存储在内存中,计算量并不大。然而,这是以优化器的质量为代价的。在接下来的讨论中,我们将学习如何调整 SGD 算法以提高优化技术的质量。
22 为什么随机梯度下降(即 SGD)会向局部最小值振荡?
造成这种振荡的原因有几个。首先,我们需要明确什么是振荡。振荡是我们在寻找全局最优值时所发生的运动。当我们尝试使用 GD、SGD、RMSProp、Adam 等优化方法来优化算法时,我们正在尝试最小化损失函数。理想情况下,我们希望迭代地改变我们的模型参数,以便我们最终得到一组参数,从而得到损失函数的全局最小值,而不仅仅是局部最小值。局部最小值可能看起来像是损失函数的最小值,但它仅适用于特定区域。而全局最优值实际上是损失函数的平均值,即实际最小值。这正是我们正在努力追逐的。
当我们有太多的振荡(即过多的运动)时,这可能会成为问题,因为我们每次都会做太多的动作。如果我们做出相反的动作或者方向错误,那么这最终将导致发现局部最优而不是全局最优。这正是我们试图避免的。与 GD 相比,SGD 中的振荡发生得更频繁。因为在 GD 的情况下,我们使用整个训练数据来计算梯度,需要计算损失函数相对于模型参数的偏导数。而在 SGD 的情况下,我们了解到我们仅使用随机采样的单个或几个训练数据点来更新梯度并使用这些梯度来更新模型参数。这会导致出现过多的振荡,因为我们使用的随机子集比训练数据小得多,它们不包含训练数据中的所有信息。这意味着我们正在计算的梯度在每个步骤中,当我们使用完全不同且非常小的数据时,可能会有很大差异。这种巨大的差异,这种方向上的变化可能会导致这些振荡过于频繁。
在 SGD 中,导致过多振荡的第二个原因是步长。步长,或者说学习率,可以定义我们需要更新多少权重或偏置参数。而这个更新的幅度是由这个学习率决定的,然后它也发挥了作用,决定了这些运动会有多大的不同以及在我们观察振荡时,会出现多大的跳跃。
第三个原因是 SGD 会遭受太多的振荡,这是一件坏事,因为这会导致太多次找到局部最优而不是全局最优,这是由于不完美的估计。当我们计算损失函数相对于权重参数或偏差因子的梯度时,如果这是在训练数据的小样本上完成的,那么梯度就会有噪音。然而,如果我们使用包含有关特征之间关系的所有信息并且仅在数据中一般性的整个训练数据,那么梯度的噪声就会少得多。他们的预测将会更加精确。我们正在使用基于小数据集的梯度作为实际梯度的估计,这是基于整个训练数据的。这种做法会引入噪声,因此在估计真实梯度时会存在缺陷。这种缺陷可能会导致更新并不总是直接指向全局最优值,从而导致随机梯度下降(SGD)出现振荡。在更高的层面上,我认为SGD出现过多振荡的原因有三个:第一个是随机子集,第二个是步长,第三个是梯度的不完美估计。
23 梯度下降(GD)与随机梯度下降(SGD)有何不同?
到目前为止,我们已经详细讨论了SGD,我将从更高的层次总结两者的差异。对于这个问题,我将利用四个不同因素来解释GD和SGD之间的差异:第一个是数据使用情况,第二个是更新频率,第三个是计算效率,第四个是收敛模式。让我们一一探讨这些因素。
梯度下降在训练模型和计算梯度时使用整个训练数据,并将该梯度用作反向传播过程的一部分来更新模型参数。然而,SGD与GD不同,它在执行训练过程和更新模型参数时并不一次性使用整个训练数据。相反,SGD仅使用随机采样的单个或两个训练数据点来执行训练,以及使用基于这两点的梯度来更新模型参数。这就是SGD与GD在数据使用量和数据使用方式上的区别。
第二个区别是更新频率。考虑到GD每次都会根据整个训练数据来更新模型参数,与SGD相比,它的更新要少得多。因为SGD每次都会频繁地对单个数据点或两个训练数据点进行模型参数的更新。与GD不同,GD必须使用整个训练数据来进行一组更新。这会导致SGD在使用非常小的数据时更频繁地进行更新,这就是更新频率方面的差异。
另一个区别是计算效率。GD的计算效率低于SGD,因为GD必须使用整个训练数据进行计算或反向传播,然后根据整个训练数据更新模型参数。这可能会导致计算量很大,尤其是在处理非常大的数据以及非常复杂的数据时。与GD不同,SGD效率更高且速度非常快,因为它使用非常少量的数据来执行更新。这意味着它需要较少的内存来对使用小数据的数据进行排序,然后花费的时间就会少得多找到全局最优值,或者至少它认为它找到了全局最优值。因此,与GD相比,SGD的收敛速度要快得多,这使得它比GD更有效率。
最后一个我要在这个问题中提到的因素是收敛模式。众所周知,GD的收敛过程比较平滑,作为优化算法,其质量比SGD更高。SGD是一个效率高但质量较差的优化器,其原因是SGD的效率是以牺牲其质量为代价的,寻找全局最优值。SGD会产生大量的振荡,因为在估计真实梯度时它只使用了训练数据的一小部分。与SGD不同,GD使用整个训练数据,因此不需要估计梯度。它能够确定精确的梯度,这会在SGD的情况下导致大量振荡。对于梯度下降(GD),我们并不需要进行所有的振荡。因此,算法所做的运动量要小得多。这就是为什么随机梯度下降(SGD)找到全局最优值所需的时间要少得多。然而,不幸的是,大多数时候,SGD会将全局最优值与局部最优值混淆。因此,SGD经过多次迭代后,最终可能只找到局部最优,并将其误认为全局最优,这显然是我们不希望看到的。
我们的目标是找到真正的全局最优值,因此,我们需要最小化并找到使损失函数最小的参数集。这与SGD的做法恰恰相反,因为SGD使用的是真实梯度,大多数时候,它能够识别出真正的全局最优值。
24 如何改进梯度下降等优化方法?动量项的作用是什么?
每当你听到“动量”和“GD”这两个词,你应该自动将注意力转向带有动量的SGD,因为带有动量的SGD基本上是SGD的改进版本。如果你理解了SGD和GD之间的区别,你就能更容易地解释什么是带有动量的SGD。
我们刚刚讨论了GD受到振荡影响的问题,这种过多的运动会导致我们使用少量的训练数据来估计真实的梯度,从而导致具有完全不同的梯度的权重中有太多不同类型的更新。这是我们想要避免的,因为我们已经看到并解释了过多的这些运动最终会导致优化算法错误地混淆全局最优和局部最优。因此,它会选择局部最优,误认为这是全局最优,但事实并非如此。
为了解决这个问题,我们提出了带有动量的SGD算法。带有动量的SGD算法利用了SGD的优点,并尝试解决SGD的最大缺点,即过多的振荡。带有动量的SGD引入了动量的概念,利用这种动量来寻找优化算法并将其推向更好的方向,从而减少振荡。
动量的作用是尝试添加我们之前对模型参数进行的更新的一小部分,然后我们假设这将很好地指示该特定时间步长中更准确的方向。假设我们处于时间步t,并且我们需要进行更新,那么动量的作用就是查看之前的所有更新,并更频繁地使用最近的更新。与非常旧的更新相比,最近的更新很可能会更好地代表我们需要采取的方向。这在优化过程中更新模型参数时,当我们考虑到这些是最近的情况时,我们就可以有更好、更准确的方法。
带有动量的SGD试图加速这个转换过程,并且不是有太多朝向不同方向的运动,也不是有两个不同的经常梯度和更新,而是试图稳定这个过程,并且有更多的持续更新。在这里你可以看到,作为动量的一部分,我们获得了这个动量项,它等于vt加一,用于时间步长t加一的更新。它的作用是需要这个伽玛乘以vt,加上学习率eta,然后是梯度。你可以看到这个膨胀的三角形,然后在theta下方,然后j theta t只是表示损失函数相对于参数theta的梯度。它基本上所做的是它说我们正在计算这个动量项,t的时间步长加一,基于之前的更新。通过将 gamma 乘以 VT 并加上我们之前看到的随机梯度下降(SGD)的常用术语,对于梯度下降(GD)来说,基本操作是使用 eta 学习率乘以损失函数相对于参数 theta 的一阶偏导数。因此,我们使用这个动量项简单地从我们的当前参数 theta t 获取新版本,更新版本为 theta t 加一,其中 theta 只是模型参数。
通过这种方式,我们正在做的是,以更一致的方式执行更多的更新,从而在方向中引入一致性。通过更重视近期的调整,我们增强了动量,因此称为动量。动量增加了朝这个方向的速度,使得在更一致的梯度中找到全局最优值,增强了向全局最优的运动,从而使损失函数达到全局最小值。这当然会提高优化算法的质量,我们最终会发现全局最优而不是局部最优。
总结一下,带有动量的 SGD 的作用是,它基本上采用 SGD 算法,因此在执行模型参数更新时再次使用少量训练数据。但与 SGD 不同,带动量的 SGD 的作用是,在寻找实际的全局最优值时,它试图复制 GD 的质量,而它的实现方式是引入动量项。这还有助于引入更新的一致性并减少算法产生的振荡,通过更平滑的路径来发现损失函数的实际全局最优值。
25 比较批量梯度下降和小批量梯度下降,以及随机梯度下降
这里我们有梯度下降算法的三个不同版本:传统的批量梯度下降(通常简称为 GD)、小批量梯度下降和 SGD 或随机梯度下降。这三种算法彼此非常接近,它们在执行每个模型训练和模型参数更新时的效率和使用的数据量方面确实有所不同。
批量梯度下降是原始的 GD,该方法涉及使用整个训练数据的传统方法。对于计算梯度时的每次迭代,进行反向传播,然后将这些梯度作为优化算法的输入,以对这些模型参数执行单次更新。然后再次使用整个训练数据进行下一次迭代,计算梯度并更新模型参数。在批量梯度下降中,我们不是在估计两个梯度,而是实际上在计算梯度,因为我们拥有完整的训练数据。由于使用整个训练数据的这种质量,批量梯度下降具有非常高的质量,因此非常稳定,能够识别实际的全局最优值。然而,这是以效率为代价的,因为批量梯度下降使用每次都需要将整个训练数据放入内存中的整个训练数据,并且在执行优化时非常慢,特别是在处理大型和复杂的数据集时。
接下来我们有批量梯度下降的另一个极端,即 SGD。SGD 与 GD 不同,我们之前在讨论 SGD 随机使用的先前面试问题时看到了这一点,因此随机采样单个或少数训练观察结果,为了执行训练,计算执行反向传播的梯度,然后使用优化来更新每次迭代中的模型参数。这意味着我们实际上并不计算实际的梯度,但我们实际上正在估计真实的梯度,因为我们只使用了训练数据的一小部分。这当然是以算法质量为代价的,尽管仅使用小样本是有效的,从进行反向传播时的训练数据中我们不需要存储训练,将整个训练数据放入内存中,但只是其中的一小部分,我们快速执行模型更新,然后我们更快地找到所谓的最佳值。但这是以算法质量为代价的,因为这样它就会开始产生太多的振荡。由于噪声梯度的存在,全局最优值和局部最优值往往会被混淆。这引出了我们的第三种优化算法,即小批量梯度下降。小批量梯度下降基本上是批量梯度下降和原始随机梯度下降(SGD)之间的一种折衷方案。小批量梯度下降的工作方式是试图在传统的梯度下降(GD)和SGD之间取得平衡。
小批量梯度下降试图利用SGD在效率方面的优势,并将其与GD在更新的稳定性和一致性以及寻找实际全局最优方面的优势结合起来。它的实现方式是将训练观察结果随机抽样到批次中,其中批次比SGD大得多,然后使用这些较小部分的训练数据在每次迭代中进行反向传播,然后更新模型参数。因此,当我们将训练数据采样到这k个不同的折叠(在本例中是批次)时,可以将其视为k折交叉验证,然后我们使用它来训练模型,然后在神经网络的情况下使用小批量梯度下降更新模型参数,例如权重和偏差向量。
虽然这三种方法有很多相似之处,但也有不同之处。在这个面试问题中,面试官试图测试你是否理解这三种方法的优点以及小批量梯度下降的目的。
26 如何在考虑小尺寸和大尺寸的情况下决定深度学习中的批量大小
这个问题是一个非常重要的问题,面试官试图测试你是否理解批量大小的影响,以及它如何影响整个算法的质量。
在这里,你的面试官想知道你对批量大小对梯度噪声、模型的偏差、模型的方差、模型的泛化、模型的收敛性、效率,尤其是内存使用情况的理解。我们已经讨论并比较了传统批量梯度下降、小批量梯度下降和SGD。我们已经谈到了...