新闻资讯

    开小灶·全栈上分更容易

    基于《智能计算系统》各章节内容

    抽取核心知识点扩展讲解

    配合《智能计算系统》课程“一起服用”

    帮你轻松领路全栈!

    在上一期的开小灶中我们为大家讲解了梯度下降法的相关知识,本期我们将在“梯度下降法”的基础上带大家认识神经网络中的一个的核心概念——BP算法。灶友们带上马札,打开电脑,我们开始“BP算法”之旅。

    何为“BP算法”

    BP算法的本质及其数学推导

    bp神经网络的卷积过程_神经网络与bp算法_多层神经网络bp算法权值更新过程

    当我们使用前馈神经网络接收输入x并产生输出 ŷ时,信息通过网络向前流动。输入x提供初始信息,然后传播到每一层的隐藏单元,最终产生输出ŷ。我们将此过程称为前向传播( )。在训练过程中多层神经网络bp算法权值更新过程,前向传播可以持续向前直到其产生一个标量代价函数J(w)。反向传播(back )算法经常简称为(BP算法),该算法允许来自代价函数的信息通过网络向后流动以便计算梯度。

    反向传播经常被误解为用于多层神经网络的整个学习算法当中,但实际上它仅指用于“计算梯度”的方法,而另一种算法,例如随机梯度下降,则是使用该梯度来进行学习。此外,反向传播经常被误解为仅适用于多层神经网络,但是原则上它可以计算任何函数的导数。

    我们可以这样理解BP算法在神经网络中的运用,即BP算法的本质是反向传播与梯度下降的结合。反向传播即是计算梯度(即求导数J'(w))的过程,梯度下降则是优化参数(即权重w)从而找到J(w)最小值的过程。

    虽然计算梯度的表达式很直观,但是当函数中涉及的参数较多时,数值化求解梯度就会带来复杂的计算量,这对整个计算过程而言是相当昂贵的。但是BP算法可以使用相对简单和廉价的程序来实现这个目标。为了方便大家了解这一点,我们首先从数学推导的层面来为大家展示梯度的计算过程。

    梯度计算即求导运算,在深度学习中我们将该求导过程称为链式求导。我们以下列函数为例为大家展示链式求导,其中x为已知的输入值,w代表权重:

    在上式中,若要对参数w求导,则需要层层递进,分别对函数表达式中运算进行求导,即

    其中,

    bp神经网络的卷积过程_神经网络与bp算法_多层神经网络bp算法权值更新过程

    从以上求导表达式中我们可以发现,我们通过将每次求偏导得到的导函数带入到下一步的求导计算中,从而求出与该导函数中参数对应的新的导函数,以此类推直到求出最终目标参数的导数,整个过程的参数替换环环相扣,故将其称为链式求导。

    通过计算我们得到,

    将z和y表达式代入上式,可得,

    由此可知,函数J(w)关于参数w的导数为上式,即该函数的梯度。

    链式求导基础上的梯度下降代码实现

    在数学推导的基础上,我们通过代码来实现在链式求导基础上优化参数w的过程。

    bp神经网络的卷积过程_多层神经网络bp算法权值更新过程_神经网络与bp算法

    同样以函数J(w)为例,目前我们已经有了导函数J'(w)的表达式多层神经网络bp算法权值更新过程,则梯度下降代码如下:

    通过以上过程我们可以发现,数值化求解梯度虽然运算清晰,但若函数复杂则会带来巨大的运算量。如若我们能在链式求导过程中能够存储中间变量,那就可以减小由于表达式回代导致的运算复杂度。“反向传播”正是解决这一问题的途径,即它可通过存储中间变量来帮助求导。

    BP算法灵魂——反向传播带来的中间变量存储

    链式法则与计算图

    微积分中的链式法则用于计算复合函数的导数。设x是实数,f和g是从实数映射到实数的函数。假设y=g(x),且z=f(g(x))=f(y),则链式法则即为,

    在前文中我们已经举过对函数J(w)进行链式求导的例子,Heyro相信灶友们已经对链式法则有了清晰的了解。反向传播是一种计算链式法则的算法,它使用特定运算顺序以提高运算效率。

    具体来说,计算机在计算节点梯度的表达式时会引入一些额外的考虑。许多节点表达式可能在整个梯度表达式中重复若干次。由此一来,任何计算梯度的程序都需会面临两种选择:要么存储这些节点表达式,要么对它们进行重新计算。但是在某些情况下,多次计算相同的节点表达式是一种浪费。反向传播算法被设计为存储运算中涉及的公共节点表达式,即减少公共节点表达式的数量而不考虑存储的开销,从而降低运算所需的时间成本。

    bp神经网络的卷积过程_多层神经网络bp算法权值更新过程_神经网络与bp算法

    在此,我们引入计算图( graph)语言来帮助灶友们更精确地理解反向传播存储“中间输出”的操作。计算图的引入可以帮助我们将计算流程形式化为直观图。与此同时,我们还需引入运算 ()这一概念。运算是指一个或多个变量的简单函数。通过将多个运算组合起来,我们便可以形式化更复杂的函数。例如,变量y可通过一个关于变量x的运算得到,则我们可画一条从x指向y的有向边。我们亦可用运算来注释输出的节点。

    前文讲解反向传播运算时函数J(w)涉及的链式求导可用计算图表示如下:

    由计算图可知,x经过与w相乘的运算,其结果可存储为中间变量y,中间变量y经过平方后存储为下一个中间变量z,z再经过先加一后平方的运算最终输出函数J(w)的值。该计算图可与前文链式求导部分y、z、J三者的表达式对应起来理解。

    由此一来,我们便可清晰地看到节点表达式运算中需要存储的中间变量。

    BP算法代码实现

    接下来同样以函数J(w)为例将以上步骤用代码呈现出来,为灶友们完整展示BP算法的整个实现过程,在此我们会将x的输入值替换为随机生成的数据训练集:

    bp神经网络的卷积过程_多层神经网络bp算法权值更新过程_神经网络与bp算法

    以上就是本期开小灶的全部内容,希望大家经过本期的学习能够有所收获。灶友们我们下期见~

    除了关注微信公众号的“开小灶”专栏以外,灶友们还可以在哔哩哔哩“智能计算系统AICS”观看智能计算系统的在线公开课程。

    听说小灶讲解与视频课程配套学习会更香哦!

    在全面进入AI时代的拐点上

    每一个拥抱新技术的人都是时代的弄潮儿

    无论你早已整装待发

    还是正走在获取装备的路上

    Heyro都希望大家能通过学习智能计算系统的课程

    成为更棒的AI时代全栈先行者——

网站首页   |    关于我们   |    公司新闻   |    产品方案   |    用户案例   |    售后服务   |    合作伙伴   |    人才招聘   |   

地址:北京市海淀区    电话:010-     邮箱:@126.com

备案号:冀ICP备09043385号-1 北京科技有限公司版权所有