书上的图5.7介绍了神经网络的结构

但是图过于简单,对于推导公式很不利,很难理解,我对原图做了一些修改和扩展,方便大家理解

首先看下图上的一些标记说明
- 1.共三层神经元,i层(共I个神经元),j层(共J个神经元),k层(共K个神经元),可以理解为i层是输入层,k层是输出层,j层是隐藏层
- 2.所有上标记号指的是哪一层,比如zj1,表示是第j层的第一个神经元
- 3.所谓神经元具体表示的是一个数,比如zj1表示的是某个具体的数值
- 4.w代表的是权重,上标指的是哪两层之间的权重,下标指的是对应的这两层的具体哪个编号的神经元,比如wji12指的是zi2到zj1两个神经元之间的权重
- 5.从一层神经元到下一层神经元,都要经过一次线性变换,公式5.48,j到k层的a的写法已经标示在图上
- 6.经过线性变化a后,还有做一次激活函数h,公式5.49,标示如图
开始推导
现在的目标时对每个w求出梯度,类似线性回归那样求出梯度,用梯度下降法求解
假设现在的问题目标是对wkj12求导
即求∂Enwkj12
根据公式5.50的链式法则注意,这里用的是线性激活函数,如果是sigmoid激活函数,这里的链式法则要增加对激活函数h的链式求导
∂En∂wji=∂En∂aj∂aj∂wji(5.50)
∂Enwkj12=∂En∂a(k)1∂a(k)1∂wkj12
引入记号(公式5.51)
δj≡∂En∂aj(5.51)
记δk1≡∂En∂a(k)1,δ通常被用来标记误差
然后链式法则后面那一项根据公式
∂aj∂wji=zi(5.52)
有∂a(k)1∂wkj12=J∑n=1wkj1nz(j)1∂wkj12=z(j)1
继续书上的推导,把式(5.51)(5.52)代入式(5.50),可以得到
∂En∂wji=δjzi(5.53)
这里我们得到
∂Enwkj12=δk1z(j)2
这里k层的δ值是容易算的,有公式(这个公式推导不展开了,可以看下标准链接函数4.3.6章节,和公式5.18),结论就是只要是指数分布都有这个公式,比如高斯分布−平方和误差函数,二项分布−sigmoid函数,多项式分布−softmax函数
δk=yk−tk(5.54)
走到这里我们已经可以计算所有k层的w的梯度了
然后往前推,计算j层的w的梯度
引入链式法则,公式5.50
∂En∂wji=∂En∂aj∂aj∂wji(5.50)
以计算wji12为例,为
∂En∂wji12=∂En∂a(j)1∂a(j)1∂wji12
上链式法则的后面容易计算,根据公式5.52
∂a(j)1∂wji12=z(i)2
前一项
∂En∂a(j)1
再次使用链式法则,有公式5.55
δj≡∂En∂aj=∑k∂En∂ak∂ak∂aj(5.55)
也就是误差对j层的梯度,通过链式法则,引入k层
引入k层这一步的想法也是很自然的,因为神经网络本来就是不断“前馈”产生的,参看公式5.9
yk(x,w)=σ(M∑j=0w(2)kjh(D∑i=0w(1)jixi))(5.9)
在我们的推导中5.55改写成如下
∂En∂a(j)1=K∑n=1∂En∂a(k)n∂a(k)n∂a(j)1
注意一下,这里从误差函数En到a(j)1中间会经过所有的k层的神经元,所以这里是一个加和操作
=∂En∂a(k)1∂a(k)1∂a(j)1+∂En∂a(k)2∂a(k)2∂a(j)1+...+∂En∂a(k)K∂a(k)K∂a(j)1
因为有5.51式,所有项的左半边记为δ(k)1,因为5.48,右半边记为∂J∑m=1wkjnmz(j)m∂a(j)1
=δ(k)1∂J∑m=1wkj1mz(j)m∂a(j)1+δ(k)2∂J∑m=1wkj2mz(j)m∂a(j)1+...+δ(k)K∂J∑m=1wkjKmz(j)m∂a(j)1
整理合并
=K∑n=1δ(k)n∂J∑m=1wkjnmz(j)m∂a(j)1
套用5.49式
=K∑n=1δ(k)n∂J∑m=1wkjnmz(j)m∂a(j)1
根据图中的公式有zjJ=h(a(j)J)
=K∑n=1δ(k)n∂J∑m=1wkjnmh(a(j)m)∂a(j)1
这里只有m=1的时候偏导有意义
=K∑n=1δ(k)n∂wkjn1h(a(j)1)∂a(j)1
=K∑n=1δ(k)nwkjn1h′(a(j)1)
=h′(a(j)1)K∑n=1δ(k)nwkjn1
得到了公式 5.56
δj=h′(aj)∑kwkjδk(5.56)
总结算法
于是,反向传播算法可以总结如下:
- 对于网络的一个输入向量n,使用式(5.48)(5.49)进行正向传播,找到所有隐含单元和输出单元的激活。
- 使用式(5.54)计算所有输出单元的δk。
- 使用式(5.56)反向传播δ,获得网络中所有隐含单元的δj。
- 使用式(5.53)计算导数。

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~