BP算法中的链式求导法则详解

BP算法的文章很多,但是详解BP算法中的链式求导法则应该只此一家了。包括Hinton关于BP网络的原始论文,对链式求导法则也只是一带而过。

文章先从简化版本的链式法则讲起,再将其应用到BP算法中。

简化版本的链式法则

两层嵌套(复合)函数
BP算法中的链式求导法则详解

如上图所示,E是A1,A2,A3的函数,A1,A2,A3都是B1函数。此时,简单的运用链式求导法则即可求得E关于B1的偏导:
d E d B 1 = d E d A 1 ∗ d A 1 d B 1 + d E d A 2 ∗ d A 2 d B 1 + d E d A 3 ∗ d A 3 d B 1 \frac{dE}{dB_1}=\frac{dE}{dA_1}*\frac{dA_1}{dB_1}+\frac{dE}{dA_2}*\frac{dA_2}{dB_1}+\frac{dE}{dA_3}*\frac{dA_3}{dB_1} dB1​dE​=dA1​dE​∗dB1​dA1​​+dA2​dE​∗dB1​dA2​​+dA3​dE​∗dB1​dA3​​

但是当函数复合了三层以后,又该怎么处理呢?
三层嵌套(复合)函数

BP算法中的链式求导法则详解
如上图所示,E是A1,A2,A3的函数,A1,A2,A3都是B1,B2,B3函数,B1,B2,B3都是 C 1 C_1 C1​的函数。那么E关于 C 1 C_1 C1​的偏导该怎么求呢?
根据函数的嵌套关系,我们很容易就能写出 d E d A i ∗ d A i d B j ∗ d B j d C 1 ( i , j = 1 , 2 , 3 ) \frac{dE}{dA_i}*\frac{dA_i}{dB_j}*\frac{dB_j}{dC_1}(i,j=1,2,3) dAi​dE​∗dBj​dAi​​∗dC1​dBj​​(i,j=1,2,3)这样的式子,如 d E d A i ∗ d A 1 d B 1 ∗ d B 1 d C 1 , d E d A 1 ∗ d A 1 d B 2 ∗ d B 2 d C 1 . . . \frac{dE}{dA_i}*\frac{dA_1}{dB_1}*\frac{dB_1}{dC_1},\frac{dE}{dA_1}*\frac{dA_1}{dB_2}*\frac{dB_2}{dC_1}... dAi​dE​∗dB1​dA1​​∗dC1​dB1​​,dA1​dE​∗dB2​dA1​​∗dC1​dB2​​...。我们可以轻而易举的把i,j=1,2,3的式子穷举出来。但是随之困扰我们的一个问题就是,该用什么符号把这些式子连接起来,是加号,减号或者乘号?
这个问题困扰了我很久,查了西瓜书,考研时的高数资料,网上的博客,甚至悲催的读了Hinton的原始论文,但是遗憾的是,所有的资料都只描述了两层嵌套的链式法则。因此,用两层嵌套嵌套的链式法则就能解决多层嵌套的求导问题,应当是业界共识。
思索之后,答案呼之欲出:可以把前面N-1层嵌套压缩成一层嵌套。举例来说,如上图的三层嵌套函数E可以描述为:E是 B 1 , B 2 , B 3 B_1,B_2,B_3 B1​,B2​,B3​的函数, B 1 , B 2 , B 3 B_1,B_2,B_3 B1​,B2​,B3​是 C 1 C_1 C1​的函数;而E关于 B i B_i Bi​的偏导,就是我们在二层嵌套中已经求过的偏导数。这样就可以使用链式法则了,具体如下图所示:BP算法中的链式求导法则详解

链式法则在BP中的应用

如果掌握了上述多层嵌套链式法则,不妨把它运用的实际的BP算法中。
首先看一个简单的BP网络,为了简化问题,该网络只包含接近输出层的部分: θ \theta θ代表阈值,w代表连接权,x代表输入,y代表输出,激活函数f是sigmoid函数 1 1 + e − x \frac{1}{1+e^{-x}} 1+e−x1​。另外, y i ^ \hat{y_i} yi​^​表示样例的第i个输出,E是偏差。BP算法中的链式求导法则详解
再用具体的数学表达式明确表示出嵌套关系:

BP算法中的链式求导法则详解

然后我们就可以开始计算了。在BP算法中,从输出层往输入层计算。在本例中,首先从输出层往输入层计算出偏差关于输入的偏导:BP算法中的链式求导法则详解
然后再从输出层往输入层计算出偏差关于阈值和连接权的偏导数:BP算法中的链式求导法则详解

上一篇:贝塞尔搜索差异演化算法


下一篇:【路径规划】基于改进差分算法实现三维多无人机协同航迹规划