对于神经网络来说,每一层计算的值正向传播,根据梯度值反向传播来修改假设函数里的参数。正是因为反向传播(BackPropagation)算法的提出,大大加快了神经网络的计算。使得多层,大量神经元的神经网络变得可用。这一节为了讲解方便,我们用一个简单的计算图来理解正向传播和反向传播。
我们要进行的这个计算比较简单,现在假如我们需要最小化J(a,b,c)这个方程:
J(a,b,c)=3(a+bc)
我们用一些中间变量来简化这个函数,使得这个方程的计算可以分为多步,每步只进行一个运算:
u=bc
v=a+u
J=3v

我们随机设置a,b,c的值,比如5,3,2, 我们在计算J的值的时候是从左向右,这就是正向传播。然后我们需要对a,b,c 分别求偏导,得到梯度向量\bigl(\begin{smallmatrix}\frac{\partial J}{\partial a},\frac{\partial J}{\partial b} ,\frac{\partial J}{\partial c}& \end{smallmatrix}\bigr)

那么我们怎么对a,b,c求偏导呢?直接求导的话,中间隔着u和v,如果是一个深层次的神经网络,最终的结果和输入层可能隔着成千上万的中间变量,直接对输入层求导可能非常麻烦耗时。并有重复计算。这时就该反向传播出场了。原理也很简单,就是微积分里的链式求导法则,通俗的说就是J对a求导很麻烦,我就先用J对v求导,然后乘以v对a求导的值,就等于J直接对a求导的值。同样的话数学家是这么说的:

由两个函数组成的复合函数,其导数等于里边函数代入外边函数的值之导数,乘以里边函数的导数。

\frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial a}
\frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial u}*\frac{\partial u}{\partial b}
\frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial u}*\frac{\partial u}{\partial c}

在一个神经网络里进行链式求导的好处是避免了重复的计算。比如我计算了v的导数,后边J对a,b,c求导数的时候都可以用中间变量v的导数,不用重新计算。
当a,b,c的值为5,3,2时,我们分别求的一下偏导数:
\frac{\partial J}{\partial v}=3
\frac{\partial v}{\partial a}=1
\frac{\partial v}{\partial u}=1
\frac{\partial u}{\partial b}=c=2
\frac{\partial u}{\partial c}=b=3
从而得到
\frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial a}=3
\frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial u}*\frac{\partial u}{\partial b}=6
\frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}*\frac{\partial v}{\partial u}*\frac{\partial u}{\partial c}=9

所以,我们有了一个梯度(3,6,9),然后a,b,c对应的值(5,3,2) 沿着梯度反方向乘以步长系数,就得到一个新的a,b,c的点,这个点是让J最快下降的。
比如我们步长系数为0.2,a,b,c 为(5,3,2) 梯度为(3,6,9) 在我们求解J的最小值的这次迭代里
a1=5-0.23=4.4
b2=3-0.2
6=1.8
c2=2-0.2*9=0.2
通过这次迭代,我们得到了新的a,b,c的值a1,b1,c1 (4.4,1.8,0.2)
a,b,c 对应的J值为 33
a1,b1,c1 对应的J值为 14.28

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: