Course 1-Neural Network & Deep Learning

本节课包括深度学习的一些基础知识,如什么是神经网络,激活函数,梯度下降法,向量化操作,前向传播和后向传播等等。

1.2 What is a neural network?

“深度学习”一词指的是训练神经网络,有时候是非常大的神经网络。那么,神经网络到底是什么呢?
以房价预测为例,假设我们有6组关于房屋面积-房价的数据,如下图所示,用线性函数拟合这组数据,又因为我们知道房价永远不可能为负,因此,当函数小于0时,我们设其为0。我们将这个线性函数称为一个神经元,输入为房屋大小,输出为房价。这是最简单的神经网络,它只有一个神经元。当我们把多个神经元像搭乐高积木那样堆叠起来,就会形成更大更复杂的神经网络。
这里写图片描述
如果在预测房价的时候,我们不仅仅使用房屋面积,还使用卧室数量、邮政编码、富裕程度等特征,如下图所示,综合这些因素,我们可以为房价进行评估。神经网络的神奇之处就在于,我们只需要给定输入X和输出Y,中间的过程它都能自己完成。
这里写图片描述

1.3 Supervised learning with neural networks

有监督学习的一些应用,如下图所示
这里写图片描述
结构化数据和非结构化数据。结构化数据指的是那些存储在数据库中的数据。非结构化数据则指图片、视频、语音、文本等数据。多亏了深度学习和神经网络,计算机现在能更好的解释非结构化数据。

1.4 Why is deep learning taking off?

如下图所示,要达到绿线上的黑点所示的性能,要满足两个条件:一个是拥有非常大规模的神经网络;另一个是非常大规模的数据集。而当数据量比较小的时候,神经网络的性能并不一定优于传统机器学习方法,这取决于传统机器学习方法中手工组件的性能。
这里写图片描述
在深度学习早期,神经网络的发展主要取决于数据规模和计算规模,但是近几年,算法方面的创新也能促进神经网络的性能提升。其中一个就是从sigmoid激活函数到relu激活函数的转换。因为,对于sigmoid激活函数来说,当输入较大的时候,sigmoid激活函数的梯度近似为0,这样就形成了“梯度消失”问题,导致模型训练变慢。但是,换做使用relu激活函数后就不存在“梯度消失”的问题了,保证了梯度下降的速度,进而保证了模型的学习速度。
快速计算重要的另外一个原因是,我们在构造神经网络时,有时候都是比较“盲目”的,我们需要先构造一个网络,让它跑起来,再根据实验结果进行针对性的改造。快速计算有助于我们加速这个迭代步骤,加快我们构造模型、改造模型。
这里写图片描述

2.1 二分类

本周将以logistic regression为例,学习神经网络编程的基础知识。以下是logistic regression中涉及的标记方式。
这里写图片描述

2.2 logistic regression

逻辑回归是个二分类器。给定输入X,输出是1的概率。由于输出是个介于0-1之间的概率值,因此,我们必须将输入的线性组合再经过一个“压缩函数”sigmoid,压缩到0-1的范围内。
这里写图片描述

2.3 logistic regression的代价函数

上一小节已经介绍了逻辑回归,为了训练逻辑回归的参数W和b,我们还必须定义一个代价函数。其中一种可选择的方式是将其定义为预测标签和真实标签的差的平方的二分之一,但在逻辑回归中,人们通常不这么做,因为在参数优化的时候,这种代价函数会将优化问题转换成非凸函数,我们会的得到很多局部最优解,这样我们无法找到全局最优解。因此,在逻辑回归问题中,我们采用最大似然估计方法,使

L(y^,y)=(ylogy^+(1y)log(1y^))

同样的,我们希望上式结果越小越好,损失函数是针对一个训练样本的,对于整个训练集来说,我们需要定义代价函数
J(W,b)=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]

损失函数只适用于单个的训练样本,而代价函数是参数W和b在整个训练集上的代价。
这里写图片描述

2.4 梯度下降

了解了逻辑回归模型、了解了损失函数和代价函数,现在我们来学习如何用梯度下降法来学习或训练参数W和b。由于代价函数是关于W和b的凸函数,因此,无论初始化值是什么,我们都可以得到全局最优值。
这里写图片描述

这里写图片描述

2.5和2.6

讲了1次函数和3次函数的求导,都是单边导数。后面的梯度检验使用的是双边导数。

2.7和2.8

计算图及其导数计算,只需要理解好求导的链式法则就好。
这里写图片描述

这里写图片描述

2.9 逻辑回归中的梯度下降法

一个样本的梯度下降法:
这里写图片描述
m个样本的梯度下降法:
这里写图片描述
从下图可以看出,我们需要for循环来一个个的读取样本,这样的处理方式很低效,向量化方法可以让我们高效的进行深度学习计算。
这里写图片描述

2.10 2.11 2.12

向量化计算可以加快计算速度,主要借助于numpy中的内建函数实现。

2.13 向量化逻辑回归

首先,把样本如下图所示堆叠起来,形成一个 (nx,m) 的矩阵,然后,我们只需要一步计算,就可以得到所有样本的z值。
这里写图片描述

这里写图片描述

2.14 避免python\numpy中的一些坑

  • 秩为1的数组
    它既不是行向量,也不是列向量。因此,它的转置和它自身一样。将它的转置和它自身相乘后,并不会得到一个方阵,而是得到一个数字。因此,在编写代码时,不要使用这种结构,每次再定义时,就把数组定义成二维的。
  • 当做了一些操作不太确定数组的形状的时候,就用assert判断一下
  • 当确实得到一个秩为1 的数组时,就用reshape将其变为一个二维数组。

2.17 损失函数的解释

我们已经知道,逻辑回归的输出是输入为标签1的概率,那么,当输入的标签为0的概率就是 1y^ 。怎样把这两种情况整合成一个概率表达式呢,如下图红框所示。又由于幂运算很难优化,而对数函数却能将幂运算转化为乘法,将乘法转化为加法,因此,我们把概率函数转化为对数函数。我们是希望每类出现的概率尽可能大的(最大似然估计),而优化的时候,是希望得到最小值,因此,我们在对数似然函数的前面再加一个负号,从而将优化问题转化为一个最小值问题。
这里写图片描述
对于m个样本来说,就是将m个结果的概率进行相乘,同样的,我们希望概率最大,但由于要最小化代价函数,因此,将概率值前面加负号后,将问题转化为最小化问题,同时还要乘以m分之1。
这里写图片描述

3.1 神经网络概览

神经网络前向和后向的计算流程如下图所示。
这里写图片描述

3.2 神经网络表示

如下图所示,可将神经网络分为输入层、隐藏层、输出层。其中,隐藏层之所以称为隐藏层,是因为其结果是看不见的。一般在计算层数时,都不考虑输入层,因此,把输入层称为第0层。隐藏层和输出层都是带有参数的,如下图中绿色笔迹所示。
这里写图片描述

3.3 计算神经网络输出

如下图所示,前面也提到过,神经网络中的每个神经元其实表示了两步计算:第一步计算z,第二步计算a。因此,神经网络就是不断重复这样的计算。
这里写图片描述
下图给出了隐藏层中第一个和第二个隐藏单元的计算过程。
这里写图片描述
下图给出了向量化实现的雏形。
这里写图片描述
下图给出了对单个输入向量化实现的过程。
这里写图片描述

3.4 多样本向量化

这里写图片描述

3.5 向量化实现的解释

这里写图片描述

这里写图片描述

3.6 激活函数

到目前为止,激活函数我们一直使用的是sigmoid函数,但有一个激活函数,它几乎一直表现比sigmoid函数好,那就是tanh函数。tanh函数可以实现数据中心化操作,使得下一层的学习更加容易。要记住一点的是,Ng几乎已经不用sigmoid激活函数了,tanh激活函数几乎在所有场合都比sigmoid函数性能优越。一个例外是输出层,因为输出为0或者1,所以在二分类的时候会用sigmoid激活函数作为输出层的激活函数,不同层可以有不同的激活函数,如下图所示,隐藏层用tanh,输出层用sigmoid。但是,无论sigmoid还是tanh,都有一个缺点:当z非常大或者非常小的时候,梯度都很小,这样会使梯度下降的速度减慢。因此,在机器学习中一个比较受欢迎的选择就是relu,如绿框中所示。要注意的是,该函数在z=0处没有定义。relu的缺点是,当z<0时,导数为0,为此,出现了一种leaky relu。无论是relu还是leaky relu都会加快学习算法的学习速度。
这里写图片描述
下图展示了不同激活函数的优点和缺点。
1、sigmoid函数
除非用在二分类的输出层,否则不要用。
2、tanh函数
几乎总是比sigmoid优越。
3、relu函数
默认最常使用的函数,不会出现梯度消失的问题。
4、leaky relu
这里写图片描述

3.7 为什么需要非线性激活函数?

