在神经网络中,为了最小化损失函数loss(w)loss(w),我们会逐一对各个wiwi进行求偏导,然后沿着梯度方向更新各个wiwi的值。但是直接求导的话这整个过程会产生重复计算。
例如z=f(g(x))=f(y)z=f(g(x))=f(y),则dzdx=dzdydydxdzdx=dzdydydx,假设xx是第层权值,yy是第层的权值,如果依次求zz对于的导数需要计算两次dzdydzdy和一次dydxdydx。而这时我们可以利用动态规划的思想先计算dzdydzdy并保存下来记为tt,这时候再计算,这样就不会出现导数的重复计算。
以上就是Backpropagation算法的思想。
这里举一个具体例子(假设我们现在处于反向传播过程中,现在要更新w1w1):
这里要求∂Etotal∂w1∂Etotal∂w1,即最后神经网络输出的损失函数值对当前w1w1的偏导数,下面对它展开:
这里,上面的w1w1即为图中的w1w1,hi+1vnethvi+1net表示hi+1vhvi+1结点中线性加权后的结果,hi+1vouthvi+1out表示hi+1vhvi+1结点的最终输出,hi+1vnethvi+1net在经过激励函数后变成hi+1vouthvi+1out。通常而言,展开后的第一项∂Etotal∂hout∂Etotal∂hout就是errorerror项(误差项),而前两项的乘积∂Etotal∂hnet∂Etotal∂hnet就可以记为δδ。下同。下面开始推导。
第一项:
这里, Ei+2tEti+2表示hi+1vhvi+1结点来自hi+2thti+2的损失值, Ei+2t+1Et+1i+2表示它来自hi+2t+1ht+1i+2的损失值。注意,∂Etotal∂(hi+2tnet)∂Etotal∂(hti+2net)在误差反向传播到i+1i+1层的时候,就已经被计算出来并且保存为δi+2tδti+2了。
第二项:
这里,对于一个结点而言,它的净输入(线性加权总和)经过激励函数ff后即可以得到它的输出,于是这个导函数即为激励函数的导数。综合上述的第一项和第二项,我们可以看到相邻两层的值有如下关系式:δi+1v=(∑δi+2twv−t)⋅f′(hi+1v)δvi+1=(∑δti+2wv−t)⋅f′(hvi+1),这里的(∑δi+2twv−t)(∑δti+2wv−t)也就是我们所谓的errori+2terrorti+2。神经网络输出层的errorerror值就是真实值和预测值的误差。
第三项:
这里,一个结点的线性加权总和对于它某个参数ww的导数值为上层某一个结点的输出,而这个输出在前向传播过程就被计算出来了。
综上所述:
小结一下,∂Etotal∂w1∂Etotal∂w1,也就等于i+2i+2层结点的errori+2terrorti+2,乘以,当前i+1i+1层激励函数的导数,乘以,它前面第ii层对应结点的输出的总乘积。
至此,w1w1的梯度方向的导数就算出来了,我们再加上学习速率后,就可以更新w1w1:
最后,我们就可以根据这个将最基本的BP神经网络推导一翻啦~
本文详细介绍了BP神经网络中的反向传播算法原理及计算流程。通过具体实例,逐步推导了权重更新所需的梯度计算方法,展示了如何避免重复计算以提高效率。

369

被折叠的 条评论
为什么被折叠?



