BP算法

本文详细解析了深度学习神经网络中反向传播算法的原理,包括变量、常量的定义,网络权值和输入作为变量的推导过程,以及残差的计算方法。通过数学公式和实例解释了如何计算网络各层节点的残差,进而用于更新网络权重和偏置,实现模型的训练优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只限于自己看!

预先说明

首先,这里面什么看成变量,什么看成常量。
变量:网络的权值W(偏置b默认在W内。)以及输入X。
常量:就是target
你可能会说呃呃呃,不是输入都是有值吗,不都是数吗,怎么会是变量啊。。一般来说网络的反向传播就是两种类型。一种是更新网络权值W,这是属于常规的,一种是更新输入X。 不管哪种情况,我们都要把W和X看成变量,才能有反向传播。
推导过程中,W和X都是变量,输出是W和X的函数。

字母说明

  • W(l)ijWij(l):第ll层到第l+1层的权值,并且是ll层的第j个单元到l+1l+1层的第ii个单元的权值。

  • Zi(l):第ll层的第i个结点的输入和
    显然Z(l)i=s(l1)j=0Wl1ijxjZi(l)=∑j=0s(l−1)Wijl−1xj , 其中sl1sl−1代表l1l−1层的结点个数(不计算偏置单元)。可以这样说,第0个单元是偏置,1~s(n1)s(n−1)是权重项。

  • a(l)iai(l):表示第ll层的第i个结点的激活值,就是下面说的out的输出,或是说a=f(net)a=f(net),写成a=f(z)a=f(z)也是一样的。

  • δ(l)iδi(l): 叫做“残差”,这里表示第ll层的第i个节点的残差。这个非常重要,残差的定义就是——总的代价函数对于某个节点的“net”的偏导。注意的是这里的“net”指的是W*x+b这样的函数结构。可以这样看网络:

    现在只需要看每个结点是如何处理数据的。不要看箭头,可以看到,h1和h2再加上“1”共三个结点输入,构成输入x⃗ x→, 而相应的权值W⃗ W→w5w5,w6w6,b2b2, 也就是说 W⃗ x⃗ W→∗x→就是这里的“net”,然后“out”是指激活后的值,就是f(net)f(net). 残差就是Enet∂E∂net,*不是Eout∂E∂out哦!

BP算法细节

参数说明:假设有n层。J表示代价函数,和上面的E是同样的意思,只不过用不同的字母写而已。
1: 首先当然是正向计算咯,分别求出L2,L3,...L2,L3,...直至最后一层LnLn激活值。我们这里把输入当做第一层。下面是真正的反向传播。

2: 对于第n层(最后一层是特殊的,必须单独拿出来)每个输出单元ii,下面的l的值为nn, 计算每个结点的残差:

(1)δi(l)=J(W,b;x,y)zi(l)=zi(l)12yhW,b(x)2=(yiai(l))f(zi(l))

注意:这里最后乘上了对“net”的导,如果是用sigmoid的函数的话,根据f(z(l)i)=a(l)i(1a(l)i)f′(zi(l))=ai(l)(1−ai(l)), 最后一层的第ii个结点的残差δi(l)=(yiai(l))ai(l)(1ai(l))

3: 从倒数第二层开始,也就是说 l=n1,n2,n3,...,2l=n−1,n−2,n−3,...,2 的各层,第ll层的第i个结点的残差计算:

δ(l)i=(j=1sl+1W(l)jiδ(l+1)j)f(z(l)i)δi(l)=(∑j=1sl+1Wji(l)δj(l+1))f′(zi(l))

分析:要想知道第ll层的第i个结点的残差,必须知道该节点所连接的下一层的各个结点的权值,以及这些结点的残差,幸亏第l+1l+1层已经计算出来了残差,你只要把后面一层的每个结点jj的残差乘以该结点与这一层的结点i相连的权值,然后加和,最后别忘了乘以这一层的激活方式的导数。 不吹不黑,如果你不太懂得话,这段话可以够你看10遍,你就懂了。

4: 你可能会说要残差干嘛?当然是计算Jw∂J∂wJb∂J∂b用的。
只要:

W(l)ijJ(W,b;x,y)=a(l)jδ(l+1)ib(l)iJ(W,b;x,y)=δ(l+1)i(2)(3)(2)∂∂Wij(l)J(W,b;x,y)=aj(l)δi(l+1)(3)∂∂bi(l)J(W,b;x,y)=δi(l+1)

结论:求J对“结点j到i的线路”的导数,求出后者i的残差,然后乘以这条线路的流量即可。

