神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)
深层神经网络(Deep L-layer neural network)
复习下前面的内容:
1.逻辑回归,结构如下图左边。一个隐藏层的神经网络,结构下图右边:

注意,神经网络的层数是这么定义的:从左到右,由0开始定义,比如上边右图,\({x}_{1}\)、\({x}_{2}\)、\({x}_{3}\),这层是第0层,这层左边的隐藏层是第1层,由此类推。如下图左边是两个隐藏层的神经网络,右边是5个隐藏层的神经网络。

严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。记住以下要点:
有一个隐藏层的神经网络,就是一个两层神经网络。记住当算神经网络的层数时,不算输入层,只算隐藏层和输出层。
但是在过去的几年中,DLI(深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用开发集来评估。
再看下深度学习的符号定义:

上图是一个四层的神经网络,有三个隐藏层。可以看到,第一层(即左边数过去第二层,因为输入层是第0层)有5个神经元数目,第二层5个,第三层3个。
用L表示层数,上图:\(L=4\),输入层的索引为“0”,第一个隐藏层\({n}^{[1]}=5\),表示有5个隐藏神经元,同理\({n}^{[2]}=5\),\({n}^{[3]}=3\),\({{n}^{[4]}}\)=\({{n}^{[L]}}=1\)(输出单元为1)。而输入层,\({n}^{[0]}={n}_{x}=3\)。
在不同层所拥有的神经元的数目,对于每层l都用\({a}^{[l]}\)来记作l层激活后结果,会在后面看到在正向传播时,最终能会计算出\({{a}^{[l]}}\)。
通过用激活函数 \(g\) 计算\({z}^{[l]}\),激活函数也被索引为层数\(l\),然后用\({w}^{[l]}\)来记作在l层计算\({z}^{[l]}\)值的权重。类似的,\({{z}^{[l]}}\)里的方程\({b}^{[l]}\)也一样。
最后总结下符号约定:
输入的特征记作\(x\),但是\(x\)同样也是0层的激活函数,所以\(x={a}^{[0]}\)。
最后一层的激活函数,所以\({a}^{[L]}\)是等于这个神经网络所预测的输出结果。
前向传播和反向传播
- 之前的神经网络入门篇都是基于浅层神经网络进行的,此篇开始基于深层神经网络进行
之前学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个相反的反向传播步骤,这次讲讲如何实现这些步骤。
先讲前向传播,输入\({a}^{[l-1]}\),输出是\({a}^{[l]}\),缓存为\({z}^{[l]}\);从实现的角度来说可以缓存下\({w}^{[l]}\)和\({b}^{[l]}\),这样更容易在不同的环节中调用函数。

所以前向传播的步骤可以写成: \({z}^{[l]}={W}^{[l]}\cdot{a}^{[l-1]}+{b}^{[l]}\)
\({{a}^{[l]}}={{g}^{[l]}}\left( {{z}^{[l]}}\right)\)
向量化实现过程可以写成: \({z}^{[l]}={W}^{[l]}\cdot {A}^{[l-1]}+{b}^{[l]}\)
\({A}^{[l]}={g}^{[l]}({Z}^{[l]})\)
前向传播需要喂入\({A}^{[0]}\)也就是\(X\),来初始化;初始化的是第一层的输入值。\({a}^{[0]}\)对应于一个训练样本的输入特征,而\({{A}^{[0]}}\)对应于一整个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
下面讲反向传播的步骤:
输入为\({{da}^{[l]}}\),输出为\({{da}^{[l-1]}}\),\({{dw}^{[l]}}\), \({{db}^{[l]}}\)

所以反向传播的步骤可以写成:
(1)\(d{{z}^{[l]}}=d{{a}^{[l]}}*{{g}^{[l]}}'( {{z}^{[l]}})\)
(2)\(d{{w}^{[l]}}=d{{z}^{[l]}}\cdot{{a}^{[l-1]}}~\)
(3)\(d{{b}^{[l]}}=d{{z}^{[l]}}~~\)
(4)\(d{{a}^{[l-1]}}={{w}^{\left[ l \right]T}}\cdot {{dz}^{[l]}}\)
(5)\(d{{z}^{[l]}}={{w}^{[l+1]T}}d{{z}^{[l+1]}}\cdot \text{ }{{g}^{[l]}}'( {{z}^{[l]}})~\)
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
(6)\(d{{Z}^{[l]}}=d{{A}^{[l]}}*{{g}^{\left[ l \right]}}'\left({{Z}^{[l]}} \right)~~\)
(7)\(d{{W}^{[l]}}=\frac{1}{m}\text{}d{{Z}^{[l]}}\cdot {{A}^{\left[ l-1 \right]T}}\)
(8)\(d{{b}^{[l]}}=\frac{1}{m}\text{ }np.sum(d{{z}^{[l]}},axis=1,keepdims=True)\)
(9)\(d{{A}^{[l-1]}}={{W}^{\left[ l \right]T}}.d{{Z}^{[l]}}\)
总结一下:

第一层可能有一个ReLU激活函数,第二层为另一个ReLU激活函数,第三层可能是sigmoid函数(如果做二分类的话),输出值为,用来计算损失;这样就可以向后迭代进行反向传播求导来求\({{dw}^{[3]}}\),\({{db}^{[3]}}\) ,\({{dw}^{[2]}}\) ,\({{db}^{[2]}}\) ,\({{dw}^{[1]}}\) ,\({{db}^{[1]}}\)。在计算的时候,缓存会把\({{z}^{[1]}}\) \({{z}^{[2]}}\)\({{z}^{[3]}}\)传递过来,然后回传\({{da}^{[2]}}\),\({{da}^{[1]}}\) ,可以用来计算\({{da}^{[0]}}\),但不会使用它,这里讲述了一个三层网络的前向和反向传播,还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用Logistic回归做二分类)——对\({{A}^{[l]}}\) 求导。
忠告:补补微积分和线性代数,多推导,多实践。
神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)的更多相关文章
- Farseer.net轻量级开源框架 入门篇:添加数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
- Farseer.net轻量级开源框架 入门篇:删除数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...
- Farseer.net轻量级开源框架 入门篇:查询数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...
- 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)
本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...
- SaltStack 入门到精通第三篇:Salt-Minion配置文件详解
SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ 发布日期:2014-06-09 17:52:16 ##### 主要配置设置 ##### 配置 默认值 ...
- SaltStack 入门到精通第二篇:Salt-master配置文件详解
SaltStack 入门到精通第二篇:Salt-master配置文件详解 转自(coocla):http://blog.coocla.org/301.html 原本想要重新翻译salt-mas ...
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- Mysql高手系列 - 第19篇:mysql游标详解,此技能可用于救火
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第19篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
随机推荐
- 搭建rsyncd服务
前言 rsync常用来做文件传输和同步.本文示例中客户端通过rsync同步服务端的/home/tmp目录到本地(不是将客户端的文件同步到服务端). 环境信息 IP 系统版本 rsync版本 说明 19 ...
- 合宙ESP32C3使用PlatformIO开发点亮ST7735S
开发背景 模块使用的合宙的ESP32-C3(经典款) 购买连接 CORE ESP32核心板是基于乐鑫ESP32-C3进行设计的一款核心板,尺寸仅有21mm*51mm,板边采用邮票孔设计,方便开发者在不 ...
- Flutter 学习笔记(01)__从 0 开始创建一个 flutter 项目
最近发现有不少的公司已经跳出 uniapp 的坑坑,开始使用 flutter 开发app了,为了让自己不失业,赶紧卷起来!此篇文章教你从 0 基础开发一个 简单页面,文章篇幅较长,建议收藏!也可以直接 ...
- 知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表
删除数据库中以往的图 MATCH (n) DETACH DELETE n 创建节点 CREATE命令语法 Neo4j CQL"CREATE"命令用于创建没有属性的节点. 它只是创建 ...
- AI绘画StableDiffusion:云端在线版免费使用笔记分享-Kaggle版
玩AI绘画(SD),自己电脑配置不够?今天给大家介绍一下如何baipiao在线版AI绘画StableDiffusion. Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源,可帮助您实现数 ...
- ThreadLocal:线程中的全局变量
最近接了一个新需求,业务场景上需要在原有基础上新增2个字段,接口新增参数意味着很多类和方法的逻辑都需要改变,需要先判断是否属于该业务场景,再做对应的逻辑.原本的打算是在入口处新增变量,在操作数据的时候 ...
- 【matplotlib基础】--图例
Matplotlib 中的图例是帮助观察者理解图像数据的重要工具.图例通常包含在图像中,用于解释不同的颜色.形状.标签和其他元素. 1. 主要参数 当不设置图例的参数时,默认的图例是这样的. impo ...
- KMP字符串对比算法及next数组计算
(注:该贴主要运用python实现该算法) 先谈谈KMP算法吧.KMP算法的全称是Knuth-Morris-Pratt 算法,它是用来进行字符串查找,即在某个主字符串里面找到某个特定子字符串.但是好像 ...
- 解密Linux中的通用块层:加速存储系统,提升系统性能
通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响.它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提 ...
- 文心一言 VS 讯飞星火 VS chatgpt (90)-- 算法导论8.3 3题
三.用go语言,利用归纳法来证明基数排序是正确的.在你所给出的证明中,在哪里需要假设所用的底层排序算法是稳定的? 文心一言: 基数排序是一种非比较型整数排序算法,其通过在每一位上进行比较来排序.基数排 ...