(课程笔记)深度学习入门 - 1 - OverView

一、机器学习算法的过程与结果

        1、首先要得到标签化数据集(DataSet),既然是标签化,那应该是监督学习模式,而且此处的数据集应该分化为训练用集(TrainSet)和测试用集(TestSet),训练用集用于训练最终的算法模型,而测试用集用于测试训练的算法模型是否性能良好,是否能满足实际需求;

        2、设置并给出机器学习的算法模型(Model);

        3、设置期望的损失函数(LossFcn)和优化器(Optimizer);

        4、执行训练过程,对测试集进行训练,使得LossFcn降低到期望的值上,并记录此时的算法参数;

        5、将训练得到的参数化模型用于测试集的测试,观察最终的匹配度(准确度)是否符合需求,如果符合,则确定该算法;若不符合,则重新选择合适的参数,必要时可能会更改损失函数或优化器。

二、神经网络相关术语

        在神经网络的发展历史上,有一个很重要的感知机算法——反向传播。

        这里提到了神经网络、感知机和反向传播三个陌生的概念。那到底啥是神经网络、感知机和反向传播呢?

1、什么是神经网络

        定义:神经网络(Neural Network)是一种模仿人脑神经系统结构和功能的计算模型,用于解决各种机器学习任务。它由多个节点(神经元)以及连接这些节点的权重组成。

        光看定义对于入门者和初学者是枯燥的,因为它是经过大量的历史沉淀下来较为精炼的语句。而我们需要搞懂一个问题,为什么深度学习的发展选择了神经网络,为什么神经网络就能够满足我们人类生活中的需求,为什么它这么强大?

        而我的看法是这样的:

        我们把现实世界中想要研究的对象进行了很多测试,记录了很多输入-输出的数据对,这些数据最终组成了一组数据集,但是我们目前仅仅知道输入和输出的值是多少,而且我们也不太关心这个黑箱问题的内部到底长什么样子,是怎么构成的,我们或许更多关心的是这个黑箱里面到底是怎么处理这个输入数据的,以及它是怎么得到这个输出的。

        举个例子:有一个我们想要研究的对象,你给个输入是1,他给你输出是3;你给个输入是2,他给你输出是5;你给3,他给7,于是就得到了以下数据对(暂时):

        (1,3)、(2、5)、(3、7)...

        眨眼一看,我们通过神经网络(目前来说是用的是人脑自己的神经网络)一思考,我们可以不难发现,好像这个黑箱在处理输入数据,采取的数学规律是 :

y=2x+1

        如果说把这个我们目前得出的,还未经过验证的数学规律拿去测试一下输入4,输入5这些新的输入数据,我们会预测:当输入4的时候输出应该是9,输入5的输出应该是11,于是,我们得出预测结果:

        (4,9)、(5、11)...

        如果说,我们把输入4扔进这个实际的黑箱中,发现输出真的是9,输入5的输出真的是11,那我们就可以暂时认为我们找到了这个黑箱的数学运行规律。

        如果说,我们把输入4扔进去后,发现实际输出不是9,输入5扔进去输出也不是11,那么此时,我们对刚才猜测的那个2x+1的数学规律肯定就会产生质疑,因为实际输出和预测输出产生了偏差,说明我们预测的数学规律目前没有达到我们的期望,此时我们要做的事情就是重新回去调整权重(k)与偏置(b),重新拟合实际输入输出数据对,必要的时候我们还可能往高次方程去思考,比如会不会是这样的数学规律:

