BP算法的文章很多,但是详解BP算法中的链式求导法则应该只此一家了。包括Hinton关于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}
dB1dE=dA1dE∗dB1dA1+dA2dE∗dB1dA2+dA3dE∗dB1dA3
但是当函数复合了三层以后,又该怎么处理呢?
三层嵌套(复合)函数
如上图所示,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)
dAidE∗dBjdAi∗dC1dBj(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}...
dAidE∗dB1dA1∗dC1dB1,dA1dE∗dB2dA1∗dC1dB2...。我们可以轻而易举的把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网络,为了简化问题,该网络只包含接近输出层的部分:
θ
\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算法中,从输出层往输入层计算。在本例中,首先从输出层往输入层计算出偏差关于输入的偏导:
然后再从输出层往输入层计算出偏差关于阈值和连接权的偏导数: