DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
介绍 DeepLearning课程总共五大章节,该系列笔记将按照课程安排进行记录。 另外第一章的前两周的课程在之前的Andrew Ng机器学习课程笔记(博客园)&Andrew Ng机器学习课程笔记(CSDN)系列笔记中都有提到,所以这里不再赘述。 另外本系列课程也设有Jupyter Notebook形式练手项目,具体的可跳转至Coursera深度学习(DeepLearning.ai)课程习题--Python学习。
1、神经网络概要
注意:这一系列的课程中用中括号表示层数,例如(a^{[1]})表示第二层(隐藏层)的数据。
2、神经网络表示
这个图的内容有点多,跟着下面的步骤来理解这个图吧:
- 首先看蓝色字体,这个2层的神经网络(输入层一般理解成第0层)有输入层(input layer)、隐藏层(Hidden layer)、输出层(output layer)组成
- 再看紫色字体,每一层用(a^{[i]}, i=0,1...n)表示,(a^{[0]})表示输入层的所有数据。而下标则表示某一层的某一行的具体的数据,例如(a^{[1]}_1)表示隐藏层的第一个元素。
- 最后是绿色字体,介绍的分别是(w)(权重)和(b)(偏置),其中(w^{[1]})表示输入层到隐藏层的权重,其是(4,3)的矩阵,而(b^{[1]})是(4,1)的矩阵。
3、计算神经网络的输出
这个比较简单就不做过多解释了,主要就是线性代数的知识。
4、多个例子中的向量化
还是以上面的神经网络为模型进行介绍,向量化过程如下: for i in range(m): (quad quad z^{[1](i)}=W^{[1]}x^{(i)}+b^{[1]}) (quad quad a^{[1](i)}=σ(z^{[1](i)})) (quad quad z^{[2](i)}=W^{[2]}x^{(i)}+b^{[2]}) (quad quad a^{[2](i)}=σ(z^{[2](i)}))
5、向量化实现的解释
上一节中使用了for循环和矩阵向量机,这里可以更加彻底地向量化,让运算更加简单,如下: (Z^{[1]}=W^{[1]}X+b^{[1]}) (A^{[1]}=σ(Z^{[1]})) (Z^{[2]}=W^{[2]}X+b^{[2]}) (A^{[2]}=σ(Z^{[2]}))
6、激活函数
常用的一共四个激活函数
- (1): (σ(z)=frac{1}{1+e^{-z}}),一般只用在二元分类的输出层,因为二元分类一般要求输出结果(y∈{0,1}),而σ函数刚好其阈值就在0,1之间。而其它层更加建议用其他的激活函数。所以一个神经网络可以使用多种激活函数(用(g^{[i]})表示第i层的激活函数)
- (2): (tanh(z) = frac{e^z-e^{-z}}{e^z+e^{-z}}),上下界限分别是1,-1。它相比于(σ(z))表现更好的原因是因为它的均值在0附近,有数据中心化的效果,所以下一层在学习的时候要更加方便和快速。但是(σ(z))和(tanh(z))有一个共同的缺点,就是当z很大或很小的时候,它们的斜率就会趋向于0,这会使得梯度下降的学习速率降低。
- (3): ReLu(The Rectified Linear Unit) 表达式是(f(x)=max(0,x)),它表现的效果是最好的,所以在不确定使用何种激活函数的时候就可以不顾一切的选择它~(难道这就是传说中的备胎?)
相比sigmoid和tanh函数,Relu激活函数的优点在于:
- 梯度不饱和。梯度计算公式为:1{x>0}。因此在反向传播过程中,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。
- 计算速度快。正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值。如果x<0,f(x)=0,如果x>0,f(x)=x。加快了正向传播的计算速度。 因此,Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍
- (4): Leaky Relu,你也许发现了Relu激活函数在当z小于0的时候导数为0,虽然这在实践中并不影响,但是为了进一步优化提出了Leaky Relu,在z小于0时导数不为0.表达式一般为(f(x)=max(0.01x,x))。其中0.01是一个可调的参数,类似于学习步长α。
7、为什么需要非线性激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与只有一个隐藏层效果相当,这种情况就是多层感知机(MLP)了。 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。
8、激活函数的导数
- (σ'(z)=σ(z)(1-σ(z)))
- (tanh'(z)=1-(tanh(z))^2)
-
Relu:
- (Relu'(z) =1 when z≥0;)
- (Relu'(z) = 0 when z<0)
9、神经网络的梯度下降法
10、直观理解反向传播
9、10节的内容都是介绍的神经网络的计算过程,更加详细的可以参看Andrew Ng机器学习课程笔记--week5(上)(神经网络损失函数&反向传播算法)
11、随机初始化
在神经网络中,如果将参数全部初始化为0 会导致一个问题,例如对于上面的神经网络的例子,如果将参数全部初始化为0,在每轮参数更新的时候,与输入单元相关的两个隐藏单元的结果将是相同的,既:
(a_1^{(2)}=a_2^{(2)})这个问题又称之为对称的权重问题,因此我们需要打破这种对称,这里提供一种随机初始化参数向量的方法: 初始化(θ_{ij}^{(l)})为一个落在 [-ε,ε]区间内的随机数, 可以很小,但是与上面梯度检验( Gradient Checking)中的ε没有任何关系。
更加详细的介绍可参看Andrew Ng机器学习课程笔记--week5(下)(梯度检测&BP随机初始化)
- Enterprise Library 4.1学习笔记7----缓存应用程序块之SqlDependency
- linux运维中的命令梳理(一)
- 可视化你的BLAST结果
- linux运维中的命令梳理(二)
- VB-取日期属于星期几
- 全球AI新闻创新实践系列③:华邮、雅虎、美联社、Quartz怎么干!
- nginx+php负载均衡集群环境中的session共享方案梳理
- PowerPoint发布及链接图片的处理
- EXCEL单元格的引用方式
- SqlDependency学习笔记
- linux系统下对网站实施负载均衡+高可用集群需要考虑的几点
- 运维利器-ClusterShell集群管理操作记录
- img标签的src=""会引起的Page_Load多次执行
- 2017影响扑克圈的黑暗事件
- 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 数组属性和方法
- android自定义加减按钮
- php链式操作的实现方式分析
- php中的依赖注入实例详解
- Android通知栏前台服务的实现
- Laravel 默认邮箱登录改成用户名登录的实现方法
- Android Studio实现简单计算器APP
- 基于PHP实现微信小程序客服消息功能
- python gstreamer实现视频快进/快退/循环播放功能
- php tpl模板引擎定义与使用示例
- ThinkPHP5&5.1框架关联模型分页操作示例
- Android实现简易计算器(可以实现连续计算)
- PHP实现提高SESSION响应速度的几种方法详解
- ThinkPHP5.1框架数据库链接和增删改查操作示例
- 新版Flutter集成到已有Android项目的实现
- PHP基于session.upload_progress 实现文件上传进度显示功能详解