y=k_{1}x^{2}+k_{2}x+b

        或者说,会不会是三次方程,或者其他奇奇怪怪的方程解析式...      

        通过不断的改变权重值k和偏置值b,以及改变模型的构建,我们终将会得到一个新的数学规律,能够准确且尽可能保证预测值与实际输出值之间的差距很小,小到让我们能够忍受,让我们可以无视的地步。但是要找到这些数学规律又谈何容易呢,今天可能我们碰巧找到这些数据对的内在运行规律了,明天又来一个更加复杂,更加难以观测的数据对,我们又该如何去分析?

        完成了这些思考,我们现在可以下一些结论和总结了:

        神经网络为什么能够训练出一些数学模型,从而解决现实生活中的问题?

        在所给定的数据集中,是存在一个客观实在的内在数学规律,这些规律甚至可能很复杂,而人们想要把这个内在数学规律找出来,但是人脑处理这些庞大的数据的效率太低且错误率高,所以用电脑模拟了人脑的神经网络模型,让电脑通过不断的试错,根据输入值和权重值来输出预测值,通过降低损失函数的值或者沿着梯度下降的优化方向,不断调整这些权重,直到训练出来的模型能够确切反映这些数据集内在的数学规律,并且误差是能够被我们容忍的时候,我们就认为我们找到了这些数据的内在数学规律。

        让GPT拆开分析一下:

        深度学习中的神经网络模型通过大规模数据的训练来寻找数据集内在的数学规律。

  1. 内在数学规律:在给定的数据集中,我们假设存在一个内在的数学规律或者模式,可以用来描述数据之间的关系和特征。这些规律或模式可能非常复杂,超出人类直觉和分析的能力范围。

  2. 人脑处理效率和错误率:对于大规模的数据集,人脑处理的效率低且容易出错。由于神经网络具有并行计算和高速处理的能力,它可以更快速地处理大量数据,并通过学习调整网络参数来自动捕捉数据集的复杂规律。

  3. 模拟人脑神经网络:神经网络模型受到人脑神经元的启发,并尝试模拟人脑的信息处理和学习机制。通过多层神经元连接、非线性激活函数等设计,神经网络可以进行层次化的特征提取和表示学习,以及复杂函数的拟合。

  4. 试错和权重调整:在训练过程中,神经网络通过反向传播算法和梯度下降优化方法,根据损失函数来评估模型的预测误差,并不断调整各个层之间的权重,以最小化损失函数。这个过程可以看作是通过试错进行模型的参数调整,使得模型能够更好地逼近数据集内在的数学规律。

  5. 确认数学规律:当训练出的模型能够在给定的数据集上表现出较高的准确性和泛化能力时,我们可以认为该模型已经捕捉到了数据集的内在数学规律。这并不意味着找到了唯一的和终极的数学规律,但是它能够对数据集进行预测和泛化。

        需要注意的是,神经网络模型在解决深度学习任务时,并不能直接给出人类可解释的规则或数学表达式。它更多地是通过模式识别和拟合来实现任务的有效解决。因此,在理解和解释神经网络的输出时,仍然面临一定的挑战(俗称可解释性差)。

2、什么是感知机

        在解释清楚了什么是神经网络,以及神经网络是如何工作的情况下,我们试着来思考一下这个曾经被提出来的概念——感知机。

        背景知识:感知机(Perceptron)这个名字是由其提出者 Frank Rosenblatt 在1957年命名的。Rosenblatt 希望找到一个能够模拟人脑神经元工作原理的数学模型,用来解决二分类问题。他将这个模型命名为“感知机”,灵感来源于神经元在感知信息、学习和做出决策时的功能。感知机模型的设计灵感主要来自于生物神经元的工作原理。每个生物神经元接收多个输入信号,并根据这些信号的综合情况产生输出信号。类似地,感知机的基本组成单元也被称为“神经元”或“人工神经元”。它接收多个输入特征,并通过一系列的加权求和和激活函数的处理,输出一个二进制的结果(0和1)。

        定义1:感知机模型是神经网络模型中的最简单的一种模型,是神经网络的基本组成部分,它是构建其他更复杂神经网络的基石。感知机通过加权求和和阈值函数的组合,可以对输入数据进行分类,是最早的二分类模型之一。

        定义2:感知机由一个输入层、一个或多个神经元以及一个输出层组成。每个神经元接收来自输入层的输入信号,并根据输入信号和对应的权重进行加权求和后,通过一个阈值函数(如阶跃函数)产生输出结果。感知机的学习算法可以通过调整权重和阈值来使网络能够将输入数据正确分类。

(课程笔记)深度学习入门 - 1 - OverView_第1张图片 图1  感知机模型

3、什么是激活函数

        在上一小节中,我们提到感知机的一个总结性概念:它接收多个输入特征,并通过一系列的加权求和和激活函数的处理,输出一个二进制的结果(0和1)。这概念中我们提到了激活函数这个东西,什么是激活函数,为什么需要激活函数,如果没有激活函数会怎么样?

        首先,我们需要知道,神经网络到底算出了个什么名堂出来,是算出了个线性函数,还是非线性函数?

        答案是:线性函数。因为神经网络从输入开始到输出,如果不经过激活函数的作用下,只是一个输入值与权重值的加权计算,再补上一个偏置值,所以自始至终都是线性映射。如下所示:x为输入,y为输出。

