深度学习AI面试问答必备50题
文:城主
(注:这不是面向初学者的文章。您需要一点基础知识来理解本文内容。)
感谢粉丝的热心推荐。本文对于任何想要准备深度学习面试的人来说都是非常有帮助的。
本文对应视频的中英完整版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。我们已经谈到了使用非常大的训练数据和使用一小部分训练数据(例如小批量)与使用更小的训练数据(例如从训练数据中随机采样的单个或很少的观察值)的想法,这个问题与此完全相关。
假设我们有这个小批量梯度下降,我们想了解在执行反向传播的训练过程中需要使用的批量大小是多少,然后在每次迭代中更新模型参数。因此,让我们根据我刚才提到的所有这些因素来比较小批量和大批量。
当谈到小批量时,这意味着我们有2到32作为批量大小,因此我们有1到32个观察值在我们的批次中。在这种情况下,梯度噪声当然会非常高,原因是我们在估计模型的梯度时使用了训练数据的一小部分。这当然意味着这个估计很可能不是真实梯度的正确估计,因为我们只使用训练数据的一小部分,这会给我们的模型带来很多噪音。与当我们有较大的批量大小时相比,梯度噪声会更低,因为我们使用更大的训练部分执行真实梯度估计时的训练数据部分。
然后我们就得到了收敛。因此,当涉及小批量时,收敛的质量往往会更差,因为它就像SGD一样,它往往会导致所有这些振荡,虽然收敛速度会很快,但它很可能会发现局部最优与全局最优。而当我们有大批量时,算法通常会收敛到更清晰的最小值,因此实际的全局最优和过程可能会更慢,但质量会更高。
然后我们就有了泛化因子。泛化基本上指的是过拟合的思想,模型实际记住了多少训练数据,与能够在看不见的数据上表现同样出色。现在每当我们使用整个训练数据时,很多时候会包含噪音,然后是模型。在每次训练模型时,我们通常使用大部分或全部训练数据。这种做法更有可能引入噪声,因为模型在获取梯度并根据这些梯度进行更新时,会使用这些噪声。基本上,对于大批量的数据,模型的泛化能力可能会降低,因为模型会记住训练数据,并可能将噪声视为正常的数据点,从而过度关注训练数据。
然而,当我们使用较小的批量时,我们会随机选择训练数据的一小部分。在这种情况下,训练数据中出现噪声的可能性较低,这意味着模型不太可能过度拟合噪声。然而,如果模型确实过度拟合了噪声,那么在未见过的新训练数据上,模型的表现可能会非常差。
总的来说,泛化是非常重要的。当我们使用较小的批量时,我们可能会得到一个泛化能力更强的模型,因为我们只使用了训练数据的一小部分,模型不太可能记住训练数据。相比之下,大批量的数据更有可能引入噪声,导致模型不能很好地泛化到未见过的数据。
此外,批量大小也会影响模型的偏差。如果批量大小较小,模型的偏差可能会较低,因为模型不太可能过度拟合训练数据。相反,如果批量大小较大,模型的偏差可能会较高。这是因为,当模型过度拟合时,偏差就会增加。因此,如果我们能降低过度拟合的可能性,那么偏差就会降低。这也意味着泛化和偏差是密切相关的。
在考虑方差时,小批量的情况下,方差会更高,因为我们每次都使用训练数据的不同部分和小部分,因此在寻找全局最优解时会出现更多的振荡和探索。而在批量大小较大的情况下,我们的方差要低得多,因为我们在寻找优化过程的解决方案方面进行的探索较少。
然后,我们还需要考虑计算成本和内存使用量。对于大批量,当我们有大量数据时,我们将在内存中存储更多数据。这也意味着收敛速度会更慢,计算成本会更高。相比之下,批量大小越小,计算成本越低,内存使用量越低。
27 批量大小如何影响深度学习模型的性能呢?
批量大小是我们在执行模型训练时每次迭代使用的训练样本数量。我们计算梯度作为反向传播的一部分,然后在每次迭代中更新模型参数。这对深度学习模型的性能和最终结果起着重要作用。
在面试中回答这个问题时,我建议您提及一些关键因素。首先是训练时间。这里,我们需要根据每次迭代的训练时间、每个时期的训练时间和总体训练时间来分析,因为这三者在比较批量大小时有很大的不同。其次,您可以提到的另一个因素是内存使用情况,因为较大的批处理大小需要更多的内存,而较小的批处理大小需要较少的内存。接下来,我们将讨论收敛质量。我们已经对此进行了深入的讨论,因此我将简要地提及一下。当我们的批量大小较小时,批量大小越小,模型的泛化能力通常越高。然而,收敛质量通常会降低,因为模型更有可能陷入局部最优,而非全局最优。
在学习动态的讨论中,批量大小将影响模型逃离局部最优的能力。如果我们使用较小的批量来估计真实梯度,这些梯度将会带有噪音。这意味着学习过程可能会不稳定,更有可能影响优化过程的质量,使模型陷入局部最优而非全局最优。如果批量大小很小,算法通常会更加不稳定,而不是在我们使用大批量,且算法在模型参数更新方面更加稳定的情况下。
28 什么是Hessian,以及如何使用它进行更快的训练?它有什么缺点?
如果你曾经学过微分理论课程,你可能会知道Hessian的含义。在这里,我将给出一个关于Hessian的高层次总结,并详细讨论在深度学习中使用Hessian的影响。
Hessian来源于微分理论,它基本上是一个包含二阶偏导数的矩阵,描述了函数与参数的关系。在深度学习中,作为优化过程的一部分,Hessian可以提供更好的梯度估计,因为它计算了损失函数的二阶偏导数。
在一些自适应学习优化算法中,它们是随机梯度下降(SGD)或带有动量的SGD的改进版本,目的是为了更好地估计真实梯度的较少噪声估计。你可能还记得,当我们讨论SGD和动量SGD时,我们说我们的主要目标是尽可能减少振荡次数。因为当我们使用小批量或少量训练观察来执行反向传播并获得真实梯度的估计时,这通常会在我们的模型中引入不稳定性,因为这个梯度的估计并不是真实梯度的正确估计。
当我们使用Hessian时,众所周知,Hessian可以更准确地估计梯度,并且它们可以帮助算法优化算法,使我们在更新模型参数时朝着更正确的方向前进。因此,使用相同数量的数据,但具有较少的噪声梯度,可以更正确地更新模型,使其更顺利地朝着全局最优的方向前进。
然而,使用Hessian也有一定的缺点。首先,计算Hessian并不容易。例如,当我们的模型中有多个参数时,我们需要获得函数的偏导数,这在计算上可能非常困难。此外,当使用Hessian作为优化算法的一部分时,这也会以计算资源为代价,因为这会导致将这些复杂的函数放入内存中,并将这些信息存储到内存中。对于深度神经网络模型来说,这个Hessian矩阵可能非常大,这将导致大量参数,有时在计算上不可行,或者计算然后反转梯度非常昂贵。
另一个使用Hessian的缺点是我们可能有过度拟合的风险。因为当我们使用二阶偏导数作为估计梯度的方法时,我们可能会过度依赖这种Hessian来进行训练加速。这可能会导致模型过度依赖训练数据进行参数更新,从而记忆训练数据。这意味着该模型不太可能对未见过的数据进行良好的概括。这当然是一个问题,因为这样我们的模型就会过度拟合,并且它将不能很好地概括未见过的数据。这是我们的最终目标。
29 讨论自适应学习率的概念,并描述自适应学习方法
自适应学习率是一个重要的概念,我们需要深入了解。同时,我们也将为您提供一些已知具有自适应性质的优化算法的示例。
在谈到传统的梯度下降(GD)、随机梯度下降(SGD)或动量SGD时,我们之前讨论过的所有优化算法都具有一个共同的特性,即它们使用完全相同的学习率来更新所有模型参数,无论这些参数是权重参数、偏差因素,还是不同隐藏层的权重参数。然而,自适应学习过程和自适应学习率与这种恒定的学习率有很大的不同。
在深度学习中,学习率(由eta定义)在定义更新步长时起着至关重要的作用。它决定了我们需要更新多少权重参数和偏差因子,基本上定义了我们需要进行的更新量。自适应学习过程的主张是,我们不应该在所有这些参数上使用完全相同的学习率。相反,我们需要查看训练数据和特征,然后根据这些信息来确定学习率,以便我们在更新模型参数时需要使用的步长。
自适应学习优化过程的作用在于,它可以处理不同的数据,研究复杂的数据集和特征,然后根据从计算梯度的学习过程中获得的信息,根据不同特征中的模式来更新不同的模型参数。这样,我们就可以根据需要采用不同的学习率,每个模型参数将有自己的学习率。这将避免停滞,减少振荡,帮助我们防止陷入局部最小值,从而无法发现全局最优值,这是我们在使用固定学习率时常遇到的问题。
当我们讨论自适应学习率的不同示例时,我们可以提到一些最流行的优化算法,其中之一就是具有自适应性质的ADAM优化算法。ADAM代表自适应矩估计,这是一种能够相应地调整学习率的算法,因此在优化方面具有更好的性能。另一个例子是RMSProp,RMSProp代表均方根传播,这是一种已经在Coursera深度学习课程中介绍过的算法。自那时起,许多人一直在使用并尝试它。另一种自适应优化算法是自适应梯度算法,即AdaGrad,它会根据累积平方梯度来调整学习率,特别适合处理稀疏数据。
总的来说,自适应优化过程是对学习率进行调整的过程,它对深度学习模型性能的影响很大。我们已经介绍了几种自适应优化算法的例子,这些算法在整个行业中得到了广泛的应用。
30 什么是RMSProp以及它是如何工作的
RMSProp是一种自适应优化过程的示例,它代表均方根传播。RMSProp是一种优化算法,它尝试最小化深度学习模型的损失函数,以找到能够最小化损失函数的模型参数集。RMSProp的作用是试图解决传统梯度下降算法的一些缺点,特别是在处理消失梯度问题或爆炸梯度问题时。
在训练深度神经网络的过程中,我们经常遇到一个大问题,即梯度消失或爆炸梯度的问题。当梯度开始向零收敛,变得很小,几乎消失,或者当梯度太大以至于爆炸时,它们会导致大量的振荡。为了避免这种情况,RMSProp使用了自适应学习率,它会调整学习率,并在此过程中使用了二阶梯度的运行平均值的概念。所以,这与Hessian的概念有关,同时也使用了dk参数。它会考虑并调节我们需要使用的最近梯度的平均值。在我们更新模型参数时,我们需要考虑从最近的调整中获取多少信息。在这种情况下,这意味着具有大梯度的参数将会降低其有效的学习率。因此,每当我们遇到参数的大梯度,我们将减少梯度,这意味着我们将控制梯度爆炸效应。当然,如果参数的均方根探针具有小梯度,我们将以相反的方式控制这一点,我们将提高他们的学习率以确保梯度不会消失。通过这种方式,我们将控制和平滑该过程,以便RMS探针使用这个衰减率。您也可以在这里看到这个beta,通常是0.9左右的数字,它控制这个运行平均值忘记最旧梯度的速度。
我们的运行平均值vt等于beta乘以vt减去一加一减去beta乘以gt的平方,这基本上是我们的二阶梯度。我们所做的就是取这个运行平均值,然后我们用它来适应和调整我们的学习率。在我们的第二个表达式中,参数的更新版本等于当前参数减去学习率除以该运行平均值的平方根的vt的平方根,然后添加一些epsilon,通常是一个小数字,只是为了确保我们不会将这个eta除以零,以防我们的运行平均值等于零。我们确保这个数字仍然存在,并且我们不会将一个数字除以零,然后我们只需将其乘以我们的梯度。根据我们的参数,我们将有一个不同的学习率,然后我们将更新这个学习率。因此,通过在RMSProp的情况下采用这个学习率,我们可以稳定这个优化过程,防止所有这些随机运动和振荡,同时我们确保更平滑的收敛。我们还确保我们的网络,特别是深度神经网络,不会遇到梯度消失问题和梯度爆炸问题,这在我们尝试优化深度神经网络时可能是一个严重的问题。
31 什么是Adam以及为什么它在神经网络中大部分时间被使用?
Adam是一种自适应优化算法,以其基于梯度的一阶矩和二阶矩的动态学习调整而闻名。Adam像RMSProp一样是另一种自适应优化算法,它相应地采用学习率,以减少振荡量并提高优化算法的质量。Adam试图将两种不同算法的优点结合在一起,它尝试将SGD的动量思想与动量与RMSProp的思想结合起来,使用第二个算法的运行平均值阶导数,然后通过将两者结合起来,尝试从这两个世界中受益。
当谈到Adam时,它可以用这种数学表示来表示,你不需要知道它,但我总是认为它有助于人们了解它如何将RMSProp和SGD与动量这两个世界结合起来,以及为什么它实际上是这样的。很有用。所以当我们查看这里时,我们可以看到第一个是动量项,因此mt等于beta1乘以mt减1加1减beta1乘以gt。其中beta1是第一个参数,它只是一个常数。beta2也是一个常量,一个超参数,我们实际上可以调整它们。在此,您可以观察到gt和gt平方,它们分别代表梯度的第一时刻和第二时刻。相较于第一时刻,第二时刻能够更准确地进行估计,噪音更少。因此,我们的目标是一方面利用动量的概念来减少优化算法产生的振荡量,通过这种方式,我们改进了优化过程并获得更好的质量。另一方面,我们还引入了速度的概念,它源自rms属性,这将导致更好的、噪音较小的梯度估计。因此,我们正在尝试在整个训练过程中调整学习率,使其在不同场景中更加有效。
因此,对于gt带有动量的情况,Adam将结合此功能,并且使用rmsprop会有益。在这种情况下,Adam将再次使用其他优化算法。这就是为什么Adam在整个行业中被证明非常有效,并且人们在整个行业中使用它来解决各种问题和应用。
正如您所看到的,一旦我们有了一阶导数的运行平均值和二阶矩梯度的运行平均值,我们也在进行调整,我们正在纠正这个动量和速度。通过除以mt,我们将mt除以1减去beta1的t次方,因为我们想要在涉及到这个动量时调整偏差。然后我们也在调整速度,所以vt就是vt的调整版本,因为我们使用vt并将其除以1减去beta2的t次方,使用beta2作为我们的超参数作为我们的第二个偏置向量。然后我们在第一时刻使用这个调整后的运行平均值和二阶梯度的运行平均值的调整版本,以便更新和采用我们的学习率。正如您在这里看到的,我们正在做什么,我们正在学习速率alpha,我们将其乘以采用和调整的动量项,然后将其除以该速度项或vt hat的平方根加上一些epsilon(通常是一个小数),只是为了确保我们不会将此数除以零,我们用它从theta t中减去,这样当前参数就可以得到新的更新参数theta t加1。
当谈到使用Adam的好处时,首先,Adam结合了多种优化算法的优点,确保质量到位、效率到位、优化算法能够应对不同场景。稀疏梯度的效率是Adam优化器的另一个优点,因为Adam在处理这种稀疏梯度时特别有效。Adam的另一个优点是它能够平衡速度和稳定性。因此,与SGD等算法相比,Adam在收敛到全局时通常收敛得更快,同时它也往往更稳定,因为与算法相比,它能够控制学习过程只使用第一时刻,而Adam也使用二阶梯度。
所以,Adam的第二个时刻,也是最后一个优势就是它的鲁棒性,所以它以在各种条件、各种场景下的鲁棒性而闻名。这也意味着它对超参数选择不太敏感。当涉及到初始学习率时,这一点尤其重要,这使得它对于大量应用程序来说变得更加容易和用户友好,特别是当你是刚刚学习深度学习的人时,调整可能会有点困难和您的超参数,可能很难识别您的算法需要使用的初始值。Adam对学习率的选择不太敏感,这非常重要。
32 Adam W是什么以及为什么它比Adam更受青睐?
这里当然指的是我们刚刚讨论的Adam优化算法,Adam W很简单,它是传统Adam优化器的调整版本。Adam W是一种自适应优化算法,它被用于优化神经网络的训练并找到损失函数的极小点。这种算法通过不断采用学习率并更新模型参数来实现优化。Adam W与Adam的最大区别在于他们执行正则化的方式。
传统的Adam算法存在一个特定的缺点,这种缺点通常在处理深度神经网络时出现。与传统的动量SGD不同,Adam无法正确概括模型。大多数时候,我们使用Adam进行正则化,例如,我们可能会使用L2正则化以及与Adam一起对大的权重进行惩罚,以解决算法的过拟合问题。
然而,Adam在业界展示了在训练不同的深度神经网络时泛化效果不佳并解决过度拟合的问题。这正是Adam W试图解决的问题。Adam W试图解决Adam的具体问题,以改进泛化能力。这使得Adam W在跨方差应用中得到越来越多的使用,尤其是在涉及到已经预先进行的微调的训练模型时。
我们知道这些类型的模型存在过度拟合问题。当过度拟合问题不再存在时,我们需要有通用模型。我们将能够对模型进行预训练,并基于这个预先训练的模型进行微调,然后在未见过的数据上使用它。这样,模型仍然会表现良好,从而解决过度拟合问题并确保我们提高泛化能力。
Adam W的工作方式就像你在这里看到的那样,与传统的Adam不同,例如使用L2正则化。它的作用是在更新模型参数时在更新过程中添加此衰减项。因此,传统的Adam算法与L2正则化相结合,其中Adam是优化算法,L2是正则化算法,用于解决过拟合问题。我们所做的就是将这个lambda乘以theta t减一,其中lambda是这个惩罚参数,我们用它来了解我们需要对某些参数进行多少惩罚。这是为了确保模型不会记住训练数据,并且它确保模型和模型更具有通用性。
然而,有时这并不能帮助我们解决过度拟合问题和权重衰减。因此,将权重衰减与梯度更新解耦,而不是使用它作为梯度更新的一部分,如果我们将其合并为直接作为模型参数更新的一部分,事实证明它对模型的泛化具有更好的影响。因此,当我们将正则化项lambda乘以theta t减一添加到梯度中时,我们不会将其添加到梯度中,而是在更新时直接添加它模型参数作为整个模型的一部分。如您所见,表达式乘以学习率。这在解决过度拟合问题并使整个训练模型更具通用性方面表现出更好的影响。
这将确保我们在特定场景中具有更好的性能,特别是当我们拥有深度神经网络或当我们对预训练模型进行微调时。这也意味着该算法在看不见的数据上表现同样好。与我们使用传统的Adam不同,传统的Adam在某些情况下不能很好地进行泛化,并且会出现过度拟合。
33 什么是批量归一化以及为什么在神经网络中使用它
要理解批量归一化这个概念,您需要知道什么是正态分布。标准正态分布是均值为零且方差等于1的概率分布函数。批量归一化的作用是归一化每批次的激活,因此称为批量归一化。批量归一化是为了解决内部协变量偏移问题而引入的技术。在神经网络中,网络激活的分布会因神经网络参数的变化而发生变化。每次我们使用反向传播计算梯度时,我们会使用优化算法来更新这些模型参数。这将引入激活分布的变化,可能会破坏神经网络的稳定性,这是我们不希望看到的。为了使我们的算法和神经网络具有更好的性能,我们希望我们的批次具有某些首选的分布特性。
因此,我们希望它是正态分布的,这被认为是统计学和机器学习中最常用的分布函数之一。我们通过标准化激活来实现这一点,即一旦我们计算了 z 分数,我们就应用激活函数并获得激活,然后我们可以标准化这些激活,通过计算平均值和方差,以及整个批次中的这些激活。对于每批次的所有观察,我们可以使用它来标准化激活。
如果您使用过传统的机器学习模型,那么您很可能会熟悉标准化的概念,但让我们快速研究一下数学定义,以防万一,您还需要提供此信息作为答案的一部分。所以当我们查看这里时,您可以看到我们正在计算所有激活的数量的平均值,其中 xi 定义激活,m 是每批的观察数。我们将所有这些激活的总和除以每批的观察数。然后这给了我们批次平均值,即 mu 批次。然后我们还可以计算该批次对应的方差,通过获取此激活值 xi 并从中减去批次的平均值,并取其平方,即激活的平方差和批次的平均值,我们取它们的总和,对于所有批次观察,有 m 个元素,并将其除以每批次所有观察的数量。
这样我们就可以找到该批次的方差估计,然后我们可以用它来标准化该批次的激活。正如你在这里看到的,我们采用 xi,即激活,我们减去 mu b(批次的平均值)并将其除以 sigma b 平方的平方根(批次的方差),并且我们添加了一些噪声,即 epsilon,以确保我们不将这个数字除以零。然后一旦我们有了这些激活,我们就可以使用这个标准化的激活来获得我们的预测。
这张图是一张常见的图,用来形象化这种批量归一化的想法。因为这里我们有该批次的所有观察结果,所以根据这张图我们有n个不同的观察结果。然后我们需要标准化这对特征。所以你可以看到我们正在标准化每个特征的每批的所有观察结果,所以我们使用每批的所有观察结果找到该特征的均值并找到该特征的方差,然后我们计算标准化激活。
你可能会想,除了稳定神经网络之外,为什么我们还要对其进行标准化,以及这对神经网络有何影响?当我们使用这个批规范执行标准化时,批量归一化引入了这两个可训练参数对激活,一个是为了规模,一个用于平移,因此比例就是这个 mu,然后平移就是方差。一旦我们有了这个步骤,就可以确保标准化过程不会减弱网络的表征能力。
通过这种方式,我们正在做的是稳定分布的激活次数,跨越不同层。所以在每一层中,我们没有完全不同的激活分布,并且当我们有相似的分布时,这很正常,那么我们会有更稳定的学习过程。这将允许更高的学习率,这将加速神经网络的训练过程。当我们加速训练过程时,我们会减少这种振荡,我们认为这是传统 SGD 的一个大问题。我们的目标是尽可能减小振荡的产生,因为振荡越小,我们走向全局最优的机会就越大。我们希望找到损失函数的全局最优解。批量归一化的一个优点是它降低了对算法初始化的敏感度。
在训练神经网络时,我们需要初始化权重和偏差向量。这个初始化过程对最终结果有显著影响。如果初始化不当,神经网络的结构可能会完全改变,导致算法走向错误的方向,从而陷入局部最小值。因此,当我们尝试优化算法时,批量归一化的执行使得算法对权重的初始值不太敏感。这意味着我们有更大的机会找到全局最优值而不是局部最优值。
批量归一化的最终间接影响是它带来了正则化效果。通常,我们会进行批量归一化以稳定神经网络,但它的正则化效果也减少了我们需要使用其他正则化算法来解决过拟合问题的需求。Morrow的方法是通过标准化激活来确保某些神经元的激活值不会过高。这些过高的激活值可能是噪声点,最终会影响整个神经网络的结果。如果训练数据中包含这些噪声点,Morrow会关注这些噪声点,并学习记住这些本不应被记住的数据点。然后,Morrow的更新将基于这些噪声点。当我们执行归一化并减少这些噪声点的影响时,我们也降低了Morrow过度跟随这些噪声并影响整个更新的风险,从而降低了过拟合的风险。因此,批量归一化对神经网络有正则化的影响。
34 什么是层归一化以及为什么在神经网络中使用它
层归一化的目标与批量归一化相同,都是为了稳定网络并减少激活的内部协变量偏移,以确保神经网络能够以稳定的方式正确学习数据中的依赖关系。批量归一化使用整个训练数据的一批来计算平均值和方差,并进行归一化。然而,层归一化的方式不同,它计算所有特征的平均值和方差,但只针对单个训练观察,并用它来标准化这些激活。
这种变化的原因是,在某些神经网络架构中,对所有训练观察结果进行标准化是不可行的,甚至没有意义。例如,当我们有基于CNN的架构时,我们可以轻松使用批量归一化。但是,当我们使用RNN、LSTM、GRU等架构时,批量归一化并不有效,而层归一化在这些情况下更有效。因此,对于这种不同的架构来源,只要无法使用批量归一化,我们就可以使用层归一化。层归一化也广泛用于最先进的Transformer,它们是流行的大型语言模型的一部分,例如仅包含编码器的GPT和纯解码器架构的BERT。
如果你想知道为什么层归一化特别用于RNN、LSTM、GRU或Transformer等架构中,那是因为在这些架构中,批量大小要么很小,要么可能会有所不同。每当我们有不同或小批量的产品时,批量归一化通常是无效的。与批量归一化不同,层归一化在这些情况下特别有效,例如在RNN、GRU或LSTM中,其中批量大小可能不同。在网络稳定性方面,层规范仍然能够有效地发挥其作用。
35 残差连接及其在神经网络中的功能
残差连接在神经网络中起着至关重要的作用,尤其是在优化神经网络性能的过程中。通过解决梯度消失问题,残差连接在ResNet、Transformer等深度学习架构中发挥着关键作用。例如,在DGPT系列的大型语言模型和aspert模型中,如果你查看名为“注意力”的论文,你会发现,除了实际的层之外,每个层都是架构的一部分。你还会看到一个附加层,上面标注着“添加”,然后是规范。这正是层归一化和添加剩余连接的地方。
残差连接的作用是,与典型的神经网络不同,在典型的神经网络中,输入只是通过权重和偏差因子转换为相应的激活以产生输出。然而,在残差连接的情况下,我们将原始输入直接添加到该层的输出上。这通常被称为快捷方式或跳过连接。这种方式被称为快捷方式或跳过连接的原因是,梯度直接跳过了计算图的转换,即权重乘法、偏差因子添加和激活函数转换,而是直接为最终结果做出贡献。在残差连接中,我们得到的输出等于该层的输出加上实际的输入。
以Transformer模型为例,你需要的就是注意力。你可能会记得Transformer架构的左侧部分,即编码器部分。这部分也被用作GPT系列的一部分,因此是一般预训练模型。我们在哪里使用输入的Transformer模型呢?输入嵌入位于位置编码的顶部,基于正弦曲线和余弦曲线。然后,如果你熟悉Transformer模型,我们会将其转换为查询键和值,然后将其作为多头注意力层的输入。
如果你不熟悉Transformer的这种架构,不用担心细节,只需将这个多头注意力层视为分层神经网络,尝试学习序列元素之间的相互依赖性。我们在这里所做的是,除了提供此输入之外,还添加在输入编码顶部的位置编码。除了将其作为多头注意力层的输入,然后多头注意力层为我们提供转换后的输出。我们还给这个值这个输入,你可以看到这个箭头指向该输出的顶部。因此,我们从多头注意力层获取输出,最重要的是,我们正在执行层归一化,并且我们在此输出上添加输入,这正是我们作为残差连接的一部分所做的事情,我们正在添加输入位于该输出的顶部。
现在,它被称为快捷方式的原因是,在计算梯度时,梯度将经历这个变换,我们需要计算损失函数的偏导数相对于权重。为此,我们首先需要计算损失函数相对于Z分数的偏导数,然后我们需要计算Z分数相对于权重的偏导数,然后使用两者并使用链式法则计算损失函数相对于权重的偏导数。现在,该梯度的整个变换将导致在许多情况下梯度非常接近于零并消失,这就是臭名昭著的梯度消失问题。为了避免这种情况,我们对残差连接所做的就是我们也有这个快捷方式,所以你可以看到我们不仅执行这种不同的变换,所以我们有x,然后我们有权重层,然后我们有修正的线性单元激活,然后我们有权重层,然后我们得到的输出是fx。最重要的是,我们还添加了这个x,因此初始输入位于该输出的顶部。这就是我们所说的剩余连接。为什么你可以看到我们有这种捷径的想法,因此梯度不仅可以通过这些变换流入网络,还可以直接流入网络。朝向梯度的理解需要数学推导。如果我们考虑输出 y 等于 x 加 fx,其中 x 是我们在输出 fx 顶部添加的输入,你会发现如果我们对这个函数求偏导数,对于 x,我们需要做的是应用链式法则。因此,我们需要先对 e 对 y 求偏导数,然后将其与 y 对 x 的偏导数相乘。这等于 e 对 y 的偏导数,与我们这里的完全相同,但然后将其乘以 1 加 fx,或者说 f 对 x 的一阶导数。
之所以是这个值,是因为我们需要取 y 对 x 的偏导数,当我们取 x 加 fx 对 x 的偏导数时,y 等于 x 加 fx。使用求和法则和微分法则,这简单地等于 x 关于 x 的导数,即 1,加上 fx 关于 x 的导数,即 f。这不是 x,它基本上是 fx 关于 x 的一阶导数。
所以,当我们展开括号时,这与取偏导数相同,即 e 相对于 y,然后加上 e 相对于 y 乘以 f 而不是 x 的偏导数。这只是左括号,所以 1 乘以这个值,得到 e 相对于 y 的一阶导数,加上括号内的第二部分,它是 f 而非 x 乘以 e 对 y 的偏导数。这只是 e 对 y 的偏导数乘以 f 而不是 x。
我解释这个数学推导的原因是你可以亲自看到,在这种情况下的梯度相对于 x,不仅能够流过这部分,这是乘以 f 而不是 x,已经经历了权重和激活函数的所有这些转换,但也直接因为我们这里有这个术语,即 e 对 y 的偏导数。
这是有帮助的,因为它可以减少梯度消失问题。当我们有多层时,从非常深的层到非常早的层,我们的梯度会经历权重和激活函数的所有这些变换,然后它最终变得非常接近于零,所以它消失了。如果我们有机会让梯度通过快捷方式并跳过某些层,我们将有更高的机会使该梯度不消失,实际上从更深的层到达初始层,这正是我们想要做的,这解决了梯度消失的问题。
36 什么是梯度裁剪及其对神经网络的影响?
我们刚刚讨论了残差连接,特别是对于深度神经网络,特别是当我们具有太多层的顺序性质时,尤其是 RNN、LSTM 等情况,我们可能会遇到梯度消失的问题,而残差连接可以帮助解决这个问题。
现在,梯度裁剪正在解决相反的问题,即梯度爆炸问题。每当我们有某些深度神经网络(例如 RNN、LSTM)时,因为我们每次都使用这些转换,并且我们使用累积性质并通过此过程将所有这些权重相互相乘,并且我们使用之前的隐藏状态来更新新的隐藏状态,因此下一个隐藏状态和下一个隐藏状态也意味着当我们遍历这些层时,我们的梯度可能会爆炸。在反向传播的优化过程完成后,我们需要执行所有的转换。然而,当我们处理较早的层时,可能会出现梯度爆炸的情况。这意味着梯度变得如此之大,以至于开始影响模型的整体性能。我们可能会开始进行大幅度的跳跃,以及开始获取的更新。优化过程可能开始向不同的方向产生过多的振荡,因此我们将这种不稳定的行为视为优化过程的一部分。这绝对不是我们想要的,因为梯度爆炸意味着我们的神经网络不稳定。这也意味着权重的更新会过大,这将导致神经网络表现不佳且训练不当。
为了避免所有这些问题,我们解决梯度爆炸问题的方法是使用梯度裁剪。梯度裁剪的作用是将梯度裁剪到一定程度,因此有一个阈值,这是我们用于梯度裁剪的参数。每当梯度变得太大以至于超过阈值时,我们就会剪裁该梯度以确保该梯度不会过大,并且我们没有过多地更新权重参数或偏差因素。因此,通过这种方式,我们正在稳定我们的神经网络。这对于 LSTM、RNN、GRU 等架构尤其重要,它们具有太多层的数据的顺序性质。通过这种方式,我们将确保我们的神经网络优化过程中不会出现这些不稳定的跳跃。我们最终将得到一个稳定的网络,能够正确学习相互依赖关系。
37 什么是 Xavier初始化,为什么在神经网络中使用
Xavier初始化背后的关键思想是保持激活的方差和跨层一致的梯度。完成的方法是设置初始权重,根据输入的数量以及神经网络中的输出神经元。它的工作方式是查看 n,其中 n 是神经元的数量作为输入,进入该层的 n 个输出是神经元的数量或作为该层一部分的输出,因为在每一层中我们都有传入的神经元和传出的神经元。n in 和 n out 描述了出去的神经元的数量,用于定义这些权重的分布。
Xavier初始化尝试稳定网络的一种方法,并保持梯度以及激活一致和稳定是通过使用某些统计分布,具有一定的品质,可以确保权重的方差是恒定的。所以我们想得出一个分布,从中我们可以对初始权重进行采样,使用 n in(其中是进入该层的神经元数量)和 n out(其中 n out 是离开该层的神经元数量)结合统计分布使用。
一种方法是使用均匀分布。如果您熟悉统计分布函数,均匀分布的工作方式是它总是有两个参数,它有一个下界 a 和上限 b,并且分布总是在这个特定区域内,就像一个矩形区域和相应的值,因此上限是概率除以 b 减 a,因此该范围内所有值的概率是常数,等于一除 b 减 a。
这在我们的例子中很重要,因为如果我们在这种情况下使用某些 a 和 b,你可以看到当使用 6 的平方根除以 n in 的平方根加上 n out 时作为下限,它是正版本,因此 6 的平方根除以 n in 的平方根加上 n out。那么对应于该随机变量的方差遵循均匀分布,下界为 a,下界为上界 b,则该方差将等于 2 除以 n in 加上 n out 的平方根。所以这个随机分布的方差就是这个量。这意味着每次我们的权重都将保持恒定。因此,它的变化也将是恒定的。如果权重具有恒定的方差,这就意味着它总是会发生变化。这又意味着什么呢?这意味着我们的量是类似的,因此不会发生太大的变化。如果梯度过高,就会导致梯度爆炸,但它也不会变得太低,因此梯度不会太小。这样,我们就可以解决梯度消失的问题。这就是为什么协方差初始化如此重要且意义重大,因为它可以帮助稳定整个网络,使得激活的方差和不同层之间的梯度保持一致。它还可以降低梯度消失和爆炸的风险,从而促进稳定性并提高训练过程的效率。这个过程与sigmoid激活函数和tanh激活函数特别相关。
38 解决梯度消失问题有哪些不同的方法
到目前为止,我们已经讨论了许多主题和方法,其中我简要提到了一些可以帮助您解决梯度消失问题的方法。在这里,我将在更高的层次上快速总结一下你可以采用的解决梯度消失问题的方法。
首先,梯度消失问题可以通过使用适当的激活函数来解决。例如,通过使用不会饱和的激活函数,如整流线性单元函数(ReLU)或泄漏整流线性单元函数(Leaky ReLU),可以帮助您解决梯度消失问题,并确保当您从深层网络传递到早期层时,梯度不会消失。因此,不要使用sigmoid或tanh,而是使用Leaky ReLU或ReLU来解决梯度消失问题。
解决这个问题的另一种方法是我们在上一个问题中讨论的,即使用适当的权重初始化技术,如Xavier初始化,可以帮助您解决梯度消失问题。另一种解决此问题的方法是执行批量归一化,这会间接地给网络带来稳定性,并通过标准化激活,使得梯度更加一致。如果你的梯度更加一致,那么梯度消失的问题就更小。
另一种解决梯度消失问题的方法,尤其是在涉及到基于序列的架构(如RNN、LSTM、GRU)时,是使用剩余连接。剩余连接可以为你的梯度提供捷径,使其可以在网络中流动,而无需经历所有的转换,这将有助于降低梯度消失的风险。
解决梯度消失问题的最终方法是通过使用适当的架构。例如,如果您使用Transformer架构,那么可能会出现梯度消失问题。但在这种架构中,我们会在每层之后自动添加残差连接和层归一化,这在某种程度上可以帮助你解决梯度消失问题。例如,如果我们使用Adam-V,这也有助于规范网络并以某种方式解决这个问题。
39 解决梯度爆炸的方法有哪些?
解决梯度爆炸的一种方法是梯度裁剪,它可以帮助保持一个阈值,并确保每次检查梯度时,如果梯度超出阈值,就会进行裁剪,这样就可以确保梯度不会超过这个水平,从而解决梯度爆炸的问题。
解决这个问题的另一种方法是以正确的方式使用权重初始化。正如我们之前看到的,Xavier初始化不仅可以帮助我们解决梯度消失的问题,还可以帮助我们解决梯度爆炸的问题,因为通过保持权重的方差恒定,我们可以确保梯度不会爆炸,也不会消失。因此,权重正则化和权重初始化也将有助于解决梯度爆炸问题。
40 如果神经网络出现与神经网络权重相关的过度拟合,会发生什么情况
这个问题可以分为两个部分。第一部分涉及过度拟合问题,您需要理解过度拟合与神经网络的关系,这通常类似于机器学习模型的过度拟合。第二部分是将过度拟合与神经网络中的权重联系起来。
首先,我们来理解什么是过拟合。当我们使用深度学习模型时,就可能会发生过度拟合。这种情况下,模型开始记忆训练数据,尽力确保模型在训练数据上表现良好,即使训练数据可能包含一些噪声点和异常值。当我们用这种类型的数据训练模型时,模型开始记住这些特点。然后,我们使用这个过度拟合的模型来预测未见过的数据,结果通常是这个过度拟合的模型在未见过的数据上表现不佳。
我们的整个目标是以这样的方式训练模型,使得最终版本的模型能够在未见过的数据上正确执行,这是我们的全部目标。否则,我们一开始就不会使用预测,我们希望有一个高精度的正确预测对于未来的数据或未见过的新数据。过度拟合会导致问题,因为它使模型的泛化性较差,无法很好地泛化于未见过的数据。
那么,过度拟合与模型的权重有何关系呢?在神经网络中,过大的权重将使模型对其输入数据非常敏感,其中可能还包括异常值或噪声数据。当模型过于紧密地遵循训练数据,包括这些异常点时,这个模型将不能很好地推广到新数据。因此,我们希望解决过度拟合的问题,以确保我们的模型具有通用性,并且在训练数据上的表现与在新数据上的表现至少在某种程度上非常相似。
41 什么是 dropout 以及它是如何工作的
Dropout 是深度学习中常用的一种正则化技术,用于解决过拟合的问题。训练神经网络时,我们希望有一个模型能够很好地概括未见过的数据。使用正则化技术是提高模型通用性并提高模型性能的一种方法,其中一种非常流行的正则化技术是 dropout。
Dropout 正则化的作用是随机丢弃或停用神经网络中的一部分神经元,在每次训练迭代期间。它的做法是采用一个概率或比例,这个比例是一个 0 到 1 之间的值,表示需要随机停用的神经元的数量比例。这个比例被称为 dropout 率。
我们说的是 RGL,这只是 L 层的激活。该随机变量遵循伯努利分布,概率为 1 减 dropout 率。其中 1 减去 dropout 率就等于不应停用的神经元数量以及应激活的错误数量。如果您将 dropout 率作为失活率,那么 1 减去 dropout 率将是激活率。
我们选择伯努利分布,因为如果您熟悉一些非常流行的统计概率分布,你会知道伯努利分布帮助我们表达和定义具有两种可能结果的随机变量,可能成功也可能失败。所以可能会退出或不退出我们可以激活或不激活所以停用神经元。这就是为什么我们说我们在该特定层的激活,假设 L 层可以用遵循伯努利分布的随机变量来描述。激活率可以定义为1减去p,其中p代表辍学率。因此,假设我们在训练迭代过程中想随机停用或丢弃神经元激活的20%,那么这个p将等于0.2。这意味着我们的激活率将等于0.8。因此,我们的层将遵循0.8的伯努利分布,0.8等于成功概率。
在每次迭代的训练过程中,我们将随机停用并丢弃一些神经元。通过这种方式,我们将确保每次我们的模型仅看到80%的激活。这有助于解决过拟合问题,因为我们减少了我们的模型看到噪声点并记住训练数据的机会。如果我们的模型每次都能看到80%的神经元,每次迭代之间都会发生80%的变化,因为该过程是随机的。这样,我们的机会就更小,让我们的网络每次都看到相同的噪音,并记住训练数据,因为我们在某种程度上取消了训练过程的相关性。这将有助于使我们的神经网络更加稳定,更少地依赖于某些神经元,这也意味着它将更好地泛化,减少过度拟合的机会。
然而,我们仅在训练数据上执行dropout。在接下来的问题中,我们将看到如何回答这些类型的问题,鉴于我们仅对训练数据执行dropout,我们到底需要做什么。
42 Dropout如何防止神经网络中的过度拟合?
我们已经回答了这个问题的大部分内容,所以我将在高层次上总结我刚才所说的作为问题的一部分。dropout防止网络过度拟合的方法是在训练过程中随机停用p%的神经元,从而减少神经网络对某些数据点的依赖,并减少网络记住训练数据的机会。通过这种方式,网络鼓励特征冗余,也有助于更好地泛化模型。
43 Dropout是否像随机森林一样?
在这个问题中,你的面试官希望你通过一种非常棘手的方式来测试你是否理解dropout和随机森林之间的差异以及它们的相似之处。dropout和随机森林的目的都是为了提高模型的鲁棒性,他们通过引入随机性和多样性在训练过程中实现这一目标。
随机森林算法是一种集成机器学习算法,可用于分类和回归。算法的工作方式是尝试使用引导的b个不同引导样本,这些样本是原始训练数据的副本,仅进行替换,并使用这b个不同的训练副本来构建b个不同的树。但它是通过对树进行去相关来实现的,从而使它们与背景不同。在每个步骤的递归构建过程中,算法在分割树时从所有p个特征中随机选择m个,因此在决定我们需要分割树的位置以及观察需要在哪个区域时分配的,这介绍了算法的随机性,有助于消除树木的相关性。然后算法最终得到b个不相关的不同决策树,然后将它们组合起来,因此也称为集成算法,然后对所有这些不同的b树取平均值,为了获得最终的预测。因此在分类的情况下,这是大多数类别,在回归的情况下,这是所有输出的平均值,这有助于随机森林对抗过度拟合。由于不相关变量的平均值具有比相关变量更低的方差,我们可以通过降低方差来帮助它们,这反过来又有助于降低过度拟合的风险,使模型更具概括性。因此,dropout技术试图通过使这个过程去相关来实现这一目标。其唯一的方法是在每次迭代中停用某些神经元,使用训练模型的训练数据的一部分。这反过来又有助于避免过度拟合并防止网络记住训练数据。
在这两种方式和方法中,模型都通过随机选择m个不同的特征来随机丢弃某些神经元,随机森林引入了这种随机成分丢失。在执行递归分割和构建决策树时,这都是为了使模型更具通用性并降低过度拟合的风险。
现在,关键的区别在于dropout和随机森林的不同。Dropout是一种单一模型的技术,我们只有一个神经网络,我们使用完全相同的训练数据。我们随机丢弃神经元,以便在每次迭代中都有不同部分的训练神经元,从而使模型更具通用性。与随机森林不同,这是一种集成技术,因此它使用原始数据的b个不同副本,通过替换对其进行采样,然后使用这b个不同的数据集来构建b个不同的树,然后组合这b个不同的模型来创建单个模型。
这意味着这两种算法的工作原理完全不同,其中一种更多地是一种正则化技术,另一种是可以单独使用的实际算法。
44 Dropout对训练与测试的影响是什么?
当我们讨论dropout时,我简要提到dropout仅适用于训练数据,这意味着我们只是随机停用激活。作为我们训练过程的一部分,但这也意味着神经元具有较小且特定的训练过程中被激活的概率为一减p。所以我们正在降低被选择激活的神经元的概率。这会导致不一致,当涉及到测试过程时,因为我们仅在训练期间应用dropout。这也意味着我们在执行测试时需要解决激活概率的降低问题。
鉴于此,训练期间p%的神经元被丢弃或停用,我们需要对此进行补偿,并且我们需要确保一致性在输入大小中。为此,我们需要做的是扩大规模,测试中的激活值除以1减去p。通过这种方式,我们将补偿我们退出时所造成的小概率差异。例如,如果退出率为20%,则为0.2,这意味着在训练过程中神经元有80%的概率被激活,不被激活的可能性为20%,这意味着在测试过程中我们需要使用0.8来缩放激活,因此1减去p。
45 什么是L2或L1正则化以及它们如何防止神经网络中的过度拟合?
L1和L2正则化都是收缩或正则化技术,在传统机器学习和深度学习中都使用,以防止模型过度拟合。这些技术试图让模型像dropout一样更通用。
你可能从这些传统的机器学习模型中知道L1和L2正则化做什么。L2正则化也称为岭回归,L1正则化也称为套索回归。L1正则化的作用是添加作为归一化、正则化或惩罚因子,该因子基于惩罚参数lambda乘以基于权重绝对值的项。这与L2正则化不同,L2正则化是岭正则化,这种正则化增加了我们的损失函数,基于lambda的正则化项,即惩罚参数乘以权重的平方。这样您就可以看到两者有何不同,一个基于我们所说的L1范数,另一个基于我们所说的L2范数,因此称为L1和L2正则化。富正则化中,稀疏性较低,因为它不会将权重设置为零,而是将它们缩小到零,但永远不会完全等于零。
46 神经网络中的 L1 和 L2 正则化有什么区别?
L1和L2正则化的使用动机都是为了防止过度拟合。然而,它们在实现这一目标的方式上存在差异。L1正则化可以将某些神经元的权重设置为零,从而在某种程度上执行特征选择。相反,L2正则化会将权重缩小到零,但永远不会将它们设置为完全等于零。因此,L2正则化不执行特征选择,它只执行正则化。而L1正则化不仅可以用于缩小权重和正则化网络,还可以在特征太多时执行特征选择。
你可能会好奇,当你将权重缩小到零并试图正则化这个小或大的权重时,这如何有助于防止过度拟合。这些方法(例如L1或L2正则化)将确保模型不会过度拟合训练数据。你会规范权重,然后这将反过来规范网络,因为权重将定义这种行为的多少。如果权重太大,将防止不稳定的行为。然后你减少它们并规范它们。这将确保你没有梯度爆炸,也将确保网络不会严重依赖某些神经元。这将确保你的模型不会过度拟合,并且不会记住可能还包括噪声和离群点的训练数据。
47 L1 与 L2 正则化如何影响 NN 中的权重?
L2正则化,也称为富正则化,将权重值的平方添加到损失函数中,因此也称为L2范数。我们对权重进行平方,对特定层的权重进行求和,然后将其乘以正则化参数,也称为惩罚参数lambda。L2正则化的影响是,它会将权重缩小到零,但它以非常成比例的方式做到这一点,因此它试图使权重彼此更加相等。它会对大的权重产生更大的影响,因为它会尝试使其等于较小的权重,但它对较小的权重的影响较小。这样,它会尝试将权重按比例分布到不同的神经元,并尝试确保所有这些不同的神经元具有同等比例的影响。
而L1正则化,也称为较小正则化,将权重的绝对值之和添加到损失函数中。L1正则化的工作方式是将这些绝对值相加,然后收缩权重接近零。在某些情况下,它会将某些权重,特别是那些小权重设置为完全等于零。因此,L1正则化以这种方式惩罚这些小权重,因此它会大幅缩小这些权重,并将它们设置为恰好为零。并且,对这些大权重的严厉程度也较低。通过这种方式,它还执行特征选择,因为所有神经元的权重为零的特征因此它们的权重变为零,这意味着它们不再对网络做出贡献。
在特征选择过程中,L1执行特征选择,L2不会执行特征选择,因为L1将某些权重设置为完全等于零。在平滑过程中,L1的平滑效果较小,因为它对小权重很苛刻,它将它们设置为恰好等于零,并且在大权重上更小。L2有点不同,它对方法的要求不那么严酷,但对大重量的要求更严酷。更不用说小权重了,它按比例分布在所有神经元的权重上,然后确保过程更平滑。最后是稀疏性方面,当涉及到L1时,稀疏性很高,因为模型还执行特征选择,因此它将某些权重设置为零,这意味着它也会自动执行特征选择,然后减少模型的维度并使得网络稀疏。而在L2或富正则化中,稀疏性较低,因为它不会将权重设置为零,而是将它们缩小到零,但永远不会完全等于零。正则化的丰富性和低稀疏度是因为正则化过程并不执行特征选择,它没有零权重。接下来,我们将探讨L1和L2正则化如何影响神经网络中的权重。
在比较大权重和小权重的惩罚影响时,L2正则化通过添加权重的平方作为惩罚,使得大权重受到严厉惩罚并因此减少,而小权重的惩罚并不那么严重,因此减少的程度也不大。这意味着L2会在所有权重之间分配误差权重,导致权重较小但非零,并且它将按比例分布在神经元的所有权重上。
然而,当谈到L1正则化时,它显著降低了权重的大小。因此,与小权重相比,大权重的减少要小得多。L1正则化对大权重的要求不那么严格,因此,它将通过将某些权重设置为完全等于零来有效地从模型中删除特征。这些权重通常已经很小,因此会受到严厉的惩罚。对于小权重,这种惩罚会非常严厉,但对于大权重则不会那么严厉。这样,我们最终将通过将它们设置为零并仅保留那些大权重来删除这些小权重。
48 什么是机器学习或人工智能中的维数诅咒
维数诅咒在机器学习中是一种常见现象,尤其是当我们处理像KNN这样的基于邻域的距离模型,或者K均值时。我们需要使用距离度量,例如欧几里德距离、余弦距离、曼哈顿距离来计算距离。当我们的数据具有高维特征时,模型开始真正遭受维数诅咒。当模型需要计算这组对之间的距离时,复杂性就会上升,但考虑到我们有如此多的特征,获得这些距离会变得有问题,有时甚至是看不见的。在某些情况下,获取和计算这些距离甚至没有意义,因为当我们有如此多的特征时,它们不再反映实际的成对关系或这两对观察值之间的距离。这就是我们所说的维度诅咒,因此当我们具有高维度并且想要计算观察对之间的距离时,我们的机器学习或人工智能模型就会受到诅咒。这可能会带来数据稀疏性,计算挑战,过度拟合的风险,模型变得不太通用,以及选择一个可以处理如此高维度数据的距离度量也将成为问题。
49 深度学习模型如何解决维度诅咒呢?
与机器学习模型不同,深度学习模型不会遇到这个问题。他们需要机器学习模型才能正确处理高维数据,他们需要执行特征选择,他们有时建议使用不同类型的特征选择技术,例如前向逐步选择、后向逐步选择、混合选择或其他类型的特征选择技术,或者降维技术,例如PCA或因子分析,以便在将特征提供为机器学习模型的输入之前降低特征的维度。然而,这并不适合我们的深度学习模型,因为深度学习模型能够通过学习这种有用的特征表示并减少我们拥有的数据维度来应对这种维度灾难。他们应用正则化并使用专门为高维数据设计的架构。所以,当我们在深度学习中使用这种复杂的高维数据时,我们不需要执行特征选择,因为深度学习模型是专门设计的,能够学习特征中的复杂依赖关系和非线性模式。他们只使用正则化技术,例如L1正则化,因此较少的正则化不仅执行正则化,而且还执行特征选择作为深度学习模型本身的一部分。深度学习模型可以通过几种方法来防止这种维数灾难,以及如何避免它们遭受这种维数灾难,那就是通过执行特征学习作为实际原始深度学习过程的一部分。因此,降维技术被广泛应用,例如,自动编码器和变分自动编码器被用于压缩输入数据,并以这种压缩形式表示输入数据。这类似于降维技术,但现在它已经成为深度学习模型实际架构的一部分。然后,从已经压缩的较低维度数据中学习隐藏因素,并据此重建以获得最终输出。
另一种方法是使用正则化方法,我之前简要地谈到了这一点。例如,使用L1正则化,因为L1正则化降低了稀疏性,并通过降低维度引入了稀疏性。通过将一些权重设置为零来间接执行特征选择。最后,如果我们使用CNN等模型并使用池化层,那么卷积神经网络中的池化层会自动执行特征选择并减少问题的维度。通过这种方式,它们自动对抗维度的诅咒。
50 什么是生成模型?举例说明
让我们首先从生成模型开始。生成模型旨在模拟数据的生成方式。他们想要学习我们通常所说的p(x)和y的联合概率分布,这是两个随机变量x和y的联合概率分布,其中x代表我们数据的特征,y代表标签。因此,生成模型所做的是尝试对底层数据分布进行建模,以便首先弄清楚数据是如何生成的,然后通过这种方式生成新的数据实例。他们还可以预测概率。
此外,生成模型在无监督学习任务方面也非常有用。通过机器学习,您可能已经熟悉了监督与无监督的概念。在监督的情况下,我们确实有标签或y值,但如果是无监督的情况下,我们没有标签来监督学习过程,这意味着我们只需要使用特征来执行学习。考虑聚类,考虑异常值检测或降维,或一些数据生成,所有这些情况都可以被视为无监督学习任务,生成模型在这方面做得很好。
当谈到生成模型时,它们在我们想要理解并且需要了解底层数据分布或当我们需要生成新数据点时特别有用。假设您想要生成合成数据,或者您有大量图像,您想要生成新图像,这些图像与输入数据相似,但它们是全新的。这可以通过使用生成模型和您现在听到的所有模型(例如GPT系列,变分自编码器,生成对抗网络)来完成。所有这些模型都是生成模型,它们主要用于生成新图像,生成合成数据。
例如,当有一个数据时,有一个模型经过大量语音训练,您提供了一些语音示例,然后该模型能够生成新的语音。因此,可以根据您自己的声音发送文本,但您还没有说这是生成模型正在执行的操作。