反向传播算法(反向传播算法原理)
大家好!今天让创意岭的小编来大家介绍下关于反向传播算法的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端
创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008
本文目录:
一、因为反向传播算法人工智能进入第二个高潮具体是在哪一年
人工智能的第二次高潮始于上世纪80年代。
人工智能是在1956年达特茅斯会议上首先提出的。该会议确定了人工智能的目标是“实现能够像人类一样利用知识去解决问题的机器”。虽然,这个梦想很快被一系列未果的尝试所击碎,但却开启了人工智能漫长而曲折的研究历程。
人工智能的第一次高潮始于上世纪50年代。在算法方面,感知器数学模型被提出用于模拟人的神经元反应过程,并能够使用梯度下降法从训练样本中自动学习,完成分类任务。另外,由于计算机应用的发展,利用计算机实现逻辑推理的一些尝试取得成功。
理论与实践效果带来第一次神经网络的浪潮。然而,感知器模型的缺陷之后被发现,即它本质上只能处理线性分类问题,就连最简单的异或题都无法正确分类。许多应用难题并没有随着时间推移而被解决,神经网络的研究也陷入停滞。
人工智能的第二次高潮始于上世纪80年代。BP(Back Propagation)算法被提出,用于多层神经网络的参数计算,以解决非线性分类和学习的问题。另外,针对特定领域的专家系统也在商业上获得成功应用,人工智能迎来了又一轮高潮。
然而,人工神经网络的设计一直缺少相应的严格的数学理论支持,之后BP算法更被指出存在梯度消失问题,因此无法对前层进行有效的学习。专家系统也暴露出应用领域狭窄、知识获取困难等问题。人工智能的研究进入第二次低谷。
人工智能的第三次高潮始于2010年代。深度学习的出现引起了广泛的关注,多层神经网络学习过程中的梯度消失问题被有效地抑制,网络的深层结构也能够自动提取并表征复杂的特征。
避免传统方法中通过人工提取特征的问题。深度学习被应用到语音识别以及图像识别中,取得了非常好的效果。人工智能在大数据时代进入了第三次发展高潮。
二、神经网络——BP算法
对于初学者来说,了解了一个算法的重要意义,往往会引起他对算法本身的重视。BP(Back Propagation,后向传播)算法,具有非凡的历史意义和重大的现实意义。
1969年,作为人工神经网络创始人的明斯基(Marrin M insky)和佩珀特(Seymour Papert)合作出版了《感知器》一书,论证了简单的线性感知器功能有限,不能解决如“异或”(XOR )这样的基本问题,而且对多层网络也持悲观态度。这些论点给神经网络研究以沉重的打击,很多科学家纷纷离开这一领域,神经网络的研究走向长达10年的低潮时期。[1]
1974年哈佛大学的Paul Werbos发明BP算法时,正值神经外网络低潮期,并未受到应有的重视。[2]
1983年,加州理工学院的物理学家John Hopfield利用神经网络,在旅行商这个NP完全问题的求解上获得当时最好成绩,引起了轰动[2]。然而,Hopfield的研究成果仍未能指出明斯基等人论点的错误所在,要推动神经网络研究的全面开展必须直接解除对感知器——多层网络算法的疑虑。[1]
真正打破明斯基冰封魔咒的是,David Rumelhart等学者出版的《平行分布处理:认知的微观结构探索》一书。书中完整地提出了BP算法,系统地解决了多层网络中隐单元连接权的学习问题,并在数学上给出了完整的推导。这是神经网络发展史上的里程碑,BP算法迅速走红,掀起了神经网络的第二次高潮。[1,2]
因此,BP算法的历史意义:明确地否定了明斯基等人的错误观点,对神经网络第二次高潮具有决定性意义。
这一点是说BP算法在神经网络领域中的地位和意义。
BP算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多是在使用BP算法进行训练[2],包括最近炙手可热的深度学习概念下的卷积神经网络(CNNs)。
BP神经网络是这样一种神经网络模型,它是由一个输入层、一个输出层和一个或多个隐层构成,它的激活函数采用sigmoid函数,采用BP算法训练的多层前馈神经网络。
BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。其算法基本思想为:在2.1所述的前馈网络中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。
BP算法中核心的数学工具就是微积分的 链式求导法则 。
BP算法的缺点,首当其冲就是局部极小值问题。
BP算法本质上是梯度下降,而它所要优化的目标函数又非常复杂,这使得BP算法效率低下。
[1]、《BP算法的哲学思考》,成素梅、郝中华著
[2]、《机器学习》,周志华著
[3]、 Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
2016-05-13 第一次发布
2016-06-04 较大幅度修改,完善推导过程,修改文章名
2016-07-23 修改了公式推导中的一个错误,修改了一个表述错误
三、一文搞懂梯度下降&反向传播
如果把神经网络模型比作一个黑箱,把模型参数比作黑箱上面一个个小旋钮,那么根据通用近似理论(universal approximation theorem),只要黑箱上的旋钮数量足够多,而且每个旋钮都被调节到合适的位置,那这个模型就可以实现近乎任意功能(可以逼近任意的数学模型)。
显然,这些旋钮(参数)不是由人工调节的,所谓的机器学习,就是通过程序来自动调节这些参数。神经网络不仅参数众多(少则十几万,多则上亿),而且网络是由线性层和非线性层交替叠加而成,上层参数的变化会对下层的输出产生非线性的影响,因此,早期的神经网络流派一度无法往多层方向发展,因为他们找不到能用于任意多层网络的、简洁的自动调节参数的方法。
直到上世纪80年代,祖师爷辛顿发明了反向传播算法,用输出误差的均方差(就是loss值)一层一层递进地反馈到各层神经网络,用梯度下降法来调节每层网络的参数。至此,神经网络才得以开始它的深度之旅。
本文用python自己动手实现梯度下降和反向传播算法。 请点击这里 到Github上查看源码。
梯度下降法是一种将输出误差反馈到神经网络并自动调节参数的方法,它通过计算输出误差的loss值( J )对参数 W 的导数,并沿着导数的反方向来调节 W ,经过多次这样的操作,就能将输出误差减小到最小值,即曲线的最低点。
虽然Tensorflow、Pytorch这些框架都实现了自动求导的功能,但为了彻底理解参数调节的过程,还是有必要自己动手实现梯度下降和反向传播算法。我相信你和我一样,已经忘了之前学的微积分知识,因此,到可汗学院复习下 Calculus
和 Multivariable Calculus 是个不错的方法,或是拜读 这篇关于神经网络矩阵微积分的文章 。
Figure2是求导的基本公式,其中最重要的是 Chain Rule ,它通过引入中间变量,将“ y 对 x 求导”的过程转换为“ y 对中间变量 u 求导,再乘以 u 对 x 求导”,这样就将一个复杂的函数链求导简化为多个简单函数求导。
如果你不想涉及这些求导的细节,可以跳过具体的计算,领会其思想就好。
对于神经网络模型: Linear -> ReLu -> Linear -> MSE(Loss function) 来说,反向传播就是根据链式法则对 求导,用输出误差的均方差(MSE)对模型的输出求导,并将导数传回上一层神经网络,用于它们来对 w 、 b 和 x (上上层的输出)求导,再将 x 的导数传回到它的上一层神经网络,由此将输出误差的均方差通过递进的方式反馈到各神经网络层。
对于 求导的第一步是为这个函数链引入中间变量:
接着第二步是对各中间变量求导,最后才是将这些导数乘起来。
首先,反向传播的起点是对loss function求导,即 。 :
mse_grad()之所以用unsqueeze(-1)给导数增加一个维度,是为了让导数的shape和tensor shape保持一致。
linear层的反向传播是对 求导,它也是一个函数链,也要先对中间变量求导再将所有导数相乘:
这些中间变量的导数分别是:
对向量 求导,指的是对向量所有的标量求偏导( ),即: ,这个横向量也称为y的梯度。
这里 ,是一个向量,因此, 求导,指的是y的所有标量(y_1, y_2, ..., y_n)对向量x求偏导,即:
。
这个矩阵称为雅克比矩阵,它是个对角矩阵,因为 ,因此 。
同理, 。
因此,所有中间导数相乘的结果:
lin_grad() 中的inp.g、w.g和b.g分别是求 的导数,以inp.g为例,它等于 ,且需要乘以前面各层的导数,即 outp.g @ w.t() ,之所以要用点积运算符(@)而不是标量相乘,是为了让它的导数shape和tensor shape保持一致。同理,w.g和b.g也是根据相同逻辑来计算的。
ReLu层的求导相对来说就简单多了,当输入 <= 0时,导数为0,当输入 > 0时,导数为1。
求导运算终于结束了,接下来就是验证我们的反向传播是否正确。验证方法是将forward_backward()计算的导数和Pytorch自动微分得到的导数相比较,如果它们相近,就认为我们的反向传播算法是正确的。
首先,将计算好的参数导数保存到w1g、b1g、w2g和b2g中,再用Pytorch的自动微分来求w11、b11、w22和b22的导数。
最后,用np.allclose()来比较导数间的差异,如果有任何一个导数不相近,assert就会报错。结果证明,我们自己动手实现的算法是正确的。
反向传播是遵循链式法则的,它将前向传播的输出作为输入,输入作为输出,通过递进的方式将求导这个动作从后向前传递回各层。神经网络参数的求导需要进行矩阵微积分计算,根据这些导数的反方向来调节参数,就可以让模型的输出误差的优化到最小值。
欢迎关注和点赞,你的鼓励将是我创作的动力
四、理解梯度下降和反向传播
梯度下降就是一个求极值的方法,在深度学习里面用于最小化损失来训练权重和偏差。
先举个简单的例子,
比如,我们要求如上曲线函数的极小值,我们只要对其求导然后找导数为0的点就可以了。
但是在实际情况会比这个要复杂的多,因为我们会有更多的变量,特别是对于神经网络而言,它可能以复杂的方式依赖于几十亿的权重和偏差,因此依靠微分来求极值显然是行不通的。
但是你想呀,我们有计算机呀,计算机最擅长什么?当然是硬算呀...
想必玩过猜数字游戏吧,你先随便猜一个,然后告知你大了还是小了,如果大了你就往小了猜,小了就往大了猜,如此循环往复就猜到对应的数字了。
梯度下降的过程也是有点类似的,就是你先随便选一个点,然后往减小的方向一点点移动,移动着移动着,你就到了那块最小的值的区域了。
那么,这个方向应该怎么确定呢?暂时先不去想它,假设我们就给我们的变量 随意移动了很小的一段 ,那么函数值 会发生多少变化呢?微积分告诉我们会这么改变:
要让 的值减小,就意味着我们要让 为负。
在此之前,我们先把上面的偏导扩展到多元变量,即不止有一个变量 ,而是有 ,我们将所有变量的偏导数组合在一起构成一个向量,将其称为梯度向量,即
把所有发生的变化 也写到一个向量里:
我们可以把 的表达式写成:
观察上面的公式,容易想到的是,我们只要选择
就可以保证 小于等于0了,其中 是一个小的正数(我们称之为学习速率或者是步长)。然后,我们就知道该如何移动这个点了:
然后让计算机使用这个规则,一遍一遍的迭代,就能让损失函数的值 达到我们希望的极小值。
总而言之,梯度下降算法的工作方式是反复计算梯度 ,然后向相反方向移动。
那么,我们如何把它应用到神经网络的学习中?显而易见的,就是利用梯度下降来找到相应的权重 和偏差 ,让损失函数的值尽可能的小。套用上面的公式,我们只要随机取一个 和 ,利用更新的规则,就有了:
在来想一下我们网络损失函数的定义,当使用二次损失时, ,也就是说,神经网络中的损失,是所有训练样本损失的平均。但是,当数据集很大的时候,这会花费很长很长的时间,因此网络的学习速度会非常非常慢。于是就有了一种叫做随机梯度下降的思想来加速学习。
这个想法其实很简单,就是随机选取一个小的批次,然后只计算这个批次的平均损失,这样只要每个批次的平均损失都最小的话,那整体也就最小了。特别的,当这个批次只去一个样本的时候,神经网络一次只能从一个训练输入中学习,这种行为被称为在线学习。
okay,现在我们已经知道用梯度下降来让网络学习权重和偏差了,但是还有一个问题困扰着我们,就是你这个方法说起来简单,可是...可是这个梯度要怎么算呀?
然后一种快速计算梯度的算法,叫做 反向传播算法 就来了。
反向传播算法的核心在于如何通过最终的损失 计算网络中任意位置的权值 (或者偏差 )的偏导 。
很明显,其实最后一层的偏导是很好计算的,因为损失只要把样本 对应的标签 和输出激活 ,带到损失函数里就得到了,问题在于怎么计算前面层的损失。顾名思义,反向传播算法的精髓就是搞出了一种方法,可以把误差从后往前反向传播,这样就可以轻松的计算前面层权值的偏导了。
在开始正式讲解之前,我们先来定义几个符号:
根据上面的符号表达,我们可以很轻松的写出正向传播的递推公式,就上一层的的输出激活作为下一层的输入,然后经过线性运算再输出 激活,这里使用向量化的形式:
为了计算 和 ,我们引入一个中间变量 ,称其为第 层的第 个神经元的误差:
按照惯例,我们用 来代表第 层的误差向量。
根据微积分中求导的链式法则,有
并且可以得到一个递推公式
写成矩阵的形式,就是
这样我们就可以将误差从后往前传递了。
那么这个误差和我们的偏导 又有什么联系呢?还是根据链式法则:
到此,整个反向传播的过程就连起来了。求偏差的偏导使用同样的方法即可。
以上就是关于反向传播算法相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读:
nginx反向代理内网访问(nginx反向代理内网访问是什么)