y_{1}=w_{1}x+b_{1}

y_{2}=w_{2}y_{1}=w_{2}(w_{1}x+b)=w_{2}w_{1}x+b_{2}

y_{3}=w_{3}y_{2}=w_{3}w_{2}w_{1}x+b_{3}

...

y=\prod w_{i}x+b_{i}

        所以,如果神经网络没有激活函数,那么每个神经元只执行线性操作,即输入值的线性加权和。这意味着整个网络的输出将是输入的线性组合,无法引入非线性。就算是多个线性映射的叠加仍然只是线性映射。因此,整个神经网络将只能进行线性映射,无法学习和表示复杂的非线性数据模式和关系。在这种情况下,无论神经网络多深多复杂,整个网络仍然只能表示线性关系。

        那么,训练出来的线性模型又有啥坏处呢?为啥不能用?

        答案:线性模型具有一定的局限性,不能很好地表达一些较为复杂的数据规律和数学关系。例如,对于非线性问题(如图像识别、语音处理等),线性模型往往无法提供令人满意的性能。

        激活函数存在的意义是什么呢?

        激活函数的作用就是通过引入非线性变换,对神经元的输出进行线性到非线性映射,从而使得神经网络能够学习和表示更加复杂的数据模式和非线性关系。激活函数在每个神经元的输出上引入了非线性,使得神经网络能够处理非线性问题,并构建出更加强大的模型。这样,神经网络可以适应各种不同的数据模式,提高学习能力和表达能力。

        因此,没有激活函数限制了神经网络只能进行线性映射,而引入合适的非线性激活函数才能帮助神经网络具备学习非线性关系的能力。激活函数的存在是神经网络能够处理非线性问题的关键,它赋予了神经网络更强大的学习和表示能力,扩展了神经网络模型的应用范围。

        常见的激活函数有哪些?

        常见的激活函数包括 Sigmoid 函数、ReLU(Rectified Linear Unit)函数、Tanh 函数等。不同的激活函数适用于不同的场景和任务,选择合适的激活函数可以提高神经网络的性能和表达能力。

        【*  GPT补充:激活函数的作用  *】

  1. 引入非线性:激活函数能够将输入信号进行非线性变换,使得神经网络可以学习和表示更加复杂的数据模式和关系。如果神经网络只由线性操作(如线性加权和求和)组成,那么无论有多少层,整个网络仍然只能表示线性映射,无法捕捉到非线性的特征。

  2. 支持复杂决策边界:激活函数的非线性特性允许神经网络学习并表示复杂的决策边界。复杂的输入数据往往包含非线性结构,通过使用适当的激活函数,神经网络可以更好地适应这些数据,并构建出更加准确的决策边界。

  3. 提供非单调响应:激活函数为神经元提供了非单调的响应特性。这意味着神经元对于不同范围的输入信号表现出不同的激活水平,从而使神经网络能够学习到不同类型和重要程度的特征。

  4. 解决优化问题:激活函数的存在能够帮助神经网络在训练中更好地适应数据,并提高优化算法的性能。由于激活函数的非线性性质,损失函数相对于网络参数的梯度可以更好地传递,从而促进了模型的收敛和学习。

4、什么是计算图与反向传播

本节可能解决的问题:

        1、计算图是什么

        2、反向传播是什么

        3、正向传播是什么

        4、反向传播算那么多偏导数干什么

        5、反向传播如何训练神经网络的

        6、计算图有什么用

        7、把梯度算出来,有什么意义

        8、正向传播,反向传播以及梯度下降三者是怎么配合训练神经网络的

        计算图是一种表示神经网络中各个层之间数据流和计算关系的结构。它将神经网络的前向传播过程分解为一系列的节点和边,每个节点代表一个计算操作(可以计算出当前节点的输出值),边表示数据的传递(用于计算偏导数)。

        反向传播是一种用于训练多层神经网络的监督学习方法。它利用链式法则计算神经网络中各层之间的梯度,并将梯度信息反向传播到每个神经元,从而根据梯度进行参数更新。反向传播算法能够有效地训练深度神经网络,提高其学习能力和表达能力。

        一提到反向传播,我们就得先认知一下它名字的由来,首先可以猜想的是有反向传播,那么可能会有正向传播吧,事实上确实有正向传播。

        在计算构造图(见图2)中,我们把最下层的(a,b)看作输入,中间层的(c,d)由输入决定,最上层的(e)看作输出。那么正向传播机制,就是当给定了(a,b)两个输入值后,可以逐步向上(向前)求得中间层,继而求得输出值,以及输出值与标签值之间的差值Loss,这种从输入——中间——输出的方向是正向的,也就是常说的正向传播。

        而反向传播,就是在已知输入,中间以及输出的节点数据的条件下,求得输出对输入的导数,具体到每个输入身上就是输出对每个输入的偏导数,具体见图3。

        当然,由于正向传播算法已经求得了Loss值,也可以借此通过反向传播,把Loss对每个输入的偏导数求出来,这个操作也叫做计算损失函数对网络中的每个输入参数的梯度。

        这里就有一个问题,为什么要求输出对各个输入的偏导数?求这个导数有什么用?

        从训练目的的角度来说,在训练神经网络时,我们希望网络的输出能够与真实标签尽可能接近,从而使得损失函数的值最小化。为了实现这一目标,需要确定如何调整网络的参数(权重和偏置),以使得损失函数减小。

        由上述可知,通过使用反向传播算法,我们可以计算损失函数相对于网络中每个参数的梯度。具体地,反向传播计算输出对各个输入的偏导数,实际上是在计算损失函数相对于网络中每个参数的偏导数。而这些偏导数指示了将参数调整多少才能使得损失函数下降。

        由于反向传播利用了链式法则,它能够高效地计算梯度,将误差从网络的输出端传递回网络的输入端。通过将梯度反向传播回去,我们可以知道每个参数对于整个网络的输出产生了多大的影响,进而可以使用优化算法(例如梯度下降)来更新参数,以减小损失函数的值。

        (有关梯度下降的优化算法,将在后续提到)

        因此,反向传播计算输出对各个输入的偏导数的目的是为了确定参数的更新方向和大小,以便使得网络的输出与真实标签更加接近,从而优化模型的性能。

(课程笔记)深度学习入门 - 1 - OverView_第2张图片 图2  计算图

(课程笔记)深度学习入门 - 1 - OverView_第3张图片 图3  通过反向传播计算偏导数

