一文搞懂梯度下降&反向传播

作者&投稿:巢将 (若有异议请与网页底部的电邮联系)
~

如果把神经网络模型比作一个黑箱,把模型参数比作黑箱上面一个个小旋钮,那么根据通用近似理论(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就会报错。结果证明,我们自己动手实现的算法是正确的。

反向传播是遵循链式法则的,它将前向传播的输出作为输入,输入作为输出,通过递进的方式将求导这个动作从后向前传递回各层。神经网络参数的求导需要进行矩阵微积分计算,根据这些导数的反方向来调节参数,就可以让模型的输出误差的优化到最小值。

欢迎关注和点赞,你的鼓励将是我创作的动力




wta文件是什么意思?
WTA文件是一种数据文件格式,在计算机科学和信息技术领域中常用。WTA文件是通过权重梯度下降算法得到的,其全称为Winner-Takes-All文件。该文件是人工神经网络领域中常用的一种格式,主要用于将神经网络训练的结果存储下来,方便后期模型的使用和优化。WTA文件与神经网络模型的训练密切相关。在经过大量数据的训练...

GAN万字长文综述
GAN在文本和语音生成领域的应用相对较少,由于BP算法对离散数据的挑战,策略梯度下降技术在SeqGAN和ORGAN中被引入,用于训练音乐和语言\/语音[9]。GAN在半监督学习和领域适应中也发挥着重要作用,如判别器分类和Triple-GAN[10]。评估GAN的性能至关重要,Inception Score、Mode Score、Kernel MMD以及Wasserstein...

为什么在实际生活工作中几乎没有人用微积分计算?
但是我们却不得不深刻理解什么叫随机梯度下降。而理解它,必须有微积分基础。你要是不信,找一个完全没有接触过微积分的人试一下,看看能理解多少。如果理解不了,那么在实际选择深度学习算法时,会异常艰难。因为连原理都没有搞懂,你怎么知道哪种算法更适合,参数怎么调整。比方说:激活函数选择那一种,每一层用几个...

万字文经典-全面通俗解读矩阵分解的历史、方法、数学本质及物理含义_百 ...
历史长河中,从简单的特征值分解到深入的SVD,再到PLSA、NMF和LDA,每一步都是为了优化推荐效果。比如,Funk-SVD和SVD++在稀疏矩阵处理上独具匠心,后者引入了隐式反馈和用户属性,使得推荐更加精准和个性化。特别值得一提的是,Funk-SVD通过梯度下降法,将用户和物品特征映射到低维矩阵P和Q,通过最小化...

配电台区智能(高级)终端高级应用系统前期设计技术的讨论
"(bp)前馈神经网络使用梯度下降法,有2部分组成:信息正向传播和误差逆向传播。信息正向传播过程中,输入信号从输入层经隐层单元逐层传播,最后传向输出层,每一层神经元状态只影响下一层神经元状态。如果在输出层不能得到期望的输出,则转向误差逆向传播,将输出信号的误差沿原来的连接通路返回。用迭代运算求解权值,通过...

求Deep learning 【Yann LeCun 1,2 , Yoshua Bengio 3 & Geoffrey Hint...
负的梯度矢量表示在该地形中下降方向最快,使其更接近于最小值,也就是平均输出误差低最低的地方。在实际应用中,大部分从业者都使用一种称作随机梯度下降的算法(SGD)。它包含了提供一些输入向量样本,计算输出和误差,计算这些样本的平均梯度,然后相应的调整权值。通过提供小的样本集合来重复这个过程用以训练网络,直到...

如何快速有效地提高 Excel 技能水平
这些参数最好剥离出来成为一个单独的界面,可以比较方便的控制和调整,为之后的Sensitivity Analysis做准备,甚至可能遇到在上文中提到的类似于用梯度下降法寻求最优值的情况。 基础模型。这一步的核心就是做出预测的三张财务报表,最令人痛苦的是配平。可以使用各类复杂函数(Indirect\/Offset\/VLookup等)来进行配平而不会...

关于感受野的总结
[9] 深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读 【获取码】SIGAI0508.[10] 理解梯度下降法 【获取码】SIGAI0511.[11] 循环神经网络综述—语音识别与自然语言处理的利器 【获取码】SIGAI0515.[12] 理解凸优化 【获取码】SIGAI0518.[13] 【实验】理解SVM的核函数和参数 【获取码】...

AI文件路径平滑
1.路径的边角 和端点可以在描边这里做平滑。2,其他弧度的调整可以点击你要调整的锚点会出现一个这样的工具栏 然后 点击这个 整条线就会平滑起来,再做调整!

Spark 怎么读文件名
这是近期2015年6月的一个项目,在运行随机梯度下降(SGD)时这套随机学习算法声称在性能上比Spark MLib中快了25%-75%。这是AMPLab实验室的sp标记项目,因此值得我们去阅读。5.Keystone ML KML将端到端的机器学习管道引进到了Spark中,但在近期Spark版本中管道已经趋于成熟。同样也承诺具有一些计算机视觉...

霍山县13783092950: 如何理解神经网络里面的反向传播算法 -
韶丽骨化: 反向传播算法(BP算法)主要是用于最常见的一类神经网络,叫多层前向神经网络,本质可以看作是一个general nonlinear estimator,即输入x_1 ... x_n 输出y,视图找到一个关系 y=f(x_1 ... x_n) (在这里f的实现方式就是神经网络)来近似已知...

霍山县13783092950: 卷积神经网络是如何反向调整参数的? -
韶丽骨化: 参数调整流程: 1. 计算loss--loss是根据网络输入值和真实值求解获得,与网络参数有关2. 根据loss使用梯度下降法进行反向传播--梯度下降的BP算法,参考微积分链式求导法则. 结束.. 可以追问的~~

霍山县13783092950: BP神经网络中的激励函数除了S型函数,还有什么函数? -
韶丽骨化: 一般来说,神经网络的激励函数有以下几种:阶跃函数 ,准线性函数,双曲正切函数,Sigmoid函数等等,其中sigmoid函数就是你所说的S型函数.以我看来,在你训练神经网络时,激励函数是不轻易换的,通常设置为S型函数.如果你的神经网络训练效果不好,应从你所选择的算法上和你的数据上找原因.算法上BP神经网络主要有自适应学习速率动量梯度下降反向传播算法(traingdx),Levenberg-Marquardt反向传播算法(trainlm)等等,我列出的这两种是最常用的,其中BP默认的是后一种.数据上,看看是不是有误差数据,如果有及其剔除,否则也会影响预测或识别的效果.

霍山县13783092950: matlab如何实现反向传播算法? -
韶丽骨化: 反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法.其主要思想是:(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向...

霍山县13783092950: 深度学习可以与人类的哪种学习行为类比? -
韶丽骨化: 当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播、反向传播、梯度下降法,其实很难表述这些公式具体做了什么,深度学习像大脑这样的类比其实是过度简化了我们的大脑具体在做什么,但因为这种形式很简洁,也...

霍山县13783092950: 什么是 net.trainParam.show -
韶丽骨化: 什么是 net.trainParam.show bpnet=newff(pr,[12 4],{'logsig', 'logsig'}, 'traingdx', 'learngdm'); %建立BP神经网络, 12个隐层神经元,4个输出神经元 %tranferFcn属性 'logsig' 隐层采用Sigmoid传输函数 %tranferFcn属性 'logsig' 输出层采用...

霍山县13783092950: matlab神经网络工具箱训练出来的函数,怎么输出得到函数代码段
韶丽骨化: 这样:clear;%输入数据矩阵 p1=zeros(1,1000); p2=zeros(1,1000);%填充数据 for i=1:1000 p1(i)=rand; p2(i)=rand; end%输入层有两个,样本数为1000 p=[p1;p2];%目标(输出)数据矩阵,待拟合的关系为简单的三角函数 t = cos(pi*p1)+sin(pi*...

霍山县13783092950: matlab神经网络工具箱分别怎么用 -
韶丽骨化: 1单击Apps,在搜索框中输入neu,下方出现了所有神经网络工具箱.neural net fitting 是我们要使用的神经网络拟合工具箱. 2 在下界面中点击next 3 单击load example data set,得到我们需要的测试数据.

霍山县13783092950: net show命令什么作用 -
韶丽骨化: print是VB的保留字,不能用作变量名或对象名的 print本身是VB的一个命令,比如:print a 或者 print #1,a 如果把它作为变量名,会使VB产生歧义,不知道它是命令还是变量或者对象

霍山县13783092950: MATLAB神经网络预测的问题 -
韶丽骨化: %神经网络算法 %这是我以前数模校内选拔赛的猪肉价格预测模型的算法,你参考下 clear;clc; %P=0:0.1:2*pi;T=sin(P);pnew=0:0.01:2*pi; P=1985:2009; T=[33139.6,...33719.1,32773,34221.8,35281,36240.8,36964.6,38421,39300,41461.9,......

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网