Python神经⽹络编程(⼆)之更新神经⽹络权重
那么我们接着上节开始讲更新权重、权重⽰例以及神经⽹路的准备布局。
1.14我们实际上是如何更新权重的。
(⼀)
以简单的3层,每层3个节点的神经⽹络为例。最后的输出是这样的。作者提出了⼀个问题:如何调整第⼀个节点和隐藏层第⼆个节点的之间链路的权重,以使得输出层第三个节点的输出增加0.5呢?
太难了这式⼦,尝试换⼀种说法:⾸先是拥抱悲观主义,训练数据不⾜/有错、神经⽹络的缺陷性。假设你在伸⼿不见五指的⼭顶上,地形陡峭、路况复杂,你只有⼀把⼿电筒做近距离观察,要下⼭你需要事先制定计划,⼀步⼀个脚印。在数学上这叫梯度下降。梯度是指地⾯坡度,你⾛的⽅向是最逗得坡度向下的⽅向。如果我们将复杂函数当作⽹络误差,那么下⼭到最⼩值就意味着最⼩化误差,从⽽改进⽹络输出。
使⽤y=(x-1)^2+1来举例。y表⽰误差,我们希望可以到最⼩x,可以最⼩化y,随机选⼀个点:斜率为负、沿着向下⽅向,同时沿x轴向右。⼀直在改进,直到⼏乎不能改进为⽌,这样我们就确信⾃⼰到达了最⼩值。要注意的是改变步⼦⼤⼩,避免调超,正梯度减⼩x,负梯度增加x。
如果y依赖于a,b,c,d⽽⾮单单x。我们可能会卡在错误的⼭⾕⾥(因为复杂函数有多个⼭⾕),解决⽅法:我们从⼭上的不同点开始,多次训练神经⽹络。确保不能终⽌错误的⼭⾕。不同的起始点针对于不同的启始参数(启⽰链接权重)。
关键点:
1.梯度下降法是求解函数最⼩值的⼀种很好的办法,应⽤场景为函数⾮常复杂困难时。
2.这种⽅法具有弹性,可以容忍不完善数据或者偶尔⾛错⼀步等等。
(⼆)
使⽤合适的误差函数,使⽤梯度下降法,我们可以正确的计算权重:
由于误差是⽬标训练值与实际输出值之间的差值,因此我们可以轻易地将输出函数改变为误差函数。
误差函数的第⼀种情况是误差相加,正负相抵了,不是⼀个很好的训练;第⼆种情况是采⽤差的绝对值,误差⽆法相抵,但可能会在V 形⼭⾕附近来回跳动,斜率不会变得减⼩,有超调的风险。第三种采⽤的是差的平⽅(⽬标值-实际值)^2,更倾向于第三种,因为:平滑连续,越接近最⼩值,梯度越⼩,
超调的可能性⽐较⼩。
误差对链接权重影响有多敏感?
第⼀个图演⽰了⼀个权重,第⼆个图显⽰的是两个链接权重(多⼭地形中寻⼭⾕)。
表⽰当权重Wj,k发⽣改变时,误差E是如何改变的。这是误差函数的斜率,也就是我们希望使⽤梯度下降⽅法到达最⼩值的⽅向。
⾸先展开误差函数,,Ok只取决于Wj,k ,误差函数根本不需要对所有输出节点求和,节点输出取决于所连
接的链接,就是取决于链接权重。。链式微积分法则:,Ok是节点k的输出,根据
S函数的应⽤,可以得到,附录中有对S函数的微分
;所以最终答案为
去掉常数之后,这个表达式描述了误差函数的斜率。这样我们可以调节Wj,k了:
这是训练神经⽹络的关键。第⼀部分是⽬标值-实际值,第⼆部分是进⼊最后⼀层节点的信号,应⽤激活函数之前,我们可以称之为ik,最后⼀部分是前⼀隐藏层节点j的输出。这个式⼦的⽬的是为了优化隐藏层和输出层之间的权重,
我们可以同理得到输⼊层和隐藏层之间权重的调整。
第⼀部分是隐藏层节点中的反向传播,第⼆部分基本不变,只是改变了节点⽽已,最后⼀层是第⼀层节点的输出oi,这⾥刚好是输⼊信号,因为输⼊层不作任何处理。
在应⽤每层训练样本,更新权重。权重改变的⽅向与梯度⽅向相反。使⽤学习因⼦以保证避免被错误样本拉的太远。若斜率为正,则减⼩权重;若斜率为负,则增⼤权重。阿尔法为学习率,⽤以调节变化强度,确保不会超调。
最后得到的权重更新矩阵为:(阿尔法为学习因⼦,Ek为输出的误差,Ok为最后⼀层真实的输出值,j列矩阵的转置):
关键点:
1.神经⽹络的误差是内部链接权重的函数;
2.改进神经⽹络,意味着通过改变权重来减少这种误差;
3.直接选择合适权重太难,通过误差函数的梯度下降,采取⼩步长,迭代的更新权重,所迈出的每⼀步是当前位置朝下的斜率最⼤⽅向(梯度下降)
4.使⽤微积分可以计算误差斜率。
1.15权重更新成功实例网络编程之delphi
举例:
进⾏权重更新:
⼀项⼀项计算:(1)已知Tk-Ok得到误差ek,e1=0.8;(2)S函数内的求和为(2*0.4)+(3*0.5)=2.3;(3)sigmod中得到1/(1+e^-x)其结果为0.909;(4)中间整体的表达式为0.909*(1-0.909)=0.083;(5)最后的O1为0.4,相乘之后得到-0.0265;若学习率为0.1,则改变量为-(0.1*0.02650)=+0.002650;w1,1更新后为2+0.002650=2.003650.经过成千上万次迭代,可以确定⼀种布局。
1.16准备布局
并不是所有的神经⽹络的尝试都可以成功,可以通过训练数据、初始权重、涉及良好的输出⽅案来解决。
1.16.1输⼊
对于S激活函数,⼤的X值,梯度较⼩,神经⽹络学习能⼒下降,这是饱和神经⽹络,因此需要⼩的输⼊;当然也不能输⼊信号太⼩(可能会丧失精度),⼀个好的建议是重新调整输⼊值,将其控制在0和1之间,譬如0.01。
1.16.2输出
如果激活函数不能⽣成1的值,那么尝试将训练⽬标值设置为⽐较⼤的值就⽐较愚蠢了,在S中,逻辑函数不能取到1.0,如果将⽬标值设置在不可达中,增⼤权重,使得⽹络饱和。
重新调整⽬标值,匹配激活函数的可能输出,注意避开激活函数不可能达到的值,⽤0.01~0.99范围内的值。
1.16.3随机初始权重
⼤权重会⼤信号传递给激活函数,导致⽹络饱和,降低⽹络可以学习到更好地权重能⼒,避免⼤的初始权重值。建议从-1.0和1.0之间随机均匀选择初始权重。
对于给定形状的⽹络以及特定激活函数,科学家设置了随机选择权重。规则具体为:对传⼊链接数量平⽅根倒数的⼤致范围进⾏随机采样。初始化权重。Eg:每个节点有3条传⼊链接,初始范围应随机化在-1/根号下3和+1/根号下3之间。禁⽌将权重设置为相同的恒定值或者初始权重为0。因为相同的话反向传播更新权重时完全相同,0权重会丧失学习能⼒。
关键点:
1.若输⼊、输出和初始权重数据与⽹络设计、实际求解不匹配,神经⽹络不能很好地⼯作;
2.⼀个常见问题是饱和,⼤信号/⼤权重导致激活函数的斜率变得⾮常平缓,这降低了神经⽹络学习权重的能⼒;
3.零值信号/权重会使⽹络丧失学习更好权重的能⼒。内部链接权重应该是随机的,⼩但避免零值,若传⼊链接较多,使⽤复杂规则降低权重。
4.输⼊应该调整到较⼩值,常见范围0.01~0.99或者-1.0~1.0,取决于具体问题。
5.输出应该在激活函数能够⽣成的值的范围内,否则会产⽣较⼤权重也达不到,⼀个合适范围是0.01~0.99。
此为第⼀章的内容。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论