(课程笔记)深度学习入门 - 1 - OverView_第4张图片 图4  反向传播图

       


        【  GPT解析  】

        一、计算图在神经网络中的作用有哪些

        (1)前向传播计算:计算图记录了神经网络的计算过程,从输入层到输出层的正向计算路径。通过按照计算图的顺序执行每个节点的计算操作,可以得到模型的预测输出。

        (2)梯度计算:计算图提供了计算梯度所需的信息。在反向传播过程中,通过链式法则从输出层向输入层反向传播梯度。计算图中每个节点的局部梯度可以根据相应的计算操作求得,从而累积得到整个网络的梯度信息。

        (3)参数更新:通过计算图中的梯度信息,可以对神经网络中的参数进行更新。根据梯度下降等优化算法,可以沿着梯度方向调整模型的参数值,从而优化模型的性能。

        计算图的使用使得反向传播算法可以高效地计算神经网络中各个层之间的梯度,从而实现参数的优化和网络的训练。它提供了一个清晰的计算框架,使得梯度的传递和参数的更新变得可行和高效。


       

        二、Loss值对网络中的每个参数的梯度大小有何意义?

        (1.1)如果梯度的大小较大:

        1、收敛速度快:较大的梯度通常表示模型在当前参数设置下,参数更新的方向与损失函数下降最快的方向相一致。因此,较大的梯度可以加速模型的收敛速度,使得模型能够更快地达到较低的损失值。

        2、参数调整大:梯度的大小决定了参数更新的步长。较大的梯度会导致较大的参数调整,这在模型初始阶段或者参数较远离最优解时可能是有益的。

        (1.2)梯度过大也可能带来一些问题:

        1、振荡和不稳定性:如果梯度过大,参数更新可能过于剧烈,导致模型在训练过程中振荡或不稳定。这可能导致模型难以收敛,甚至无法收敛到合适的解。

        2、错过最优点:过大的梯度可能导致参数跳过最优解,使得模型无法找到全局最优点,而只能收敛到局部最优点。

        (2)如果梯度的大小较小:

        1、收敛速度慢:较小的梯度意味着在当前参数设置下,参数更新的方向与损失函数下降的方向不完全一致。这可能导致模型需要更多的迭代步骤才能收敛到较低的损失值。

        2、参数调整小:较小的梯度会导致较小的参数调整,在模型参数初始阶段或者参数接近最优解时可能是合适的。

        综上所述,梯度的大小对于模型的训练非常重要。在实践中,通常需要根据具体情况进行梯度的调整,以平衡收敛速度、稳定性和避免错过最优解。


       

        三、正向传播,反向传播以及梯度下降优化算法是如何在神经网络训练过程中搭配工作的?

        

        (1)正向传播:在训练过程中,首先使用当前的权重和偏置值对输入进行正向传播,计算出网络的输出。

        (2)计算损失函数:将网络的输出与真实标签进行比较,计算损失函数的值,衡量模型输出与真实值之间的差异。

        (3)反向传播:从输出层开始,使用链式法则计算每个参数相对于损失函数的偏导数(即梯度),依次向后传播。这一过程通过将误差从输出层反向传播到隐藏层和输入层,计算每层中的梯度。

        (4)参数更新:利用计算得到的梯度,根据指定的优化算法(例如梯度下降)来更新每个参数的值。在每次迭代中,通过将参数调整一个小的步长与梯度相乘,来更新参数的值。

        (5)重复迭代:重复执行步骤1至步骤4,直到达到预定的停止条件(例如达到最大迭代次数或损失函数收敛)。

        综上,通过不断迭代更新参数,模型可以根据数据调整权重和偏置的值,逐渐优化模型的性能。梯度提供了有关更新方向和幅度的信息,使得模型能够朝着减小损失函数的方向进行调整。

        需要注意的是,在进行参数更新时,通常会乘以一个学习率(learning rate)来控制每次更新的步长大小。学习率决定了参数更新的速度,过大的学习率可能导致梯度爆炸或不稳定,而过小的学习率可能导致收敛速度过慢。因此,选择合适的学习率也是训练过程中的重要问题。

5、什么是梯度下降算法

本节可能解决的问题:

        1、梯度下降是什么

        2、梯度下降有什么用

        3、梯度下降是如何运行的

        4、梯度上升和梯度下降是什么关系

        5、学习率是什么,如何设置该参数

        6、梯度下降算法有哪些改良版需要知道

        前面一个小节谈到了梯度下降优化算法,并且这个优化算法也是相当的常用,同时也有很多基于梯度下降算法改造的改良算法。这里我们得需要搞清楚一个最基本的定义,那就是什么是梯度下降算法,为什么不叫梯度上升算法?

        梯度下降算法:它主要是用于求解最小化目标函数的问题,这里的目标函数,其实就是损失函数LossFcn,由于我们的目标就是要让损失函数降至我们能容忍的范围(即:降到尽可能的低,也就是一个函数最值的问题)。所以在机器学习和神经网络中,梯度下降算法就是被用于更新模型参数,以减小损失函数。它根据梯度信息,反复迭代,沿着梯度的反方向来调整参数的值,直到达到局部最优解或收敛到最小值。

        这里需要解释一个问题,我们是如何根据梯度信息来让损失函数降低

        一个关键的信息,就是这个梯度,到底算的是哪个梯度

        答案是:计算的是LossFcn对于网络中每一个权重w的梯度,即:

\frac{\partial Loss}{\partial w}

        当然需要注意的是,这个梯度计算公式算出来的,其实是LossFcn对权重w的正向梯度,也就是说,这是一个梯度上升。而我们需要的是让损失函数朝着梯度下降的方向走,而不是南辕北辙的朝着梯度上升的方向走,如果朝着梯度上升的方向走,那么损失函数只会越来越大。我们可以把梯度就理解为楼梯的高度,往上爬就不能出门,而且,如果还是选择的是梯度上升的方向爬,那么只会爬得更高,离出门这个目标就更加差得远了。

        所以,我们其实要的损失函数LossFcn对权重值w的反方向,这才是梯度下降。即:

