当前位置: 首页 > news >正文

【深度学习:CNN】BP算法

转载:http://blog.csdn.net/hungryof/article/details/50436231

一、预先说明

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

二、字母说明

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

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

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

  • δ(l)i : 叫做“残差”,这里表示第 l 层的第 i 个节点的残差。这个非常重要,残差的定义就是——总的代价函数对于某个节点的“net”的偏导。注意的是这里的“net”指的是W*x+b这样的函数结构。可以这样看网络: 
     
    现在只需要看每个结点是如何处理数据的。不要看箭头,可以看到,h1和h2再加上“1”共三个结点输入,构成输入 x⃗  , 而相应的权值 W⃗  w5 , w6 , b2 , 也就是说  W⃗ x⃗  就是这里的“net”,然后“out”是指激活后的值,就是 f(net) 残差就是 Enet ,*不是 Eout 哦!

三、BP算法细节

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

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

δ(l)i=J(W,b;x,y)z(l)i=z(l)i12yhW,b(x)2=(yia(l)i)f(z(l)i)

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

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

δ(l)i=j=1sl+1W(l)jiδ(l+1)jf(z(l)i)

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

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

W(l)ijJ(W,b;x,y)=a(l)jδ(l+1)ib(l)iJ(W,b;x,y)=δ(l+1)i

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

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

J(W,b;x,y)w(l)ij=J(W,b;x,y)outioutinetinetiwij

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

注意,第 l+1 层的 netiwij 就是该层的输入,也就是第 l 层的输出 a(l)j .

最后一个问题,为啥

δ(l)i=j=1sl+1W(l)jiδ(l+1)jf(z(l)i)
呢?

δ(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)jf(z(l1)i)

慢慢看,看懂问题不大。

四、编码

  1. 进行前馈传导计算,利用前向传导公式,得到  L2,L3,  直到输出层  Ll  的激活值。
  2. 对输出层(第  l 层),计算:
    δ(nl)=(ya(nl))f(z(nl))
  3. 对于 l=nl1,nl2,nl3,,2  的各层,计算:
    δ(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).

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


相关文章:

  • 【深度学习:CNN】Deep Learning模型之CNN
  • 【深度学习:caffe】Caffemodel解析
  • 有错误代码,只是借鉴以下编程思想
  • 【pycharm 教程】(一)安装和首次使用
  • 【Pycharm教程】(二)设置字体大小
  • 【Pycharm教程】(三)第一个代码Hello world!
  • 【PyCharm 教程】(四)显示行号
  • 【PyCharm 教程】(五)断点 调试
  • 【PyCharm 教程】(六)自定义文件模板
  • 【PyCharm 教程】(七)管理解释器及第三方模块、包
  • 【Bug-python】IndexError: list index out of range
  • 【深度学习:CNN】如何高效的通过BP算法来训练CNN
  • 【VC++DLL动态链接库编程】DLL动态链接库的原理讲解(2)
  • 【VC++DLL动态链接库编程】VC++静态库编译(3)
  • 【VC++DLL动态链接库编程】DLL动态链接库创建(4)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 0基础学习移动端适配
  • iOS编译提示和导航提示
  • k8s 面向应用开发者的基础命令
  • 程序员最讨厌的9句话,你可有补充?
  • 分享几个不错的工具
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聚类分析——Kmeans
  • k8s使用glusterfs实现动态持久化存储
  • ​520就是要宠粉,你的心头书我买单
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (42)STM32——LCD显示屏实验笔记
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)Knockout 创建自定义绑定
  • (循环依赖问题)学习spring的第九天
  • . Flume面试题
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Core和.Net Standard直观理解
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET中 MVC 工厂模式浅析
  • .net中我喜欢的两种验证码
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • ::什么意思
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @ModelAttribute注解使用
  • @SuppressWarnings(unchecked)代码的作用
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [BT]BUUCTF刷题第9天(3.27)
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++提高编程](三):STL初识
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [CTO札记]盛大文学公司名称对联
  • [DAX] MAX函数 | MAXX函数
  • [dfs] 图案计数