深度学习深度学习(九)backpropagation
作者:互联网
复习一下,我们之前知道,组成一个神经网络后,就要计算出他的参数W。而计算W就要弄清楚他的costfunction,因为costfunction就是衡量和计算不同W的值之间的优劣的。换句话说,我们要根据样本数据找到使得costfunction最小的W的值。这个方法我通常使用的是梯度下降,而梯度下降中最重要的参数就是找到costfunction对W的导数DW。
在未组成网络的时候我们知道,单个式子的导数比如D = ó;这里如果costfunction使用的是方差,则ó = (Ÿ-Y)*f'(h)。其中f'是activation function的导数。(Ÿ-Y)其实是方差的导数。h是实际的方程:
那现在问题来了,如果是在一个神经网络中呢?各个层级里面的W怎么求呢?
我们先来看一个最简单的网络:
要用梯度下降,我们就必须求得导数,
先求:
从前面讲梯度下降我们知道从后面往前可以用之前的一级的求导
= (Y-Ÿ)*f'(A * )A=óA;(ó=(Y-Ÿ)*f'(A * ))
这个没有毛病,我们再来求:
我们先拆解一下:
E = 1/2(Y-Ÿ)^2; ---这是一个没有的方差公式,即单样本时(m=1),确实时这样
Ÿ = f(A * );
A=f(X*);
根据复合函数求导,我们就有:
= * *
拆解计算每一个导数哈:
= -(Y-Ÿ)
= f'(A * )*
= f'(X * )*X
做一次合并:
= * * = -(Y-Ÿ) * f'(A * )* * f'(X * )*X
之前第一个式子:
= (Y-Ÿ)*f'(A * )A=óA; (ó=(Y-Ÿ)*f'(A * ))
我们让把这里的ó记为:
即
= (Y-Ÿ)*f'(A * )A=A;
而
= * * f'(X * )*X
再假设, = *f'(X*)*
那我们就可以得出结论: = *X
一般地,如果上一层是 则 = * f'(X*) (注意:因为这个从最后一层往前走,所以ó是倒叙的,而是正序的;其实和是同一层的)
而本层的导数就等于本层的 。
两层单节点的w求导就如上求出了。
当然,上述网络是一个简单的网络,即引起ΔY变化的有w有A,而在网络上A的变化,可不仅仅只影响一个节点,而是将作用在所有的下一层节点中,如下图:
这样,在计算ΔA的时候,就不能仅仅只把对Y1的影响计算进去,因为ΔA的变化一定会被分散到Y1,Y2,所以ΔA一定是个累计值,这样,我们就得出了完整的backpropagation公式:
这就是backpropagation算法,去计算每个w的导数,因为这个算法的特点是先算出最后结果即顶点的导数情况,然后再反向的向输出层每个节点计算所以叫做backpropagation。
额,这里最后完整的公式推断,我没有详细推导,上述那个2层单w的backpropagation我是经过详细推导的。
有兴趣的朋友,也可以把这个完整的公式推导一下。
好了,到这里,完整的神经网络基础就已经全部完成。
标签:导数,梯度,学习,backpropagation,计算,深度,我们,costfunction 来源: https://blog.csdn.net/wwwlgy/article/details/121213051