分析:其实是这样的,WlijWijl是第ll层到l+1层的权值,并且是从结点jj到结点i的权值。根据链式法则:

J(W,b;x,y)w(l)ij=J(W,b;x,y)outioutinetinetiwij∂J(W,b;x,y)∂wij(l)=∂J(W,b;x,y)∂outi∗∂outi∂neti∗∂neti∂wij

请仔细看上面的公式,好好理解。
残差的定义就是J(W,b;x,y)neti∂J(W,b;x,y)∂neti,根据链式法则:
δ(l+1i=J(W,b;x,y)neti=J(W,b;x,y)outioutinetiδi(l+1)=∂J(W,b;x,y)∂neti=∂J(W,b;x,y)∂outi∗∂outi∂neti
这下明白了吧,就是说第l+1l+1层,
Jw(l)ij=δ(l+1)inetiwij=δ(l+1)ia(l)j∂J∂wij(l)=δi(l+1)∗∂neti∂wij=δi(l+1)aj(l)

注意,第l+1l+1层的netiwij∂neti∂wij就是该层的输入,也就是第ll层的输出aj(l).

最后一个问题,为啥

δ(l)i=(j=1sl+1W(l)jiδ(l+1)j)f(z(l)i)δi(l)=(∑j=1sl+1Wji(l)δj(l+1))f′(zi(l))
呢?

δ(l1)i=z(l1)iJ(W,b;x,y)=z(l1)i12yhW,b(x)2=z(l1)i12j=1Sl(yja(l)j)2=12j=1Slz(l1)i(yja(l)j)2=12j=1Slz(l1)i(yjf(z(l)j))2=j=1Sl(yjf(z(l)j))z(l1)if(z(l)j)=j=1Sl(yjf(z(nl)j))f(z(l)j)z(l)jz(l1)i=j=1Slδ(l)jz(l)jz(l1)i=j=1Slδ(l)jz(l1)ik=1S(l1)f(z(l1)k)W(l1)jk=j=1Slδ(l)jW(l1)jif(z(l1)i)=(j=1SlW(l1)jiδ(l)j)f(z(l1)i)δi(l−1)=∂∂zi(l−1)J(W,b;x,y)=∂∂zi(l−1)12‖y−hW,b(x)‖2=∂∂zi(l−1)12∑j=1Sl(yj−aj(l))2=12∑j=1Sl∂∂zi(l−1)(yj−aj(l))2=12∑j=1Sl∂∂zi(l−1)(yj−f(zj(l)))2=∑j=1Sl−(yj−f(zj(l)))⋅∂∂zi(l−1)f(zj(l))=∑j=1Sl−(yj−f(zj(nl)))⋅f′(zj(l))⋅∂zj(l)∂zi(l−1)=∑j=1Slδj(l)⋅∂zj(l)∂zi(l−1)=∑j=1Sl(δj(l)⋅∂∂zi(l−1)∑k=1S(l−1)f(zk(l−1))⋅Wjk(l−1))=∑j=1Slδj(l)⋅Wji(l−1)⋅f′(zi(l−1))=(∑j=1SlWji(l−1)δj(l))f′(zi(l−1))

慢慢看,看懂问题不大。

编码

  1. 进行前馈传导计算,利用前向传导公式,得到 L2,L3,L2,L3,… 直到输出层 LlLl 的激活值。
  2. 对输出层(第 ll层),计算:
    δ(nl)=(ya(nl))f(z(nl))
  3. 对于l=nl1,nl2,nl3,,2l=nl−1,nl−2,nl−3,…,2 的各层,计算:
    δ(l)=((W(l))Tδ(l+1))f(z(l))δ(l)=((W(l))Tδ(l+1))∙f′(z(l))
  4. 计算最终需要的偏导数值:
    W(l)J(W,b;x,y)=δ(l+1)(a(l))T,b(l)J(W,b;x,y)=δ(l+1).∇W(l)J(W,b;x,y)=δ(l+1)(a(l))T,∇b(l)J(W,b;x,y)=δ(l+1).

最后说明一点,BP传播,计算各层的各点的残差是关键,残差是总的代价函数对于该点的net的偏导,从倒数第二层开始,求残差就要用到其后面的一层的各个残差,只要用后面一层的各个结点残差乘以其与这一层这个的结点所连接的权值,再求和,最后乘以这一层这个结点的out对net的偏导就可以了。如此一来,残差乘以这个结点的输入,就可以得到整个代价函数对于这个结点的w偏导了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值