对于简单的模型,我们可以手动求解出梯度,但是对于非常复杂的模型,比如一个100层的网络,我们不可能通过手写公式的办法去求解梯度。因此,这里就引入了反向传播算法,之前在pytorch框架下使用的自动求导本质上就是一个反向传播算法。
反向传播算法本质上就是一个链式求导法则的应用。
链式法则:比如函数 ,令
,那么
根据链式求导法则,我们可以得到
通过链式法则我们知道我们需要对其中的元素求导,那我们可以一层一层求导,然后将结果乘起来,这就是链式法则的核心,也是反向传播的核心。
和上面的例子一样, ,
, 通过计算图可以将这个计算过程表达出来。

上面图1绿色的数字表示其数值,下面红色的数字表示求出的梯度,我们可以一步步看一下反向传播的过程。
1.左右边开始,梯度毋庸置疑,肯定是1
2. ,
3. ,
这样一步步我们就可以求出了。
对于复杂的函数,比如sigmoid函数 我们需要求解出
,
,
将这个函数抽象成一个计算图,即
画出计算图

同样上面图2绿色的数字表示数值,下面红色的数字表示梯度,我们从后往前计算一下各个参数的梯度。首先最右边的梯度是1,然后经过这个函数,这个函数的梯度是
,所以往前传播的梯度是
,然后经过
这个操作,梯度不变,这样不断往后传播就能够求得每个参数的梯度。
网友评论