为什么神经网络需要非线性激活函数?事实证明,为了让神经网络计算出有趣的函数,必须使用非线性激活函数。
如下图所示,如果 g(z)=z ,那么就称其为线性激活函数或恒等激活函数。事实证明,如果使用线性激活函数,那么无论神经网络多么庞大,最终的输出都是输入的线性组合,有多少隐藏层都是白搭,因为线性函数的线性组合仍然是线性的。(下图右半部分简单的证明了一下)只有一个地方可以使用线性激活函数,那就是在回归问题的时候,输出层可以使用线性激活函数,但是在隐藏层必须使用非线性激活函数(在房价预测那个案例中,由于房价都是非负的,我们还可以使用relu激活函数)
这里写图片描述

3.8 激活函数的导数

如下图所示,当z较大或较小时,sigmoid函数的导数近似为0。
这里写图片描述
如下图所示,tanh函数与sigmoid函数相似,当z较大或较小时,导数依然近似为0。
这里写图片描述

这里写图片描述

3.9 神经网络的梯度下降法

这里写图片描述

这里写图片描述

3.10 直观理解反向传播

对于逻辑回归,其反向传播如下所示:
这里写图片描述
含有一个隐藏层的神经网络,其反向传播如下图所示
这里写图片描述

这里写图片描述

3.11 随机初始化权重

如果是逻辑回归,那么将权重全部初始化为0是ok的,但如果是其他神经网络,将权重都初始化为0,再应用梯度下降法,那么梯度下降法就会失效。为什么呢?
如下图所示,如果我们把隐藏层的W和b都置为0,那么隐藏层的两个单元输出就是一样的,在反向传播、更新梯度时,W都是一样的,无论经过多少次的迭代,两个隐藏单元始终都是一样的,对应于W1的矩阵,它的每一行都是相同的,因此,两个隐藏单元计算相同的值,这种情况下,隐藏层即便有多个神经元也是没有意义的,因为他们计算的东西都是一样的。
这里写图片描述
解决方法就是随机初始化权重,如下图所示,为什么要在随机高斯变量后再乘以0.01呢?因为如果权重太大,z就会变大,这样激活函数的梯度就会非常接近与0,使得学习速度太慢。
这里写图片描述

4.1 L层的深度神经网络

这里写图片描述
深度神经网络的标记如下图所示
这里写图片描述

4.2 深层神经网络的前向传播

这里写图片描述

4.3 核对矩阵维数

检查神经网络bug的一种方法就是核对矩阵维数。
对于单一样本,如下图所示,针对前馈神经网络,我们明确每层的神经元个数n,就可以确定每层的W和b的型,如下图中右边部分所示,相应地,z的型也就确定下来了(n,1)
这里写图片描述
那么,对于多个样本向量化的结果又是什么样的呢?W,b和之前一样,区别在于Z、A和X的型均为(n,m)。
这里写图片描述

4.4 为什么要使用深度神经网络?

我们已经知道深度神经网络可以解决很多问题,但其实我们需要的不是很大的网络,而是具有深度的网络,为啥呢?
首先,我们要搞明白深度神经网络在计算什么。假如我们在做一个人脸检测器,神经网络的第一层可以当做比较基本的特征检测器,比如,边缘检测,把第二层当做面部部分特征的检测器,如鼻子、眼睛、眉毛等等。最后,在第三层将这些部分组合在一起,就可以得到不同的人脸。

4.5 深度神经网络的基本组成部分

如下图所示,我们以蓝笔框出来的这一隐藏层作为第 l 层,进行说明。
前向传播时,输入是a[l1],输出是 a[l] ,计算过程中还需要 W[l] b[l] ,缓存是 z[l]
后向传播时,输入是 da[l] ,输出是 da[l1] dW[l] db[l] ,计算过程中还需要 W[l] b[l] z[l] dz[l]
这里写图片描述
实现了某一层的前向和后向传播后,整个神经网络的前向和后向传播如下图所示
这里写图片描述

4.6 前向和反向传播

这里写图片描述
注意,向量化实现反向传播的时候, dW db 要乘以 1m
这里写图片描述

这里写图片描述

4.7 参数VS超参数

这里写图片描述

这里写图片描述

4.8 深度学习和大脑的关系

在神经网络早期,人们喜欢将神经网络和大脑做类比,但其实大脑中的一个神经元细胞远比一个逻辑回归单元复杂,关于神经元的一些工作机理至今还不能解释,因此,神经网络其实和大脑关系不是很大。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值