-\frac{\partial Loss}{\partial w}

        更多地,梯度下降指示了一条可以下楼梯下得最快的路线,让我们更快的达到出门这个目标。反之,梯度上升就是指示了一条可以上楼梯上得最快的路线,让我们更快的爬上楼。

        所以可以看出,当我们想要实现损失函数LossFcn最小这个目标,一定是使用梯度下降,因为梯度下降才可以让损失函数走向我们想要达到的最小值目标。反之,如果我们需要实现目标函数最大化(可能那个时候就不叫损失函数了,或许叫期望函数?)的时候,就需要梯度上升,此时可以让目标函数以最快的方式走向最大值。


        清楚了选择梯度下降的目标后,那么梯度下降算法是如何在神经网络的训练中发挥作用呢?以下是完整的解释:

        梯度下降算法是一种常用的优化算法,用于求解最小化目标函数的问题。在机器学习和神经网络中,梯度下降算法被广泛应用于更新模型参数,以减小损失函数。它通过迭代地沿着梯度的反方向来调整参数的值,直到达到局部最优解或收敛到最小值。

        梯度下降算法的基本思想是,通过使用目标函数的梯度信息来指导参数的更新方向。具体操作如下:

        (1)初始化参数:选择合适的初始参数作为起点。

        (2)计算梯度:对于当前的参数设置,计算目标函数关于每个参数的偏导数(梯度),得到梯度向量。

-\frac{\partial Loss}{\partial w}

        (3)参数更新:根据梯度向量和学习率选择合适的步长大小,将参数沿着梯度的反方向进行更新。一般来说,参数更新的公式为:新参数 = 旧参数 - 学习率 * 梯度。

w_{new}=w_{old}-lr*\frac{\partial LossFcn}{\partial w_{old}}

        (4)重复迭代:重复执行步骤2和步骤3,直到达到停止条件。停止条件可以是达到最大迭代次数、梯度的大小足够小,或者目标函数的值变化不大。

        梯度下降算法有多种变体,包括批梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-Batch Gradient Descent)。这些变体主要区别在于每次更新参数时使用的样本数量,以及计算梯度的方式。

        梯度下降算法的作用是最小化目标函数,从而使模型更好地拟合训练数据。通过根据梯度调整参数,模型可以逐步接近最优解,并在给定的停止条件下收敛。梯度下降算法是训练神经网络等机器学习模型的核心步骤之一,它能够帮助模型不断优化和改善性能。


        上述步骤中提到了一个关键参数,叫学习率(Learning Rate,简写:lr),那么学习率是什么,它如何去设置?

        学习率指示了每一次依赖梯度下降的迭代过程中的步长大小,一般来说学习率需要选取一个适当的值,这是因为:

        (1)如果学习率选择的太小,那么每一次更新后的权重,基本上和上一次的权重差不了太多,训练速度缓慢,效率较低;

        (2)如果学习率选择的太大,那么每一次更新后的权重可能会造成剧烈波动和震荡,权重可能会如同反复横跳一般的时大时小,影响训练效果和效率。

        因此,合理选择学习率也是一个需要推敲的事情。


        以下是GPT的解析:

        用目标函数对各个权重进行求导得到的是梯度上升,这个上升是什么意思?

        在监督学习中,目标函数通常基于训练数据和模型的预测结果来计算模型的误差或损失。目标函数的设计取决于具体的问题类型,例如回归问题中常用的平方损失函数、分类问题中常用的交叉熵损失函数等。

        优化目标函数的目标是最小化(或最大化)其值。对于梯度下降算法来说,我们通常关注的是最小化目标函数。通过计算目标函数对模型参数的偏导数(梯度),我们可以获得关于每个参数的梯度信息。

        梯度上升(Gradient Ascent)是指在某些特定情况下,我们希望最大化目标函数的值而不是最小化。这包括一些优化问题,例如某些形式的无监督学习中使用的概率模型的训练。在这种情况下,我们通过对目标函数进行梯度上升来调整参数,以使目标函数值增加。

        需要注意的是,梯度上升和梯度下降在数学上是等价的,只是梯度方向不同而已。梯度上升和梯度下降都是通过计算目标函数的梯度来调整参数,使得模型朝着更优的状态进行调整。在梯度上升中,我们朝着梯度的方向进行更新,以增加目标函数的值;而在梯度下降中,我们朝着梯度的反方向进行更新,以减小目标函数的值。


        有很多优化算法也是基于梯度下降算法改良而来的,具体来说还有以下几种优化算法

        它们之间的主要区别在于每次更新参数时使用的样本数量。

  1. 批量梯度下降(Batch Gradient Descent):

    • 每次更新参数时使用所有的训练样本。
    • 计算整个训练集的梯度,并更新参数。
    • 优点:收敛稳定,每次更新准确性高。
    • 缺点:计算代价高,内存要求大,无法处理大规模数据集。
  2. 小批量梯度下降(Mini-Batch Gradient Descent):

    • 每次更新参数时使用一部分训练样本,称为批次(batch)。
    • 批次大小通常是介于批量梯度下降和随机梯度下降之间的一个中等值。
    • 计算批次样本的平均梯度,并更新参数。
    • 优点:相对于批量梯度下降,计算代价和内存消耗较低。
    • 缺点:可能陷入局部最优解,对于某些特定问题可能需要调整批次大小。
  3. 随机梯度下降(Stochastic Gradient Descent):

    • 每次更新参数时使用单个训练样本。
    • 计算一个样本的梯度,并更新参数。
    • 优点:计算代价和内存消耗最低,适用于大规模数据集和在线学习。
  4. 动量(Momentum)优化算法:

    • 引入动量项来加速参数更新,并且减少更新方向上的摆动。
    • 根据当前梯度和上一次更新的速度进行参数更新。
    • 可以帮助跳出局部最优解,加速收敛。
  5. AdaGrad(Adaptive Gradient)优化算法:

    • 自适应学习率的优化算法,对不同的参数按照其历史梯度进行调整学习率。
    • 对于频繁出现的稀疏特征有较好的效果。
    • 随着训练的进行,学习率逐渐减小。
  6. RMSProp(Root Mean Square Propagation)优化算法:

    • 通过衰减平均历史梯度的方式自适应地调整学习率。
    • 对于非平稳目标函数有较好的效果,可以加速收敛。
  7. Adam(Adaptive Moment Estimation)优化算法:

    • 结合了动量算法和RMSProp算法,同时利用梯度的一阶矩估计和二阶矩估计来调整学习率。
    • 结合了两种算法的优点,适用于大部分的优化问题。
    • 广泛应用于深度学习中。

