赞
踩
科普知识
BP算法(即反向传播算法)适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。
前言
上期文章中我们学习基本的神经网络知识,并对其输出,也就是前向传播进行了数学计算展示,然而,一个完成的神经网络是应该包含前向和后向传播,前向传播是为了计算输入的过程,后向传播过程是为了学习过程服务的,今天,我们就来学习一下神经网络的反向传播算法,我们尽量简单点,让大家都能理解。
反向传播算法
反向传播算法是通过误差函数(损失函数)来不断调整权重的一个算法,通过不断的调整权重,神经网络就能学会针对当前数据的适合的权重来达到输出接近真实值的过程。下面,我们就看看神经网络是如何用反向传播算法来进行学习过程的,顺便看看它到底和感知机的训练过程有什么不同。
1.1 简单的神经网络示意图
如上图,为了方便后面的计算过程演示,我们定义了一些权重符号,大家先仔细看懂这个图,才好对照后面的计算公式,值得注意的是,本次结构图中增加了偏置b,这在之前很少讲解,这次一块用上,相当于之前每一个神经元的激活函数之前加上一个b而已,下面会有公式展开,切记观察哦。
第一层是输入层,包含两个神经元i1,i2(i3不需要了),和截距项(偏置)b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数,最终有两个输出。
1.2 反向传播计算过程
1.数据初始化
在进行计算之前,我们需要给神经网络一些初始值,比如说输入数据需要知道吧,权重w和偏置不需要随机给一个,真实值,也就是输出也需要知道吧,于是,我们定义:
输入数据:i1=0.1 i2=0.2
权重初始化:w1=0.05,w2=0.10,w3=0.15,w4=0.20,w5=0.25 , w6=0.30,w7=0.35,w8=0.40
偏置:b1=b2=0.3
输出数据(也就是预期输出,也成为标签): o1=0.8, o2=0.9
在图上展示为:
神经网络中激活函数我们选取sigmoid,其倒数的结果刚好可以用自身来进行表示。
第一步:输入层--->隐藏层
1.计算神经元h1的输出:
N_h1 = 0.05*0.1+0.1*0.2+0.3 = 0.325
h1经过激活函数sigmoid之后得到h1神经元的输出(即h1神经元最终输出):
神经元h1的输出为:out_h1 = 0.5805
2.同理可得神经元h2的输出为:
out_h2 = 0.5878
第二步:隐藏层--->输出层
1. o1的输出:
N_o1 = 0.5805*0.25+0.5878*0.30+0.3 = 0.6214
o1经过激活函数sigmoid之后得到o1神经元的输出(即o1神经元最终输出):
神经元o1的输出为:out_o1 = 0.6505
2.同理可得神经元o2的输出为:
out_o2 = 0.6766
如此神经网络的前向传播就已经结束了,我们的得到的输出是out_o1=0.6505,out_o2=0.6766, 然而我们的预期输出,也就是o1 = 0.8, o2 = 0.9,因此,神经网络好需要训练来进行权重的更新 最终使得输出值趋近于实现给定的输出o1,o2, 神经网络的训练过程采用反向传播算法,下面就来见证一下吧:
反向传播算过过程:
首先,我们来看一下之前学习的误差函数,反向传播也是建立在误差函数的基础上对权重进行更新的。
由图中可知,神经元有两个输出,因此,误差应该计算两个输出的误差之和。
因此o1的误差为:
同理:
总的误差为:
1.输出层-->隐藏层的权重更新(以w6为例),用上一步的总体误差对w6求导,此处用到高数的链式法则。
对公式的解释:首先用总体误差对权重w6求导(也就是求取其梯度),由图可知,误差函数与w6之间是一个复合函数的关系,环环相扣,因此,我们需要找到与w6有关的所有关系然后一步步求导回去才行,由图可知,w6链接的是输出神经元o1,因此神经元o2就暂时一边玩去了,我们先用误差函数对o2的输出out_o1求导(因为误差函数是关于out_o1的函数),随后out_o1又是N_o1的函数,于是又求导,随后发现关于N_o1的是关于w6的函数,由此求导到了w6本身,链式法则完毕(此处也许不太好理解,需要回想一下高数)。
我们来计算三个分式的结果:
此处以为out_o1是关于N_o1的sigmoid函数的函数,因此,求导后即为上式(关于sigmoid求导上文有介绍)
三式子相乘得出总体误差对w6的梯度:
由此,利用最开始的的梯度下降算法公式,即可完成对w6的更新
以上,就完成了权重w6的依稀更新,依次类推,隐藏层中的w5-w7-w8也是同样的更新方式,小编这里就不一一推导啦。
2.隐藏层-->输入层的权重更新(以w2为例),还是用到高数的链式法则,往下看。
总误差对w2的梯度为:
对公示的解释:从以上看出我们对w2进行求导的时候,进行了神经元跳跃,直接到了隐藏层与w2有链接的h1神经元,这一点大家务必仔细看。,然后运用链式法则进行对N_h1求导,最后对w2求导,步骤和之前的输出层求导类似。
我们依旧来计算三个分式:
三个公式相乘:
由此,利用最开始的的梯度下降算法公式,即可完成对w2的更新:
以上,就完成了权重w2的依稀更新,依次类推,隐藏层中的w1-w3-w4也是同样的更新方式。
这个时候,同学们就会问了,我们更新了这些权重后下一步该做什么呢?这个问题非常重要,回到最开始,我们反向传播算法是拿来干嘛的呢?用来更新权重对吧?为什么要更新呢?因为需要适合的权重与输入的数据进行运算得到神经网络的输出并且使得这个输出尽可能接近我们给定的预期输出结果(一般如何确定为接近,小数点后4-6位差不多就可以啦,当然很多实际情况是达不到的)?那么现在神经网络的输出和预期输出之间差值是多少呢?我们看的的是误差函数,此时的误差函数也就是上面的总的误差值为:0.0361,显然神经网络的输出还不能说是接近预期输出目标,因此这个网络的权重还不是最适合的,需要更新对吧,但是现在我们刚好进行了第一次更新权重,下一步要做的是什么呢?当然是用更新后的每一个权重去替换之前的对应权重啊,然后用替换后的权重带入神经网络的计算公式,得出当前权重下神经网络的输出,这个时候再去计算误差函数,如果运气好?这个时候的神经网络的输出十分的接近我们的预期输出,那么恭喜你,这个时候的权重就是最佳的,你可以不用训练的,你只需要保存当前权重就可以拿去做其他类似数据的神经网络计算啦,一般情况下神经网络的训练时间还是比较久的,意味着我们不能很快就找到适合的权重,因此,这个时候的误差函数还是有一点大,我们还得重复之前的更新方式,继续去训练寻找最适合的权重,知道n次之后,最适合的权重也许就找到啦,当然也可能找不到,这就需要其他策略了,这是后话我们再说。
以上就是整个反向传播算法的大概解读,至于精细的,粉丝们可以去看看深度学习的花书,这本书其实很不错,就是公式有点太多啦,要是数学基础不太好的话,估计够呛,比如说小编,当然还好有很多优秀的博客解读,小编才能较好的理解,因此,小编这里也建议大家好好学习数学,计算机理论的发展其实有着数学发展推动的功劳在背后,务必重视。
我知道,跟随者最近几期的同学们可能觉得深度学习的入门有点难啦,前向传播、反向传播、梯度下降算法需要自己手动计算等等,如果遇到数十个神经元估计就尴尬啦,是的深度学习的入门的确有一点难度,但是,不要忘记问题有多难,人类就有多优秀,古今往来,这些例子数不胜数,因此,对于之前的问题,我可以告诉你们,一点都不需要担心,因为众多的科技公司或者优秀的学者已经用代码实现了以上计算公式,而且是自动地,这一点减轻了广大学习者很多时间,在此非常感谢他们,举个例子,就拿权重更新的过程来说,对于我们后面要学习的keras或者tensorflow深度学习框架来说,就是一句代码的事,不需要我们去考虑计算的问题,因此,我们的工作在于如何提出更加优秀的数学理论或者是有建设性意义的深度学习网络,甚至是训练技巧,甚至是权重更新方式?我们的权重更新目前大多数都是采用的梯度下降算法,哪门有没有比它更好的算法呢?我想应该是有的,今天的学者在努力去突破,未来的学者也一定会去创造,说不定就是在看的各位,未来,一起加油!
深度学习上手其实不难,小编这里主要是讲解了理论可能有点枯燥,不是太懂也没关系,只要懂得大概的流程就可以上手啦,目前很多东西都是代码化的,因此,希望大家不要退缩哦,因为,实战篇更精彩……
END
结语:
本周的分享结束了,为了本次推文,小编准备了两周,内容比较充实,也许有点枯燥,但仔细体会其中,还是有点意思,期待在看的各位有所收获,另外,理论篇的文章是为了让大家在后期的实战中有一个理论基础,而不至于在实战的时候基本的定义和操作都不知道,因此,对于理论的文章,大家只要知道有什么?起什么用?用在哪里?就差不多啦,不要单纯的认为理论篇文章很难哦。
编辑:玥怡居士|审核:小圈圈居士
扫二维码关注
IT进阶之旅
记得点击蓝字关注我们哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。