版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lewif/article/details/88053174
在利用梯度下降法对神经网络权重等参数进行训练时,需要利用反向传播去计算损失函数对权重参数的偏导数。
反向传播
下面分析是如何反向传播的(分析时不考虑偏置项),
参考上图,
① 对于一个神经元
j,它的输出被定义为,
Oj=φ(netj)=φ(k=1∑NwkjOk)(1.1)
其中,
wkj表示神经元
k到
j之间的权重,
Ok是上一层神经元的输出。
φ为激活函数,这里取为
logistic函数,
φ(z)=1+e−z1(1.2)
logistic函数的求导公式为,
dzdφ(z)=φ(z)(1−φ(z))(1.3)
② 损失函数定义为,
E=21(t−y)2(1.4)
其中,
y为输出层的输出,
t为期望输出。
考虑
wkj对于
E的影响,是
Oj间接影响的,因此可得下面的公式(这里假设
j前一层神经元为
i,即求对
wij的偏导数),
∂wij∂E=∂Oj∂E∂netj∂Oj∂wij∂netj(1.5)
其中,后两个偏导数可以直接求出,
∂netj∂Oj参考公式
1.3,
∂wij∂netj=Oi。但是此时,
∂Oj∂E,依然无法求出。不过如果
j是输出层,因为
Oj=y,此时可求出
E对
Oj的偏导数,
∂Oj∂E=∂y∂E=∂y∂21(t−y)2=y−t(1.6)
下面就到了最关键的一步,此时对于非输出层,我们无法直接求出
∂Oj∂E,考虑将
Oj对
E的作用向
j的下一层迭代,我们把
E考虑成一个输入由
L=u,v…,w这些神经元组成的函数,
Oj是
u,v,w这些神经元的输入,
Oj直接构成了对
netu,netv,netw的影响。
∂Oj∂E(Oj)=∂Oj∂E(netu,netv,…,netw)(1.7)
利用全微分形式,可以获取到一个递归方程,
∂Oj∂E=l∈L∑(∂netl∂E∂Oj∂netl)=l∈L∑(∂Ol∂E∂netl∂Olwjl)(1.8)
通过递归方程,我们可以从输出层开始对需要求的偏导数进行递归,因此得名反向传播。
一个例子
下面以一个简单的网络来对上面的反向传播结果进行验证,如下图所示,
∂wj−1,j∂E=∂Oj∂E∂netj∂Oj∂wj−1,j∂netj(1.9)
其中,上式
∂Oj∂E=∂y∂E,三项偏导数都可求出。接着求
∂wj−2,j−1∂E,
∂wj−2,j−1∂E=∂Oj−1∂E∂netj−1∂Oj−1∂wj−2,j−1∂netj−1=∂Oj∂E∂netj∂Oj∂Oj−1∂netj∂netj−1∂Oj−1∂wj−2,j−1∂netj−1(1.10)
在上式中,
∂Oj−1∂E=∂Oj∂E∂netj∂Oj∂Oj−1∂netj,求
∂Oj−1∂E时先求出
E对上一层的
Oj的偏导数
∂Oj∂E,公式(1.10)和(1.8)完全对应,上述过程充分体现了链式法则。