6、训练算法与优化算法

        神经网络的训练阶段大致可以分为两个部分:训练阶段和优化阶段。而训练阶段所使用的算法称为训练算法,优化阶段所使用的算法为优化算法。

        训练算法:训练算法是指用于更新神经网络的权重(w)和偏置(b)的方法。它定义了如何根据输入数据和标签来调整模型的参数,从而使得神经网络能够适应任务的要求。常见的训练算法包括反向传播(BP)算法、随机梯度下降(SGD)算法、批量梯度下降(BGD)算法等。

        优化算法:优化算法是指用于最小化(或最大化)目标函数的算法。在神经网络中,优化算法的目标是通过调整网络的参数使得损失函数值达到最小化。常见的优化算法包括梯度下降(GD)算法(包括随机梯度下降和批量梯度下降)、动量法、Adam算法等。

        训练算法和优化算法,它们在神经网络训练过程中扮演不同的角色

        训练算法决定了如何根据数据和标签调整网络的参数,使得网络能够适应任务的要求。例如:反向传播算法是一种常用的训练算法,用于计算梯度并根据梯度调整网络的权重和偏置。

        优化算法决定了如何根据损失函数的梯度来更新网络的参数,从而最小化(或最大化)目标函数。例如:梯度下降算法是一种常见的优化算法,通过不断迭代地沿着负梯度方向更新参数来实现最小化损失函数。

        因此,训练算法和优化算法在神经网络训练中是两个不同但相关的概念,它们共同作用于网络的参数更新和模型的训练。


        那么问题来了,训练算法(比如BP算法)既然可以根据梯度自行调整网络的权重和偏置,那为什么还需要优化算法呢?

        从理论上来说,训练算法(如反向传播算法)确实可以根据梯度自行调整网络的权重和偏置,而且在一些简单的模型中可以只通过训练算法来将模型收敛住,但不可否认的是,优化算法的作用是更为广泛的。为什么呢?

        (1)从收敛速度上来讲,优化算法可以控制参数更新的速度和方向,使得模型能够更快地收敛到最优解。某些优化算法如动量法、Adam等可以在训练过程中更快地搜索最优解的方向,从而加速收敛。

        (2)从局部最优解上来讲,训练算法依赖于梯度信息来更新参数,但在非凸优化问题中,神经网络的损失函数可能存在多个局部最优解。优化算法可以帮助我们更好地探索参数空间,从而避免陷入局部最优解并找到全局最优解。

       (3)从学习率调整上来讲,优化算法可以自动调整学习率,避免在训练过程中出现不稳定的情况。例如,学习率衰减技术可以使得学习率随着训练的进行逐渐减小,从而使得模型在开始时更快地收敛,在后期更细致地搜索参数空间。

        (4)从模型的鲁棒性上来讲,优化算法可以提高模型的鲁棒性,使得模型对训练数据中的噪声和异常值具有一定的容忍度。某些优化算法具有正则化的效果,如L1和L2正则化,可以限制参数的大小并减少过拟合的风险。

        因此,优化算法在神经网络的训练过程中起到了重要的作用,它可以加速模型的收敛、帮助跳出局部最优解、自动调整学习率以及提高模型的鲁棒性。我们可以看出,训练算法和优化算法是相互配合的,它们共同推动神经网络的训练和改进。


        还有一点需要注意,对于大多数实际问题来说,模型的复杂性和参数空间通常非常庞大,而且损失函数也可能是非凸的。在这种情况下,如果执意不使用优化算法,可能会面临以下问题

        (1)收敛速度慢:训练算法可能会因为权重调整的幅度过大或过小而导致收敛速度较慢,甚至出现震荡的情况。优化算法可以通过控制参数更新的速度和方向来加快收敛速度。

        (2)局部最优解:训练算法在复杂的非凸问题中容易陷入局部最优解。优化算法的机制可以帮助模型跳出局部最优解并搜索全局最优解。

        (3)参数调整困难:训练算法可能需要手动调整学习率、正则化系数等超参数,以获得更好的性能。而优化算法可以自动调整这些超参数,使得模型更容易优化和泛化。

       对于大多数实际问题而言,引入专门的优化算法能够提升训练的效果、加速收敛并找到更好的最优解。综合使用训练算法和优化算法可以更好地训练神经网络并获得更好的性能。另外,训练算法和优化算法也是需要相互契合的,适配的两个算法搭建在一起,可以得到更好的效果和效率。

