DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络
一、深层神经网络
深层神经网络的符号与浅层的不同,记录如下:
- 用(L)表示层数,该神经网络(L=4)
- (n^{[l]})表示第(l)层的神经元的数量,例如(n^{[1]}=n^{[2]}=5,n^{[3]}=3,n^{[4]}=1)
- (a^{[l]})表示第(l)层中的激活函数,(a^{[l]}=g^{[l]}(z^{[l]}))
二、前向和反向传播
1. 第(l)层的前向传播
输入为 (a^{[l-1]}) 输出为 (a^{[l]}), cache((z^{[l]}))
矢量化表示: [Z^{[l]}=W^{[l]}·A^{[l-1]}+b^{[l]}] [A^{[l]}=g^{[l]}(Z^{[l]})]
2. 第(l)层的反向传播
输入为 (da^{[l]}) 输出为 (da^{[l-1]},dW^{[l]},db^{[l]})
计算细节: [dz^{[l]}=da^{[l]}*g^{[l]'}(z^{[l]})] [dw^{[l]}=dz^{[l]}*a^{[l-1]}] [db^{[l]}=dz^{[l]}] [da^{[l-1]}=w^{[l]^T}·dz^{[l]}] [dz^{[l]}=w^{[l+1]^T}dz^{[l+1]}*g^{[l]'}(z^{[l]})]
矢量化表示: [dZ^{[l]}=dA^{[l]}*g^{[l]'}(z^{[l]})] [dw^{[l]}=frac{1}{m}dz^{[l]}·A^{[l-1]^T}] [db^{[l]}=frac{1}{m}np.sum(dz^{[l]},axis=1,keepdim=True)] [dA^{[l-1]}=w^{[l]^T}·dz^{[l]}]
3. 总结
前向传播示例
反向传播
更清晰的表示:
三、深层网络中的前向传播
四、核对矩阵的维数
这节的内容主要是告诉我们如何知道自己在设计神经网络模型的时候各个参数的维度是否正确的方法。其实我自己在写代码的时候都得这样做才能有信心继续往下敲键盘,2333。
还是以这个神经网络为例,各层神经网络节点数为(n^{[0]}=3,n^{[1]}=n^{[2]}=5,n^{[3]}=3,n^{[4]}=1)。
先确定(W^{[1]})的维度: 已知(Z^{[1]}=W^{[1]}·X+b^{[1]}),很容易知道(Z^{[1]}∈R^{5×1},X∈R^{3×1}),(b^{[1]})其实不用计算就知道其维度与(Z)是相同的,即(b^{[1]}∈R^{5×1})。根据矩阵内积计算公式可以确定(W^{[1]}∈R^{5×3})。 其他层同理,不再赘述。
五、为什么使用深层表示
为什么要使用深层表示?
下面就从直观上来理解深层神经网络。
如上图所示是一个人脸识别的过程,具体的实现步骤如下:
- 1.通过深层神经网络首先会选取一些边缘信息,例如脸形,眼框,总之是一些边框之类的信息(我自己的理解是之所以先找出边缘信息是为了将要观察的事物与周围环境分割开来),这也就是第一层的作用。
- 2.找到边缘信息后,开始放大,将信息聚合在一起。例如找到眼睛轮廓信息后,通过往上一层汇聚从而得到眼睛的信息;同理通过汇聚脸的轮廓信息得到脸颊信息等等
- 3.在第二步的基础上将各个局部信息(眼睛、眉毛……)汇聚成一张人脸,最终达到人脸识别的效果。
六、搭建深层神经网络块
上图表示单个神经元的前向和反向传播算法过程。
- 前向 输入(a^{[l-1]}),经过计算(g^{[l]}(w^{[l]}·a^{[l-1]}+b^{[l]}))得到(a^{[l]})
- 反向 计算(da^{[l]}),然后反向作为输入,经过一系列微分运算得到(dw^{[l]},db^{[l]})(用来更新权重和偏差),以及上一层的(da^{[l-1]})。
推广到整个深层神经网络就如下图所示:
祭上神图:
七、参数 vs 超参数
- 参数 常见的参数即为(W^{[1]},b^{[1]},W^{[2]},b^{[2]}……)
-
超参数
- learning_rate: (α)
- iterations(迭代次数)
- hidden layer (隐藏层数量(L))
- hidden units (隐藏层神经元数量(n^{[l]}))
- 激活函数的选择
- minibatch size
- 几种正则化的方法
- momentum(动力、动量)后面会提到
八、这和大脑有什么关系
主要就是说神经网络和人的大脑运行机理貌似很相似,blabla。。。
- SQL Server 深入解析索引存储(下)
- 2751: [HAOI2012]容易题(easy)
- codevs3002 石子归并 3
- 算法模板——计算几何2(二维凸包——Andrew算法)
- 算法模板——splay区间反转 2
- 算法模板——Dinic网络最大流 2
- 1935: [Shoi2007]Tree 园丁的烦恼
- 1339 / 1163: [Baltic2008]Mafia
- 4010: [HNOI2015]菜肴制作
- 4052: [Cerc2013]Magical GCD
- ElasticSearch搜索引擎在SpringBoot中的实践
- 2292: 【POJ Challenge 】永远挑战
- 四边形不等式优化DP
- 4063: [Cerc2012]Darts
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?
- 简析Spark Streaming/Flink的Kafka动态感知
- 微信小程序开发实战(19):页面导航
- Kotlin:02-函数的声明
- 「MoreThanJava」Day 5:面向对象进阶—继承详解
- 要点1:指针、数组和复合字面量
- akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
- com-IFileDlg 进行文件的 打开或者保存
- 哆啦A梦?不好记!安利一下Prometheus这款开源的企业监控报警平台
- Kotlin:03-变量、常量、数据类型
- nginx工程师,需要上承天命,下召九幽
- 新版视频流媒体平台EasyNVR如何在前端显示当前页面所在位置?
- Kotlin:04-基本数据类型详细介绍
- Kotlin:05-控制流 if、when、for、while
- android: API24 及以上版本调用系统相机时报:FileUriExposedException 的解决