反向传播初理解(2019-11-21)

2019-11-22  本文已影响0人  yzuzhangxr

对于简单的模型,我们可以手动求解出梯度,但是对于非常复杂的模型,比如一个100层的网络,我们不可能通过手写公式的办法去求解梯度。因此,这里就引入了反向传播算法,之前在pytorch框架下使用的自动求导本质上就是一个反向传播算法。

反向传播算法本质上就是一个链式求导法则的应用。

链式法则:比如函数f(x,y,z)=(x+y)z ,令q=x+y ,那么f=qz 根据链式求导法则,我们可以得到

\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x}                                (1)

\frac{\partial f}{\partial y}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}                                 (2)

\frac{\partial f}{\partial z}=q                                             (3)

通过链式法则我们知道我们需要对其中的元素求导,那我们可以一层一层求导,然后将结果乘起来,这就是链式法则的核心,也是反向传播的核心。

和上面的例子一样,q=x+y , f=qz , 通过计算图可以将这个计算过程表达出来。

图1

上面图1绿色的数字表示其数值,下面红色的数字表示求出的梯度,我们可以一步步看一下反向传播的过程。

1.左右边开始,梯度毋庸置疑,肯定是1

2.\frac{\partial f}{\partial q}=z=-4 ,  \frac{\partial f}{\partial z}=q=3

3.\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x}=-4\times1=-4 , \frac{\partial f}{\partial y}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}=-4\times1=-4

这样一步步我们就可以求出了\nabla f(x,y,z)

对于复杂的函数,比如sigmoid函数f(w,x)=\frac1{1+e^{-(w_0x_0+w_1x_1+w_2)}} 我们需要求解出\frac{\partial f}{\partial w_0} , \frac{\partial f}{\partial w_1} , \frac{\partial f}{\partial w_2}

将这个函数抽象成一个计算图,即

f(x)=\frac1x

f_c(x)=1+x

f_e(x)=e^x

f_w(x)=-(w_0x_0+w_1x_1+w_2)

画出计算图

图2

同样上面图2绿色的数字表示数值,下面红色的数字表示梯度,我们从后往前计算一下各个参数的梯度。首先最右边的梯度是1,然后经过\frac1x这个函数,这个函数的梯度是-\frac1{x^2},所以往前传播的梯度是1\times-\frac1{1.37^2}=-0.53,然后经过+1这个操作,梯度不变,这样不断往后传播就能够求得每个参数的梯度。

上一篇 下一篇

猜你喜欢

热点阅读