7、激活函数,训练算法和优化算法的执行顺序问题

        在神经网络的训练过程中,一般会按照以下顺序进行操作:

        (1)前向传播阶段:将输入数据通过神经网络的各层向输出层进行计算,得到各层输出值以及最终预测输出值。在每个层的计算过程中,都会先经过激活函数。

        (2)计算损失函数阶段:计算到预测输出值后,将网络的预测输出与真实数据的标签值进行比较,可得到损失函数的值。这个损失函数可以衡量网络输出与真实标签之间的差距。

        (3)反向传播:根据损失函数的值,利用反向传播算法计算梯度。反向传播通过链式法则来计算每个网络参数对损失函数的梯度。

        (4)优化算法:根据梯度信息更新网络的参数(权重和偏置)。优化算法可以根据具体情况来调整参数的更新速度和方向。

        以上流程中,在训练算法阶段(即:第1~3步),首先经过激活函数作用的是前向传播过程,在每个神经元的输出上应用激活函数来引入非线性。然后,在计算损失函数和反向传播过程中,激活函数不再起作用,主要是对模型的输出进行误差计算和梯度传递。

        最后,在优化算法中(即:第4步),根据梯度信息来更新网络的参数。这样的迭代过程会不断重复,直到达到设定的停止条件(如达到最大迭代次数或损失函数达到收敛)。

        总的来说,训练算法和优化算法在神经网络训练过程中是交替进行的(即:训练——优化——训练——优化,如此交替往复),激活函数并不是先执行或者后执行,而是在训练算法中,与训练过程一起执行,具体来说:便是通过前向传播经过激活函数得到输出,然后根据损失函数进行反向传播计算梯度,最后使用优化算法更新参数。

你可能感兴趣的:(深度学习入门笔记,笔记,深度学习,人工智能)